diff --git a/Cargo.lock b/Cargo.lock index 5611415..57ebc2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -846,6 +846,19 @@ dependencies = [ "smallvec", ] +[[package]] +name = "bigdecimal" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bincode" version = "1.3.3" @@ -3805,7 +3818,9 @@ name = "mudu" version = "0.1.0" dependencies = [ "arbitrary", + "bigdecimal", "byteorder", + "chrono", "console-subscriber", "crc", "heck", @@ -3831,6 +3846,7 @@ dependencies = [ "mudu_binding", "mudu_cli", "mudu_contract", + "mudu_sys", "mudu_type", "mudu_utils", "mysql", @@ -4021,11 +4037,15 @@ dependencies = [ name = "mudu_sys" version = "0.1.0" dependencies = [ + "async-backtrace", "async-trait", "chrono", + "futures", + "lazy_static", "libc", "mudu", "rliburing", + "scc", "socket2 0.5.10", "tokio", "tracing", @@ -4088,7 +4108,6 @@ dependencies = [ "mudu_sys", "scc", "serde_json", - "tokio", "tracing", "tracing-subscriber", "tree-sitter", @@ -6275,7 +6294,6 @@ name = "testing" version = "0.1.0" dependencies = [ "base64 0.22.1", - "libsql", "mudu", "mudu_binding", "mudu_cli", diff --git a/Cargo.toml b/Cargo.toml index f61f567..388ad1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -97,3 +97,4 @@ chrono = { version = "0.4.42" } async-backtrace = { version = "0.2.7" } uniffi = { version = "0.31.0", features = ["scaffolding-ffi-buffer-fns"] } zip = { version = "8.4.0" } +bigdecimal = { version = "0.4.10" } diff --git a/doc/cn/DEPLOY.md b/doc/cn/DEPLOY.md new file mode 100644 index 0000000..7814b7f --- /dev/null +++ b/doc/cn/DEPLOY.md @@ -0,0 +1,100 @@ +# MuduDB 一键部署指南 + +在纯净 Ubuntu 24.04 环境中一键完成依赖安装、编译、启动、测试。 + +## 快速开始 + +```bash +# 1. 安装系统依赖 + Rust 工具链 +bash script/shell/install_deps.sh + +# 2. 编译全部组件并打包示例应用 +bash script/shell/build_all.sh + +# 3. 启动服务器并运行 CRUD 测试 +bash script/shell/run_test.sh +``` + +三步全部通过即部署成功。 + +## 环境要求 + +- Ubuntu 24.04 LTS (x86_64) +- Linux 内核 5.1+,需启用 `CONFIG_IO_URING=y` +- 8GB+ 内存, 20GB+ 磁盘 +- 外网访问 (下载 Rust 工具链和依赖) + +### 检查 io_uring 支持 + +```bash +# 内核版本 +uname -r # 必须 ≥ 5.1 + +# io_uring 是否可用 +grep io_uring /proc/filesystems && echo "io_uring OK" || echo "NOT supported" + +# memlock 限制 (io_uring 需要锁定内存) +ulimit -l # 建议 ≥ 65536 或 unlimited +``` + +### Docker 环境 + +如果在 Docker 中运行,需要 `--privileged` 以访问宿主机内核的 io_uring: + +```bash +docker run --privileged -v /path/to/repo:/mududb_p:ro ubuntu:24.04 ... +``` + +或使用更精细的权限: +```bash +docker run --cap-add CAP_SYS_ADMIN --ulimit memlock=-1:-1 ... +``` + +## 脚本说明 + +### `script/shell/install_deps.sh` + +安装运行 MuduDB 所需的全部依赖: + +| 类别 | 内容 | +|------|------| +| 系统包 | python3, pip, python-is-python3, build-essential, curl, liburing-dev, clang, libclang-dev, llvm-dev, pkgconf, iproute2 | +| Rust | nightly 工具链 + rustfmt + wasm32-wasip2 target | +| Python | toml, tomli-w | +| 工具 | cargo-make | + +### `script/shell/build_all.sh` + +编译并安装全部组件: + +1. `cargo build --release` — 编译 34 个 crate +2. 安装二进制文件到 `~/.cargo/bin/` (mudud, mcli, mpk, mgen, mtp) +3. 编译 wallet 示例应用,生成 `.mpk` 包 + +### `script/shell/run_test.sh` + +启动 MuduDB 服务器并执行 CRUD 测试: + +- 自动创建临时数据目录和配置文件 +- 启动 mudud 服务器 (HTTP 8300 / TCP 9527) +- 安装 wallet 示例应用 +- 测试 CREATE / READ / UPDATE / INVOKE / DELETE +- 测试结束后自动清理 + +### `script/shell/debug_test.sh` + +带诊断信息的集成测试,输出更详细的日志和中间状态。 + +## 一键运行全部 + +```bash +#!/bin/bash +set -euo pipefail +bash script/shell/install_deps.sh +source "$HOME/.cargo/env" +bash script/shell/build_all.sh +mkdir -p "$HOME/.mududb" +bash script/shell/run_test.sh +bash script/shell/debug_test.sh +echo "All tests passed." +``` diff --git a/example/game-backend/package/package.desc.json b/example/game-backend/package/package.desc.json index 9e72b4f..ac6a952 100644 --- a/example/game-backend/package/package.desc.json +++ b/example/game-backend/package/package.desc.json @@ -3,17 +3,9 @@ "game_backend": [ { "module_name": "game_backend", - "proc_name": "command", + "proc_name": "event", "param_desc": { - "fields": [ - { - "dat_type": { - "id": "Binary", - "param": null - }, - "name": "message" - } - ] + "fields": [] }, "return_desc": { "fields": [ @@ -29,9 +21,17 @@ }, { "module_name": "game_backend", - "proc_name": "event", + "proc_name": "command", "param_desc": { - "fields": [] + "fields": [ + { + "dat_type": { + "id": "Binary", + "param": null + }, + "name": "message" + } + ] }, "return_desc": { "fields": [ diff --git a/example/game-backend/src/generated/procedure.rs b/example/game-backend/src/generated/procedure.rs index d6c7b06..f725290 100644 --- a/example/game-backend/src/generated/procedure.rs +++ b/example/game-backend/src/generated/procedure.rs @@ -9,221 +9,221 @@ pub fn command(oid: OID, message: Vec) -> RS> { /**mudu-proc**/ pub fn event(oid: OID) -> RS> { Ok(Vec::new()) -} - fn mp2_command(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure( - param, - mudu_inner_p2_command, - ) -} - -pub fn mudu_inner_p2_command( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = command( - param.session_id(), - - - param.param_list()[0].expect_binary().clone(), - - - ); - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::dat_value::DatValue::from_binary(tuple) - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_command() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "message".to_string(), - - ::mududb::types::dat_type::DatType::new_no_param(::mududb::types::dat_type_id::DatTypeID::Binary) - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_command() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::mududb::types::dat_type::DatType::new_no_param(::mududb::types::dat_type_id::DatTypeID::Binary) - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_command() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "game_backend".to_string(), - "command".to_string(), - mudu_argv_desc_command().clone(), - mudu_result_desc_command().clone(), - false - ) - }) -} - -mod mod_command { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-command; - world mudu-app-mp2-command { - export mp2-command: func(param:list) -> list; - } - "##, - - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestCommand {} - - impl Guest for GuestCommand { - fn mp2_command(param:Vec) -> Vec { - super::mp2_command(param) - } - } - - export!(GuestCommand); -} - fn mp2_event(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure( - param, - mudu_inner_p2_event, - ) -} - -pub fn mudu_inner_p2_event( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = event( - param.session_id(), - - ); - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::dat_value::DatValue::from_binary(tuple) - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_event() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_result_desc_event() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::mududb::types::dat_type::DatType::new_no_param(::mududb::types::dat_type_id::DatTypeID::Binary) - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_event() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "game_backend".to_string(), - "event".to_string(), - mudu_argv_desc_event().clone(), - mudu_result_desc_event().clone(), - false - ) - }) -} - -mod mod_event { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-event; - world mudu-app-mp2-event { - export mp2-event: func(param:list) -> list; - } - "##, - - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestEvent {} - - impl Guest for GuestEvent { - fn mp2_event(param:Vec) -> Vec { - super::mp2_event(param) - } - } - - export!(GuestEvent); -} \ No newline at end of file +} + fn mp2_event(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure( + param, + mudu_inner_p2_event, + ) +} + +pub fn mudu_inner_p2_event( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = event( + param.session_id(), + + ); + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::dat_value::DatValue::from_binary(tuple) + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_event() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_result_desc_event() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::mududb::types::dat_type::DatType::new_no_param(::mududb::types::dat_type_id::DatTypeID::Binary) + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_event() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "game_backend".to_string(), + "event".to_string(), + mudu_argv_desc_event().clone(), + mudu_result_desc_event().clone(), + false + ) + }) +} + +mod mod_event { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-event; + world mudu-app-mp2-event { + export mp2-event: func(param:list) -> list; + } + "##, + + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestEvent {} + + impl Guest for GuestEvent { + fn mp2_event(param:Vec) -> Vec { + super::mp2_event(param) + } + } + + export!(GuestEvent); +} + fn mp2_command(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure( + param, + mudu_inner_p2_command, + ) +} + +pub fn mudu_inner_p2_command( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = command( + param.session_id(), + + + param.param_list()[0].expect_binary().clone(), + + + ); + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::dat_value::DatValue::from_binary(tuple) + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_command() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "message".to_string(), + + ::mududb::types::dat_type::DatType::new_no_param(::mududb::types::dat_type_id::DatTypeID::Binary) + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_command() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::mududb::types::dat_type::DatType::new_no_param(::mududb::types::dat_type_id::DatTypeID::Binary) + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_command() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "game_backend".to_string(), + "command".to_string(), + mudu_argv_desc_command().clone(), + mudu_result_desc_command().clone(), + false + ) + }) +} + +mod mod_command { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-command; + world mudu-app-mp2-command { + export mp2-command: func(param:list) -> list; + } + "##, + + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestCommand {} + + impl Guest for GuestCommand { + fn mp2_command(param:Vec) -> Vec { + super::mp2_command(param) + } + } + + export!(GuestCommand); +} \ No newline at end of file diff --git a/example/key-value/package/package.desc.json b/example/key-value/package/package.desc.json index 679d4fb..950938e 100644 --- a/example/key-value/package/package.desc.json +++ b/example/key-value/package/package.desc.json @@ -3,7 +3,7 @@ "key_value": [ { "module_name": "key_value", - "proc_name": "kv_read_modify_write", + "proc_name": "kv_insert", "param_desc": { "fields": [ { @@ -26,29 +26,17 @@ } } }, - "name": "append_value" + "name": "value" } ] }, "return_desc": { - "fields": [ - { - "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - }, - "name": "0" - } - ] + "fields": [] } }, { "module_name": "key_value", - "proc_name": "kv_insert", + "proc_name": "kv_update", "param_desc": { "fields": [ { @@ -168,7 +156,7 @@ }, { "module_name": "key_value", - "proc_name": "kv_update", + "proc_name": "kv_read_modify_write", "param_desc": { "fields": [ { @@ -191,12 +179,24 @@ } } }, - "name": "value" + "name": "append_value" } ] }, "return_desc": { - "fields": [] + "fields": [ + { + "dat_type": { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + }, + "name": "0" + } + ] } } ] diff --git a/example/key-value/src/generated/procedure.rs b/example/key-value/src/generated/procedure.rs index ceaf9a5..b0a25a4 100644 --- a/example/key-value/src/generated/procedure.rs +++ b/example/key-value/src/generated/procedure.rs @@ -73,10 +73,10 @@ pub async fn kv_read_modify_write(xid: XID, user_key: String, append_value: Stri #[cfg(test)] mod tests { use super::{kv_insert, kv_read, kv_read_modify_write, kv_scan, kv_update}; + use mududb::sys_interface::async_api::{mudu_close, mudu_open}; use std::path::PathBuf; use std::sync::{Mutex, OnceLock}; use std::time::{SystemTime, UNIX_EPOCH}; - use mududb::sys_interface::async_api::{mudu_close, mudu_open}; fn test_lock() -> &'static Mutex<()> { static LOCK: OnceLock> = OnceLock::new(); @@ -129,623 +129,623 @@ mod tests { assert!(err.message().contains("missing")); mudu_close(xid).await.unwrap(); } -} -async fn mp2_kv_read_modify_write(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_kv_read_modify_write, - ).await -} - -pub async fn mudu_inner_p2_kv_read_modify_write( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = kv_read_modify_write( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_kv_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "append_value".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_kv_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_kv_read_modify_write() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "key_value".to_string(), - "kv_read_modify_write".to_string(), - mudu_argv_desc_kv_read_modify_write().clone(), - mudu_result_desc_kv_read_modify_write().clone(), - false - ) - }) -} - -mod mod_kv_read_modify_write { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-kv-read-modify-write; - world mudu-app-mp2-kv-read-modify-write { - export mp2-kv-read-modify-write: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestKvReadModifyWrite {} - - impl Guest for GuestKvReadModifyWrite { - async fn mp2_kv_read_modify_write(param:Vec) -> Vec { - super::mp2_kv_read_modify_write(param).await - } - } - - export!(GuestKvReadModifyWrite); -} -async fn mp2_kv_insert(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_kv_insert, - ).await -} - -pub async fn mudu_inner_p2_kv_insert( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = kv_insert( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_kv_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "value".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_kv_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_kv_insert() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "key_value".to_string(), - "kv_insert".to_string(), - mudu_argv_desc_kv_insert().clone(), - mudu_result_desc_kv_insert().clone(), - false - ) - }) -} - -mod mod_kv_insert { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-kv-insert; - world mudu-app-mp2-kv-insert { - export mp2-kv-insert: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestKvInsert {} - - impl Guest for GuestKvInsert { - async fn mp2_kv_insert(param:Vec) -> Vec { - super::mp2_kv_insert(param).await - } - } - - export!(GuestKvInsert); -} -async fn mp2_kv_scan(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_kv_scan, - ).await -} - -pub async fn mudu_inner_p2_kv_scan( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = kv_scan( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "Vec")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_kv_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "start_user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "end_user_key".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_kv_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_kv_scan() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "key_value".to_string(), - "kv_scan".to_string(), - mudu_argv_desc_kv_scan().clone(), - mudu_result_desc_kv_scan().clone(), - false - ) - }) -} - -mod mod_kv_scan { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-kv-scan; - world mudu-app-mp2-kv-scan { - export mp2-kv-scan: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestKvScan {} - - impl Guest for GuestKvScan { - async fn mp2_kv_scan(param:Vec) -> Vec { - super::mp2_kv_scan(param).await - } - } - - export!(GuestKvScan); -} -async fn mp2_kv_read(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_kv_read, - ).await -} - -pub async fn mudu_inner_p2_kv_read( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = kv_read( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_kv_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_kv_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_kv_read() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "key_value".to_string(), - "kv_read".to_string(), - mudu_argv_desc_kv_read().clone(), - mudu_result_desc_kv_read().clone(), - false - ) - }) -} - -mod mod_kv_read { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-kv-read; - world mudu-app-mp2-kv-read { - export mp2-kv-read: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestKvRead {} - - impl Guest for GuestKvRead { - async fn mp2_kv_read(param:Vec) -> Vec { - super::mp2_kv_read(param).await - } - } - - export!(GuestKvRead); -} -async fn mp2_kv_update(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_kv_update, - ).await -} - -pub async fn mudu_inner_p2_kv_update( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = kv_update( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_kv_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "value".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_kv_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_kv_update() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "key_value".to_string(), - "kv_update".to_string(), - mudu_argv_desc_kv_update().clone(), - mudu_result_desc_kv_update().clone(), - false - ) - }) -} - -mod mod_kv_update { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-kv-update; - world mudu-app-mp2-kv-update { - export mp2-kv-update: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestKvUpdate {} - - impl Guest for GuestKvUpdate { - async fn mp2_kv_update(param:Vec) -> Vec { - super::mp2_kv_update(param).await - } - } - - export!(GuestKvUpdate); -} \ No newline at end of file +} +async fn mp2_kv_insert(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_kv_insert, + ).await +} + +pub async fn mudu_inner_p2_kv_insert( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = kv_insert( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_kv_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "value".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_kv_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_kv_insert() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "key_value".to_string(), + "kv_insert".to_string(), + mudu_argv_desc_kv_insert().clone(), + mudu_result_desc_kv_insert().clone(), + false + ) + }) +} + +mod mod_kv_insert { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-kv-insert; + world mudu-app-mp2-kv-insert { + export mp2-kv-insert: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestKvInsert {} + + impl Guest for GuestKvInsert { + async fn mp2_kv_insert(param:Vec) -> Vec { + super::mp2_kv_insert(param).await + } + } + + export!(GuestKvInsert); +} +async fn mp2_kv_update(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_kv_update, + ).await +} + +pub async fn mudu_inner_p2_kv_update( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = kv_update( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_kv_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "value".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_kv_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_kv_update() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "key_value".to_string(), + "kv_update".to_string(), + mudu_argv_desc_kv_update().clone(), + mudu_result_desc_kv_update().clone(), + false + ) + }) +} + +mod mod_kv_update { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-kv-update; + world mudu-app-mp2-kv-update { + export mp2-kv-update: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestKvUpdate {} + + impl Guest for GuestKvUpdate { + async fn mp2_kv_update(param:Vec) -> Vec { + super::mp2_kv_update(param).await + } + } + + export!(GuestKvUpdate); +} +async fn mp2_kv_scan(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_kv_scan, + ).await +} + +pub async fn mudu_inner_p2_kv_scan( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = kv_scan( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "Vec")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_kv_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "start_user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "end_user_key".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_kv_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_kv_scan() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "key_value".to_string(), + "kv_scan".to_string(), + mudu_argv_desc_kv_scan().clone(), + mudu_result_desc_kv_scan().clone(), + false + ) + }) +} + +mod mod_kv_scan { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-kv-scan; + world mudu-app-mp2-kv-scan { + export mp2-kv-scan: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestKvScan {} + + impl Guest for GuestKvScan { + async fn mp2_kv_scan(param:Vec) -> Vec { + super::mp2_kv_scan(param).await + } + } + + export!(GuestKvScan); +} +async fn mp2_kv_read(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_kv_read, + ).await +} + +pub async fn mudu_inner_p2_kv_read( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = kv_read( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_kv_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_kv_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_kv_read() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "key_value".to_string(), + "kv_read".to_string(), + mudu_argv_desc_kv_read().clone(), + mudu_result_desc_kv_read().clone(), + false + ) + }) +} + +mod mod_kv_read { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-kv-read; + world mudu-app-mp2-kv-read { + export mp2-kv-read: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestKvRead {} + + impl Guest for GuestKvRead { + async fn mp2_kv_read(param:Vec) -> Vec { + super::mp2_kv_read(param).await + } + } + + export!(GuestKvRead); +} +async fn mp2_kv_read_modify_write(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_kv_read_modify_write, + ).await +} + +pub async fn mudu_inner_p2_kv_read_modify_write( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = kv_read_modify_write( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_kv_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "append_value".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_kv_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_kv_read_modify_write() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "key_value".to_string(), + "kv_read_modify_write".to_string(), + mudu_argv_desc_kv_read_modify_write().clone(), + mudu_result_desc_kv_read_modify_write().clone(), + false + ) + }) +} + +mod mod_kv_read_modify_write { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-kv-read-modify-write; + world mudu-app-mp2-kv-read-modify-write { + export mp2-kv-read-modify-write: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestKvReadModifyWrite {} + + impl Guest for GuestKvReadModifyWrite { + async fn mp2_kv_read_modify_write(param:Vec) -> Vec { + super::mp2_kv_read_modify_write(param).await + } + } + + export!(GuestKvReadModifyWrite); +} \ No newline at end of file diff --git a/example/key-value/src/rust/procedure.rs b/example/key-value/src/rust/procedure.rs index 7bc4930..2feecad 100644 --- a/example/key-value/src/rust/procedure.rs +++ b/example/key-value/src/rust/procedure.rs @@ -73,10 +73,10 @@ pub fn kv_read_modify_write(xid: XID, user_key: String, append_value: String) -> #[cfg(test)] mod tests { use super::{kv_insert, kv_read, kv_read_modify_write, kv_scan, kv_update}; + use mududb::sys_interface::sync_api::{mudu_close, mudu_open}; use std::path::PathBuf; use std::sync::{Mutex, OnceLock}; use std::time::{SystemTime, UNIX_EPOCH}; - use mududb::sys_interface::sync_api::{mudu_close, mudu_open}; fn test_lock() -> &'static Mutex<()> { static LOCK: OnceLock> = OnceLock::new(); diff --git a/example/tpcc/package/package.desc.json b/example/tpcc/package/package.desc.json index 1a261d1..5d6c96c 100644 --- a/example/tpcc/package/package.desc.json +++ b/example/tpcc/package/package.desc.json @@ -1,6 +1,227 @@ { "modules": { "tpcc": [ + { + "module_name": "tpcc", + "proc_name": "tpcc_seed_partitioned", + "param_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "warehouse_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "district_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "customer_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "item_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "initial_stock" + } + ] + }, + "return_desc": { + "fields": [] + } + }, + { + "module_name": "tpcc", + "proc_name": "tpcc_payment_partitioned", + "param_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "warehouse_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "district_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "customer_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "amount" + } + ] + }, + "return_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "0" + } + ] + } + }, + { + "module_name": "tpcc", + "proc_name": "tpcc_delivery_partitioned", + "param_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "warehouse_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "district_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "carrier_id" + } + ] + }, + "return_desc": { + "fields": [ + { + "dat_type": { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + }, + "name": "0" + } + ] + } + }, + { + "module_name": "tpcc", + "proc_name": "tpcc_stock_level_partitioned", + "param_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "warehouse_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "district_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "threshold" + } + ] + }, + "return_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "0" + } + ] + } + }, + { + "module_name": "tpcc", + "proc_name": "tpcc_delivery", + "param_desc": { + "fields": [ + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "warehouse_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "district_id" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "carrier_id" + } + ] + }, + "return_desc": { + "fields": [ + { + "dat_type": { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + }, + "name": "0" + } + ] + } + }, { "module_name": "tpcc", "proc_name": "tpcc_new_order", @@ -92,7 +313,7 @@ }, { "module_name": "tpcc", - "proc_name": "tpcc_delivery", + "proc_name": "tpcc_new_order_partitioned", "param_desc": { "fields": [ { @@ -114,7 +335,52 @@ "id": "I32", "param": null }, - "name": "carrier_id" + "name": "customer_id" + }, + { + "dat_type": { + "id": "Array", + "param": { + "Array": { + "dat_type": { + "id": "I32", + "param": null + }, + "max_size": null + } + } + }, + "name": "item_ids" + }, + { + "dat_type": { + "id": "Array", + "param": { + "Array": { + "dat_type": { + "id": "I32", + "param": null + }, + "max_size": null + } + } + }, + "name": "supplier_warehouse_ids" + }, + { + "dat_type": { + "id": "Array", + "param": { + "Array": { + "dat_type": { + "id": "I32", + "param": null + }, + "max_size": null + } + } + }, + "name": "quantities" } ] }, @@ -136,7 +402,7 @@ }, { "module_name": "tpcc", - "proc_name": "tpcc_seed", + "proc_name": "tpcc_payment", "param_desc": { "fields": [ { @@ -144,45 +410,46 @@ "id": "I32", "param": null }, - "name": "warehouse_count" + "name": "warehouse_id" }, { "dat_type": { "id": "I32", "param": null }, - "name": "district_count" + "name": "district_id" }, { "dat_type": { "id": "I32", "param": null }, - "name": "customer_count" + "name": "customer_id" }, { "dat_type": { "id": "I32", "param": null }, - "name": "item_count" - }, + "name": "amount" + } + ] + }, + "return_desc": { + "fields": [ { "dat_type": { "id": "I32", "param": null }, - "name": "initial_stock" + "name": "0" } ] - }, - "return_desc": { - "fields": [] } }, { "module_name": "tpcc", - "proc_name": "tpcc_payment", + "proc_name": "tpcc_order_status", "param_desc": { "fields": [ { @@ -205,31 +472,74 @@ "param": null }, "name": "customer_id" - }, + } + ] + }, + "return_desc": { + "fields": [ { "dat_type": { - "id": "I32", - "param": null + "id": "String", + "param": { + "String": { + "length": 65536 + } + } }, - "name": "amount" + "name": "0" } ] - }, - "return_desc": { + } + }, + { + "module_name": "tpcc", + "proc_name": "tpcc_seed", + "param_desc": { "fields": [ { "dat_type": { "id": "I32", "param": null }, - "name": "0" + "name": "warehouse_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "district_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "customer_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "item_count" + }, + { + "dat_type": { + "id": "I32", + "param": null + }, + "name": "initial_stock" } ] + }, + "return_desc": { + "fields": [] } }, { "module_name": "tpcc", - "proc_name": "tpcc_stock_level", + "proc_name": "tpcc_order_status_partitioned", "param_desc": { "fields": [ { @@ -251,7 +561,7 @@ "id": "I32", "param": null }, - "name": "threshold" + "name": "customer_id" } ] }, @@ -259,8 +569,12 @@ "fields": [ { "dat_type": { - "id": "I32", - "param": null + "id": "String", + "param": { + "String": { + "length": 65536 + } + } }, "name": "0" } @@ -269,7 +583,7 @@ }, { "module_name": "tpcc", - "proc_name": "tpcc_order_status", + "proc_name": "tpcc_stock_level", "param_desc": { "fields": [ { @@ -291,7 +605,7 @@ "id": "I32", "param": null }, - "name": "customer_id" + "name": "threshold" } ] }, @@ -299,12 +613,8 @@ "fields": [ { "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } + "id": "I32", + "param": null }, "name": "0" } diff --git a/example/tpcc/package/type.desc.json b/example/tpcc/package/type.desc.json index 507bf38..c8a0740 100644 --- a/example/tpcc/package/type.desc.json +++ b/example/tpcc/package/type.desc.json @@ -1,104 +1,90 @@ { "types": { - "Stock": [ + "History": [ 2, { - "record_name": "stock", + "record_name": "history", "record_fields": [ { - "field_name": "s_i_id", + "field_name": "h_id", "field_type": [ 0, - 6 + 14 ] }, { - "field_name": "s_w_id", + "field_name": "h_c_id", "field_type": [ 0, 6 ] }, { - "field_name": "s_quantity", + "field_name": "h_c_d_id", "field_type": [ 0, 6 ] }, { - "field_name": "s_ytd", + "field_name": "h_c_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "s_order_cnt", + "field_name": "h_d_id", "field_type": [ 0, 6 ] }, { - "field_name": "s_remote_cnt", - "field_type": [ - 0, - 6 - ] - } - ] - } - ], - "District": [ - 2, - { - "record_name": "district", - "record_fields": [ - { - "field_name": "d_id", + "field_name": "h_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "d_w_id", + "field_name": "h_amount", "field_type": [ 0, 6 ] }, { - "field_name": "d_name", + "field_name": "h_data", "field_type": [ 0, 14 ] - }, - { - "field_name": "d_tax", - "field_type": [ - 0, - 6 - ] - }, + } + ] + } + ], + "NewOrder": [ + 2, + { + "record_name": "new_order", + "record_fields": [ { - "field_name": "d_ytd", + "field_name": "no_o_id", "field_type": [ 0, 6 ] }, { - "field_name": "d_next_o_id", + "field_name": "no_d_id", "field_type": [ 0, 6 ] }, { - "field_name": "d_last_delivery_o_id", + "field_name": "no_w_id", "field_type": [ 0, 6 @@ -107,56 +93,55 @@ ] } ], - "NewOrder": [ + "District": [ 2, { - "record_name": "new_order", + "record_name": "district", "record_fields": [ { - "field_name": "no_o_id", + "field_name": "d_id", "field_type": [ 0, 6 ] }, { - "field_name": "no_d_id", + "field_name": "d_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "no_w_id", + "field_name": "d_name", + "field_type": [ + 0, + 14 + ] + }, + { + "field_name": "d_tax", "field_type": [ 0, 6 ] - } - ] - } - ], - "Item": [ - 2, - { - "record_name": "item", - "record_fields": [ + }, { - "field_name": "i_id", + "field_name": "d_ytd", "field_type": [ 0, 6 ] }, { - "field_name": "i_name", + "field_name": "d_next_o_id", "field_type": [ 0, - 14 + 6 ] }, { - "field_name": "i_price", + "field_name": "d_last_delivery_o_id", "field_type": [ 0, 6 @@ -165,72 +150,72 @@ ] } ], - "Orders": [ + "OrderLine": [ 2, { - "record_name": "orders", + "record_name": "order_line", "record_fields": [ { - "field_name": "o_id", + "field_name": "ol_o_id", "field_type": [ 0, 6 ] }, { - "field_name": "o_d_id", + "field_name": "ol_d_id", "field_type": [ 0, 6 ] }, { - "field_name": "o_w_id", + "field_name": "ol_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "o_c_id", + "field_name": "ol_number", "field_type": [ 0, 6 ] }, { - "field_name": "o_entry_d", + "field_name": "ol_i_id", "field_type": [ 0, - 14 + 6 ] }, { - "field_name": "o_carrier_id", + "field_name": "ol_supply_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "o_ol_cnt", + "field_name": "ol_delivery_d", "field_type": [ 0, - 6 + 14 ] }, { - "field_name": "o_all_local", + "field_name": "ol_quantity", "field_type": [ 0, 6 ] }, { - "field_name": "o_status", + "field_name": "ol_amount", "field_type": [ 0, - 14 + 6 ] } ] @@ -272,6 +257,35 @@ ] } ], + "Item": [ + 2, + { + "record_name": "item", + "record_fields": [ + { + "field_name": "i_id", + "field_type": [ + 0, + 6 + ] + }, + { + "field_name": "i_name", + "field_type": [ + 0, + 14 + ] + }, + { + "field_name": "i_price", + "field_type": [ + 0, + 6 + ] + } + ] + } + ], "Customer": [ 2, { @@ -364,136 +378,122 @@ ] } ], - "History": [ + "Stock": [ 2, { - "record_name": "history", + "record_name": "stock", "record_fields": [ { - "field_name": "h_id", - "field_type": [ - 0, - 14 - ] - }, - { - "field_name": "h_c_id", + "field_name": "s_i_id", "field_type": [ 0, 6 ] }, { - "field_name": "h_c_d_id", + "field_name": "s_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "h_c_w_id", + "field_name": "s_quantity", "field_type": [ 0, 6 ] }, { - "field_name": "h_d_id", + "field_name": "s_ytd", "field_type": [ 0, 6 ] }, { - "field_name": "h_w_id", + "field_name": "s_order_cnt", "field_type": [ 0, 6 ] }, { - "field_name": "h_amount", + "field_name": "s_remote_cnt", "field_type": [ 0, 6 ] - }, - { - "field_name": "h_data", - "field_type": [ - 0, - 14 - ] } ] } ], - "OrderLine": [ + "Orders": [ 2, { - "record_name": "order_line", + "record_name": "orders", "record_fields": [ { - "field_name": "ol_o_id", + "field_name": "o_id", "field_type": [ 0, 6 ] }, { - "field_name": "ol_d_id", + "field_name": "o_d_id", "field_type": [ 0, 6 ] }, { - "field_name": "ol_w_id", + "field_name": "o_w_id", "field_type": [ 0, 6 ] }, { - "field_name": "ol_number", + "field_name": "o_c_id", "field_type": [ 0, 6 ] }, { - "field_name": "ol_i_id", + "field_name": "o_entry_d", "field_type": [ 0, - 6 + 14 ] }, { - "field_name": "ol_supply_w_id", + "field_name": "o_carrier_id", "field_type": [ 0, 6 ] }, { - "field_name": "ol_delivery_d", + "field_name": "o_ol_cnt", "field_type": [ 0, - 14 + 6 ] }, { - "field_name": "ol_quantity", + "field_name": "o_all_local", "field_type": [ 0, 6 ] }, { - "field_name": "ol_amount", + "field_name": "o_status", "field_type": [ 0, - 6 + 14 ] } ] diff --git a/example/tpcc/sql/ddl_warehouse_partitioned.sql b/example/tpcc/sql/ddl_warehouse_partitioned.sql new file mode 100644 index 0000000..11797df --- /dev/null +++ b/example/tpcc/sql/ddl_warehouse_partitioned.sql @@ -0,0 +1,114 @@ +CREATE TABLE warehouse ( + w_id INTEGER PRIMARY KEY, + w_name TEXT NOT NULL, + w_tax INTEGER NOT NULL, + w_ytd INTEGER NOT NULL +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (w_id); + +CREATE TABLE district ( + d_id INTEGER NOT NULL, + d_w_id INTEGER NOT NULL, + d_name TEXT NOT NULL, + d_tax INTEGER NOT NULL, + d_ytd INTEGER NOT NULL, + d_next_o_id INTEGER NOT NULL, + d_last_delivery_o_id INTEGER NOT NULL, + PRIMARY KEY (d_w_id, d_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (d_w_id); + +CREATE TABLE customer ( + c_id INTEGER NOT NULL, + c_d_id INTEGER NOT NULL, + c_w_id INTEGER NOT NULL, + c_first TEXT NOT NULL, + c_last TEXT NOT NULL, + c_discount INTEGER NOT NULL, + c_credit TEXT NOT NULL, + c_balance INTEGER NOT NULL, + c_ytd_payment INTEGER NOT NULL, + c_payment_cnt INTEGER NOT NULL, + c_delivery_cnt INTEGER NOT NULL, + c_last_order_id INTEGER, + PRIMARY KEY (c_w_id, c_d_id, c_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (c_w_id); + +CREATE TABLE item ( + i_w_id INTEGER NOT NULL, + i_id INTEGER NOT NULL, + i_name TEXT NOT NULL, + i_price INTEGER NOT NULL, + PRIMARY KEY (i_w_id, i_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (i_w_id); + +CREATE TABLE stock ( + s_i_id INTEGER NOT NULL, + s_w_id INTEGER NOT NULL, + s_quantity INTEGER NOT NULL, + s_ytd INTEGER NOT NULL, + s_order_cnt INTEGER NOT NULL, + s_remote_cnt INTEGER NOT NULL, + PRIMARY KEY (s_w_id, s_i_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (s_w_id); + +CREATE TABLE orders ( + o_id INTEGER NOT NULL, + o_d_id INTEGER NOT NULL, + o_w_id INTEGER NOT NULL, + o_c_id INTEGER NOT NULL, + o_entry_d TEXT NOT NULL, + o_carrier_id INTEGER, + o_ol_cnt INTEGER NOT NULL, + o_all_local INTEGER NOT NULL, + o_status TEXT NOT NULL, + PRIMARY KEY (o_w_id, o_d_id, o_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (o_w_id); + +CREATE TABLE new_order ( + no_o_id INTEGER NOT NULL, + no_d_id INTEGER NOT NULL, + no_w_id INTEGER NOT NULL, + PRIMARY KEY (no_w_id, no_d_id, no_o_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (no_w_id); + +CREATE TABLE order_line ( + ol_o_id INTEGER NOT NULL, + ol_d_id INTEGER NOT NULL, + ol_w_id INTEGER NOT NULL, + ol_number INTEGER NOT NULL, + ol_i_id INTEGER NOT NULL, + ol_supply_w_id INTEGER NOT NULL, + ol_delivery_d TEXT, + ol_quantity INTEGER NOT NULL, + ol_amount INTEGER NOT NULL, + PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (ol_w_id); + +CREATE TABLE history ( + h_w_id INTEGER NOT NULL, + h_id TEXT NOT NULL, + h_c_id INTEGER NOT NULL, + h_c_d_id INTEGER NOT NULL, + h_c_w_id INTEGER NOT NULL, + h_d_id INTEGER NOT NULL, + h_amount INTEGER NOT NULL, + h_data TEXT NOT NULL, + PRIMARY KEY (h_w_id, h_id) +) +PARTITION BY GLOBAL RULE r_tpcc_wh +REFERENCES (h_w_id); diff --git a/example/tpcc/src/bin/tpcc_benchmark.rs b/example/tpcc/src/bin/tpcc_benchmark.rs index 18c3189..bdcfbea 100644 --- a/example/tpcc/src/bin/tpcc_benchmark.rs +++ b/example/tpcc/src/bin/tpcc_benchmark.rs @@ -1,19 +1,26 @@ use clap::{Parser, ValueEnum}; -use mududb::common::result::RS; -use mududb::error::ec::EC::NotImplemented; -use mududb::m_error; -use mududb::binding::procedure::procedure_invoke; use mudu_cli::client::async_client::{AsyncClient, AsyncClientImpl}; -use mudu_cli::management::install_app_package; +use mudu_cli::management::{ + ServerTopology, fetch_server_topology, install_app_package, is_server_topology_unsupported, +}; +use mududb::binding::procedure::procedure_invoke; +use mududb::common::result::RS; use mududb::contract::procedure::procedure_param::ProcedureParam; +use mududb::contract::protocol::ClientRequest; use mududb::contract::tuple::tuple_datum::TupleDatum; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::{NetErr, NoneErr, NotImplemented, ThreadErr, TokioErr}; +use mududb::m_error; +use mududb::sys_interface::sync_api::{mudu_close, mudu_command, mudu_open}; use std::fs; use std::path::PathBuf; +use std::thread; use std::time::Instant; -use mududb::sys_interface::sync_api::{mudu_close, mudu_command, mudu_open}; +use tokio::runtime::Builder; use tpcc::rust::procedure::{ - tpcc_delivery, tpcc_new_order, tpcc_order_status, tpcc_payment, tpcc_seed, tpcc_stock_level, + tpcc_delivery, tpcc_delivery_partitioned, tpcc_new_order, tpcc_new_order_partitioned, + tpcc_order_status, tpcc_order_status_partitioned, tpcc_payment, tpcc_payment_partitioned, + tpcc_seed, tpcc_seed_partitioned, tpcc_stock_level, tpcc_stock_level_partitioned, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)] @@ -44,6 +51,8 @@ struct Args { new_order_percent: usize, #[arg(long, default_value_t = false)] enable_async: bool, + #[arg(long, default_value_t = false)] + warehouse_partitioned: bool, #[arg(long, default_value = "tpcc")] app_name: String, #[arg(long, default_value = "127.0.0.1:9527")] @@ -87,6 +96,7 @@ fn new_order_lines( warehouse_id: i32, warehouse_count: i32, item_count: i32, + local_only: bool, ) -> (Vec, Vec, Vec) { let line_count = (index % 5) + 3; let mut item_ids = Vec::with_capacity(line_count); @@ -94,7 +104,7 @@ fn new_order_lines( let mut quantities = Vec::with_capacity(line_count); for line_idx in 0..line_count { item_ids.push(value_for(index * 7 + line_idx * 3 + 1, item_count)); - let supplier_warehouse_id = if warehouse_count > 1 && line_idx % 3 == 2 { + let supplier_warehouse_id = if !local_only && warehouse_count > 1 && line_idx % 3 == 2 { value_for(index + line_idx + 1, warehouse_count) } else { warehouse_id @@ -106,57 +116,149 @@ fn new_order_lines( } fn run_sync(args: Args) -> RS<()> { - let start = Instant::now(); + let total_start = Instant::now(); + let init_xid = mudu_open()?; + init_schema_sync(init_xid, &args)?; + run_seed_sync(init_xid, &args)?; + prepare_sync_txn_context(init_xid, &args)?; + mudu_close(init_xid)?; + let load_elapsed_secs = total_start.elapsed().as_secs_f64(); + let txn_start = Instant::now(); + let worker_count = args.connection_count.max(1).min(args.operation_count.max(1)); + let mut handles = Vec::with_capacity(worker_count); + for terminal_id in 0..worker_count { + let worker_args = args.clone(); + handles.push(thread::spawn(move || run_sync_terminal(worker_args, terminal_id))); + } + for handle in handles { + let result = handle + .join() + .map_err(|_| m_error!(ThreadErr, "join tpcc sync benchmark worker error"))?; + result?; + } + print_summary( + "sync", + &args, + load_elapsed_secs, + txn_start.elapsed().as_secs_f64(), + total_start.elapsed().as_secs_f64(), + ); + Ok(()) +} + +fn run_sync_terminal(args: Args, terminal_id: usize) -> RS<()> { let xid = mudu_open()?; - init_schema_sync(xid)?; - tpcc_seed( - xid, + for op_index in (terminal_id..args.operation_count).step_by(args.connection_count.max(1)) { + run_sync_op(xid, &args, op_index, terminal_id)?; + } + mudu_close(xid)?; + Ok(()) +} + +fn run_sync_op(xid: u128, args: &Args, op_index: usize, terminal_id: usize) -> RS<()> { + let warehouse_id = warehouse_for_op(op_index, terminal_id, args); + let district_id = value_for(op_index, args.districts_per_warehouse); + let customer_id = value_for(op_index, args.customers_per_district); + match op_for(op_index, args) { + TpccOp::NewOrder => { + run_sync_new_order(xid, args, op_index, warehouse_id, district_id, customer_id)?; + } + TpccOp::Payment => { + let _ = if args.warehouse_partitioned { + tpcc_payment_partitioned(xid, warehouse_id, district_id, customer_id, 3)? + } else { + tpcc_payment(xid, warehouse_id, district_id, customer_id, 3)? + }; + } + TpccOp::OrderStatus => { + let _ = if args.warehouse_partitioned { + tpcc_order_status_partitioned(xid, warehouse_id, district_id, customer_id)? + } else { + tpcc_order_status(xid, warehouse_id, district_id, customer_id)? + }; + } + TpccOp::Delivery => { + let _ = if args.warehouse_partitioned { + tpcc_delivery_partitioned(xid, warehouse_id, district_id, 1)? + } else { + tpcc_delivery(xid, warehouse_id, district_id, 1)? + }; + } + TpccOp::StockLevel => { + let _ = if args.warehouse_partitioned { + tpcc_stock_level_partitioned(xid, warehouse_id, district_id, 95)? + } else { + tpcc_stock_level(xid, warehouse_id, district_id, 95)? + }; + } + } + Ok(()) +} + +fn run_sync_new_order( + xid: u128, + args: &Args, + op_index: usize, + warehouse_id: i32, + district_id: i32, + customer_id: i32, +) -> RS<()> { + let (item_ids, supplier_warehouse_ids, quantities) = new_order_lines( + op_index, + warehouse_id, args.warehouses, - args.districts_per_warehouse, - args.customers_per_district, args.items, - 100, - )?; + args.warehouse_partitioned, + ); + let _ = if args.warehouse_partitioned { + tpcc_new_order_partitioned( + xid, + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + )? + } else { + tpcc_new_order( + xid, + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + )? + }; + Ok(()) +} +fn prepare_sync_txn_context(xid: u128, args: &Args) -> RS<()> { for op_index in 0..args.operation_count { - let warehouse_id = value_for(op_index, args.warehouses); - let district_id = value_for(op_index, args.districts_per_warehouse); - let customer_id = value_for(op_index, args.customers_per_district); - match op_for(op_index, &args) { - TpccOp::NewOrder => { - let (item_ids, supplier_warehouse_ids, quantities) = - new_order_lines(op_index, warehouse_id, args.warehouses, args.items); - let _ = tpcc_new_order( + match op_for(op_index, args) { + TpccOp::OrderStatus | TpccOp::Delivery => { + let terminal_id = op_index % args.connection_count.max(1); + let warehouse_id = warehouse_for_op(op_index, terminal_id, args); + let district_id = value_for(op_index, args.districts_per_warehouse); + let customer_id = value_for(op_index, args.customers_per_district); + run_sync_new_order( xid, + args, + args.operation_count + op_index, warehouse_id, district_id, customer_id, - item_ids, - supplier_warehouse_ids, - quantities, )?; } - TpccOp::Payment => { - let _ = tpcc_payment(xid, warehouse_id, district_id, customer_id, 3)?; - } - TpccOp::OrderStatus => { - let _ = tpcc_order_status(xid, warehouse_id, district_id, customer_id)?; - } - TpccOp::Delivery => { - let _ = tpcc_delivery(xid, warehouse_id, district_id, 1)?; - } - TpccOp::StockLevel => { - let _ = tpcc_stock_level(xid, warehouse_id, district_id, 95)?; - } + _ => {} } } - mudu_close(xid)?; - print_summary("sync", &args, start.elapsed().as_secs_f64()); Ok(()) } async fn run_tcp(args: Args) -> RS<()> { - let start = Instant::now(); + let total_start = Instant::now(); if let Some(mpk_path) = &args.mpk { let mpk_binary = fs::read(mpk_path) .map_err(|e| m_error!(mududb::error::ec::EC::IOErr, "read tpcc mpk error", e))?; @@ -186,6 +288,8 @@ async fn run_tcp(args: Args) -> RS<()> { })? .session_id(); + init_schema_tcp(&mut client, session_id, &args).await?; + invoke_void( &mut client, session_id, @@ -199,27 +303,24 @@ async fn run_tcp(args: Args) -> RS<()> { ), ) .await?; + prepare_tcp_txn_context(&mut client, session_id, &args).await?; + let load_elapsed_secs = total_start.elapsed().as_secs_f64(); + let txn_start = Instant::now(); for op_index in 0..args.operation_count { - let warehouse_id = value_for(op_index, args.warehouses); + let warehouse_id = warehouse_for_op(op_index, op_index % args.connection_count.max(1), &args); let district_id = value_for(op_index, args.districts_per_warehouse); let customer_id = value_for(op_index, args.customers_per_district); match op_for(op_index, &args) { TpccOp::NewOrder => { - let (item_ids, supplier_warehouse_ids, quantities) = - new_order_lines(op_index, warehouse_id, args.warehouses, args.items); - let _: String = invoke_typed( + run_tcp_new_order( &mut client, session_id, - &args.proc_name("tpcc_new_order"), - ( - warehouse_id, - district_id, - customer_id, - item_ids, - supplier_warehouse_ids, - quantities, - ), + &args, + op_index, + warehouse_id, + district_id, + customer_id, ) .await?; } @@ -274,47 +375,289 @@ async fn run_tcp(args: Args) -> RS<()> { e ) })?; - print_summary("tcp", &args, start.elapsed().as_secs_f64()); + print_summary( + "tcp", + &args, + load_elapsed_secs, + txn_start.elapsed().as_secs_f64(), + total_start.elapsed().as_secs_f64(), + ); + Ok(()) +} + +async fn run_tcp_new_order( + client: &mut AsyncClientImpl, + session_id: u128, + args: &Args, + op_index: usize, + warehouse_id: i32, + district_id: i32, + customer_id: i32, +) -> RS<()> { + let (item_ids, supplier_warehouse_ids, quantities) = new_order_lines( + op_index, + warehouse_id, + args.warehouses, + args.items, + args.warehouse_partitioned, + ); + let _: String = invoke_typed( + client, + session_id, + &args.proc_name("tpcc_new_order"), + ( + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + ), + ) + .await?; + Ok(()) +} + +async fn prepare_tcp_txn_context( + client: &mut AsyncClientImpl, + session_id: u128, + args: &Args, +) -> RS<()> { + for op_index in 0..args.operation_count { + match op_for(op_index, args) { + TpccOp::OrderStatus | TpccOp::Delivery => { + let terminal_id = op_index % args.connection_count.max(1); + let warehouse_id = warehouse_for_op(op_index, terminal_id, args); + let district_id = value_for(op_index, args.districts_per_warehouse); + let customer_id = value_for(op_index, args.customers_per_district); + run_tcp_new_order( + client, + session_id, + args, + args.operation_count + op_index, + warehouse_id, + district_id, + customer_id, + ) + .await?; + } + _ => {} + } + } Ok(()) } -fn print_summary(mode: &str, args: &Args, elapsed_secs: f64) { - let throughput = if elapsed_secs > 0.0 { - args.operation_count as f64 / elapsed_secs +fn print_summary( + mode: &str, + args: &Args, + load_elapsed_secs: f64, + txn_elapsed_secs: f64, + total_elapsed_secs: f64, +) { + let throughput = if txn_elapsed_secs > 0.0 { + args.operation_count as f64 / txn_elapsed_secs + } else { + 0.0 + }; + let tps = throughput; + let new_order_tps = tps * (args.new_order_percent as f64 / 100.0); + let total_throughput = if total_elapsed_secs > 0.0 { + args.operation_count as f64 / total_elapsed_secs } else { 0.0 }; println!( - "tpcc benchmark mode={mode} warehouses={} districts={} customers={} items={} operations={} elapsed={:.3}s throughput={:.2} ops/s", + "tpcc benchmark mode={mode} connections={} warehouses={} districts={} customers={} items={} operations={} load_elapsed={:.3}s txn_elapsed={:.3}s total_elapsed={:.3}s throughput={:.2} ops/s tps={:.2} new_order_tps={:.2} total_throughput={:.2} ops/s", + args.connection_count, args.warehouses, args.districts_per_warehouse, args.customers_per_district, args.items, args.operation_count, - elapsed_secs, + load_elapsed_secs, + txn_elapsed_secs, + total_elapsed_secs, throughput, + tps, + new_order_tps, + total_throughput, ); } impl Args { fn proc_name(&self, proc_name: &str) -> String { - format!("{}/tpcc/{}", self.app_name, proc_name) + let suffix = if self.warehouse_partitioned { + format!("{proc_name}_partitioned") + } else { + proc_name.to_string() + }; + format!("{}/tpcc/{}", self.app_name, suffix) } } -fn init_schema_sync(xid: u128) -> RS<()> { - execute_sql_script(xid, include_str!("../../sql/ddl.sql"))?; +fn init_schema_sync(xid: u128, args: &Args) -> RS<()> { + if args.warehouse_partitioned { + let topology = load_sync_topology()?; + execute_statement_sync(xid, &build_partition_rule_sql(args))?; + execute_statement_sync(xid, &build_partition_placement_sql(args, &topology)?)?; + } + execute_sql_script(xid, schema_sql(args))?; execute_sql_script(xid, include_str!("../../sql/init.sql"))?; Ok(()) } +async fn init_schema_tcp(client: &mut AsyncClientImpl, session_id: u128, args: &Args) -> RS<()> { + if !args.warehouse_partitioned { + return Ok(()); + } + let topology = load_async_topology(&args.http_addr).await?; + execute_statement_tcp(client, &args.app_name, &build_partition_rule_sql(args)).await?; + execute_statement_tcp( + client, + &args.app_name, + &build_partition_placement_sql(args, &topology)?, + ) + .await?; + execute_sql_script_tcp(client, &args.app_name, schema_sql(args)).await?; + execute_sql_script_tcp(client, &args.app_name, include_str!("../../sql/init.sql")).await?; + let _ = session_id; + Ok(()) +} + fn execute_sql_script(xid: u128, sql_script: &str) -> RS<()> { for statement in split_sql_statements(sql_script) { - let _ = mudu_command(xid, sql_stmt!(&statement), sql_params!(&()))?; + execute_statement_sync(xid, &statement)?; + } + Ok(()) +} + +fn execute_statement_sync(xid: u128, statement: &str) -> RS<()> { + let _ = mudu_command(xid, sql_stmt!(&statement), sql_params!(&()))?; + Ok(()) +} + +async fn execute_sql_script_tcp( + client: &mut AsyncClientImpl, + app_name: &str, + sql_script: &str, +) -> RS<()> { + for statement in split_sql_statements(sql_script) { + execute_statement_tcp(client, app_name, &statement).await?; } Ok(()) } +async fn execute_statement_tcp( + client: &mut AsyncClientImpl, + app_name: &str, + statement: &str, +) -> RS<()> { + let _ = client + .execute(ClientRequest::new(app_name.to_string(), statement.to_string())) + .await?; + Ok(()) +} + +fn schema_sql(args: &Args) -> &'static str { + if args.warehouse_partitioned { + include_str!("../../sql/ddl_warehouse_partitioned.sql") + } else { + include_str!("../../sql/ddl.sql") + } +} + +fn run_seed_sync(xid: u128, args: &Args) -> RS<()> { + if args.warehouse_partitioned { + tpcc_seed_partitioned( + xid, + args.warehouses, + args.districts_per_warehouse, + args.customers_per_district, + args.items, + 100, + ) + } else { + tpcc_seed( + xid, + args.warehouses, + args.districts_per_warehouse, + args.customers_per_district, + args.items, + 100, + ) + } +} + +fn warehouse_for_op(op_index: usize, terminal_id: usize, args: &Args) -> i32 { + if !args.warehouse_partitioned { + return value_for(op_index, args.warehouses); + } + value_for(terminal_id, args.warehouses) +} + +fn load_sync_topology() -> RS { + let Some(http_addr) = mudu_adapter::config::mudud_http_addr() else { + return Err(m_error!( + NoneErr, + "warehouse-partitioned benchmark requires a mudud connection with http_addr" + )); + }; + let runtime = Builder::new_current_thread() + .enable_all() + .build() + .map_err(|e| m_error!(TokioErr, "build tpcc topology runtime error", e))?; + match runtime.block_on(fetch_server_topology(&http_addr)) { + Ok(topology) => Ok(topology), + Err(err) if is_server_topology_unsupported(&err) => Err(m_error!( + NoneErr, + "warehouse-partitioned benchmark requires server topology support" + )), + Err(err) => Err(m_error!(NetErr, err)), + } +} + +async fn load_async_topology(http_addr: &str) -> RS { + match fetch_server_topology(http_addr).await { + Ok(topology) => Ok(topology), + Err(err) if is_server_topology_unsupported(&err) => Err(m_error!( + NoneErr, + "warehouse-partitioned benchmark requires server topology support" + )), + Err(err) => Err(m_error!(NetErr, err)), + } +} + +fn build_partition_rule_sql(args: &Args) -> String { + let partitions = (1..=args.warehouses) + .map(|warehouse_id| { + format!( + "PARTITION p{warehouse_id} VALUES FROM ({warehouse_id}) TO ({})", + warehouse_id + 1 + ) + }) + .collect::>() + .join(", "); + format!( + "CREATE PARTITION RULE r_tpcc_wh RANGE (warehouse_id) ({partitions})" + ) +} + +fn build_partition_placement_sql(args: &Args, topology: &ServerTopology) -> RS { + if topology.workers.is_empty() { + return Err(m_error!(NoneErr, "server topology exposes no workers")); + } + let placements = (1..=args.warehouses) + .map(|warehouse_id| { + let worker = &topology.workers[(warehouse_id as usize - 1) % topology.workers.len()]; + format!("PARTITION p{warehouse_id} ON WORKER {}", worker.worker_id) + }) + .collect::>() + .join(", "); + Ok(format!( + "CREATE PARTITION PLACEMENT FOR RULE r_tpcc_wh ({placements})" + )) +} + fn split_sql_statements(sql_script: &str) -> Vec { let mut statements = Vec::new(); let mut current = String::new(); @@ -463,178 +806,5 @@ async fn main() { } #[cfg(all(test, target_os = "linux"))] -mod tests { - use super::{Args, BenchmarkMode, run_sync, run_tcp}; - use mududb::common::result::RS; - use mudu_runtime::backend::backend::Backend; - use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, ServerMode}; - use mudu_utils::notifier::{Notifier, notify_wait}; - use std::env; - use std::ffi::OsStr; - use std::fs; - use std::path::PathBuf; - use std::sync::OnceLock; - use std::thread::{self, JoinHandle}; - use std::time::{SystemTime, UNIX_EPOCH}; - use testing::{reserve_port, wait_until_port_ready}; - use tokio::sync::Mutex; - - fn test_lock() -> &'static Mutex<()> { - static LOCK: OnceLock> = OnceLock::new(); - LOCK.get_or_init(|| Mutex::new(())) - } - - fn temp_dir(prefix: &str) -> PathBuf { - let suffix = SystemTime::now() - .duration_since(UNIX_EPOCH) - .expect("system time before unix epoch") - .as_nanos(); - std::env::temp_dir().join(format!("tpcc_benchmark_{prefix}_{suffix}")) - } - - fn with_connection_env(value: &str, f: impl FnOnce() -> T) -> T { - let prev = env::var("MUDU_CONNECTION").ok(); - // SAFETY: guarded by test_lock so process env mutation is serialized in this test. - unsafe { env::set_var("MUDU_CONNECTION", value) }; - let result = f(); - match prev { - Some(prev) => { - // SAFETY: guarded by test_lock. - unsafe { env::set_var("MUDU_CONNECTION", prev) }; - } - None => { - // SAFETY: guarded by test_lock. - unsafe { env::remove_var("MUDU_CONNECTION") }; - } - } - result - } - - struct RunningServer { - stop: Notifier, - handle: JoinHandle>, - } - - impl RunningServer { - fn stop(self) -> RS<()> { - self.stop.notify_all(); - self.handle.join().map_err(|_| { - mududb::m_error!( - mududb::error::ec::EC::ThreadErr, - "join tpcc benchmark mudud thread error" - ) - })? - } - } - - fn start_backend() -> RS> { - let Some(http_port) = reserve_port()? else { - return Ok(None); - }; - let Some(tcp_port) = reserve_port()? else { - return Ok(None); - }; - let db_path = temp_dir("db"); - let mpk_path = temp_dir("mpk"); - fs::create_dir_all(&db_path).map_err(|e| { - mududb::m_error!( - mududb::error::ec::EC::IOErr, - "create tpcc benchmark db dir error", - e - ) - })?; - fs::create_dir_all(&mpk_path).map_err(|e| { - mududb::m_error!( - mududb::error::ec::EC::IOErr, - "create tpcc benchmark mpk dir error", - e - ) - })?; - let cfg = MuduDBCfg { - mpk_path: mpk_path.to_string_lossy().into_owned(), - db_path: db_path.to_string_lossy().into_owned(), - listen_ip: "127.0.0.1".to_string(), - http_listen_port: http_port, - pg_listen_port: 0, - tcp_listen_port: tcp_port, - server_mode: ServerMode::IOUring, - io_uring_worker_threads: 1, - ..Default::default() - }; - let (stop, waiter) = notify_wait(); - let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); - wait_until_port_ready(http_port, "HTTP")?; - wait_until_port_ready(tcp_port, "TCP")?; - Ok(Some((http_port, tcp_port, RunningServer { stop, handle }))) - } - - #[tokio::test(flavor = "current_thread")] - async fn tpcc_benchmark_runs_through_mudud_adapter() -> RS<()> { - let _guard = test_lock().lock().await; - let Some((_http_port, tcp_port, server)) = start_backend()? else { - return Ok(()); - }; - - let args = Args { - mode: BenchmarkMode::Interactive, - warehouses: 1, - districts_per_warehouse: 2, - customers_per_district: 8, - items: 16, - operation_count: 20, - connection_count: 1, - payment_percent: 40, - new_order_percent: 40, - enable_async: false, - app_name: "tpcc".to_string(), - tcp_addr: "127.0.0.1:9527".to_string(), - http_addr: "127.0.0.1:8300".to_string(), - mpk: None, - }; - - let connection = format!("mudud://127.0.0.1:{tcp_port}/default"); - let result = with_connection_env(&connection, || run_sync(args)); - let stop_result = server.stop(); - result?; - stop_result?; - Ok(()) - } - - #[tokio::test(flavor = "current_thread")] - async fn tpcc_benchmark_runs_through_tcp_mpk_mode() -> RS<()> { - let _guard = test_lock().lock().await; - let Some((http_port, tcp_port, server)) = start_backend()? else { - return Ok(()); - }; - - let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mpk_path = manifest_dir.join("mpk").join("tpcc.mpk"); - if mpk_path.extension() != Some(OsStr::new("mpk")) || !mpk_path.exists() { - let _ = server.stop(); - return Ok(()); - } - - let args = Args { - mode: BenchmarkMode::StoredProcedure, - warehouses: 1, - districts_per_warehouse: 2, - customers_per_district: 8, - items: 16, - operation_count: 20, - connection_count: 1, - payment_percent: 40, - new_order_percent: 40, - enable_async: false, - app_name: "tpcc".to_string(), - tcp_addr: format!("127.0.0.1:{tcp_port}"), - http_addr: format!("127.0.0.1:{http_port}"), - mpk: Some(mpk_path), - }; - - let result = run_tcp(args).await; - let stop_result = server.stop(); - result?; - stop_result?; - Ok(()) - } -} +#[path = "tpcc_benchmark_tests/mod.rs"] +mod tests; diff --git a/example/tpcc/src/bin/tpcc_benchmark_tests/interactive.rs b/example/tpcc/src/bin/tpcc_benchmark_tests/interactive.rs new file mode 100644 index 0000000..0f68db9 --- /dev/null +++ b/example/tpcc/src/bin/tpcc_benchmark_tests/interactive.rs @@ -0,0 +1,42 @@ +use super::{Args, BenchmarkMode, run_sync, start_backend, test_lock, with_connection_env}; +use mududb::common::result::RS; + +#[tokio::test(flavor = "current_thread")] +async fn tpcc_benchmark_runs_through_mudud_adapter() -> RS<()> { + let _guard = test_lock().lock().await; + let Some((_http_port, tcp_port, server)) = start_backend()? else { + eprintln!( + "tpcc benchmark test final stats: skipped because local test ports could not be reserved" + ); + return Ok(()); + }; + + let args = Args { + mode: BenchmarkMode::Interactive, + warehouses: 10, + districts_per_warehouse: 2, + customers_per_district: 8, + items: 16, + operation_count: 20, + connection_count: 2, + payment_percent: 40, + new_order_percent: 40, + enable_async: false, + warehouse_partitioned: false, + app_name: "tpcc".to_string(), + tcp_addr: "127.0.0.1:9527".to_string(), + http_addr: "127.0.0.1:8300".to_string(), + mpk: None, + }; + + let connection = format!("mudud://127.0.0.1:{tcp_port}/default"); + let result = with_connection_env(&connection, || run_sync(args.clone())); + let stop_result = server.stop(); + result?; + eprintln!( + "tpcc benchmark test final stats: mode=interactive adapter=mudud operations={} summary_emitted_by=tpcc-benchmark", + args.operation_count, + ); + stop_result?; + Ok(()) +} diff --git a/example/tpcc/src/bin/tpcc_benchmark_tests/mod.rs b/example/tpcc/src/bin/tpcc_benchmark_tests/mod.rs new file mode 100644 index 0000000..f5bf103 --- /dev/null +++ b/example/tpcc/src/bin/tpcc_benchmark_tests/mod.rs @@ -0,0 +1,113 @@ +use super::{Args, BenchmarkMode, run_sync, run_tcp}; +use mudu_runtime::backend::backend::Backend; +use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, ServerMode}; +use mudu_utils::notifier::{Notifier, notify_wait}; +use mududb::common::result::RS; +use std::env; +use std::ffi::OsStr; +use std::fs; +use std::path::PathBuf; +use std::sync::OnceLock; +use std::thread::{self, JoinHandle}; +use std::time::{SystemTime, UNIX_EPOCH}; +use testing::{reserve_port, wait_until_port_ready}; +use tokio::sync::Mutex; + +mod interactive; +mod partitioned; +mod tcp_mpk; + +pub(super) fn test_lock() -> &'static Mutex<()> { + static LOCK: OnceLock> = OnceLock::new(); + LOCK.get_or_init(|| Mutex::new(())) +} + +fn temp_dir(prefix: &str) -> PathBuf { + let suffix = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("system time before unix epoch") + .as_nanos(); + std::env::temp_dir().join(format!("tpcc_benchmark_{prefix}_{suffix}")) +} + +pub(super) fn with_connection_env(value: &str, f: impl FnOnce() -> T) -> T { + let prev = env::var("MUDU_CONNECTION").ok(); + // SAFETY: guarded by test_lock so process env mutation is serialized in this test. + unsafe { env::set_var("MUDU_CONNECTION", value) }; + let result = f(); + match prev { + Some(prev) => { + // SAFETY: guarded by test_lock. + unsafe { env::set_var("MUDU_CONNECTION", prev) }; + } + None => { + // SAFETY: guarded by test_lock. + unsafe { env::remove_var("MUDU_CONNECTION") }; + } + } + result +} + +pub(super) struct RunningServer { + stop: Notifier, + handle: JoinHandle>, +} + +impl RunningServer { + pub(super) fn stop(self) -> RS<()> { + self.stop.notify_all(); + self.handle.join().map_err(|_| { + mududb::m_error!( + mududb::error::ec::EC::ThreadErr, + "join tpcc benchmark mudud thread error" + ) + })? + } +} + +pub(super) fn start_backend() -> RS> { + let Some(http_port) = reserve_port()? else { + return Ok(None); + }; + let Some(tcp_port) = reserve_port()? else { + return Ok(None); + }; + let db_path = temp_dir("db"); + let mpk_path = temp_dir("mpk"); + fs::create_dir_all(&db_path).map_err(|e| { + mududb::m_error!( + mududb::error::ec::EC::IOErr, + "create tpcc benchmark db dir error", + e + ) + })?; + fs::create_dir_all(&mpk_path).map_err(|e| { + mududb::m_error!( + mududb::error::ec::EC::IOErr, + "create tpcc benchmark mpk dir error", + e + ) + })?; + let cfg = MuduDBCfg { + mpk_path: mpk_path.to_string_lossy().into_owned(), + db_path: db_path.to_string_lossy().into_owned(), + listen_ip: "127.0.0.1".to_string(), + http_listen_port: http_port, + pg_listen_port: 0, + tcp_listen_port: tcp_port, + server_mode: ServerMode::IOUring, + io_uring_worker_threads: 1, + ..Default::default() + }; + let (stop, waiter) = notify_wait(); + let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); + wait_until_port_ready(http_port, "HTTP")?; + wait_until_port_ready(tcp_port, "TCP")?; + Ok(Some((http_port, tcp_port, RunningServer { stop, handle }))) +} + +pub(super) fn tpcc_mpk_path() -> Option { + let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let mpk_path = manifest_dir.join("mpk").join("tpcc.mpk"); + (mpk_path.extension() == Some(OsStr::new("mpk")) && mpk_path.exists()).then_some(mpk_path) +} diff --git a/example/tpcc/src/bin/tpcc_benchmark_tests/partitioned.rs b/example/tpcc/src/bin/tpcc_benchmark_tests/partitioned.rs new file mode 100644 index 0000000..cdd86dd --- /dev/null +++ b/example/tpcc/src/bin/tpcc_benchmark_tests/partitioned.rs @@ -0,0 +1,37 @@ +use super::{Args, BenchmarkMode, run_sync, start_backend, test_lock, with_connection_env}; +use mududb::common::result::RS; + +#[tokio::test(flavor = "current_thread")] +async fn tpcc_benchmark_runs_partitioned_through_mudud_adapter() -> RS<()> { + let _guard = test_lock().lock().await; + let Some((http_port, tcp_port, server)) = start_backend()? else { + return Ok(()); + }; + + let args = Args { + mode: BenchmarkMode::Interactive, + warehouses: 2, + districts_per_warehouse: 2, + customers_per_district: 8, + items: 16, + operation_count: 20, + connection_count: 2, + payment_percent: 40, + new_order_percent: 40, + enable_async: false, + warehouse_partitioned: true, + app_name: "default".to_string(), + tcp_addr: format!("127.0.0.1:{tcp_port}"), + http_addr: format!("127.0.0.1:{http_port}"), + mpk: None, + }; + + let connection = + format!("mudud://127.0.0.1:{tcp_port}/default?http_addr=127.0.0.1:{http_port}"); + let result = with_connection_env(&connection, || run_sync(args)); + let stop_result = server.stop(); + result?; + stop_result?; + Ok(()) +} + diff --git a/example/tpcc/src/bin/tpcc_benchmark_tests/tcp_mpk.rs b/example/tpcc/src/bin/tpcc_benchmark_tests/tcp_mpk.rs new file mode 100644 index 0000000..5346720 --- /dev/null +++ b/example/tpcc/src/bin/tpcc_benchmark_tests/tcp_mpk.rs @@ -0,0 +1,76 @@ +use super::{Args, BenchmarkMode, run_tcp, start_backend, test_lock, tpcc_mpk_path}; +use mududb::common::result::RS; + +#[tokio::test(flavor = "current_thread")] +async fn tpcc_benchmark_runs_through_tcp_mpk_mode() -> RS<()> { + let _guard = test_lock().lock().await; + let Some((http_port, tcp_port, server)) = start_backend()? else { + return Ok(()); + }; + + let Some(mpk_path) = tpcc_mpk_path() else { + let _ = server.stop(); + return Ok(()); + }; + + let args = Args { + mode: BenchmarkMode::StoredProcedure, + warehouses: 1, + districts_per_warehouse: 2, + customers_per_district: 8, + items: 16, + operation_count: 20, + connection_count: 1, + payment_percent: 40, + new_order_percent: 40, + enable_async: false, + warehouse_partitioned: false, + app_name: "tpcc".to_string(), + tcp_addr: format!("127.0.0.1:{tcp_port}"), + http_addr: format!("127.0.0.1:{http_port}"), + mpk: Some(mpk_path), + }; + + let result = run_tcp(args).await; + let stop_result = server.stop(); + result?; + stop_result?; + Ok(()) +} + +#[tokio::test(flavor = "current_thread")] +async fn tpcc_benchmark_warehouse_partition_aware_mode_runs_through_tcp_mpk() -> RS<()> { + let _guard = test_lock().lock().await; + let Some((http_port, tcp_port, server)) = start_backend()? else { + return Ok(()); + }; + + let Some(mpk_path) = tpcc_mpk_path() else { + let _ = server.stop(); + return Ok(()); + }; + + let args = Args { + mode: BenchmarkMode::StoredProcedure, + warehouses: 2, + districts_per_warehouse: 3, + customers_per_district: 8, + items: 16, + operation_count: 24, + connection_count: 2, + payment_percent: 40, + new_order_percent: 40, + enable_async: false, + warehouse_partitioned: true, + app_name: "tpcc".to_string(), + tcp_addr: format!("127.0.0.1:{tcp_port}"), + http_addr: format!("127.0.0.1:{http_port}"), + mpk: Some(mpk_path), + }; + + let result = run_tcp(args).await; + let stop_result = server.stop(); + result?; + stop_result?; + Ok(()) +} diff --git a/example/tpcc/src/generated/procedure.rs b/example/tpcc/src/generated/procedure.rs index dd608b1..d94da90 100644 --- a/example/tpcc/src/generated/procedure.rs +++ b/example/tpcc/src/generated/procedure.rs @@ -11,10 +11,10 @@ use crate::generated::stock::object::Stock; use crate::generated::warehouse::object::Warehouse; use mududb::common::result::RS; use mududb::common::xid::XID; -use mududb::error::ec::EC::MuduError; -use mududb::m_error; use mududb::contract::database::entity::Entity; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::MuduError; +use mududb::m_error; use mududb::sys_interface::async_api::{mudu_command, mudu_query}; async fn query_one_entity( @@ -64,14 +64,14 @@ fn required_string(value: &Option, field: &str) -> RS { .ok_or_else(|| m_error!(MuduError, format!("entity field is null: {field}"))) } -/**mudu-proc**/ -pub async fn tpcc_seed( +async fn tpcc_seed_inner( xid: XID, warehouse_count: i32, district_count: i32, customer_count: i32, item_count: i32, initial_stock: i32, + warehouse_partitioned: bool, ) -> RS<()> { require_positive("warehouse_count", warehouse_count)?; require_positive("district_count", district_count)?; @@ -79,12 +79,26 @@ pub async fn tpcc_seed( require_positive("item_count", item_count)?; require_positive("initial_stock", initial_stock)?; - for item_id in 1..=item_count { - mudu_command( - xid, - sql_stmt!(&"INSERT INTO item (i_id, i_name, i_price) VALUES (?, ?, ?)"), - sql_params!(&(item_id, item_name(item_id), item_id * 10)), - ).await?; + if warehouse_partitioned { + for warehouse_id in 1..=warehouse_count { + for item_id in 1..=item_count { + mudu_command( + xid, + sql_stmt!( + &"INSERT INTO item (i_w_id, i_id, i_name, i_price) VALUES (?, ?, ?, ?)" + ), + sql_params!(&(warehouse_id, item_id, item_name(item_id), item_id * 10)), + ).await?; + } + } + } else { + for item_id in 1..=item_count { + mudu_command( + xid, + sql_stmt!(&"INSERT INTO item (i_id, i_name, i_price) VALUES (?, ?, ?)"), + sql_params!(&(item_id, item_name(item_id), item_id * 10)), + ).await?; + } } for warehouse_id in 1..=warehouse_count { mudu_command( @@ -139,8 +153,7 @@ pub async fn tpcc_seed( Ok(()) } -/**mudu-proc**/ -pub async fn tpcc_new_order( +async fn tpcc_new_order_inner( xid: XID, warehouse_id: i32, district_id: i32, @@ -148,11 +161,22 @@ pub async fn tpcc_new_order( item_ids: Vec, supplier_warehouse_ids: Vec, quantities: Vec, + warehouse_partitioned: bool, ) -> RS { require_positive("warehouse_id", warehouse_id)?; require_positive("district_id", district_id)?; require_positive("customer_id", customer_id)?; validate_order_lines(&item_ids, &supplier_warehouse_ids, &quantities)?; + if warehouse_partitioned + && supplier_warehouse_ids + .iter() + .any(|&supplier_warehouse_id| supplier_warehouse_id != warehouse_id) + { + return Err(m_error!( + MuduError, + "partitioned tpcc_new_order requires local supplier warehouses" + )); + } let district = query_one_entity::( xid, @@ -206,11 +230,19 @@ pub async fn tpcc_new_order( .zip(quantities.iter()) .enumerate() { - let item = query_one_entity::( - xid, - "SELECT i_id, i_name, i_price FROM item WHERE i_id = ?", - sql_params!(&(item_id,)), - ).await?; + let item = if warehouse_partitioned { + query_one_entity::( + xid, + "SELECT i_id, i_name, i_price FROM item WHERE i_w_id = ? AND i_id = ?", + sql_params!(&(warehouse_id, item_id)), + ).await? + } else { + query_one_entity::( + xid, + "SELECT i_id, i_name, i_price FROM item WHERE i_id = ?", + sql_params!(&(item_id,)), + ).await? + }; let item_price = required_i32(item.get_i_price(), "item.i_price")?; let stock = query_one_entity::( xid, @@ -281,13 +313,13 @@ pub async fn tpcc_new_order( )) } -/**mudu-proc**/ -pub async fn tpcc_payment( +async fn tpcc_payment_inner( xid: XID, warehouse_id: i32, district_id: i32, customer_id: i32, amount: i32, + warehouse_partitioned: bool, ) -> RS { require_positive("warehouse_id", warehouse_id)?; require_positive("district_id", district_id)?; @@ -341,25 +373,150 @@ pub async fn tpcc_payment( customer_id )), ).await?; - mudu_command( - xid, - sql_stmt!( - &"INSERT INTO history (h_id, h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_w_id, h_amount, h_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" - ), - sql_params!(&( - mududb::sys::random::next_uuid_v4_string(), - customer_id, - district_id, - warehouse_id, - district_id, - warehouse_id, - amount, - format!("payment warehouse={warehouse_id} district={district_id}") - )), - ).await?; + if warehouse_partitioned { + mudu_command( + xid, + sql_stmt!( + &"INSERT INTO history (h_w_id, h_id, h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_amount, h_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" + ), + sql_params!(&( + warehouse_id, + mududb::sys::random::next_uuid_v4_string(), + customer_id, + district_id, + warehouse_id, + district_id, + amount, + format!("payment warehouse={warehouse_id} district={district_id}") + )), + ).await?; + } else { + mudu_command( + xid, + sql_stmt!( + &"INSERT INTO history (h_id, h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_w_id, h_amount, h_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" + ), + sql_params!(&( + mududb::sys::random::next_uuid_v4_string(), + customer_id, + district_id, + warehouse_id, + district_id, + warehouse_id, + amount, + format!("payment warehouse={warehouse_id} district={district_id}") + )), + ).await?; + } Ok(next_c_balance) } +/**mudu-proc**/ +pub async fn tpcc_seed( + xid: XID, + warehouse_count: i32, + district_count: i32, + customer_count: i32, + item_count: i32, + initial_stock: i32, +) -> RS<()> { + tpcc_seed_inner( + xid, + warehouse_count, + district_count, + customer_count, + item_count, + initial_stock, + false, + ).await +} + +/**mudu-proc**/ +pub async fn tpcc_seed_partitioned( + xid: XID, + warehouse_count: i32, + district_count: i32, + customer_count: i32, + item_count: i32, + initial_stock: i32, +) -> RS<()> { + tpcc_seed_inner( + xid, + warehouse_count, + district_count, + customer_count, + item_count, + initial_stock, + true, + ).await +} + +/**mudu-proc**/ +pub async fn tpcc_new_order( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + item_ids: Vec, + supplier_warehouse_ids: Vec, + quantities: Vec, +) -> RS { + tpcc_new_order_inner( + xid, + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + false, + ).await +} + +/**mudu-proc**/ +pub async fn tpcc_new_order_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + item_ids: Vec, + supplier_warehouse_ids: Vec, + quantities: Vec, +) -> RS { + tpcc_new_order_inner( + xid, + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + true, + ).await +} + +/**mudu-proc**/ +pub async fn tpcc_payment( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + amount: i32, +) -> RS { + tpcc_payment_inner(xid, warehouse_id, district_id, customer_id, amount, false).await +} + +/**mudu-proc**/ +pub async fn tpcc_payment_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + amount: i32, +) -> RS { + tpcc_payment_inner(xid, warehouse_id, district_id, customer_id, amount, true).await +} + /**mudu-proc**/ pub async fn tpcc_order_status( xid: XID, @@ -384,6 +541,16 @@ pub async fn tpcc_order_status( required_string(order.get_o_status(), "orders.o_status") } +/**mudu-proc**/ +pub async fn tpcc_order_status_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, +) -> RS { + tpcc_order_status(xid, warehouse_id, district_id, customer_id).await +} + /**mudu-proc**/ pub async fn tpcc_delivery(xid: XID, warehouse_id: i32, district_id: i32, carrier_id: i32) -> RS { require_positive("warehouse_id", warehouse_id)?; @@ -445,6 +612,16 @@ pub async fn tpcc_delivery(xid: XID, warehouse_id: i32, district_id: i32, carrie Ok(format!("delivered order={order_id} carrier={carrier_id}")) } +/**mudu-proc**/ +pub async fn tpcc_delivery_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + carrier_id: i32, +) -> RS { + tpcc_delivery(xid, warehouse_id, district_id, carrier_id).await +} + /**mudu-proc**/ pub async fn tpcc_stock_level(xid: XID, warehouse_id: i32, district_id: i32, threshold: i32) -> RS { require_positive("warehouse_id", warehouse_id)?; @@ -457,6 +634,16 @@ pub async fn tpcc_stock_level(xid: XID, warehouse_id: i32, district_id: i32, thr ).await } +/**mudu-proc**/ +pub async fn tpcc_stock_level_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + threshold: i32, +) -> RS { + tpcc_stock_level(xid, warehouse_id, district_id, threshold).await +} + #[cfg(test)] mod tests { use super::{ @@ -464,9 +651,9 @@ mod tests { }; use crate::test_lock; use mududb::contract::{sql_params, sql_stmt}; + use mududb::sys_interface::async_api::{mudu_batch, mudu_close, mudu_open}; use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; - use mududb::sys_interface::async_api::{mudu_batch, mudu_close, mudu_open}; fn temp_db_path(name: &str) -> PathBuf { let suffix = SystemTime::now() @@ -509,947 +696,1890 @@ mod tests { mudu_close(xid).await.unwrap(); } -} -async fn mp2_tpcc_new_order(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_tpcc_new_order, - ).await -} - -pub async fn mudu_inner_p2_tpcc_new_order( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = tpcc_new_order( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - Vec, - _, - >(¶m.param_list()[3], "Vec")?, - - - - ::mududb::types::datum::value_to_typed::< - Vec, - _, - >(¶m.param_list()[4], "Vec")?, - - - - ::mududb::types::datum::value_to_typed::< - Vec, - _, - >(¶m.param_list()[5], "Vec")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_tpcc_new_order() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "warehouse_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "district_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "customer_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "item_ids".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "supplier_warehouse_ids".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "quantities".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_tpcc_new_order() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_tpcc_new_order() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "tpcc".to_string(), - "tpcc_new_order".to_string(), - mudu_argv_desc_tpcc_new_order().clone(), - mudu_result_desc_tpcc_new_order().clone(), - false - ) - }) -} - -mod mod_tpcc_new_order { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-tpcc-new-order; - world mudu-app-mp2-tpcc-new-order { - export mp2-tpcc-new-order: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTpccNewOrder {} - - impl Guest for GuestTpccNewOrder { - async fn mp2_tpcc_new_order(param:Vec) -> Vec { - super::mp2_tpcc_new_order(param).await - } - } - - export!(GuestTpccNewOrder); -} -async fn mp2_tpcc_delivery(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_tpcc_delivery, - ).await -} - -pub async fn mudu_inner_p2_tpcc_delivery( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = tpcc_delivery( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_tpcc_delivery() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "warehouse_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "district_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "carrier_id".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_tpcc_delivery() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_tpcc_delivery() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "tpcc".to_string(), - "tpcc_delivery".to_string(), - mudu_argv_desc_tpcc_delivery().clone(), - mudu_result_desc_tpcc_delivery().clone(), - false - ) - }) -} - -mod mod_tpcc_delivery { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-tpcc-delivery; - world mudu-app-mp2-tpcc-delivery { - export mp2-tpcc-delivery: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTpccDelivery {} - - impl Guest for GuestTpccDelivery { - async fn mp2_tpcc_delivery(param:Vec) -> Vec { - super::mp2_tpcc_delivery(param).await - } - } - - export!(GuestTpccDelivery); -} -async fn mp2_tpcc_seed(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_tpcc_seed, - ).await -} - -pub async fn mudu_inner_p2_tpcc_seed( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = tpcc_seed( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[3], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[4], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_tpcc_seed() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "warehouse_count".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "district_count".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "customer_count".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "item_count".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "initial_stock".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_tpcc_seed() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_tpcc_seed() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "tpcc".to_string(), - "tpcc_seed".to_string(), - mudu_argv_desc_tpcc_seed().clone(), - mudu_result_desc_tpcc_seed().clone(), - false - ) - }) -} - -mod mod_tpcc_seed { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-tpcc-seed; - world mudu-app-mp2-tpcc-seed { - export mp2-tpcc-seed: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTpccSeed {} - - impl Guest for GuestTpccSeed { - async fn mp2_tpcc_seed(param:Vec) -> Vec { - super::mp2_tpcc_seed(param).await - } - } - - export!(GuestTpccSeed); -} -async fn mp2_tpcc_payment(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_tpcc_payment, - ).await -} - -pub async fn mudu_inner_p2_tpcc_payment( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = tpcc_payment( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[3], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "i32")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_tpcc_payment() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "warehouse_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "district_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "customer_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "amount".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_tpcc_payment() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_tpcc_payment() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "tpcc".to_string(), - "tpcc_payment".to_string(), - mudu_argv_desc_tpcc_payment().clone(), - mudu_result_desc_tpcc_payment().clone(), - false - ) - }) -} - -mod mod_tpcc_payment { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-tpcc-payment; - world mudu-app-mp2-tpcc-payment { - export mp2-tpcc-payment: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTpccPayment {} - - impl Guest for GuestTpccPayment { - async fn mp2_tpcc_payment(param:Vec) -> Vec { - super::mp2_tpcc_payment(param).await - } - } - - export!(GuestTpccPayment); -} -async fn mp2_tpcc_stock_level(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_tpcc_stock_level, - ).await -} - -pub async fn mudu_inner_p2_tpcc_stock_level( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = tpcc_stock_level( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "i32")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_tpcc_stock_level() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "warehouse_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "district_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "threshold".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_tpcc_stock_level() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_tpcc_stock_level() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "tpcc".to_string(), - "tpcc_stock_level".to_string(), - mudu_argv_desc_tpcc_stock_level().clone(), - mudu_result_desc_tpcc_stock_level().clone(), - false - ) - }) -} - -mod mod_tpcc_stock_level { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-tpcc-stock-level; - world mudu-app-mp2-tpcc-stock-level { - export mp2-tpcc-stock-level: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTpccStockLevel {} - - impl Guest for GuestTpccStockLevel { - async fn mp2_tpcc_stock_level(param:Vec) -> Vec { - super::mp2_tpcc_stock_level(param).await - } - } - - export!(GuestTpccStockLevel); -} -async fn mp2_tpcc_order_status(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_tpcc_order_status, - ).await -} - -pub async fn mudu_inner_p2_tpcc_order_status( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = tpcc_order_status( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_tpcc_order_status() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "warehouse_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "district_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "customer_id".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_tpcc_order_status() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_tpcc_order_status() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "tpcc".to_string(), - "tpcc_order_status".to_string(), - mudu_argv_desc_tpcc_order_status().clone(), - mudu_result_desc_tpcc_order_status().clone(), - false - ) - }) -} - -mod mod_tpcc_order_status { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-tpcc-order-status; - world mudu-app-mp2-tpcc-order-status { - export mp2-tpcc-order-status: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTpccOrderStatus {} - - impl Guest for GuestTpccOrderStatus { - async fn mp2_tpcc_order_status(param:Vec) -> Vec { - super::mp2_tpcc_order_status(param).await - } - } - - export!(GuestTpccOrderStatus); -} \ No newline at end of file +} +async fn mp2_tpcc_seed_partitioned(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_seed_partitioned, + ).await +} + +pub async fn mudu_inner_p2_tpcc_seed_partitioned( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_seed_partitioned( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[3], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[4], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_seed_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "item_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "initial_stock".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_seed_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_seed_partitioned() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_seed_partitioned".to_string(), + mudu_argv_desc_tpcc_seed_partitioned().clone(), + mudu_result_desc_tpcc_seed_partitioned().clone(), + false + ) + }) +} + +mod mod_tpcc_seed_partitioned { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-seed-partitioned; + world mudu-app-mp2-tpcc-seed-partitioned { + export mp2-tpcc-seed-partitioned: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccSeedPartitioned {} + + impl Guest for GuestTpccSeedPartitioned { + async fn mp2_tpcc_seed_partitioned(param:Vec) -> Vec { + super::mp2_tpcc_seed_partitioned(param).await + } + } + + export!(GuestTpccSeedPartitioned); +} +async fn mp2_tpcc_payment_partitioned(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_payment_partitioned, + ).await +} + +pub async fn mudu_inner_p2_tpcc_payment_partitioned( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_payment_partitioned( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[3], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "i32")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_payment_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_payment_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_payment_partitioned() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_payment_partitioned".to_string(), + mudu_argv_desc_tpcc_payment_partitioned().clone(), + mudu_result_desc_tpcc_payment_partitioned().clone(), + false + ) + }) +} + +mod mod_tpcc_payment_partitioned { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-payment-partitioned; + world mudu-app-mp2-tpcc-payment-partitioned { + export mp2-tpcc-payment-partitioned: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccPaymentPartitioned {} + + impl Guest for GuestTpccPaymentPartitioned { + async fn mp2_tpcc_payment_partitioned(param:Vec) -> Vec { + super::mp2_tpcc_payment_partitioned(param).await + } + } + + export!(GuestTpccPaymentPartitioned); +} +async fn mp2_tpcc_delivery_partitioned(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_delivery_partitioned, + ).await +} + +pub async fn mudu_inner_p2_tpcc_delivery_partitioned( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_delivery_partitioned( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_delivery_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "carrier_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_delivery_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_delivery_partitioned() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_delivery_partitioned".to_string(), + mudu_argv_desc_tpcc_delivery_partitioned().clone(), + mudu_result_desc_tpcc_delivery_partitioned().clone(), + false + ) + }) +} + +mod mod_tpcc_delivery_partitioned { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-delivery-partitioned; + world mudu-app-mp2-tpcc-delivery-partitioned { + export mp2-tpcc-delivery-partitioned: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccDeliveryPartitioned {} + + impl Guest for GuestTpccDeliveryPartitioned { + async fn mp2_tpcc_delivery_partitioned(param:Vec) -> Vec { + super::mp2_tpcc_delivery_partitioned(param).await + } + } + + export!(GuestTpccDeliveryPartitioned); +} +async fn mp2_tpcc_stock_level_partitioned(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_stock_level_partitioned, + ).await +} + +pub async fn mudu_inner_p2_tpcc_stock_level_partitioned( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_stock_level_partitioned( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "i32")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_stock_level_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "threshold".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_stock_level_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_stock_level_partitioned() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_stock_level_partitioned".to_string(), + mudu_argv_desc_tpcc_stock_level_partitioned().clone(), + mudu_result_desc_tpcc_stock_level_partitioned().clone(), + false + ) + }) +} + +mod mod_tpcc_stock_level_partitioned { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-stock-level-partitioned; + world mudu-app-mp2-tpcc-stock-level-partitioned { + export mp2-tpcc-stock-level-partitioned: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccStockLevelPartitioned {} + + impl Guest for GuestTpccStockLevelPartitioned { + async fn mp2_tpcc_stock_level_partitioned(param:Vec) -> Vec { + super::mp2_tpcc_stock_level_partitioned(param).await + } + } + + export!(GuestTpccStockLevelPartitioned); +} +async fn mp2_tpcc_delivery(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_delivery, + ).await +} + +pub async fn mudu_inner_p2_tpcc_delivery( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_delivery( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_delivery() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "carrier_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_delivery() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_delivery() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_delivery".to_string(), + mudu_argv_desc_tpcc_delivery().clone(), + mudu_result_desc_tpcc_delivery().clone(), + false + ) + }) +} + +mod mod_tpcc_delivery { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-delivery; + world mudu-app-mp2-tpcc-delivery { + export mp2-tpcc-delivery: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccDelivery {} + + impl Guest for GuestTpccDelivery { + async fn mp2_tpcc_delivery(param:Vec) -> Vec { + super::mp2_tpcc_delivery(param).await + } + } + + export!(GuestTpccDelivery); +} +async fn mp2_tpcc_new_order(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_new_order, + ).await +} + +pub async fn mudu_inner_p2_tpcc_new_order( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_new_order( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[3], "Vec")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[4], "Vec")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[5], "Vec")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_new_order() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "item_ids".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "supplier_warehouse_ids".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "quantities".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_new_order() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_new_order() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_new_order".to_string(), + mudu_argv_desc_tpcc_new_order().clone(), + mudu_result_desc_tpcc_new_order().clone(), + false + ) + }) +} + +mod mod_tpcc_new_order { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-new-order; + world mudu-app-mp2-tpcc-new-order { + export mp2-tpcc-new-order: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccNewOrder {} + + impl Guest for GuestTpccNewOrder { + async fn mp2_tpcc_new_order(param:Vec) -> Vec { + super::mp2_tpcc_new_order(param).await + } + } + + export!(GuestTpccNewOrder); +} +async fn mp2_tpcc_new_order_partitioned(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_new_order_partitioned, + ).await +} + +pub async fn mudu_inner_p2_tpcc_new_order_partitioned( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_new_order_partitioned( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[3], "Vec")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[4], "Vec")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[5], "Vec")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_new_order_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "item_ids".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "supplier_warehouse_ids".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "quantities".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_new_order_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_new_order_partitioned() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_new_order_partitioned".to_string(), + mudu_argv_desc_tpcc_new_order_partitioned().clone(), + mudu_result_desc_tpcc_new_order_partitioned().clone(), + false + ) + }) +} + +mod mod_tpcc_new_order_partitioned { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-new-order-partitioned; + world mudu-app-mp2-tpcc-new-order-partitioned { + export mp2-tpcc-new-order-partitioned: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccNewOrderPartitioned {} + + impl Guest for GuestTpccNewOrderPartitioned { + async fn mp2_tpcc_new_order_partitioned(param:Vec) -> Vec { + super::mp2_tpcc_new_order_partitioned(param).await + } + } + + export!(GuestTpccNewOrderPartitioned); +} +async fn mp2_tpcc_payment(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_payment, + ).await +} + +pub async fn mudu_inner_p2_tpcc_payment( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_payment( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[3], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "i32")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_payment() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_payment() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_payment() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_payment".to_string(), + mudu_argv_desc_tpcc_payment().clone(), + mudu_result_desc_tpcc_payment().clone(), + false + ) + }) +} + +mod mod_tpcc_payment { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-payment; + world mudu-app-mp2-tpcc-payment { + export mp2-tpcc-payment: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccPayment {} + + impl Guest for GuestTpccPayment { + async fn mp2_tpcc_payment(param:Vec) -> Vec { + super::mp2_tpcc_payment(param).await + } + } + + export!(GuestTpccPayment); +} +async fn mp2_tpcc_order_status(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_order_status, + ).await +} + +pub async fn mudu_inner_p2_tpcc_order_status( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_order_status( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_order_status() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_order_status() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_order_status() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_order_status".to_string(), + mudu_argv_desc_tpcc_order_status().clone(), + mudu_result_desc_tpcc_order_status().clone(), + false + ) + }) +} + +mod mod_tpcc_order_status { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-order-status; + world mudu-app-mp2-tpcc-order-status { + export mp2-tpcc-order-status: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccOrderStatus {} + + impl Guest for GuestTpccOrderStatus { + async fn mp2_tpcc_order_status(param:Vec) -> Vec { + super::mp2_tpcc_order_status(param).await + } + } + + export!(GuestTpccOrderStatus); +} +async fn mp2_tpcc_seed(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_seed, + ).await +} + +pub async fn mudu_inner_p2_tpcc_seed( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_seed( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[3], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[4], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_seed() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "item_count".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "initial_stock".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_seed() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_seed() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_seed".to_string(), + mudu_argv_desc_tpcc_seed().clone(), + mudu_result_desc_tpcc_seed().clone(), + false + ) + }) +} + +mod mod_tpcc_seed { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-seed; + world mudu-app-mp2-tpcc-seed { + export mp2-tpcc-seed: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccSeed {} + + impl Guest for GuestTpccSeed { + async fn mp2_tpcc_seed(param:Vec) -> Vec { + super::mp2_tpcc_seed(param).await + } + } + + export!(GuestTpccSeed); +} +async fn mp2_tpcc_order_status_partitioned(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_order_status_partitioned, + ).await +} + +pub async fn mudu_inner_p2_tpcc_order_status_partitioned( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_order_status_partitioned( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_order_status_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "customer_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_order_status_partitioned() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_order_status_partitioned() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_order_status_partitioned".to_string(), + mudu_argv_desc_tpcc_order_status_partitioned().clone(), + mudu_result_desc_tpcc_order_status_partitioned().clone(), + false + ) + }) +} + +mod mod_tpcc_order_status_partitioned { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-order-status-partitioned; + world mudu-app-mp2-tpcc-order-status-partitioned { + export mp2-tpcc-order-status-partitioned: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccOrderStatusPartitioned {} + + impl Guest for GuestTpccOrderStatusPartitioned { + async fn mp2_tpcc_order_status_partitioned(param:Vec) -> Vec { + super::mp2_tpcc_order_status_partitioned(param).await + } + } + + export!(GuestTpccOrderStatusPartitioned); +} +async fn mp2_tpcc_stock_level(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_tpcc_stock_level, + ).await +} + +pub async fn mudu_inner_p2_tpcc_stock_level( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = tpcc_stock_level( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "i32")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_tpcc_stock_level() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "warehouse_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "district_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "threshold".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_tpcc_stock_level() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_tpcc_stock_level() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "tpcc".to_string(), + "tpcc_stock_level".to_string(), + mudu_argv_desc_tpcc_stock_level().clone(), + mudu_result_desc_tpcc_stock_level().clone(), + false + ) + }) +} + +mod mod_tpcc_stock_level { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-tpcc-stock-level; + world mudu-app-mp2-tpcc-stock-level { + export mp2-tpcc-stock-level: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTpccStockLevel {} + + impl Guest for GuestTpccStockLevel { + async fn mp2_tpcc_stock_level(param:Vec) -> Vec { + super::mp2_tpcc_stock_level(param).await + } + } + + export!(GuestTpccStockLevel); +} \ No newline at end of file diff --git a/example/tpcc/src/rust/procedure.rs b/example/tpcc/src/rust/procedure.rs index 5733eb7..ad90b06 100644 --- a/example/tpcc/src/rust/procedure.rs +++ b/example/tpcc/src/rust/procedure.rs @@ -11,12 +11,13 @@ use crate::rust::stock::object::Stock; use crate::rust::warehouse::object::Warehouse; use mududb::common::result::RS; use mududb::common::xid::XID; -use mududb::error::ec::EC::MuduError; -use mududb::m_error; use mududb::contract::database::entity::Entity; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::MuduError; +use mududb::m_error; use mududb::sys_interface::sync_api::{mudu_command, mudu_query}; + fn query_one_entity( xid: XID, sql: &str, @@ -64,14 +65,14 @@ fn required_string(value: &Option, field: &str) -> RS { .ok_or_else(|| m_error!(MuduError, format!("entity field is null: {field}"))) } -/**mudu-proc**/ -pub fn tpcc_seed( +fn tpcc_seed_inner( xid: XID, warehouse_count: i32, district_count: i32, customer_count: i32, item_count: i32, initial_stock: i32, + warehouse_partitioned: bool, ) -> RS<()> { require_positive("warehouse_count", warehouse_count)?; require_positive("district_count", district_count)?; @@ -79,12 +80,26 @@ pub fn tpcc_seed( require_positive("item_count", item_count)?; require_positive("initial_stock", initial_stock)?; - for item_id in 1..=item_count { - mudu_command( - xid, - sql_stmt!(&"INSERT INTO item (i_id, i_name, i_price) VALUES (?, ?, ?)"), - sql_params!(&(item_id, item_name(item_id), item_id * 10)), - )?; + if warehouse_partitioned { + for warehouse_id in 1..=warehouse_count { + for item_id in 1..=item_count { + mudu_command( + xid, + sql_stmt!( + &"INSERT INTO item (i_w_id, i_id, i_name, i_price) VALUES (?, ?, ?, ?)" + ), + sql_params!(&(warehouse_id, item_id, item_name(item_id), item_id * 10)), + )?; + } + } + } else { + for item_id in 1..=item_count { + mudu_command( + xid, + sql_stmt!(&"INSERT INTO item (i_id, i_name, i_price) VALUES (?, ?, ?)"), + sql_params!(&(item_id, item_name(item_id), item_id * 10)), + )?; + } } for warehouse_id in 1..=warehouse_count { mudu_command( @@ -139,8 +154,7 @@ pub fn tpcc_seed( Ok(()) } -/**mudu-proc**/ -pub fn tpcc_new_order( +fn tpcc_new_order_inner( xid: XID, warehouse_id: i32, district_id: i32, @@ -148,11 +162,22 @@ pub fn tpcc_new_order( item_ids: Vec, supplier_warehouse_ids: Vec, quantities: Vec, + warehouse_partitioned: bool, ) -> RS { require_positive("warehouse_id", warehouse_id)?; require_positive("district_id", district_id)?; require_positive("customer_id", customer_id)?; validate_order_lines(&item_ids, &supplier_warehouse_ids, &quantities)?; + if warehouse_partitioned + && supplier_warehouse_ids + .iter() + .any(|&supplier_warehouse_id| supplier_warehouse_id != warehouse_id) + { + return Err(m_error!( + MuduError, + "partitioned tpcc_new_order requires local supplier warehouses" + )); + } let district = query_one_entity::( xid, @@ -161,11 +186,13 @@ pub fn tpcc_new_order( )?; let next_order_id = required_i32(district.get_d_next_o_id(), "district.d_next_o_id")?; let next_d_next_o_id = next_order_id + 1; + query_one_entity::( xid, "SELECT c_id, c_d_id, c_w_id, c_first, c_last, c_discount, c_credit, c_balance, c_ytd_payment, c_payment_cnt, c_delivery_cnt, c_last_order_id FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?", sql_params!(&(warehouse_id, district_id, customer_id)), )?; + mudu_command( xid, sql_stmt!(&"UPDATE district SET d_next_o_id = ? WHERE d_w_id = ? AND d_id = ?"), @@ -206,11 +233,19 @@ pub fn tpcc_new_order( .zip(quantities.iter()) .enumerate() { - let item = query_one_entity::( - xid, - "SELECT i_id, i_name, i_price FROM item WHERE i_id = ?", - sql_params!(&(item_id,)), - )?; + let item = if warehouse_partitioned { + query_one_entity::( + xid, + "SELECT i_id, i_name, i_price FROM item WHERE i_w_id = ? AND i_id = ?", + sql_params!(&(warehouse_id, item_id)), + )? + } else { + query_one_entity::( + xid, + "SELECT i_id, i_name, i_price FROM item WHERE i_id = ?", + sql_params!(&(item_id,)), + )? + }; let item_price = required_i32(item.get_i_price(), "item.i_price")?; let stock = query_one_entity::( xid, @@ -281,14 +316,15 @@ pub fn tpcc_new_order( )) } -/**mudu-proc**/ -pub fn tpcc_payment( +fn tpcc_payment_inner( xid: XID, warehouse_id: i32, district_id: i32, customer_id: i32, amount: i32, + warehouse_partitioned: bool, ) -> RS { + require_positive("warehouse_id", warehouse_id)?; require_positive("district_id", district_id)?; require_positive("customer_id", customer_id)?; @@ -341,25 +377,150 @@ pub fn tpcc_payment( customer_id )), )?; - mudu_command( - xid, - sql_stmt!( - &"INSERT INTO history (h_id, h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_w_id, h_amount, h_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" - ), - sql_params!(&( - mududb::sys::random::next_uuid_v4_string(), - customer_id, - district_id, - warehouse_id, - district_id, - warehouse_id, - amount, - format!("payment warehouse={warehouse_id} district={district_id}") - )), - )?; + if warehouse_partitioned { + mudu_command( + xid, + sql_stmt!( + &"INSERT INTO history (h_w_id, h_id, h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_amount, h_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" + ), + sql_params!(&( + warehouse_id, + mududb::sys::random::next_uuid_v4_string(), + customer_id, + district_id, + warehouse_id, + district_id, + amount, + format!("payment warehouse={warehouse_id} district={district_id}") + )), + )?; + } else { + mudu_command( + xid, + sql_stmt!( + &"INSERT INTO history (h_id, h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_w_id, h_amount, h_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" + ), + sql_params!(&( + mududb::sys::random::next_uuid_v4_string(), + customer_id, + district_id, + warehouse_id, + district_id, + warehouse_id, + amount, + format!("payment warehouse={warehouse_id} district={district_id}") + )), + )?; + } Ok(next_c_balance) } +/**mudu-proc**/ +pub fn tpcc_seed( + xid: XID, + warehouse_count: i32, + district_count: i32, + customer_count: i32, + item_count: i32, + initial_stock: i32, +) -> RS<()> { + tpcc_seed_inner( + xid, + warehouse_count, + district_count, + customer_count, + item_count, + initial_stock, + false, + ) +} + +/**mudu-proc**/ +pub fn tpcc_seed_partitioned( + xid: XID, + warehouse_count: i32, + district_count: i32, + customer_count: i32, + item_count: i32, + initial_stock: i32, +) -> RS<()> { + tpcc_seed_inner( + xid, + warehouse_count, + district_count, + customer_count, + item_count, + initial_stock, + true, + ) +} + +/**mudu-proc**/ +pub fn tpcc_new_order( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + item_ids: Vec, + supplier_warehouse_ids: Vec, + quantities: Vec, +) -> RS { + tpcc_new_order_inner( + xid, + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + false, + ) +} + +/**mudu-proc**/ +pub fn tpcc_new_order_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + item_ids: Vec, + supplier_warehouse_ids: Vec, + quantities: Vec, +) -> RS { + tpcc_new_order_inner( + xid, + warehouse_id, + district_id, + customer_id, + item_ids, + supplier_warehouse_ids, + quantities, + true, + ) +} + +/**mudu-proc**/ +pub fn tpcc_payment( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + amount: i32, +) -> RS { + tpcc_payment_inner(xid, warehouse_id, district_id, customer_id, amount, false) +} + +/**mudu-proc**/ +pub fn tpcc_payment_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, + amount: i32, +) -> RS { + tpcc_payment_inner(xid, warehouse_id, district_id, customer_id, amount, true) +} + /**mudu-proc**/ pub fn tpcc_order_status( xid: XID, @@ -384,6 +545,16 @@ pub fn tpcc_order_status( required_string(order.get_o_status(), "orders.o_status") } +/**mudu-proc**/ +pub fn tpcc_order_status_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + customer_id: i32, +) -> RS { + tpcc_order_status(xid, warehouse_id, district_id, customer_id) +} + /**mudu-proc**/ pub fn tpcc_delivery(xid: XID, warehouse_id: i32, district_id: i32, carrier_id: i32) -> RS { require_positive("warehouse_id", warehouse_id)?; @@ -445,6 +616,16 @@ pub fn tpcc_delivery(xid: XID, warehouse_id: i32, district_id: i32, carrier_id: Ok(format!("delivered order={order_id} carrier={carrier_id}")) } +/**mudu-proc**/ +pub fn tpcc_delivery_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + carrier_id: i32, +) -> RS { + tpcc_delivery(xid, warehouse_id, district_id, carrier_id) +} + /**mudu-proc**/ pub fn tpcc_stock_level(xid: XID, warehouse_id: i32, district_id: i32, threshold: i32) -> RS { require_positive("warehouse_id", warehouse_id)?; @@ -457,6 +638,16 @@ pub fn tpcc_stock_level(xid: XID, warehouse_id: i32, district_id: i32, threshold ) } +/**mudu-proc**/ +pub fn tpcc_stock_level_partitioned( + xid: XID, + warehouse_id: i32, + district_id: i32, + threshold: i32, +) -> RS { + tpcc_stock_level(xid, warehouse_id, district_id, threshold) +} + #[cfg(test)] mod tests { use super::{ @@ -464,9 +655,9 @@ mod tests { }; use crate::test_lock; use mududb::contract::{sql_params, sql_stmt}; + use mududb::sys_interface::sync_api::{mudu_batch, mudu_close, mudu_open}; use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; - use mududb::sys_interface::sync_api::{mudu_batch, mudu_close, mudu_open}; fn temp_db_path(name: &str) -> PathBuf { let suffix = SystemTime::now() diff --git a/example/vote/package/package.desc.json b/example/vote/package/package.desc.json index f6ead13..c784195 100644 --- a/example/vote/package/package.desc.json +++ b/example/vote/package/package.desc.json @@ -3,7 +3,7 @@ "vote": [ { "module_name": "vote", - "proc_name": "add_option", + "proc_name": "get_voting_history", "param_desc": { "fields": [ { @@ -15,18 +15,7 @@ } } }, - "name": "vote_id" - }, - { - "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - }, - "name": "option_text" + "name": "user_id" } ] }, @@ -34,10 +23,63 @@ "fields": [ { "dat_type": { - "id": "String", + "id": "Array", "param": { - "String": { - "length": 65536 + "Array": { + "dat_type": { + "id": "Record", + "param": { + "Record": { + "name": "vote_history_item", + "field": [ + [ + "vote_id", + { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + } + ], + [ + "topic", + { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + } + ], + [ + "action_time", + { + "id": "I32", + "param": null + } + ], + [ + "is_withdrawn", + { + "id": "I32", + "param": null + } + ], + [ + "vote_ended", + { + "id": "I32", + "param": null + } + ] + ] + } + } + }, + "max_size": null } } }, @@ -48,7 +90,7 @@ }, { "module_name": "vote", - "proc_name": "cast_vote", + "proc_name": "create_vote", "param_desc": { "fields": [ { @@ -60,7 +102,7 @@ } } }, - "name": "user_id" + "name": "creator_id" }, { "dat_type": { @@ -71,38 +113,33 @@ } } }, - "name": "vote_id" + "name": "topic" }, { "dat_type": { - "id": "Array", + "id": "String", "param": { - "Array": { - "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - }, - "max_size": null + "String": { + "length": 65536 } } }, - "name": "option_ids" - } - ] - }, - "return_desc": { - "fields": [] - } - }, - { - "module_name": "vote", - "proc_name": "withdraw_vote", - "param_desc": { - "fields": [ + "name": "vote_type" + }, + { + "dat_type": { + "id": "I64", + "param": null + }, + "name": "max_choices" + }, + { + "dat_type": { + "id": "I64", + "param": null + }, + "name": "end_time" + }, { "dat_type": { "id": "String", @@ -112,8 +149,12 @@ } } }, - "name": "user_id" - }, + "name": "visibility_rule" + } + ] + }, + "return_desc": { + "fields": [ { "dat_type": { "id": "String", @@ -123,17 +164,14 @@ } } }, - "name": "vote_id" + "name": "0" } ] - }, - "return_desc": { - "fields": [] } }, { "module_name": "vote", - "proc_name": "get_vote_result", + "proc_name": "create_user", "param_desc": { "fields": [ { @@ -145,7 +183,7 @@ } } }, - "name": "vote_id" + "name": "phone" } ] }, @@ -153,59 +191,10 @@ "fields": [ { "dat_type": { - "id": "Record", + "id": "String", "param": { - "Record": { - "name": "vote_result", - "field": [ - [ - "vote_id", - { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - } - ], - [ - "topic", - { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - } - ], - [ - "vote_ended", - { - "id": "I32", - "param": null - } - ], - [ - "total_votes", - { - "id": "I32", - "param": null - } - ], - [ - "options", - { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - } - ] - ] + "String": { + "length": 65536 } } }, @@ -216,7 +205,7 @@ }, { "module_name": "vote", - "proc_name": "get_voting_history", + "proc_name": "cast_vote", "param_desc": { "fields": [ { @@ -229,66 +218,28 @@ } }, "name": "user_id" - } - ] - }, - "return_desc": { - "fields": [ + }, + { + "dat_type": { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + }, + "name": "vote_id" + }, { "dat_type": { "id": "Array", "param": { "Array": { "dat_type": { - "id": "Record", + "id": "String", "param": { - "Record": { - "name": "vote_history_item", - "field": [ - [ - "vote_id", - { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - } - ], - [ - "topic", - { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - } - ], - [ - "action_time", - { - "id": "I32", - "param": null - } - ], - [ - "is_withdrawn", - { - "id": "I32", - "param": null - } - ], - [ - "vote_ended", - { - "id": "I32", - "param": null - } - ] - ] + "String": { + "length": 65536 } } }, @@ -296,14 +247,17 @@ } } }, - "name": "0" + "name": "option_ids" } ] + }, + "return_desc": { + "fields": [] } }, { "module_name": "vote", - "proc_name": "create_vote", + "proc_name": "add_option", "param_desc": { "fields": [ { @@ -315,7 +269,7 @@ } } }, - "name": "creator_id" + "name": "vote_id" }, { "dat_type": { @@ -326,8 +280,12 @@ } } }, - "name": "topic" - }, + "name": "option_text" + } + ] + }, + "return_desc": { + "fields": [ { "dat_type": { "id": "String", @@ -337,22 +295,16 @@ } } }, - "name": "vote_type" - }, - { - "dat_type": { - "id": "I64", - "param": null - }, - "name": "max_choices" - }, - { - "dat_type": { - "id": "I64", - "param": null - }, - "name": "end_time" - }, + "name": "0" + } + ] + } + }, + { + "module_name": "vote", + "proc_name": "withdraw_vote", + "param_desc": { + "fields": [ { "dat_type": { "id": "String", @@ -362,12 +314,8 @@ } } }, - "name": "visibility_rule" - } - ] - }, - "return_desc": { - "fields": [ + "name": "user_id" + }, { "dat_type": { "id": "String", @@ -377,14 +325,17 @@ } } }, - "name": "0" + "name": "vote_id" } ] + }, + "return_desc": { + "fields": [] } }, { "module_name": "vote", - "proc_name": "create_user", + "proc_name": "get_vote_result", "param_desc": { "fields": [ { @@ -396,7 +347,7 @@ } } }, - "name": "phone" + "name": "vote_id" } ] }, @@ -404,10 +355,59 @@ "fields": [ { "dat_type": { - "id": "String", + "id": "Record", "param": { - "String": { - "length": 65536 + "Record": { + "name": "vote_result", + "field": [ + [ + "vote_id", + { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + } + ], + [ + "topic", + { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + } + ], + [ + "vote_ended", + { + "id": "I32", + "param": null + } + ], + [ + "total_votes", + { + "id": "I32", + "param": null + } + ], + [ + "options", + { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + } + ] + ] } } }, diff --git a/example/vote/package/type.desc.json b/example/vote/package/type.desc.json index 2b5e710..7b22613 100644 --- a/example/vote/package/type.desc.json +++ b/example/vote/package/type.desc.json @@ -1,40 +1,26 @@ { "types": { - "VoteResult": [ + "Options": [ 2, { - "record_name": "vote_result", + "record_name": "options", "record_fields": [ { - "field_name": "vote_id", + "field_name": "option_id", "field_type": [ 0, 14 ] }, { - "field_name": "topic", + "field_name": "vote_id", "field_type": [ 0, 14 ] }, { - "field_name": "vote_ended", - "field_type": [ - 0, - 6 - ] - }, - { - "field_name": "total_votes", - "field_type": [ - 0, - 6 - ] - }, - { - "field_name": "options", + "field_name": "option_text", "field_type": [ 0, 14 @@ -43,102 +29,87 @@ ] } ], - "Options": [ + "VoteActions": [ 2, { - "record_name": "options", + "record_name": "vote_actions", "record_fields": [ { - "field_name": "option_id", + "field_name": "action_id", "field_type": [ 0, 14 ] }, { - "field_name": "vote_id", + "field_name": "user_id", "field_type": [ 0, 14 ] }, { - "field_name": "option_text", - "field_type": [ - 0, - 14 - ] - } - ] - } - ], - "VoteChoices": [ - 2, - { - "record_name": "vote_choices", - "record_fields": [ - { - "field_name": "choice_id", + "field_name": "vote_id", "field_type": [ 0, 14 ] }, { - "field_name": "action_id", + "field_name": "action_time", "field_type": [ 0, - 14 + 6 ] }, { - "field_name": "option_id", + "field_name": "is_withdrawn", "field_type": [ 0, - 14 + 6 ] } ] } ], - "VoteActions": [ + "VoteResult": [ 2, { - "record_name": "vote_actions", + "record_name": "vote_result", "record_fields": [ { - "field_name": "action_id", + "field_name": "vote_id", "field_type": [ 0, 14 ] }, { - "field_name": "user_id", + "field_name": "topic", "field_type": [ 0, 14 ] }, { - "field_name": "vote_id", + "field_name": "vote_ended", "field_type": [ 0, - 14 + 6 ] }, { - "field_name": "action_time", + "field_name": "total_votes", "field_type": [ 0, 6 ] }, { - "field_name": "is_withdrawn", + "field_name": "options", "field_type": [ 0, - 6 + 14 ] } ] @@ -201,66 +172,95 @@ ] } ], - "Users": [ + "VoteHistoryItem": [ 2, { - "record_name": "users", + "record_name": "vote_history_item", "record_fields": [ { - "field_name": "user_id", + "field_name": "vote_id", "field_type": [ 0, 14 ] }, { - "field_name": "phone", + "field_name": "topic", "field_type": [ 0, 14 ] + }, + { + "field_name": "action_time", + "field_type": [ + 0, + 6 + ] + }, + { + "field_name": "is_withdrawn", + "field_type": [ + 0, + 6 + ] + }, + { + "field_name": "vote_ended", + "field_type": [ + 0, + 6 + ] } ] } ], - "VoteHistoryItem": [ + "Users": [ 2, { - "record_name": "vote_history_item", + "record_name": "users", "record_fields": [ { - "field_name": "vote_id", + "field_name": "user_id", "field_type": [ 0, 14 ] }, { - "field_name": "topic", + "field_name": "phone", "field_type": [ 0, 14 ] - }, + } + ] + } + ], + "VoteChoices": [ + 2, + { + "record_name": "vote_choices", + "record_fields": [ { - "field_name": "action_time", + "field_name": "choice_id", "field_type": [ 0, - 6 + 14 ] }, { - "field_name": "is_withdrawn", + "field_name": "action_id", "field_type": [ 0, - 6 + 14 ] }, { - "field_name": "vote_ended", + "field_name": "option_id", "field_type": [ 0, - 6 + 14 ] } ] diff --git a/example/vote/src/generated/procedure.rs b/example/vote/src/generated/procedure.rs index 7a099be..77915d9 100644 --- a/example/vote/src/generated/procedure.rs +++ b/example/vote/src/generated/procedure.rs @@ -6,10 +6,10 @@ use crate::generated::votes::object::Votes; use fallible_iterator::FallibleIterator; use mududb::common::result::RS; use mududb::common::xid::XID; -use mududb::error::ec::EC::MuduError; -use mududb::m_error; use mududb::contract::database::entity_set::RecordSet; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::MuduError; +use mududb::m_error; use mududb::sys_interface::async_api::{mudu_command, mudu_query}; // User management @@ -372,927 +372,927 @@ mod tests { .contains("Visibility rule must be 'always' or 'after_end'") ); } -} -async fn mp2_add_option(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_add_option, - ).await -} - -pub async fn mudu_inner_p2_add_option( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = add_option( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_add_option() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "vote_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "option_text".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_add_option() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_add_option() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "add_option".to_string(), - mudu_argv_desc_add_option().clone(), - mudu_result_desc_add_option().clone(), - false - ) - }) -} - -mod mod_add_option { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-add-option; - world mudu-app-mp2-add-option { - export mp2-add-option: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestAddOption {} - - impl Guest for GuestAddOption { - async fn mp2_add_option(param:Vec) -> Vec { - super::mp2_add_option(param).await - } - } - - export!(GuestAddOption); -} -async fn mp2_cast_vote(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_cast_vote, - ).await -} - -pub async fn mudu_inner_p2_cast_vote( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = cast_vote( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - Vec, - _, - >(¶m.param_list()[2], "Vec")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_cast_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "vote_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "option_ids".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_cast_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_cast_vote() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "cast_vote".to_string(), - mudu_argv_desc_cast_vote().clone(), - mudu_result_desc_cast_vote().clone(), - false - ) - }) -} - -mod mod_cast_vote { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-cast-vote; - world mudu-app-mp2-cast-vote { - export mp2-cast-vote: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestCastVote {} - - impl Guest for GuestCastVote { - async fn mp2_cast_vote(param:Vec) -> Vec { - super::mp2_cast_vote(param).await - } - } - - export!(GuestCastVote); -} -async fn mp2_withdraw_vote(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_withdraw_vote, - ).await -} - -pub async fn mudu_inner_p2_withdraw_vote( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = withdraw_vote( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_withdraw_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "vote_id".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_withdraw_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_withdraw_vote() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "withdraw_vote".to_string(), - mudu_argv_desc_withdraw_vote().clone(), - mudu_result_desc_withdraw_vote().clone(), - false - ) - }) -} - -mod mod_withdraw_vote { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-withdraw-vote; - world mudu-app-mp2-withdraw-vote { - export mp2-withdraw-vote: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestWithdrawVote {} - - impl Guest for GuestWithdrawVote { - async fn mp2_withdraw_vote(param:Vec) -> Vec { - super::mp2_withdraw_vote(param).await - } - } - - export!(GuestWithdrawVote); -} -async fn mp2_get_vote_result(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_get_vote_result, - ).await -} - -pub async fn mudu_inner_p2_get_vote_result( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = get_vote_result( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "VoteResult")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_get_vote_result() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "vote_id".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_get_vote_result() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_get_vote_result() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "get_vote_result".to_string(), - mudu_argv_desc_get_vote_result().clone(), - mudu_result_desc_get_vote_result().clone(), - false - ) - }) -} - -mod mod_get_vote_result { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-get-vote-result; - world mudu-app-mp2-get-vote-result { - export mp2-get-vote-result: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestGetVoteResult {} - - impl Guest for GuestGetVoteResult { - async fn mp2_get_vote_result(param:Vec) -> Vec { - super::mp2_get_vote_result(param).await - } - } - - export!(GuestGetVoteResult); -} -async fn mp2_get_voting_history(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_get_voting_history, - ).await -} - -pub async fn mudu_inner_p2_get_voting_history( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = get_voting_history( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "Vec")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_get_voting_history() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_get_voting_history() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_get_voting_history() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "get_voting_history".to_string(), - mudu_argv_desc_get_voting_history().clone(), - mudu_result_desc_get_voting_history().clone(), - false - ) - }) -} - -mod mod_get_voting_history { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-get-voting-history; - world mudu-app-mp2-get-voting-history { - export mp2-get-voting-history: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestGetVotingHistory {} - - impl Guest for GuestGetVotingHistory { - async fn mp2_get_voting_history(param:Vec) -> Vec { - super::mp2_get_voting_history(param).await - } - } - - export!(GuestGetVotingHistory); -} -async fn mp2_create_vote(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_create_vote, - ).await -} - -pub async fn mudu_inner_p2_create_vote( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = create_vote( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - i64, - _, - >(¶m.param_list()[3], "i64")?, - - - - ::mududb::types::datum::value_to_typed::< - i64, - _, - >(¶m.param_list()[4], "i64")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[5], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_create_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "creator_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "topic".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "vote_type".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "max_choices".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "end_time".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "visibility_rule".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_create_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_create_vote() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "create_vote".to_string(), - mudu_argv_desc_create_vote().clone(), - mudu_result_desc_create_vote().clone(), - false - ) - }) -} - -mod mod_create_vote { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-create-vote; - world mudu-app-mp2-create-vote { - export mp2-create-vote: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestCreateVote {} - - impl Guest for GuestCreateVote { - async fn mp2_create_vote(param:Vec) -> Vec { - super::mp2_create_vote(param).await - } - } - - export!(GuestCreateVote); -} -async fn mp2_create_user(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_create_user, - ).await -} - -pub async fn mudu_inner_p2_create_user( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = create_user( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "phone".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_create_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "vote".to_string(), - "create_user".to_string(), - mudu_argv_desc_create_user().clone(), - mudu_result_desc_create_user().clone(), - false - ) - }) -} - -mod mod_create_user { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-create-user; - world mudu-app-mp2-create-user { - export mp2-create-user: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestCreateUser {} - - impl Guest for GuestCreateUser { - async fn mp2_create_user(param:Vec) -> Vec { - super::mp2_create_user(param).await - } - } - - export!(GuestCreateUser); -} \ No newline at end of file +} +async fn mp2_get_voting_history(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_get_voting_history, + ).await +} + +pub async fn mudu_inner_p2_get_voting_history( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = get_voting_history( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "Vec")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_get_voting_history() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_get_voting_history() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_get_voting_history() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "get_voting_history".to_string(), + mudu_argv_desc_get_voting_history().clone(), + mudu_result_desc_get_voting_history().clone(), + false + ) + }) +} + +mod mod_get_voting_history { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-get-voting-history; + world mudu-app-mp2-get-voting-history { + export mp2-get-voting-history: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestGetVotingHistory {} + + impl Guest for GuestGetVotingHistory { + async fn mp2_get_voting_history(param:Vec) -> Vec { + super::mp2_get_voting_history(param).await + } + } + + export!(GuestGetVotingHistory); +} +async fn mp2_create_vote(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_create_vote, + ).await +} + +pub async fn mudu_inner_p2_create_vote( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = create_vote( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[2], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + i64, + _, + >(¶m.param_list()[3], "i64")?, + + + + ::mududb::types::datum::value_to_typed::< + i64, + _, + >(¶m.param_list()[4], "i64")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[5], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_create_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "creator_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "topic".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "vote_type".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "max_choices".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "end_time".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "visibility_rule".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_create_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_create_vote() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "create_vote".to_string(), + mudu_argv_desc_create_vote().clone(), + mudu_result_desc_create_vote().clone(), + false + ) + }) +} + +mod mod_create_vote { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-create-vote; + world mudu-app-mp2-create-vote { + export mp2-create-vote: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestCreateVote {} + + impl Guest for GuestCreateVote { + async fn mp2_create_vote(param:Vec) -> Vec { + super::mp2_create_vote(param).await + } + } + + export!(GuestCreateVote); +} +async fn mp2_create_user(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_create_user, + ).await +} + +pub async fn mudu_inner_p2_create_user( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = create_user( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "phone".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_create_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "create_user".to_string(), + mudu_argv_desc_create_user().clone(), + mudu_result_desc_create_user().clone(), + false + ) + }) +} + +mod mod_create_user { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-create-user; + world mudu-app-mp2-create-user { + export mp2-create-user: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestCreateUser {} + + impl Guest for GuestCreateUser { + async fn mp2_create_user(param:Vec) -> Vec { + super::mp2_create_user(param).await + } + } + + export!(GuestCreateUser); +} +async fn mp2_cast_vote(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_cast_vote, + ).await +} + +pub async fn mudu_inner_p2_cast_vote( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = cast_vote( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + Vec, + _, + >(¶m.param_list()[2], "Vec")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_cast_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "vote_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "option_ids".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_cast_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_cast_vote() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "cast_vote".to_string(), + mudu_argv_desc_cast_vote().clone(), + mudu_result_desc_cast_vote().clone(), + false + ) + }) +} + +mod mod_cast_vote { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-cast-vote; + world mudu-app-mp2-cast-vote { + export mp2-cast-vote: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestCastVote {} + + impl Guest for GuestCastVote { + async fn mp2_cast_vote(param:Vec) -> Vec { + super::mp2_cast_vote(param).await + } + } + + export!(GuestCastVote); +} +async fn mp2_add_option(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_add_option, + ).await +} + +pub async fn mudu_inner_p2_add_option( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = add_option( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_add_option() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "vote_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "option_text".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_add_option() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_add_option() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "add_option".to_string(), + mudu_argv_desc_add_option().clone(), + mudu_result_desc_add_option().clone(), + false + ) + }) +} + +mod mod_add_option { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-add-option; + world mudu-app-mp2-add-option { + export mp2-add-option: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestAddOption {} + + impl Guest for GuestAddOption { + async fn mp2_add_option(param:Vec) -> Vec { + super::mp2_add_option(param).await + } + } + + export!(GuestAddOption); +} +async fn mp2_withdraw_vote(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_withdraw_vote, + ).await +} + +pub async fn mudu_inner_p2_withdraw_vote( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = withdraw_vote( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_withdraw_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "vote_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_withdraw_vote() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_withdraw_vote() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "withdraw_vote".to_string(), + mudu_argv_desc_withdraw_vote().clone(), + mudu_result_desc_withdraw_vote().clone(), + false + ) + }) +} + +mod mod_withdraw_vote { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-withdraw-vote; + world mudu-app-mp2-withdraw-vote { + export mp2-withdraw-vote: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestWithdrawVote {} + + impl Guest for GuestWithdrawVote { + async fn mp2_withdraw_vote(param:Vec) -> Vec { + super::mp2_withdraw_vote(param).await + } + } + + export!(GuestWithdrawVote); +} +async fn mp2_get_vote_result(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_get_vote_result, + ).await +} + +pub async fn mudu_inner_p2_get_vote_result( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = get_vote_result( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "VoteResult")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_get_vote_result() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "vote_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_get_vote_result() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_get_vote_result() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "vote".to_string(), + "get_vote_result".to_string(), + mudu_argv_desc_get_vote_result().clone(), + mudu_result_desc_get_vote_result().clone(), + false + ) + }) +} + +mod mod_get_vote_result { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-get-vote-result; + world mudu-app-mp2-get-vote-result { + export mp2-get-vote-result: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestGetVoteResult {} + + impl Guest for GuestGetVoteResult { + async fn mp2_get_vote_result(param:Vec) -> Vec { + super::mp2_get_vote_result(param).await + } + } + + export!(GuestGetVoteResult); +} \ No newline at end of file diff --git a/example/vote/src/rust/procedure.rs b/example/vote/src/rust/procedure.rs index ed1cd55..f8912cd 100644 --- a/example/vote/src/rust/procedure.rs +++ b/example/vote/src/rust/procedure.rs @@ -6,10 +6,10 @@ use crate::rust::votes::object::Votes; use fallible_iterator::FallibleIterator; use mududb::common::result::RS; use mududb::common::xid::XID; -use mududb::error::ec::EC::MuduError; -use mududb::m_error; use mududb::contract::database::entity_set::RecordSet; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::MuduError; +use mududb::m_error; use mududb::sys_interface::sync_api::{mudu_command, mudu_query}; // User management diff --git a/example/wallet/package/package.desc.json b/example/wallet/package/package.desc.json index 73a734d..40d980b 100644 --- a/example/wallet/package/package.desc.json +++ b/example/wallet/package/package.desc.json @@ -28,7 +28,7 @@ }, { "module_name": "wallet", - "proc_name": "create_user", + "proc_name": "transfer_funds", "param_desc": { "fields": [ { @@ -36,29 +36,21 @@ "id": "I32", "param": null }, - "name": "user_id" + "name": "from_user_id" }, { "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } + "id": "I32", + "param": null }, - "name": "name" + "name": "to_user_id" }, { "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } + "id": "I32", + "param": null }, - "name": "email" + "name": "amount" } ] }, @@ -68,7 +60,7 @@ }, { "module_name": "wallet", - "proc_name": "transfer_funds", + "proc_name": "purchase", "param_desc": { "fields": [ { @@ -76,21 +68,25 @@ "id": "I32", "param": null }, - "name": "from_user_id" + "name": "user_id" }, { "dat_type": { "id": "I32", "param": null }, - "name": "to_user_id" + "name": "amount" }, { "dat_type": { - "id": "I32", - "param": null + "id": "String", + "param": { + "String": { + "length": 65536 + } + } }, - "name": "amount" + "name": "description" } ] }, @@ -118,7 +114,7 @@ }, { "module_name": "wallet", - "proc_name": "update_user", + "proc_name": "deposit", "param_desc": { "fields": [ { @@ -130,25 +126,10 @@ }, { "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - }, - "name": "name" - }, - { - "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } + "id": "I32", + "param": null }, - "name": "email" + "name": "amount" } ] }, @@ -158,7 +139,7 @@ }, { "module_name": "wallet", - "proc_name": "purchase", + "proc_name": "create_user", "param_desc": { "fields": [ { @@ -170,10 +151,14 @@ }, { "dat_type": { - "id": "I32", - "param": null + "id": "String", + "param": { + "String": { + "length": 65536 + } + } }, - "name": "amount" + "name": "name" }, { "dat_type": { @@ -184,7 +169,7 @@ } } }, - "name": "description" + "name": "email" } ] }, @@ -226,7 +211,7 @@ }, { "module_name": "wallet", - "proc_name": "deposit", + "proc_name": "update_user", "param_desc": { "fields": [ { @@ -238,10 +223,25 @@ }, { "dat_type": { - "id": "I32", - "param": null + "id": "String", + "param": { + "String": { + "length": 65536 + } + } }, - "name": "amount" + "name": "name" + }, + { + "dat_type": { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + }, + "name": "email" } ] }, diff --git a/example/wallet/package/type.desc.json b/example/wallet/package/type.desc.json index 5caa3e1..626d7a2 100644 --- a/example/wallet/package/type.desc.json +++ b/example/wallet/package/type.desc.json @@ -57,6 +57,35 @@ ] } ], + "Wallets": [ + 2, + { + "record_name": "wallets", + "record_fields": [ + { + "field_name": "user_id", + "field_type": [ + 0, + 6 + ] + }, + { + "field_name": "balance", + "field_type": [ + 0, + 6 + ] + }, + { + "field_name": "updated_at", + "field_type": [ + 0, + 6 + ] + } + ] + } + ], "Orders": [ 2, { @@ -149,35 +178,6 @@ } ] } - ], - "Wallets": [ - 2, - { - "record_name": "wallets", - "record_fields": [ - { - "field_name": "user_id", - "field_type": [ - 0, - 6 - ] - }, - { - "field_name": "balance", - "field_type": [ - 0, - 6 - ] - }, - { - "field_name": "updated_at", - "field_type": [ - 0, - 6 - ] - } - ] - } ] } } \ No newline at end of file diff --git a/example/wallet/src/generated/procedures.rs b/example/wallet/src/generated/procedures.rs index 96168f1..3bdd18b 100644 --- a/example/wallet/src/generated/procedures.rs +++ b/example/wallet/src/generated/procedures.rs @@ -1,13 +1,13 @@ use crate::generated::wallets::object::Wallets; use mududb::common::result::RS; use mududb::common::xid::XID; -use mududb::error::ec::EC::MuduError; -use mududb::m_error; use mududb::contract::database::attr_value::AttrValue; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::MuduError; +use mududb::m_error; +use mududb::sys_interface::async_api::{mudu_command, mudu_query}; use mududb::types::datum::DatumDyn; use std::time::UNIX_EPOCH; -use mududb::sys_interface::async_api::{mudu_command, mudu_query}; fn current_timestamp() -> i64 { let now = mududb::sys::time::system_time_now(); @@ -406,1020 +406,1020 @@ pub async fn purchase(xid: XID, user_id: i32, amount: i32, description: String) ).await?; Ok(()) -} -async fn mp2_withdraw(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_withdraw, - ).await -} - -pub async fn mudu_inner_p2_withdraw( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = withdraw( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_withdraw() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "amount".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_withdraw() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_withdraw() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "withdraw".to_string(), - mudu_argv_desc_withdraw().clone(), - mudu_result_desc_withdraw().clone(), - false - ) - }) -} - -mod mod_withdraw { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-withdraw; - world mudu-app-mp2-withdraw { - export mp2-withdraw: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestWithdraw {} - - impl Guest for GuestWithdraw { - async fn mp2_withdraw(param:Vec) -> Vec { - super::mp2_withdraw(param).await - } - } - - export!(GuestWithdraw); -} -async fn mp2_create_user(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_create_user, - ).await -} - -pub async fn mudu_inner_p2_create_user( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = create_user( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "name".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "email".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_create_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "create_user".to_string(), - mudu_argv_desc_create_user().clone(), - mudu_result_desc_create_user().clone(), - false - ) - }) -} - -mod mod_create_user { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-create-user; - world mudu-app-mp2-create-user { - export mp2-create-user: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestCreateUser {} - - impl Guest for GuestCreateUser { - async fn mp2_create_user(param:Vec) -> Vec { - super::mp2_create_user(param).await - } - } - - export!(GuestCreateUser); -} -async fn mp2_transfer_funds(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_transfer_funds, - ).await -} - -pub async fn mudu_inner_p2_transfer_funds( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = transfer_funds( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_transfer_funds() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "from_user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "to_user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "amount".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_transfer_funds() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_transfer_funds() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "transfer_funds".to_string(), - mudu_argv_desc_transfer_funds().clone(), - mudu_result_desc_transfer_funds().clone(), - false - ) - }) -} - -mod mod_transfer_funds { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-transfer-funds; - world mudu-app-mp2-transfer-funds { - export mp2-transfer-funds: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTransferFunds {} - - impl Guest for GuestTransferFunds { - async fn mp2_transfer_funds(param:Vec) -> Vec { - super::mp2_transfer_funds(param).await - } - } - - export!(GuestTransferFunds); -} -async fn mp2_delete_user(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_delete_user, - ).await -} - -pub async fn mudu_inner_p2_delete_user( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = delete_user( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_delete_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_delete_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_delete_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "delete_user".to_string(), - mudu_argv_desc_delete_user().clone(), - mudu_result_desc_delete_user().clone(), - false - ) - }) -} - -mod mod_delete_user { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-delete-user; - world mudu-app-mp2-delete-user { - export mp2-delete-user: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestDeleteUser {} - - impl Guest for GuestDeleteUser { - async fn mp2_delete_user(param:Vec) -> Vec { - super::mp2_delete_user(param).await - } - } - - export!(GuestDeleteUser); -} -async fn mp2_update_user(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_update_user, - ).await -} - -pub async fn mudu_inner_p2_update_user( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = update_user( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_update_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "name".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "email".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_update_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_update_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "update_user".to_string(), - mudu_argv_desc_update_user().clone(), - mudu_result_desc_update_user().clone(), - false - ) - }) -} - -mod mod_update_user { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-update-user; - world mudu-app-mp2-update-user { - export mp2-update-user: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestUpdateUser {} - - impl Guest for GuestUpdateUser { - async fn mp2_update_user(param:Vec) -> Vec { - super::mp2_update_user(param).await - } - } - - export!(GuestUpdateUser); -} -async fn mp2_purchase(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_purchase, - ).await -} - -pub async fn mudu_inner_p2_purchase( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = purchase( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_purchase() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "amount".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "description".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_purchase() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_purchase() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "purchase".to_string(), - mudu_argv_desc_purchase().clone(), - mudu_result_desc_purchase().clone(), - false - ) - }) -} - -mod mod_purchase { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-purchase; - world mudu-app-mp2-purchase { - export mp2-purchase: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestPurchase {} - - impl Guest for GuestPurchase { - async fn mp2_purchase(param:Vec) -> Vec { - super::mp2_purchase(param).await - } - } - - export!(GuestPurchase); -} -async fn mp2_transfer(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_transfer, - ).await -} - -pub async fn mudu_inner_p2_transfer( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = transfer( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[2], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_transfer() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "from_user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "to_user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "amount".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_transfer() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_transfer() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "transfer".to_string(), - mudu_argv_desc_transfer().clone(), - mudu_result_desc_transfer().clone(), - false - ) - }) -} - -mod mod_transfer { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-transfer; - world mudu-app-mp2-transfer { - export mp2-transfer: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestTransfer {} - - impl Guest for GuestTransfer { - async fn mp2_transfer(param:Vec) -> Vec { - super::mp2_transfer(param).await - } - } - - export!(GuestTransfer); -} -async fn mp2_deposit(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_deposit, - ).await -} - -pub async fn mudu_inner_p2_deposit( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = deposit( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[1], "i32")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_deposit() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_id".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "amount".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_deposit() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_deposit() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "wallet".to_string(), - "deposit".to_string(), - mudu_argv_desc_deposit().clone(), - mudu_result_desc_deposit().clone(), - false - ) - }) -} - -mod mod_deposit { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-deposit; - world mudu-app-mp2-deposit { - export mp2-deposit: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestDeposit {} - - impl Guest for GuestDeposit { - async fn mp2_deposit(param:Vec) -> Vec { - super::mp2_deposit(param).await - } - } - - export!(GuestDeposit); -} \ No newline at end of file +} +async fn mp2_withdraw(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_withdraw, + ).await +} + +pub async fn mudu_inner_p2_withdraw( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = withdraw( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_withdraw() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_withdraw() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_withdraw() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "withdraw".to_string(), + mudu_argv_desc_withdraw().clone(), + mudu_result_desc_withdraw().clone(), + false + ) + }) +} + +mod mod_withdraw { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-withdraw; + world mudu-app-mp2-withdraw { + export mp2-withdraw: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestWithdraw {} + + impl Guest for GuestWithdraw { + async fn mp2_withdraw(param:Vec) -> Vec { + super::mp2_withdraw(param).await + } + } + + export!(GuestWithdraw); +} +async fn mp2_transfer_funds(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_transfer_funds, + ).await +} + +pub async fn mudu_inner_p2_transfer_funds( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = transfer_funds( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_transfer_funds() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "from_user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "to_user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_transfer_funds() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_transfer_funds() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "transfer_funds".to_string(), + mudu_argv_desc_transfer_funds().clone(), + mudu_result_desc_transfer_funds().clone(), + false + ) + }) +} + +mod mod_transfer_funds { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-transfer-funds; + world mudu-app-mp2-transfer-funds { + export mp2-transfer-funds: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTransferFunds {} + + impl Guest for GuestTransferFunds { + async fn mp2_transfer_funds(param:Vec) -> Vec { + super::mp2_transfer_funds(param).await + } + } + + export!(GuestTransferFunds); +} +async fn mp2_purchase(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_purchase, + ).await +} + +pub async fn mudu_inner_p2_purchase( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = purchase( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[2], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_purchase() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "description".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_purchase() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_purchase() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "purchase".to_string(), + mudu_argv_desc_purchase().clone(), + mudu_result_desc_purchase().clone(), + false + ) + }) +} + +mod mod_purchase { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-purchase; + world mudu-app-mp2-purchase { + export mp2-purchase: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestPurchase {} + + impl Guest for GuestPurchase { + async fn mp2_purchase(param:Vec) -> Vec { + super::mp2_purchase(param).await + } + } + + export!(GuestPurchase); +} +async fn mp2_delete_user(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_delete_user, + ).await +} + +pub async fn mudu_inner_p2_delete_user( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = delete_user( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_delete_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_delete_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_delete_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "delete_user".to_string(), + mudu_argv_desc_delete_user().clone(), + mudu_result_desc_delete_user().clone(), + false + ) + }) +} + +mod mod_delete_user { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-delete-user; + world mudu-app-mp2-delete-user { + export mp2-delete-user: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestDeleteUser {} + + impl Guest for GuestDeleteUser { + async fn mp2_delete_user(param:Vec) -> Vec { + super::mp2_delete_user(param).await + } + } + + export!(GuestDeleteUser); +} +async fn mp2_deposit(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_deposit, + ).await +} + +pub async fn mudu_inner_p2_deposit( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = deposit( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_deposit() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_deposit() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_deposit() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "deposit".to_string(), + mudu_argv_desc_deposit().clone(), + mudu_result_desc_deposit().clone(), + false + ) + }) +} + +mod mod_deposit { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-deposit; + world mudu-app-mp2-deposit { + export mp2-deposit: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestDeposit {} + + impl Guest for GuestDeposit { + async fn mp2_deposit(param:Vec) -> Vec { + super::mp2_deposit(param).await + } + } + + export!(GuestDeposit); +} +async fn mp2_create_user(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_create_user, + ).await +} + +pub async fn mudu_inner_p2_create_user( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = create_user( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[2], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "name".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "email".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_create_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_create_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "create_user".to_string(), + mudu_argv_desc_create_user().clone(), + mudu_result_desc_create_user().clone(), + false + ) + }) +} + +mod mod_create_user { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-create-user; + world mudu-app-mp2-create-user { + export mp2-create-user: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestCreateUser {} + + impl Guest for GuestCreateUser { + async fn mp2_create_user(param:Vec) -> Vec { + super::mp2_create_user(param).await + } + } + + export!(GuestCreateUser); +} +async fn mp2_transfer(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_transfer, + ).await +} + +pub async fn mudu_inner_p2_transfer( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = transfer( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[1], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[2], "i32")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_transfer() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "from_user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "to_user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "amount".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_transfer() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_transfer() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "transfer".to_string(), + mudu_argv_desc_transfer().clone(), + mudu_result_desc_transfer().clone(), + false + ) + }) +} + +mod mod_transfer { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-transfer; + world mudu-app-mp2-transfer { + export mp2-transfer: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestTransfer {} + + impl Guest for GuestTransfer { + async fn mp2_transfer(param:Vec) -> Vec { + super::mp2_transfer(param).await + } + } + + export!(GuestTransfer); +} +async fn mp2_update_user(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_update_user, + ).await +} + +pub async fn mudu_inner_p2_update_user( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = update_user( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + i32, + _, + >(¶m.param_list()[0], "i32")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[2], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_update_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_id".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "name".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "email".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_update_user() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_update_user() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "wallet".to_string(), + "update_user".to_string(), + mudu_argv_desc_update_user().clone(), + mudu_result_desc_update_user().clone(), + false + ) + }) +} + +mod mod_update_user { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-update-user; + world mudu-app-mp2-update-user { + export mp2-update-user: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestUpdateUser {} + + impl Guest for GuestUpdateUser { + async fn mp2_update_user(param:Vec) -> Vec { + super::mp2_update_user(param).await + } + } + + export!(GuestUpdateUser); +} \ No newline at end of file diff --git a/example/wallet/src/rust/procedures.rs b/example/wallet/src/rust/procedures.rs index f6cee5e..3c6edb2 100644 --- a/example/wallet/src/rust/procedures.rs +++ b/example/wallet/src/rust/procedures.rs @@ -1,13 +1,13 @@ use crate::rust::wallets::object::Wallets; use mududb::common::result::RS; use mududb::common::xid::XID; -use mududb::error::ec::EC::MuduError; -use mududb::m_error; use mududb::contract::database::attr_value::AttrValue; use mududb::contract::{sql_params, sql_stmt}; +use mududb::error::ec::EC::MuduError; +use mududb::m_error; +use mududb::sys_interface::sync_api::{mudu_command, mudu_query}; use mududb::types::datum::DatumDyn; use std::time::UNIX_EPOCH; -use mududb::sys_interface::sync_api::{mudu_command, mudu_query}; fn current_timestamp() -> i64 { let now = mududb::sys::time::system_time_now(); diff --git a/example/wallet/src/testing/procedure.rs b/example/wallet/src/testing/procedure.rs index 56d5368..1b8f183 100644 --- a/example/wallet/src/testing/procedure.rs +++ b/example/wallet/src/testing/procedure.rs @@ -4,10 +4,10 @@ use crate::rust::wallets::object::Wallets; use mududb::common::id::OID; use mududb::contract::database::entity_set::RecordSet; use mududb::contract::{sql_params, sql_stmt}; +use mududb::sys_interface::sync_api::{mudu_batch, mudu_close, mudu_open, mudu_query}; use std::path::PathBuf; use std::sync::{Mutex, OnceLock}; use std::time::UNIX_EPOCH; -use mududb::sys_interface::sync_api::{mudu_batch, mudu_close, mudu_open, mudu_query}; static TEST_MUTEX: OnceLock> = OnceLock::new(); diff --git a/example/ycsb/package/package.desc.json b/example/ycsb/package/package.desc.json index 570b78b..a4fe375 100644 --- a/example/ycsb/package/package.desc.json +++ b/example/ycsb/package/package.desc.json @@ -70,7 +70,7 @@ }, { "module_name": "ycsb", - "proc_name": "ycsb_scan", + "proc_name": "ycsb_insert", "param_desc": { "fields": [ { @@ -82,7 +82,7 @@ } } }, - "name": "start_user_key" + "name": "user_key" }, { "dat_type": { @@ -93,32 +93,12 @@ } } }, - "name": "end_user_key" + "name": "value" } ] }, "return_desc": { - "fields": [ - { - "dat_type": { - "id": "Array", - "param": { - "Array": { - "dat_type": { - "id": "String", - "param": { - "String": { - "length": 65536 - } - } - }, - "max_size": null - } - } - }, - "name": "0" - } - ] + "fields": [] } }, { @@ -168,7 +148,7 @@ }, { "module_name": "ycsb", - "proc_name": "ycsb_insert", + "proc_name": "ycsb_scan", "param_desc": { "fields": [ { @@ -180,7 +160,7 @@ } } }, - "name": "user_key" + "name": "start_user_key" }, { "dat_type": { @@ -191,12 +171,32 @@ } } }, - "name": "value" + "name": "end_user_key" } ] }, "return_desc": { - "fields": [] + "fields": [ + { + "dat_type": { + "id": "Array", + "param": { + "Array": { + "dat_type": { + "id": "String", + "param": { + "String": { + "length": 65536 + } + } + }, + "max_size": null + } + } + }, + "name": "0" + } + ] } } ] diff --git a/example/ycsb/src/bin/ycsb_benchmark.rs b/example/ycsb/src/bin/ycsb_benchmark.rs index 0f90fca..f16778f 100644 --- a/example/ycsb/src/bin/ycsb_benchmark.rs +++ b/example/ycsb/src/bin/ycsb_benchmark.rs @@ -1,23 +1,25 @@ use clap::Parser; -use mududb::common::result::RS; -use mududb::common::xid::XID; -use mududb::binding::universal::uni_session_open_argv::UniSessionOpenArgv; use mudu_cli::management::{ServerTopology, fetch_server_topology}; -use mududb::contract::database::sql_stmt_text::SQLStmtText; use mudu_utils::debug::debug_serve; use mudu_utils::notifier::NotifyWait; -use mudu_utils::task::spawn_task; +use mudu_utils::task_async::spawn_task; use mudu_utils::task_trace; +use mududb::binding::universal::uni_session_open_argv::UniSessionOpenArgv; +use mududb::common::result::RS; +use mududb::common::xid::XID; +use mududb::contract::database::sql_stmt_text::SQLStmtText; +use mududb::sys_interface::async_api::{ + mudu_close as mudu_close_async, mudu_command as mudu_command_async, + mudu_open_argv as mudu_open_argv_async, +}; +use mududb::sys_interface::sync_api::{ + mudu_close, mudu_command as mudu_command_sync, mudu_open_argv, +}; use std::sync::Arc; use std::sync::Barrier as StdBarrier; use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread; use std::time::{Duration, Instant}; -use mududb::sys_interface::async_api::{ - mudu_close as mudu_close_async, mudu_command as mudu_command_async, - mudu_open_argv as mudu_open_argv_async, -}; -use mududb::sys_interface::sync_api::{mudu_close, mudu_command as mudu_command_sync, mudu_open_argv}; use tokio::runtime::Builder; use tokio::sync::{Barrier as TokioBarrier, Semaphore}; use ycsb::rust::procedure::{ @@ -491,7 +493,7 @@ async fn run_workers_async( value_template: Arc, phase: WorkerPhase, ) -> RS { - let _ = task_trace!(); + mudu_utils::scoped_task_trace!(); let next_insert = Arc::new(AtomicUsize::new(args.record_count)); let progress = ProgressReporter::start( phase, @@ -626,7 +628,7 @@ async fn run_worker_async( start_barrier: Option>, phase: WorkerPhase, ) -> RS { - let _ = task_trace!(); + mudu_utils::scoped_task_trace!(); let partition_index = worker_partition(worker_idx, args.partition_count); let slot = routing.slot(partition_index)?; let worker_id = slot.worker_id; @@ -902,7 +904,7 @@ async fn run_run_phase_async( next_insert: &AtomicUsize, progress: Option<&ProgressTracker>, ) -> RS<()> { - let _ = task_trace!(); + mudu_utils::scoped_task_trace!(); let (start, end) = shard_bounds(args.operation_count, connection_count, worker_idx); let (key_start, key_end) = shard_bounds(args.record_count, connection_count, worker_idx); let mut owned_keys = (key_start..key_end).collect::>(); diff --git a/example/ycsb/src/generated/procedure.rs b/example/ycsb/src/generated/procedure.rs index df5b580..13cc8c8 100644 --- a/example/ycsb/src/generated/procedure.rs +++ b/example/ycsb/src/generated/procedure.rs @@ -61,9 +61,9 @@ pub async fn ycsb_read_modify_write(xid: XID, user_key: String, append_value: St mod tests { use super::{ycsb_insert, ycsb_read, ycsb_read_modify_write, ycsb_scan, ycsb_update}; use crate::test_lock; + use mududb::sys_interface::async_api::{mudu_close, mudu_open}; use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; - use mududb::sys_interface::async_api::{mudu_close, mudu_open}; fn temp_db_path(name: &str) -> PathBuf { let suffix = SystemTime::now() @@ -101,623 +101,623 @@ mod tests { mudu_close(xid).await.unwrap(); } -} -async fn mp2_ycsb_read(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_ycsb_read, - ).await -} - -pub async fn mudu_inner_p2_ycsb_read( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = ycsb_read( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_ycsb_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_ycsb_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_ycsb_read() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "ycsb".to_string(), - "ycsb_read".to_string(), - mudu_argv_desc_ycsb_read().clone(), - mudu_result_desc_ycsb_read().clone(), - false - ) - }) -} - -mod mod_ycsb_read { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-ycsb-read; - world mudu-app-mp2-ycsb-read { - export mp2-ycsb-read: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestYcsbRead {} - - impl Guest for GuestYcsbRead { - async fn mp2_ycsb_read(param:Vec) -> Vec { - super::mp2_ycsb_read(param).await - } - } - - export!(GuestYcsbRead); -} -async fn mp2_ycsb_update(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_ycsb_update, - ).await -} - -pub async fn mudu_inner_p2_ycsb_update( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = ycsb_update( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_ycsb_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "value".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_ycsb_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_ycsb_update() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "ycsb".to_string(), - "ycsb_update".to_string(), - mudu_argv_desc_ycsb_update().clone(), - mudu_result_desc_ycsb_update().clone(), - false - ) - }) -} - -mod mod_ycsb_update { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-ycsb-update; - world mudu-app-mp2-ycsb-update { - export mp2-ycsb-update: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestYcsbUpdate {} - - impl Guest for GuestYcsbUpdate { - async fn mp2_ycsb_update(param:Vec) -> Vec { - super::mp2_ycsb_update(param).await - } - } - - export!(GuestYcsbUpdate); -} -async fn mp2_ycsb_scan(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_ycsb_scan, - ).await -} - -pub async fn mudu_inner_p2_ycsb_scan( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = ycsb_scan( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "Vec")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_ycsb_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "start_user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "end_user_key".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_ycsb_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - as ::mududb::types::datum::Datum>::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_ycsb_scan() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "ycsb".to_string(), - "ycsb_scan".to_string(), - mudu_argv_desc_ycsb_scan().clone(), - mudu_result_desc_ycsb_scan().clone(), - false - ) - }) -} - -mod mod_ycsb_scan { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-ycsb-scan; - world mudu-app-mp2-ycsb-scan { - export mp2-ycsb-scan: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestYcsbScan {} - - impl Guest for GuestYcsbScan { - async fn mp2_ycsb_scan(param:Vec) -> Vec { - super::mp2_ycsb_scan(param).await - } - } - - export!(GuestYcsbScan); -} -async fn mp2_ycsb_read_modify_write(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_ycsb_read_modify_write, - ).await -} - -pub async fn mudu_inner_p2_ycsb_read_modify_write( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = ycsb_read_modify_write( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![ - - ::mududb::types::datum::value_from_typed(&tuple, "String")? - - ] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_ycsb_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "append_value".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_ycsb_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_proc_desc_ycsb_read_modify_write() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "ycsb".to_string(), - "ycsb_read_modify_write".to_string(), - mudu_argv_desc_ycsb_read_modify_write().clone(), - mudu_result_desc_ycsb_read_modify_write().clone(), - false - ) - }) -} - -mod mod_ycsb_read_modify_write { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-ycsb-read-modify-write; - world mudu-app-mp2-ycsb-read-modify-write { - export mp2-ycsb-read-modify-write: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestYcsbReadModifyWrite {} - - impl Guest for GuestYcsbReadModifyWrite { - async fn mp2_ycsb_read_modify_write(param:Vec) -> Vec { - super::mp2_ycsb_read_modify_write(param).await - } - } - - export!(GuestYcsbReadModifyWrite); -} -async fn mp2_ycsb_insert(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( - param, - mudu_inner_p2_ycsb_insert, - ).await -} - -pub async fn mudu_inner_p2_ycsb_insert( - param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { - let res = ycsb_insert( - param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[0], "String")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[1], "String")?, - - - ).await; - match res { - Ok(tuple) => { - let return_list = { - - vec![] - - }; - Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) - } - Err(e) => Err(e), - } -} - -pub fn mudu_argv_desc_ycsb_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "user_key".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "value".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) -} - -pub fn mudu_result_desc_ycsb_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ]) - } - ) -} - -pub fn mudu_proc_desc_ycsb_insert() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "ycsb".to_string(), - "ycsb_insert".to_string(), - mudu_argv_desc_ycsb_insert().clone(), - mudu_result_desc_ycsb_insert().clone(), - false - ) - }) -} - -mod mod_ycsb_insert { - wit_bindgen::generate!({ - inline: - r##"package mudu:mp2-ycsb-insert; - world mudu-app-mp2-ycsb-insert { - export mp2-ycsb-insert: func(param:list) -> list; - } - "##, - async: true - }); - - #[allow(non_camel_case_types)] - #[allow(unused)] - struct GuestYcsbInsert {} - - impl Guest for GuestYcsbInsert { - async fn mp2_ycsb_insert(param:Vec) -> Vec { - super::mp2_ycsb_insert(param).await - } - } - - export!(GuestYcsbInsert); -} \ No newline at end of file +} +async fn mp2_ycsb_read(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_ycsb_read, + ).await +} + +pub async fn mudu_inner_p2_ycsb_read( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = ycsb_read( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_ycsb_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_ycsb_read() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_ycsb_read() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "ycsb".to_string(), + "ycsb_read".to_string(), + mudu_argv_desc_ycsb_read().clone(), + mudu_result_desc_ycsb_read().clone(), + false + ) + }) +} + +mod mod_ycsb_read { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-ycsb-read; + world mudu-app-mp2-ycsb-read { + export mp2-ycsb-read: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestYcsbRead {} + + impl Guest for GuestYcsbRead { + async fn mp2_ycsb_read(param:Vec) -> Vec { + super::mp2_ycsb_read(param).await + } + } + + export!(GuestYcsbRead); +} +async fn mp2_ycsb_update(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_ycsb_update, + ).await +} + +pub async fn mudu_inner_p2_ycsb_update( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = ycsb_update( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_ycsb_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "value".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_ycsb_update() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_ycsb_update() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "ycsb".to_string(), + "ycsb_update".to_string(), + mudu_argv_desc_ycsb_update().clone(), + mudu_result_desc_ycsb_update().clone(), + false + ) + }) +} + +mod mod_ycsb_update { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-ycsb-update; + world mudu-app-mp2-ycsb-update { + export mp2-ycsb-update: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestYcsbUpdate {} + + impl Guest for GuestYcsbUpdate { + async fn mp2_ycsb_update(param:Vec) -> Vec { + super::mp2_ycsb_update(param).await + } + } + + export!(GuestYcsbUpdate); +} +async fn mp2_ycsb_insert(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_ycsb_insert, + ).await +} + +pub async fn mudu_inner_p2_ycsb_insert( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = ycsb_insert( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_ycsb_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "value".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_ycsb_insert() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ]) + } + ) +} + +pub fn mudu_proc_desc_ycsb_insert() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "ycsb".to_string(), + "ycsb_insert".to_string(), + mudu_argv_desc_ycsb_insert().clone(), + mudu_result_desc_ycsb_insert().clone(), + false + ) + }) +} + +mod mod_ycsb_insert { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-ycsb-insert; + world mudu-app-mp2-ycsb-insert { + export mp2-ycsb-insert: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestYcsbInsert {} + + impl Guest for GuestYcsbInsert { + async fn mp2_ycsb_insert(param:Vec) -> Vec { + super::mp2_ycsb_insert(param).await + } + } + + export!(GuestYcsbInsert); +} +async fn mp2_ycsb_read_modify_write(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_ycsb_read_modify_write, + ).await +} + +pub async fn mudu_inner_p2_ycsb_read_modify_write( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = ycsb_read_modify_write( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "String")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_ycsb_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "append_value".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_ycsb_read_modify_write() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_ycsb_read_modify_write() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "ycsb".to_string(), + "ycsb_read_modify_write".to_string(), + mudu_argv_desc_ycsb_read_modify_write().clone(), + mudu_result_desc_ycsb_read_modify_write().clone(), + false + ) + }) +} + +mod mod_ycsb_read_modify_write { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-ycsb-read-modify-write; + world mudu-app-mp2-ycsb-read-modify-write { + export mp2-ycsb-read-modify-write: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestYcsbReadModifyWrite {} + + impl Guest for GuestYcsbReadModifyWrite { + async fn mp2_ycsb_read_modify_write(param:Vec) -> Vec { + super::mp2_ycsb_read_modify_write(param).await + } + } + + export!(GuestYcsbReadModifyWrite); +} +async fn mp2_ycsb_scan(param:Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( + param, + mudu_inner_p2_ycsb_scan, + ).await +} + +pub async fn mudu_inner_p2_ycsb_scan( + param: ::mududb::contract::procedure::procedure_param::ProcedureParam, +) -> ::mududb::common::result::RS< + ::mududb::contract::procedure::procedure_result::ProcedureResult, +> { + let res = ycsb_scan( + param.session_id(), + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[0], "String")?, + + + + ::mududb::types::datum::value_to_typed::< + String, + _, + >(¶m.param_list()[1], "String")?, + + + ).await; + match res { + Ok(tuple) => { + let return_list = { + + vec![ + + ::mududb::types::datum::value_from_typed(&tuple, "Vec")? + + ] + + }; + Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) + } + Err(e) => Err(e), + } +} + +pub fn mudu_argv_desc_ycsb_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "start_user_key".to_string(), + + ::dat_type().clone() + + ), + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "end_user_key".to_string(), + + ::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_result_desc_ycsb_scan() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = + std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| + { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + + as ::mududb::types::datum::Datum>::dat_type().clone() + + ), + + ]) + } + ) +} + +pub fn mudu_proc_desc_ycsb_scan() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock< + ::mududb::contract::procedure::proc_desc::ProcDesc, + > = std::sync::OnceLock::new(); + _PROC_DESC + .get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "ycsb".to_string(), + "ycsb_scan".to_string(), + mudu_argv_desc_ycsb_scan().clone(), + mudu_result_desc_ycsb_scan().clone(), + false + ) + }) +} + +mod mod_ycsb_scan { + wit_bindgen::generate!({ + inline: + r##"package mudu:mp2-ycsb-scan; + world mudu-app-mp2-ycsb-scan { + export mp2-ycsb-scan: func(param:list) -> list; + } + "##, + async: true + }); + + #[allow(non_camel_case_types)] + #[allow(unused)] + struct GuestYcsbScan {} + + impl Guest for GuestYcsbScan { + async fn mp2_ycsb_scan(param:Vec) -> Vec { + super::mp2_ycsb_scan(param).await + } + } + + export!(GuestYcsbScan); +} \ No newline at end of file diff --git a/example/ycsb/src/rust/procedure.rs b/example/ycsb/src/rust/procedure.rs index e2b39af..147259d 100644 --- a/example/ycsb/src/rust/procedure.rs +++ b/example/ycsb/src/rust/procedure.rs @@ -61,9 +61,9 @@ pub fn ycsb_read_modify_write(xid: XID, user_key: String, append_value: String) mod tests { use super::{ycsb_insert, ycsb_read, ycsb_read_modify_write, ycsb_scan, ycsb_update}; use crate::test_lock; + use mududb::sys_interface::sync_api::{mudu_close, mudu_open}; use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; - use mududb::sys_interface::sync_api::{mudu_close, mudu_open}; fn temp_db_path(name: &str) -> PathBuf { let suffix = SystemTime::now() diff --git a/mudu/Cargo.toml b/mudu/Cargo.toml index ff6ace6..b4cee6d 100644 --- a/mudu/Cargo.toml +++ b/mudu/Cargo.toml @@ -16,6 +16,8 @@ rmp-serde = { workspace = true } rmpv = { workspace = true } crc = "3.3.0" heck = { version = "0.5.0" } +bigdecimal = { workspace = true } +chrono = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] console-subscriber = {workspace = true} diff --git a/mudu/src/data_type/date.rs b/mudu/src/data_type/date.rs new file mode 100644 index 0000000..fcc3a35 --- /dev/null +++ b/mudu/src/data_type/date.rs @@ -0,0 +1,61 @@ +use crate::data_type::temporal::unix_epoch_date; +use chrono::{NaiveDate, TimeDelta}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub struct DateValue { + days_since_epoch: i32, +} + +impl DateValue { + pub fn from_days_since_epoch(days_since_epoch: i32) -> Self { + Self { days_since_epoch } + } + + pub fn days_since_epoch(&self) -> i32 { + self.days_since_epoch + } + + pub fn parse(s: &str) -> Result { + let date = + NaiveDate::parse_from_str(s, "%Y-%m-%d").map_err(|_| format!("invalid date {}", s))?; + Ok(Self::from_naive_date(date)) + } + + pub fn format(&self) -> String { + self.to_naive_date().format("%Y-%m-%d").to_string() + } + + pub fn from_naive_date(date: NaiveDate) -> Self { + let days = date.signed_duration_since(unix_epoch_date()).num_days() as i32; + Self::from_days_since_epoch(days) + } + + pub fn to_naive_date(&self) -> NaiveDate { + unix_epoch_date() + .checked_add_signed(TimeDelta::days(self.days_since_epoch as i64)) + .expect("date in range") + } +} + +#[cfg(test)] +mod tests { + use super::DateValue; + + #[test] + fn date_roundtrip_preserves_epoch_offsets() { + let before_epoch = DateValue::parse("1969-12-31").unwrap(); + let epoch = DateValue::parse("1970-01-01").unwrap(); + let after_epoch = DateValue::parse("2026-05-20").unwrap(); + + assert_eq!(before_epoch.days_since_epoch(), -1); + assert_eq!(epoch.days_since_epoch(), 0); + assert_eq!(after_epoch.days_since_epoch(), 20_593); + assert_eq!(after_epoch.format(), "2026-05-20"); + } + + #[test] + fn invalid_date_is_rejected() { + assert!(DateValue::parse("2026-02-30").is_err()); + } +} diff --git a/mudu/src/data_type/mod.rs b/mudu/src/data_type/mod.rs new file mode 100644 index 0000000..5f6ce16 --- /dev/null +++ b/mudu/src/data_type/mod.rs @@ -0,0 +1,6 @@ +pub mod date; +pub mod numeric; +pub mod temporal; +pub mod time; +pub mod timestamp; +pub mod timestamptz; diff --git a/mudu/src/data_type/numeric.rs b/mudu/src/data_type/numeric.rs new file mode 100644 index 0000000..213d6f8 --- /dev/null +++ b/mudu/src/data_type/numeric.rs @@ -0,0 +1,149 @@ +use bigdecimal::rounding::RoundingMode; +use bigdecimal::{BigDecimal, ParseBigDecimalError}; +use serde::de::Error as DeError; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::fmt::{Display, Formatter}; +use std::str::FromStr; + +/// Stable Mudu wrapper around `bigdecimal::BigDecimal`. +/// +/// Database-facing crates should depend on this wrapper rather than on the +/// third-party type directly so numeric semantics can evolve behind a single +/// abstraction boundary. +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Numeric { + inner: BigDecimal, +} + +impl Numeric { + pub fn new(inner: BigDecimal) -> Self { + Self { inner } + } + + pub fn zero() -> Self { + Self::from(0_i32) + } + + pub fn parse(value: &str) -> Result { + BigDecimal::from_str(value).map(Self::new) + } + + pub fn from_bigdecimal(inner: BigDecimal) -> Self { + Self::new(inner) + } + + pub fn as_bigdecimal(&self) -> &BigDecimal { + &self.inner + } + + pub fn into_bigdecimal(self) -> BigDecimal { + self.inner + } + + pub fn with_scale(&self, new_scale: i64) -> Self { + Self::new(self.inner.with_scale(new_scale)) + } + + pub fn with_scale_round(&self, new_scale: i64, mode: RoundingMode) -> Self { + Self::new(self.inner.with_scale_round(new_scale, mode)) + } + + pub fn round_half_even(&self, new_scale: i64) -> Self { + self.with_scale_round(new_scale, RoundingMode::HalfEven) + } + + pub fn to_plain_string(&self) -> String { + self.inner.to_plain_string() + } +} + +impl Default for Numeric { + fn default() -> Self { + Self::zero() + } +} + +impl From for Numeric { + fn from(value: BigDecimal) -> Self { + Self::new(value) + } +} + +impl From for BigDecimal { + fn from(value: Numeric) -> Self { + value.into_bigdecimal() + } +} + +macro_rules! impl_numeric_from_int { + ($($ty:ty),+ $(,)?) => { + $( + impl From<$ty> for Numeric { + fn from(value: $ty) -> Self { + Self::new(BigDecimal::from(value)) + } + } + )+ + }; +} + +impl_numeric_from_int!(i8, i16, i32, i64, i128, u8, u16, u32, u64, u128); + +impl FromStr for Numeric { + type Err = ParseBigDecimalError; + + fn from_str(s: &str) -> Result { + Self::parse(s) + } +} + +impl Display for Numeric { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(self.to_plain_string().as_str()) + } +} + +impl Serialize for Numeric { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(self.to_plain_string().as_str()) + } +} + +impl<'de> Deserialize<'de> for Numeric { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + Self::parse(value.as_str()).map_err(D::Error::custom) + } +} + +#[cfg(test)] +mod tests { + use super::Numeric; + use bigdecimal::rounding::RoundingMode; + + #[test] + fn serializes_as_plain_string() { + let value = Numeric::parse("12.3400").unwrap(); + let json = serde_json::to_string(&value).unwrap(); + assert_eq!(json, "\"12.3400\""); + } + + #[test] + fn deserializes_from_string() { + let value: Numeric = serde_json::from_str("\"-0.0100\"").unwrap(); + assert_eq!(value.to_string(), "-0.0100"); + } + + #[test] + fn rounds_with_explicit_mode() { + let value = Numeric::parse("1.235").unwrap(); + let rounded = value.with_scale_round(2, RoundingMode::HalfEven); + assert_eq!(rounded.to_string(), "1.24"); + } +} diff --git a/mudu/src/data_type/temporal.rs b/mudu/src/data_type/temporal.rs new file mode 100644 index 0000000..d097a10 --- /dev/null +++ b/mudu/src/data_type/temporal.rs @@ -0,0 +1,103 @@ +use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, Utc}; + +pub const TEMPORAL_MAX_PRECISION: u8 = 6; +pub const MICROS_PER_SECOND: i64 = 1_000_000; +pub const MICROS_PER_MINUTE: i64 = 60 * MICROS_PER_SECOND; +pub const MICROS_PER_HOUR: i64 = 60 * MICROS_PER_MINUTE; +pub const MICROS_PER_DAY: i64 = 24 * MICROS_PER_HOUR; + +pub fn unix_epoch_date() -> NaiveDate { + NaiveDate::from_ymd_opt(1970, 1, 1).expect("unix epoch date") +} + +pub fn unix_epoch_timestamp() -> NaiveDateTime { + unix_epoch_date() + .and_hms_micro_opt(0, 0, 0, 0) + .expect("unix epoch datetime") +} + +pub fn validate_precision(precision: u8) -> Result<(), String> { + if precision > TEMPORAL_MAX_PRECISION { + return Err(format!( + "temporal precision must be less than or equal to {}", + TEMPORAL_MAX_PRECISION + )); + } + Ok(()) +} + +pub fn precision_factor(precision: u8) -> i64 { + match precision { + 0 => MICROS_PER_SECOND, + 1 => 100_000, + 2 => 10_000, + 3 => 1_000, + 4 => 100, + 5 => 10, + _ => 1, + } +} + +pub fn truncate_micros(micros: i64, precision: u8) -> i64 { + let factor = precision_factor(precision); + micros.div_euclid(factor) * factor +} + +pub fn format_fractional_micros(micros: u32, precision: u8) -> String { + if precision == 0 { + String::new() + } else { + let digits = format!("{:06}", micros); + format!(".{}", &digits[..precision as usize]) + } +} + +pub fn parse_naive_time(s: &str) -> Result { + ["%H:%M:%S%.f", "%H:%M:%S"] + .iter() + .find_map(|fmt| NaiveTime::parse_from_str(s, fmt).ok()) + .ok_or_else(|| format!("invalid time {}", s)) +} + +pub fn parse_naive_timestamp(s: &str) -> Result { + [ + "%Y-%m-%d %H:%M:%S%.f", + "%Y-%m-%d %H:%M:%S", + "%Y-%m-%dT%H:%M:%S%.f", + "%Y-%m-%dT%H:%M:%S", + ] + .iter() + .find_map(|fmt| NaiveDateTime::parse_from_str(s, fmt).ok()) + .ok_or_else(|| format!("invalid timestamp {}", s)) +} + +pub fn parse_fixed_offset_timestamp(s: &str) -> Result, String> { + if let Ok(value) = DateTime::parse_from_rfc3339(s) { + return Ok(value); + } + let normalized = if s.contains(' ') && !s.contains('T') { + s.replacen(' ', "T", 1) + } else { + s.to_string() + }; + DateTime::parse_from_rfc3339(&normalized) + .map_err(|_| format!("invalid timestamp with time zone {}", s)) +} + +pub fn micros_from_naive_timestamp(value: NaiveDateTime) -> Result { + value + .signed_duration_since(unix_epoch_timestamp()) + .num_microseconds() + .ok_or_else(|| "timestamp micros overflow".to_string()) +} + +pub fn naive_timestamp_from_micros(micros: i64) -> Result { + DateTime::::from_timestamp_micros(micros) + .map(|dt| dt.naive_utc()) + .ok_or_else(|| "timestamp micros out of range".to_string()) +} + +pub fn utc_timestamp_from_micros(micros: i64) -> Result, String> { + DateTime::::from_timestamp_micros(micros) + .ok_or_else(|| "timestamp micros out of range".to_string()) +} diff --git a/mudu/src/data_type/time.rs b/mudu/src/data_type/time.rs new file mode 100644 index 0000000..1d90330 --- /dev/null +++ b/mudu/src/data_type/time.rs @@ -0,0 +1,81 @@ +use crate::data_type::temporal::{ + MICROS_PER_DAY, MICROS_PER_HOUR, MICROS_PER_MINUTE, MICROS_PER_SECOND, + format_fractional_micros, parse_naive_time, truncate_micros, validate_precision, +}; +use chrono::{NaiveTime, Timelike}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub struct TimeValue { + micros_since_midnight: i64, +} + +impl TimeValue { + pub fn from_micros_since_midnight(micros_since_midnight: i64) -> Result { + if !(0..MICROS_PER_DAY).contains(µs_since_midnight) { + return Err("time micros must be within a single day".to_string()); + } + Ok(Self { + micros_since_midnight, + }) + } + + pub fn micros_since_midnight(&self) -> i64 { + self.micros_since_midnight + } + + pub fn parse(s: &str) -> Result { + let time = parse_naive_time(s)?; + Self::from_naive_time(time) + } + + pub fn format(&self, precision: u8) -> String { + let precision = precision.min(6); + let micros = truncate_micros(self.micros_since_midnight, precision); + let hour = micros / MICROS_PER_HOUR; + let minute = (micros % MICROS_PER_HOUR) / MICROS_PER_MINUTE; + let second = (micros % MICROS_PER_MINUTE) / MICROS_PER_SECOND; + let micros_part = (micros % MICROS_PER_SECOND) as u32; + format!( + "{:02}:{:02}:{:02}{}", + hour, + minute, + second, + format_fractional_micros(micros_part, precision) + ) + } + + pub fn truncate_precision(&self, precision: u8) -> Result { + validate_precision(precision)?; + Self::from_micros_since_midnight(truncate_micros(self.micros_since_midnight, precision)) + } + + pub fn from_naive_time(time: NaiveTime) -> Result { + let micros = time.num_seconds_from_midnight() as i64 * MICROS_PER_SECOND + + (time.nanosecond() / 1_000) as i64; + Self::from_micros_since_midnight(micros) + } +} + +#[cfg(test)] +mod tests { + use super::{MICROS_PER_DAY, TimeValue}; + + #[test] + fn time_parse_and_truncate_precision() { + let value = TimeValue::parse("12:34:56.123456").unwrap(); + + assert_eq!(value.format(6), "12:34:56.123456"); + assert_eq!( + value.truncate_precision(3).unwrap().format(6), + "12:34:56.123000" + ); + assert_eq!(value.format(3), "12:34:56.123"); + } + + #[test] + fn time_micros_must_stay_within_day() { + assert!(TimeValue::from_micros_since_midnight(-1).is_err()); + assert!(TimeValue::from_micros_since_midnight(MICROS_PER_DAY).is_err()); + } +} diff --git a/mudu/src/data_type/timestamp.rs b/mudu/src/data_type/timestamp.rs new file mode 100644 index 0000000..f281393 --- /dev/null +++ b/mudu/src/data_type/timestamp.rs @@ -0,0 +1,88 @@ +use crate::data_type::temporal::{ + format_fractional_micros, micros_from_naive_timestamp, parse_naive_timestamp, + validate_precision, +}; +use chrono::{DateTime, NaiveDateTime, Timelike, Utc}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub struct TimestampValue { + epoch_micros: i64, +} + +impl TimestampValue { + pub fn from_epoch_micros(epoch_micros: i64) -> Self { + Self { epoch_micros } + } + + pub fn epoch_micros(&self) -> i64 { + self.epoch_micros + } + + pub fn parse(s: &str) -> Result { + let timestamp = parse_naive_timestamp(s)?; + Self::from_naive_datetime(timestamp) + } + + pub fn format(&self, precision: u8) -> Result { + validate_precision(precision)?; + let dt = self.to_naive_datetime()?; + Ok(format!( + "{} {}{}", + dt.date().format("%Y-%m-%d"), + dt.time().format("%H:%M:%S"), + format_fractional_micros(dt.time().nanosecond() / 1_000, precision) + )) + } + + pub fn truncate_precision(&self, precision: u8) -> Result { + validate_precision(precision)?; + let factor = match precision { + 0 => 1_000_000, + 1 => 100_000, + 2 => 10_000, + 3 => 1_000, + 4 => 100, + 5 => 10, + _ => 1, + }; + Ok(Self::from_epoch_micros( + self.epoch_micros.div_euclid(factor) * factor, + )) + } + + pub fn from_naive_datetime(timestamp: NaiveDateTime) -> Result { + Ok(Self::from_epoch_micros(micros_from_naive_timestamp( + timestamp, + )?)) + } + + pub fn to_naive_datetime(&self) -> Result { + DateTime::::from_timestamp_micros(self.epoch_micros) + .map(|dt| dt.naive_utc()) + .ok_or_else(|| "timestamp micros out of range".to_string()) + } +} + +#[cfg(test)] +mod tests { + use super::TimestampValue; + + #[test] + fn timestamp_parse_formats_and_truncates() { + let value = TimestampValue::parse("2026-05-20T14:30:45.123456").unwrap(); + + assert_eq!(value.format(6).unwrap(), "2026-05-20 14:30:45.123456"); + assert_eq!( + value.truncate_precision(4).unwrap().format(6).unwrap(), + "2026-05-20 14:30:45.123400" + ); + assert_eq!(value.format(4).unwrap(), "2026-05-20 14:30:45.1234"); + } + + #[test] + fn timestamp_out_of_range_is_reported() { + let value = TimestampValue::from_epoch_micros(i64::MAX); + assert!(value.to_naive_datetime().is_err()); + } +} diff --git a/mudu/src/data_type/timestamptz.rs b/mudu/src/data_type/timestamptz.rs new file mode 100644 index 0000000..b2d442a --- /dev/null +++ b/mudu/src/data_type/timestamptz.rs @@ -0,0 +1,90 @@ +use crate::data_type::temporal::{ + format_fractional_micros, parse_fixed_offset_timestamp, validate_precision, +}; +use chrono::{DateTime, FixedOffset, Offset, Timelike, Utc}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub struct TimestampTzValue { + epoch_micros_utc: i64, +} + +impl TimestampTzValue { + pub fn from_epoch_micros_utc(epoch_micros_utc: i64) -> Self { + Self { epoch_micros_utc } + } + + pub fn epoch_micros_utc(&self) -> i64 { + self.epoch_micros_utc + } + + pub fn parse(s: &str) -> Result { + let timestamp = parse_fixed_offset_timestamp(s)?; + Ok(Self::from_epoch_micros_utc(timestamp.timestamp_micros())) + } + + pub fn format(&self, precision: u8) -> Result { + self.format_with_offset(precision, Utc.fix()) + } + + pub fn format_with_offset(&self, precision: u8, offset: FixedOffset) -> Result { + validate_precision(precision)?; + let dt = self.to_utc_datetime()?.with_timezone(&offset); + Ok(format!( + "{} {}{}{}", + dt.date_naive().format("%Y-%m-%d"), + dt.time().format("%H:%M:%S"), + format_fractional_micros(dt.time().nanosecond() / 1_000, precision), + dt.format("%:z") + )) + } + + pub fn truncate_precision(&self, precision: u8) -> Result { + validate_precision(precision)?; + let factor = match precision { + 0 => 1_000_000, + 1 => 100_000, + 2 => 10_000, + 3 => 1_000, + 4 => 100, + 5 => 10, + _ => 1, + }; + Ok(Self::from_epoch_micros_utc( + self.epoch_micros_utc.div_euclid(factor) * factor, + )) + } + + pub fn to_utc_datetime(&self) -> Result, String> { + DateTime::::from_timestamp_micros(self.epoch_micros_utc) + .ok_or_else(|| "timestamp with time zone micros out of range".to_string()) + } +} + +#[cfg(test)] +mod tests { + use super::{FixedOffset, TimestampTzValue}; + + #[test] + fn timestamptz_normalizes_to_same_utc_instant() { + let value = TimestampTzValue::parse("2026-05-20 14:30:45.123456+08:00").unwrap(); + + assert_eq!(value.format(6).unwrap(), "2026-05-20 06:30:45.123456+00:00"); + assert_eq!( + value + .format_with_offset(6, FixedOffset::east_opt(8 * 3600).unwrap()) + .unwrap(), + "2026-05-20 14:30:45.123456+08:00" + ); + } + + #[test] + fn timestamptz_truncates_precision() { + let value = TimestampTzValue::parse("2026-05-20T14:30:45.123456+08:00").unwrap(); + + assert_eq!( + value.truncate_precision(3).unwrap().format(6).unwrap(), + "2026-05-20 06:30:45.123000+00:00" + ); + } +} diff --git a/mudu/src/lib.rs b/mudu/src/lib.rs index 3143bb5..6e2ea3b 100644 --- a/mudu/src/lib.rs +++ b/mudu/src/lib.rs @@ -1,6 +1,7 @@ #![feature(associated_type_defaults)] pub mod common; +pub mod data_type; pub mod error; pub mod utils; diff --git a/mudu_adapter/Cargo.toml b/mudu_adapter/Cargo.toml index 08d08d3..e768cbf 100644 --- a/mudu_adapter/Cargo.toml +++ b/mudu_adapter/Cargo.toml @@ -8,6 +8,7 @@ debug_trace = ["dep:async-backtrace", "mudu_utils/debug_trace"] [dependencies] mudu = { workspace = true } +mudu_sys = { workspace = true } mudu_contract = { workspace = true } mudu_binding = { workspace = true } mudu_cli = { workspace = true } diff --git a/mudu_adapter/src/kv.rs b/mudu_adapter/src/kv.rs index aa9d05e..534e07e 100644 --- a/mudu_adapter/src/kv.rs +++ b/mudu_adapter/src/kv.rs @@ -32,9 +32,7 @@ pub fn get(session_id: OID, key: &[u8]) -> RS>> { pub async fn get_async(session_id: OID, key: &[u8]) -> RS>> { let key = key.to_vec(); - tokio::task::spawn_blocking(move || get(session_id, &key)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite kv get task error", e))? + mudu_sys::task_async::spawn_blocking(move || get(session_id, &key)).await? } pub fn put(session_id: OID, key: &[u8], value: &[u8]) -> RS<()> { @@ -55,9 +53,7 @@ pub fn put(session_id: OID, key: &[u8], value: &[u8]) -> RS<()> { pub async fn put_async(session_id: OID, key: &[u8], value: &[u8]) -> RS<()> { let key = key.to_vec(); let value = value.to_vec(); - tokio::task::spawn_blocking(move || put(session_id, &key, &value)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite kv put task error", e))? + mudu_sys::task_async::spawn_blocking(move || put(session_id, &key, &value)).await? } pub fn range(session_id: OID, start_key: &[u8], end_key: &[u8]) -> RS, Vec)>> { @@ -118,9 +114,7 @@ pub async fn range_async( ) -> RS, Vec)>> { let start_key = start_key.to_vec(); let end_key = end_key.to_vec(); - tokio::task::spawn_blocking(move || range(session_id, &start_key, &end_key)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite kv range task error", e))? + mudu_sys::task_async::spawn_blocking(move || range(session_id, &start_key, &end_key)).await? } pub fn ensure_session_exists(session_id: OID) -> RS<()> { @@ -149,7 +143,5 @@ pub fn ensure_session_exists(session_id: OID) -> RS<()> { } pub async fn ensure_session_exists_async(session_id: OID) -> RS<()> { - tokio::task::spawn_blocking(move || ensure_session_exists(session_id)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite session check task error", e))? + mudu_sys::task_async::spawn_blocking(move || ensure_session_exists(session_id)).await? } diff --git a/mudu_adapter/src/mududb.rs b/mudu_adapter/src/mududb.rs index 2ed027a..d22579e 100644 --- a/mudu_adapter/src/mududb.rs +++ b/mudu_adapter/src/mududb.rs @@ -21,13 +21,14 @@ use mudu_contract::protocol::{ }; use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; +use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::sync::a_rwlock::ARwLock; +use mudu_utils::task_async::build_current_thread_runtime; use scc::HashMap as SccHashMap; use std::collections::HashMap; use std::sync::mpsc::{self, Receiver, Sender, SyncSender}; use std::sync::{Arc, Mutex}; use std::thread; -use tokio::runtime::Builder; -use tokio::sync::{Mutex as AsyncMutex, RwLock}; struct MududSession { client: SyncClient, @@ -38,8 +39,8 @@ type SessionRef = Arc>; lazy_static! { static ref SESSIONS: SccHashMap = SccHashMap::new(); - static ref ASYNC_NATIVE_SESSIONS: RwLock>>> = - RwLock::new(HashMap::new()); + static ref ASYNC_NATIVE_SESSIONS: ARwLock>>> = + ARwLock::new(HashMap::new()); } struct AsyncMududSession { @@ -137,7 +138,7 @@ pub async fn mudu_open_async(argv: &UniSessionOpenArgv) -> RS { .await? .session_id(); let session_id = state::next_session_id(); - let session = Arc::new(AsyncMutex::new(AsyncMududSession { + let session = Arc::new(AMutex::new(AsyncMududSession { client, remote_session_id, })); @@ -432,7 +433,7 @@ where f(&mut session) } -async fn async_session(session_id: OID) -> RS>> { +async fn async_session(session_id: OID) -> RS>> { ASYNC_NATIVE_SESSIONS .read() .await @@ -593,10 +594,7 @@ impl AsyncManager { } fn run_async_manager(receiver: Receiver) { - let runtime = Builder::new_current_thread() - .enable_all() - .build() - .expect("build mudud async manager runtime"); + let runtime = build_current_thread_runtime().expect("build mudud async manager runtime"); runtime.block_on(async move { let mut sessions = HashMap::::new(); while let Ok(command) = receiver.recv() { diff --git a/mudu_adapter/src/mysql.rs b/mudu_adapter/src/mysql.rs index 39c2ffc..e4c2bd4 100644 --- a/mudu_adapter/src/mysql.rs +++ b/mudu_adapter/src/mysql.rs @@ -16,6 +16,8 @@ use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dat_value::DatValue; +use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::sync::a_rwlock::ARwLock; use mysql::consts::ColumnType; use mysql::prelude::Queryable; use mysql::{Opts, Pool, Row, Value}; @@ -27,7 +29,6 @@ use mysql_async::{ use scc::HashMap as SccHashMap; use std::collections::HashMap; use std::sync::{Arc, Mutex}; -use tokio::sync::{Mutex as AsyncMutex, RwLock}; type MySqlConnRef = Arc>; @@ -37,8 +38,8 @@ struct MySqlAsyncSession { lazy_static! { static ref SESSIONS: SccHashMap = SccHashMap::new(); - static ref ASYNC_SESSIONS: RwLock>>> = - RwLock::new(HashMap::new()); + static ref ASYNC_SESSIONS: ARwLock>>> = + ARwLock::new(HashMap::new()); } fn connect() -> RS { @@ -108,7 +109,7 @@ pub fn mudu_open() -> RS { pub async fn mudu_open_async() -> RS { let _trace = mudu_utils::task_trace!(); let session_id = state::next_session_id(); - let session = Arc::new(AsyncMutex::new(connect_async().await?)); + let session = Arc::new(AMutex::new(connect_async().await?)); ASYNC_SESSIONS.write().await.insert(session_id, session); Ok(session_id) } @@ -371,7 +372,7 @@ where f(&mut conn) } -async fn with_async_session(session_id: OID) -> RS>> { +async fn with_async_session(session_id: OID) -> RS>> { ASYNC_SESSIONS .read() .await diff --git a/mudu_adapter/src/postgres.rs b/mudu_adapter/src/postgres.rs index 6bcd5fc..3278676 100644 --- a/mudu_adapter/src/postgres.rs +++ b/mudu_adapter/src/postgres.rs @@ -16,13 +16,13 @@ use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dat_value::DatValue; +use mudu_utils::sync::a_rwlock::ARwLock; use postgres::types::Type; use postgres::{Client, NoTls, Row}; use scc::HashMap as SccHashMap; use std::collections::HashMap; use std::sync::Arc; use std::sync::Mutex; -use tokio::sync::RwLock; use tokio::task::JoinHandle; use tokio_postgres::{Client as AsyncClient, NoTls as AsyncNoTls}; @@ -36,8 +36,8 @@ struct PgAsyncSession { lazy_static! { static ref SESSIONS: SccHashMap = SccHashMap::new(); - static ref ASYNC_SESSIONS: RwLock>> = - RwLock::new(HashMap::new()); + static ref ASYNC_SESSIONS: ARwLock>> = + ARwLock::new(HashMap::new()); } fn connect() -> RS { @@ -55,7 +55,7 @@ async fn connect_async() -> RS { let (client, connection) = tokio_postgres::connect(&url, AsyncNoTls) .await .map_err(|e| m_error!(EC::DBInternalError, "connect postgres error", e))?; - let connection_task = tokio::spawn(async move { + let connection_task = mudu_sys::task_async::spawn_tokio(async move { let _ = connection.await; }); initialize_schema_async(&client).await?; diff --git a/mudu_adapter/src/sqlite.rs b/mudu_adapter/src/sqlite.rs index 7132d9a..88c5282 100644 --- a/mudu_adapter/src/sqlite.rs +++ b/mudu_adapter/src/sqlite.rs @@ -69,9 +69,7 @@ pub fn mudu_open() -> RS { pub async fn mudu_open_async() -> RS { let _trace = mudu_utils::task_trace!(); - tokio::task::spawn_blocking(mudu_open) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async open task error", e))? + mudu_sys::task_async::spawn_blocking(mudu_open).await? } pub fn mudu_close(session_id: OID) -> RS<()> { @@ -87,9 +85,7 @@ pub fn mudu_close(session_id: OID) -> RS<()> { pub async fn mudu_close_async(session_id: OID) -> RS<()> { let _trace = mudu_utils::task_trace!(); - tokio::task::spawn_blocking(move || mudu_close(session_id)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async close task error", e))? + mudu_sys::task_async::spawn_blocking(move || mudu_close(session_id)).await? } pub fn mudu_get(session_id: OID, key: &[u8]) -> RS>> { @@ -99,9 +95,7 @@ pub fn mudu_get(session_id: OID, key: &[u8]) -> RS>> { pub async fn mudu_get_async(session_id: OID, key: &[u8]) -> RS>> { let _trace = mudu_utils::task_trace!(); let key = key.to_vec(); - tokio::task::spawn_blocking(move || crate::kv::get(session_id, &key)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async get task error", e))? + mudu_sys::task_async::spawn_blocking(move || crate::kv::get(session_id, &key)).await? } pub fn mudu_put(session_id: OID, key: &[u8], value: &[u8]) -> RS<()> { @@ -112,9 +106,7 @@ pub async fn mudu_put_async(session_id: OID, key: &[u8], value: &[u8]) -> RS<()> let _trace = mudu_utils::task_trace!(); let key = key.to_vec(); let value = value.to_vec(); - tokio::task::spawn_blocking(move || crate::kv::put(session_id, &key, &value)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async put task error", e))? + mudu_sys::task_async::spawn_blocking(move || crate::kv::put(session_id, &key, &value)).await? } pub fn mudu_range( @@ -133,9 +125,8 @@ pub async fn mudu_range_async( let _trace = mudu_utils::task_trace!(); let start_key = start_key.to_vec(); let end_key = end_key.to_vec(); - tokio::task::spawn_blocking(move || crate::kv::range(session_id, &start_key, &end_key)) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async range task error", e))? + mudu_sys::task_async::spawn_blocking(move || crate::kv::range(session_id, &start_key, &end_key)) + .await? } pub fn mudu_query( @@ -177,7 +168,7 @@ pub async fn mudu_query_async( let sql_text = sql.to_sql_string(); let sqlite_params = to_sqlite_values(params)?; let (desc, tuple_rows) = - tokio::task::spawn_blocking(move || -> RS<(TupleFieldDesc, Vec)> { + mudu_sys::task_async::spawn_blocking(move || -> RS<(TupleFieldDesc, Vec)> { kv::ensure_session_exists(oid)?; let conn = open_connection()?; let mut stmt = conn @@ -196,8 +187,7 @@ pub async fn mudu_query_async( } Ok((desc, tuple_rows)) }) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async query task error", e))??; + .await??; Ok(RecordSet::new( Arc::new(LocalResultSet::new(tuple_rows)), Arc::new(desc), @@ -236,7 +226,7 @@ pub async fn mudu_command_async(oid: OID, sql: &dyn SQLStmt, params: &dyn SQLPar let _trace = mudu_utils::task_trace!(); let sql_text = sql.to_sql_string(); let sqlite_params = to_sqlite_values(params)?; - tokio::task::spawn_blocking(move || { + mudu_sys::task_async::spawn_blocking(move || { kv::ensure_session_exists(oid)?; let conn = open_connection()?; let mut stmt = conn @@ -247,8 +237,7 @@ pub async fn mudu_command_async(oid: OID, sql: &dyn SQLStmt, params: &dyn SQLPar .map_err(|e| m_error!(EC::DBInternalError, "execute sqlite command error", e))?; Ok(changed as u64) }) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async command task error", e))? + .await? } pub async fn mudu_batch_async(oid: OID, sql: &dyn SQLStmt, params: &dyn SQLParams) -> RS { @@ -260,13 +249,12 @@ pub async fn mudu_batch_async(oid: OID, sql: &dyn SQLStmt, params: &dyn SQLParam )); } let sql_text = sql.to_sql_string(); - tokio::task::spawn_blocking(move || -> RS { + mudu_sys::task_async::spawn_blocking(move || -> RS { kv::ensure_session_exists(oid)?; let conn = open_connection()?; conn.execute_batch(&sql_text) .map_err(|e| m_error!(EC::DBInternalError, "execute sqlite batch error", e))?; Ok(conn.changes() as u64) }) - .await - .map_err(|e| m_error!(EC::ThreadErr, "join sqlite async batch task error", e))? + .await? } diff --git a/mudu_api/csharp/Mudu.cs b/mudu_api/csharp/Mudu.cs index 57f0592..2fc393e 100644 --- a/mudu_api/csharp/Mudu.cs +++ b/mudu_api/csharp/Mudu.cs @@ -11,8 +11,8 @@ global using UniError = Universal.UniError; global using UniMessage = Universal.UniMessage; global using UniOid = Universal.UniOid; -global using UniPrimitive = Universal.UniPrimitive; -global using UniPrimitiveValue = Universal.UniPrimitiveValue; +global using UniScalar = Universal.UniScalar; +global using UniScalarValue = Universal.UniScalarValue; global using UniQueryArgv = Universal.UniQueryArgv; global using UniQueryResult = Universal.UniQueryResult; global using UniQueryReturn = Universal.UniQueryReturn; diff --git a/mudu_api/csharp/README.md b/mudu_api/csharp/README.md index 5c013e4..2d9e0c1 100644 --- a/mudu_api/csharp/README.md +++ b/mudu_api/csharp/README.md @@ -104,9 +104,9 @@ var argv = new UniCommandArgv { Params = new() { - new universal.UniDatValuePrimitive + new universal.UniDatValueScalar { - Inner = new universal.UniPrimitiveValueString + Inner = new universal.UniScalarValueString { Inner = "alice" } @@ -140,9 +140,9 @@ var argv = new UniQueryArgv { Params = new() { - new universal.UniDatValuePrimitive + new universal.UniDatValueScalar { - Inner = new universal.UniPrimitiveValueString + Inner = new universal.UniScalarValueString { Inner = "alice" } @@ -197,7 +197,7 @@ Use these only when you need raw transport or custom serialization handling: ## Notes -- The mock backend currently supports primitive and binary parameter values. +- The mock backend currently supports scalar and binary parameter values. - The mock query path currently maps SQLite result columns into `uni` result rows and tuple descriptions. - `fetch` in mock mode currently returns the input bytes unchanged. diff --git a/mudu_api/csharp/demo/Program.cs b/mudu_api/csharp/demo/Program.cs index 083aeff..ced1a39 100644 --- a/mudu_api/csharp/demo/Program.cs +++ b/mudu_api/csharp/demo/Program.cs @@ -27,9 +27,9 @@ { Params = new() { - new Universal.UniDatValuePrimitive + new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueI32 + Inner = new Universal.UniScalarValueI32 { Inner = 10 } @@ -51,9 +51,9 @@ foreach (var row in ok.ResultSet.RowSet) { - var id = ((Universal.UniPrimitiveValueI64)((Universal.UniDatValuePrimitive)row.Fields[0]).Inner).Inner; - var name = ((Universal.UniPrimitiveValueString)((Universal.UniDatValuePrimitive)row.Fields[1]).Inner).Inner; - var score = ((Universal.UniPrimitiveValueI64)((Universal.UniDatValuePrimitive)row.Fields[2]).Inner).Inner; + var id = ((Universal.UniScalarValueI64)((Universal.UniDatValueScalar)row.Fields[0]).Inner).Inner; + var name = ((Universal.UniScalarValueString)((Universal.UniDatValueScalar)row.Fields[1]).Inner).Inner; + var score = ((Universal.UniScalarValueI64)((Universal.UniDatValueScalar)row.Fields[2]).Inner).Inner; Console.WriteLine($"{id}: {name} -> {score}"); } @@ -70,16 +70,16 @@ static void InsertUser(string name, int score) { Params = new() { - new Universal.UniDatValuePrimitive + new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueString + Inner = new Universal.UniScalarValueString { Inner = name } }, - new Universal.UniDatValuePrimitive + new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueI32 + Inner = new Universal.UniScalarValueI32 { Inner = score } diff --git a/mudu_api/csharp/demo/README.md b/mudu_api/csharp/demo/README.md index c01d6ec..87affb2 100644 --- a/mudu_api/csharp/demo/README.md +++ b/mudu_api/csharp/demo/README.md @@ -101,4 +101,4 @@ Rules: ## Notes - The demo is intended for local development and integration testing. -- The mock backend currently supports primitive and binary SQL parameters. +- The mock backend currently supports scalar and binary SQL parameters. diff --git a/mudu_api/csharp/mock/MockSqliteMuduSysCall.cs b/mudu_api/csharp/mock/MockSqliteMuduSysCall.cs index 24d8f87..eeefee3 100644 --- a/mudu_api/csharp/mock/MockSqliteMuduSysCall.cs +++ b/mudu_api/csharp/mock/MockSqliteMuduSysCall.cs @@ -192,30 +192,30 @@ private static object ToDbValue(UniDatValue value) { return value switch { - Universal.UniDatValuePrimitive primitive => ToDbPrimitive(primitive.Inner), + Universal.UniDatValueScalar scalar => ToDbScalar(scalar.Inner), Universal.UniDatValueBinary binary => binary.Inner, _ => throw new global::System.NotSupportedException($"Unsupported sqlite parameter type: {value.GetType().Name}"), }; } - private static object ToDbPrimitive(UniPrimitiveValue value) + private static object ToDbScalar(UniScalarValue value) { return value switch { - Universal.UniPrimitiveValueBool v => v.Inner ? 1L : 0L, - Universal.UniPrimitiveValueU8 v => (long)v.Inner, - Universal.UniPrimitiveValueI8 v => (long)v.Inner, - Universal.UniPrimitiveValueU16 v => (long)v.Inner, - Universal.UniPrimitiveValueI16 v => (long)v.Inner, - Universal.UniPrimitiveValueU32 v => (long)v.Inner, - Universal.UniPrimitiveValueI32 v => v.Inner, - Universal.UniPrimitiveValueU64 v => unchecked((long)v.Inner), - Universal.UniPrimitiveValueI64 v => v.Inner, - Universal.UniPrimitiveValueF32 v => (double)v.Inner, - Universal.UniPrimitiveValueF64 v => v.Inner, - Universal.UniPrimitiveValueChar v => v.Inner.ToString(), - Universal.UniPrimitiveValueString v => v.Inner, - _ => throw new global::System.NotSupportedException($"Unsupported sqlite primitive parameter: {value.GetType().Name}"), + Universal.UniScalarValueBool v => v.Inner ? 1L : 0L, + Universal.UniScalarValueU8 v => (long)v.Inner, + Universal.UniScalarValueI8 v => (long)v.Inner, + Universal.UniScalarValueU16 v => (long)v.Inner, + Universal.UniScalarValueI16 v => (long)v.Inner, + Universal.UniScalarValueU32 v => (long)v.Inner, + Universal.UniScalarValueI32 v => v.Inner, + Universal.UniScalarValueU64 v => unchecked((long)v.Inner), + Universal.UniScalarValueI64 v => v.Inner, + Universal.UniScalarValueF32 v => (double)v.Inner, + Universal.UniScalarValueF64 v => v.Inner, + Universal.UniScalarValueChar v => v.Inner.ToString(), + Universal.UniScalarValueString v => v.Inner, + _ => throw new global::System.NotSupportedException($"Unsupported sqlite scalar parameter: {value.GetType().Name}"), }; } @@ -267,13 +267,13 @@ private static UniDatType ToUniDatType(string? sqliteTypeName) var normalized = (sqliteTypeName ?? string.Empty).ToUpperInvariant(); return normalized switch { - "INTEGER" => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.I64 }, - "REAL" => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.F64 }, - "TEXT" => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.String }, - "BLOB" => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.Blob }, - "BOOLEAN" => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.Bool }, - "BOOL" => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.Bool }, - _ => new Universal.UniDatTypePrimitive { Inner = UniPrimitive.String }, + "INTEGER" => new Universal.UniDatTypeScalar { Inner = UniScalar.I64 }, + "REAL" => new Universal.UniDatTypeScalar { Inner = UniScalar.F64 }, + "TEXT" => new Universal.UniDatTypeScalar { Inner = UniScalar.String }, + "BLOB" => new Universal.UniDatTypeScalar { Inner = UniScalar.Blob }, + "BOOLEAN" => new Universal.UniDatTypeScalar { Inner = UniScalar.Bool }, + "BOOL" => new Universal.UniDatTypeScalar { Inner = UniScalar.Bool }, + _ => new Universal.UniDatTypeScalar { Inner = UniScalar.String }, }; } @@ -285,41 +285,41 @@ private static UniDatValue ToUniDatValue(object value, string? sqliteTypeName) { Inner = bytes }, - string text => new Universal.UniDatValuePrimitive + string text => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueString { Inner = text } + Inner = new Universal.UniScalarValueString { Inner = text } }, - double f64 => new Universal.UniDatValuePrimitive + double f64 => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueF64 { Inner = f64 } + Inner = new Universal.UniScalarValueF64 { Inner = f64 } }, - float f32 => new Universal.UniDatValuePrimitive + float f32 => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueF32 { Inner = f32 } + Inner = new Universal.UniScalarValueF32 { Inner = f32 } }, - long i64 => new Universal.UniDatValuePrimitive + long i64 => new Universal.UniDatValueScalar { - Inner = CreateIntegerPrimitive(i64, sqliteTypeName) + Inner = CreateIntegerScalar(i64, sqliteTypeName) }, - int i32 => new Universal.UniDatValuePrimitive + int i32 => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueI32 { Inner = i32 } + Inner = new Universal.UniScalarValueI32 { Inner = i32 } }, - short i16 => new Universal.UniDatValuePrimitive + short i16 => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueI16 { Inner = i16 } + Inner = new Universal.UniScalarValueI16 { Inner = i16 } }, - byte u8 => new Universal.UniDatValuePrimitive + byte u8 => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueU8 { Inner = u8 } + Inner = new Universal.UniScalarValueU8 { Inner = u8 } }, - bool b => new Universal.UniDatValuePrimitive + bool b => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueBool { Inner = b } + Inner = new Universal.UniScalarValueBool { Inner = b } }, - _ => new Universal.UniDatValuePrimitive + _ => new Universal.UniDatValueScalar { - Inner = new Universal.UniPrimitiveValueString + Inner = new Universal.UniScalarValueString { Inner = Convert.ToString(value, global::System.Globalization.CultureInfo.InvariantCulture) ?? string.Empty } @@ -327,15 +327,15 @@ private static UniDatValue ToUniDatValue(object value, string? sqliteTypeName) }; } - private static UniPrimitiveValue CreateIntegerPrimitive(long value, string? sqliteTypeName) + private static UniScalarValue CreateIntegerScalar(long value, string? sqliteTypeName) { var normalized = (sqliteTypeName ?? string.Empty).ToUpperInvariant(); if (normalized == "BOOLEAN" || normalized == "BOOL") { - return new Universal.UniPrimitiveValueBool { Inner = value != 0 }; + return new Universal.UniScalarValueBool { Inner = value != 0 }; } - return new Universal.UniPrimitiveValueI64 { Inner = value }; + return new Universal.UniScalarValueI64 { Inner = value }; } private static UniError ToUniError(global::System.Exception ex) diff --git a/mudu_api/csharp/uni/UniDatType.cs b/mudu_api/csharp/uni/UniDatType.cs index 1102cb2..9b81c84 100644 --- a/mudu_api/csharp/uni/UniDatType.cs +++ b/mudu_api/csharp/uni/UniDatType.cs @@ -10,7 +10,7 @@ namespace Universal { // Annotate inheritance types -[Union(0, typeof(UniDatTypePrimitive))] +[Union(0, typeof(UniDatTypeScalar))] [Union(1, typeof(UniDatTypeArray))] @@ -33,7 +33,7 @@ public interface UniDatType public enum UniDatTypeKind { - Primitive = 0, + Scalar = 0, Array = 1, @@ -53,32 +53,32 @@ public enum UniDatTypeKind { -[MessagePackFormatter(typeof(UniDatTypePrimitiveFormatter))] -public class UniDatTypePrimitive : UniDatType +[MessagePackFormatter(typeof(UniDatTypeScalarFormatter))] +public class UniDatTypeScalar : UniDatType { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniDatTypePrimitive() + public UniDatTypeScalar() { Inner = default; } - public required UniPrimitive Inner { get; set; } + public required UniScalar Inner { get; set; } public UniDatTypeKind Kind() { - return UniDatTypeKind.Primitive; + return UniDatTypeKind.Scalar; } public static UniDatTypeKind KindStatic() { - return UniDatTypeKind.Primitive; + return UniDatTypeKind.Scalar; } - public static UniDatTypePrimitive AsPrimitive(UniDatType value) + public static UniDatTypeScalar AsScalar(UniDatType value) { switch (value) { - case UniDatTypePrimitive v: + case UniDatTypeScalar v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -86,9 +86,9 @@ public static UniDatTypePrimitive AsPrimitive(UniDatType value) } } -public class UniDatTypePrimitiveFormatter : IMessagePackFormatter +public class UniDatTypeScalarFormatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniDatTypePrimitive? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniDatTypeScalar? value, MessagePackSerializerOptions options) { if (value is null) { @@ -99,15 +99,15 @@ public void Serialize(ref MessagePackWriter writer, UniDatTypePrimitive? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniDatTypePrimitive? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniDatTypeScalar? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { return null; } - UniPrimitive inner = MessagePackSerializer.Deserialize(ref reader, options)!; - return new UniDatTypePrimitive { Inner= inner}; + UniScalar inner = MessagePackSerializer.Deserialize(ref reader, options)!; + return new UniDatTypeScalar { Inner= inner}; } } diff --git a/mudu_api/csharp/uni/UniDatValue.cs b/mudu_api/csharp/uni/UniDatValue.cs index 36221fd..d3b19b3 100644 --- a/mudu_api/csharp/uni/UniDatValue.cs +++ b/mudu_api/csharp/uni/UniDatValue.cs @@ -10,7 +10,7 @@ namespace Universal { // Annotate inheritance types -[Union(0, typeof(UniDatValuePrimitive))] +[Union(0, typeof(UniDatValueScalar))] [Union(1, typeof(UniDatValueArray))] @@ -25,7 +25,7 @@ public interface UniDatValue public enum UniDatValueKind { - Primitive = 0, + Scalar = 0, Array = 1, @@ -37,32 +37,32 @@ public enum UniDatValueKind { -[MessagePackFormatter(typeof(UniDatValuePrimitiveFormatter))] -public class UniDatValuePrimitive : UniDatValue +[MessagePackFormatter(typeof(UniDatValueScalarFormatter))] +public class UniDatValueScalar : UniDatValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniDatValuePrimitive() + public UniDatValueScalar() { - Inner = new UniPrimitiveValueString(); + Inner = new UniScalarValueString(); } - public required UniPrimitiveValue Inner { get; set; } + public required UniScalarValue Inner { get; set; } public UniDatValueKind Kind() { - return UniDatValueKind.Primitive; + return UniDatValueKind.Scalar; } public static UniDatValueKind KindStatic() { - return UniDatValueKind.Primitive; + return UniDatValueKind.Scalar; } - public static UniDatValuePrimitive AsPrimitive(UniDatValue value) + public static UniDatValueScalar AsScalar(UniDatValue value) { switch (value) { - case UniDatValuePrimitive v: + case UniDatValueScalar v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -70,9 +70,9 @@ public static UniDatValuePrimitive AsPrimitive(UniDatValue value) } } -public class UniDatValuePrimitiveFormatter : IMessagePackFormatter +public class UniDatValueScalarFormatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniDatValuePrimitive? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniDatValueScalar? value, MessagePackSerializerOptions options) { if (value is null) { @@ -83,15 +83,15 @@ public void Serialize(ref MessagePackWriter writer, UniDatValuePrimitive? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniDatValuePrimitive? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniDatValueScalar? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { return null; } - UniPrimitiveValue inner = MessagePackSerializer.Deserialize(ref reader, options)!; - return new UniDatValuePrimitive { Inner= inner}; + UniScalarValue inner = MessagePackSerializer.Deserialize(ref reader, options)!; + return new UniDatValueScalar { Inner= inner}; } } diff --git a/mudu_api/csharp/uni/UniPrimitive.cs b/mudu_api/csharp/uni/UniPrimitive.cs index 3355531..37d62db 100644 --- a/mudu_api/csharp/uni/UniPrimitive.cs +++ b/mudu_api/csharp/uni/UniPrimitive.cs @@ -7,7 +7,7 @@ namespace Universal { -public enum UniPrimitive { +public enum UniScalar { Bool = 0, diff --git a/mudu_api/csharp/uni/UniPrimitiveValue.cs b/mudu_api/csharp/uni/UniPrimitiveValue.cs index b95f201..ae3be69 100644 --- a/mudu_api/csharp/uni/UniPrimitiveValue.cs +++ b/mudu_api/csharp/uni/UniPrimitiveValue.cs @@ -10,40 +10,40 @@ namespace Universal { // Annotate inheritance types -[Union(0, typeof(UniPrimitiveValueBool))] +[Union(0, typeof(UniScalarValueBool))] -[Union(1, typeof(UniPrimitiveValueU8))] +[Union(1, typeof(UniScalarValueU8))] -[Union(2, typeof(UniPrimitiveValueI8))] +[Union(2, typeof(UniScalarValueI8))] -[Union(3, typeof(UniPrimitiveValueU16))] +[Union(3, typeof(UniScalarValueU16))] -[Union(4, typeof(UniPrimitiveValueI16))] +[Union(4, typeof(UniScalarValueI16))] -[Union(5, typeof(UniPrimitiveValueU32))] +[Union(5, typeof(UniScalarValueU32))] -[Union(6, typeof(UniPrimitiveValueI32))] +[Union(6, typeof(UniScalarValueI32))] -[Union(7, typeof(UniPrimitiveValueU64))] +[Union(7, typeof(UniScalarValueU64))] -[Union(8, typeof(UniPrimitiveValueI64))] +[Union(8, typeof(UniScalarValueI64))] -[Union(9, typeof(UniPrimitiveValueF32))] +[Union(9, typeof(UniScalarValueF32))] -[Union(10, typeof(UniPrimitiveValueF64))] +[Union(10, typeof(UniScalarValueF64))] -[Union(11, typeof(UniPrimitiveValueChar))] +[Union(11, typeof(UniScalarValueChar))] -[Union(12, typeof(UniPrimitiveValueString))] +[Union(12, typeof(UniScalarValueString))] -[Union(13, typeof(UniPrimitiveValueBlob))] +[Union(13, typeof(UniScalarValueBlob))] -public interface UniPrimitiveValue +public interface UniScalarValue { - public UniPrimitiveValueKind Kind(); + public UniScalarValueKind Kind(); } -public enum UniPrimitiveValueKind { +public enum UniScalarValueKind { Bool = 0, @@ -77,12 +77,12 @@ public enum UniPrimitiveValueKind { -[MessagePackFormatter(typeof(UniPrimitiveValueBoolFormatter))] -public class UniPrimitiveValueBool : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueBoolFormatter))] +public class UniScalarValueBool : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueBool() + public UniScalarValueBool() { Inner = false; } @@ -90,19 +90,19 @@ public UniPrimitiveValueBool() public bool Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.Bool; + public UniScalarValueKind Kind() { + return UniScalarValueKind.Bool; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.Bool; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.Bool; } - public static UniPrimitiveValueBool AsBool(UniPrimitiveValue value) + public static UniScalarValueBool AsBool(UniScalarValue value) { switch (value) { - case UniPrimitiveValueBool v: + case UniScalarValueBool v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -110,9 +110,9 @@ public static UniPrimitiveValueBool AsBool(UniPrimitiveValue value) } } -public class UniPrimitiveValueBoolFormatter : IMessagePackFormatter +public class UniScalarValueBoolFormatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueBool? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueBool? value, MessagePackSerializerOptions options) { if (value is null) { @@ -123,7 +123,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueBool? value MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueBool? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueBool? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -131,16 +131,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueBool? value } bool inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueBool { Inner= inner}; + return new UniScalarValueBool { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueU8Formatter))] -public class UniPrimitiveValueU8 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueU8Formatter))] +public class UniScalarValueU8 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueU8() + public UniScalarValueU8() { Inner = 0; } @@ -148,19 +148,19 @@ public UniPrimitiveValueU8() public byte Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.U8; + public UniScalarValueKind Kind() { + return UniScalarValueKind.U8; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.U8; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.U8; } - public static UniPrimitiveValueU8 AsU8(UniPrimitiveValue value) + public static UniScalarValueU8 AsU8(UniScalarValue value) { switch (value) { - case UniPrimitiveValueU8 v: + case UniScalarValueU8 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -168,9 +168,9 @@ public static UniPrimitiveValueU8 AsU8(UniPrimitiveValue value) } } -public class UniPrimitiveValueU8Formatter : IMessagePackFormatter +public class UniScalarValueU8Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU8? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueU8? value, MessagePackSerializerOptions options) { if (value is null) { @@ -181,7 +181,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU8? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueU8? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueU8? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -189,16 +189,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU8? value, } byte inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueU8 { Inner= inner}; + return new UniScalarValueU8 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueI8Formatter))] -public class UniPrimitiveValueI8 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueI8Formatter))] +public class UniScalarValueI8 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueI8() + public UniScalarValueI8() { Inner = 0; } @@ -206,19 +206,19 @@ public UniPrimitiveValueI8() public byte Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.I8; + public UniScalarValueKind Kind() { + return UniScalarValueKind.I8; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.I8; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.I8; } - public static UniPrimitiveValueI8 AsI8(UniPrimitiveValue value) + public static UniScalarValueI8 AsI8(UniScalarValue value) { switch (value) { - case UniPrimitiveValueI8 v: + case UniScalarValueI8 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -226,9 +226,9 @@ public static UniPrimitiveValueI8 AsI8(UniPrimitiveValue value) } } -public class UniPrimitiveValueI8Formatter : IMessagePackFormatter +public class UniScalarValueI8Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI8? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueI8? value, MessagePackSerializerOptions options) { if (value is null) { @@ -239,7 +239,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI8? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueI8? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueI8? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -247,16 +247,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI8? value, } byte inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueI8 { Inner= inner}; + return new UniScalarValueI8 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueU16Formatter))] -public class UniPrimitiveValueU16 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueU16Formatter))] +public class UniScalarValueU16 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueU16() + public UniScalarValueU16() { Inner = 0; } @@ -264,19 +264,19 @@ public UniPrimitiveValueU16() public ushort Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.U16; + public UniScalarValueKind Kind() { + return UniScalarValueKind.U16; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.U16; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.U16; } - public static UniPrimitiveValueU16 AsU16(UniPrimitiveValue value) + public static UniScalarValueU16 AsU16(UniScalarValue value) { switch (value) { - case UniPrimitiveValueU16 v: + case UniScalarValueU16 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -284,9 +284,9 @@ public static UniPrimitiveValueU16 AsU16(UniPrimitiveValue value) } } -public class UniPrimitiveValueU16Formatter : IMessagePackFormatter +public class UniScalarValueU16Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU16? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueU16? value, MessagePackSerializerOptions options) { if (value is null) { @@ -297,7 +297,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU16? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueU16? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueU16? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -305,16 +305,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU16? value, } ushort inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueU16 { Inner= inner}; + return new UniScalarValueU16 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueI16Formatter))] -public class UniPrimitiveValueI16 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueI16Formatter))] +public class UniScalarValueI16 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueI16() + public UniScalarValueI16() { Inner = 0; } @@ -322,19 +322,19 @@ public UniPrimitiveValueI16() public short Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.I16; + public UniScalarValueKind Kind() { + return UniScalarValueKind.I16; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.I16; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.I16; } - public static UniPrimitiveValueI16 AsI16(UniPrimitiveValue value) + public static UniScalarValueI16 AsI16(UniScalarValue value) { switch (value) { - case UniPrimitiveValueI16 v: + case UniScalarValueI16 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -342,9 +342,9 @@ public static UniPrimitiveValueI16 AsI16(UniPrimitiveValue value) } } -public class UniPrimitiveValueI16Formatter : IMessagePackFormatter +public class UniScalarValueI16Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI16? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueI16? value, MessagePackSerializerOptions options) { if (value is null) { @@ -355,7 +355,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI16? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueI16? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueI16? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -363,16 +363,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI16? value, } short inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueI16 { Inner= inner}; + return new UniScalarValueI16 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueU32Formatter))] -public class UniPrimitiveValueU32 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueU32Formatter))] +public class UniScalarValueU32 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueU32() + public UniScalarValueU32() { Inner = 0; } @@ -380,19 +380,19 @@ public UniPrimitiveValueU32() public uint Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.U32; + public UniScalarValueKind Kind() { + return UniScalarValueKind.U32; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.U32; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.U32; } - public static UniPrimitiveValueU32 AsU32(UniPrimitiveValue value) + public static UniScalarValueU32 AsU32(UniScalarValue value) { switch (value) { - case UniPrimitiveValueU32 v: + case UniScalarValueU32 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -400,9 +400,9 @@ public static UniPrimitiveValueU32 AsU32(UniPrimitiveValue value) } } -public class UniPrimitiveValueU32Formatter : IMessagePackFormatter +public class UniScalarValueU32Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU32? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueU32? value, MessagePackSerializerOptions options) { if (value is null) { @@ -413,7 +413,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU32? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueU32? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueU32? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -421,16 +421,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU32? value, } uint inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueU32 { Inner= inner}; + return new UniScalarValueU32 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueI32Formatter))] -public class UniPrimitiveValueI32 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueI32Formatter))] +public class UniScalarValueI32 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueI32() + public UniScalarValueI32() { Inner = 0; } @@ -438,19 +438,19 @@ public UniPrimitiveValueI32() public int Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.I32; + public UniScalarValueKind Kind() { + return UniScalarValueKind.I32; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.I32; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.I32; } - public static UniPrimitiveValueI32 AsI32(UniPrimitiveValue value) + public static UniScalarValueI32 AsI32(UniScalarValue value) { switch (value) { - case UniPrimitiveValueI32 v: + case UniScalarValueI32 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -458,9 +458,9 @@ public static UniPrimitiveValueI32 AsI32(UniPrimitiveValue value) } } -public class UniPrimitiveValueI32Formatter : IMessagePackFormatter +public class UniScalarValueI32Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI32? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueI32? value, MessagePackSerializerOptions options) { if (value is null) { @@ -471,7 +471,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI32? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueI32? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueI32? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -479,16 +479,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI32? value, } int inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueI32 { Inner= inner}; + return new UniScalarValueI32 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueU64Formatter))] -public class UniPrimitiveValueU64 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueU64Formatter))] +public class UniScalarValueU64 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueU64() + public UniScalarValueU64() { Inner = 0; } @@ -496,19 +496,19 @@ public UniPrimitiveValueU64() public ulong Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.U64; + public UniScalarValueKind Kind() { + return UniScalarValueKind.U64; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.U64; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.U64; } - public static UniPrimitiveValueU64 AsU64(UniPrimitiveValue value) + public static UniScalarValueU64 AsU64(UniScalarValue value) { switch (value) { - case UniPrimitiveValueU64 v: + case UniScalarValueU64 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -516,9 +516,9 @@ public static UniPrimitiveValueU64 AsU64(UniPrimitiveValue value) } } -public class UniPrimitiveValueU64Formatter : IMessagePackFormatter +public class UniScalarValueU64Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU64? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueU64? value, MessagePackSerializerOptions options) { if (value is null) { @@ -529,7 +529,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU64? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueU64? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueU64? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -537,16 +537,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueU64? value, } ulong inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueU64 { Inner= inner}; + return new UniScalarValueU64 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueI64Formatter))] -public class UniPrimitiveValueI64 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueI64Formatter))] +public class UniScalarValueI64 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueI64() + public UniScalarValueI64() { Inner = 0; } @@ -554,19 +554,19 @@ public UniPrimitiveValueI64() public long Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.I64; + public UniScalarValueKind Kind() { + return UniScalarValueKind.I64; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.I64; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.I64; } - public static UniPrimitiveValueI64 AsI64(UniPrimitiveValue value) + public static UniScalarValueI64 AsI64(UniScalarValue value) { switch (value) { - case UniPrimitiveValueI64 v: + case UniScalarValueI64 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -574,9 +574,9 @@ public static UniPrimitiveValueI64 AsI64(UniPrimitiveValue value) } } -public class UniPrimitiveValueI64Formatter : IMessagePackFormatter +public class UniScalarValueI64Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI64? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueI64? value, MessagePackSerializerOptions options) { if (value is null) { @@ -587,7 +587,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI64? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueI64? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueI64? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -595,16 +595,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueI64? value, } long inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueI64 { Inner= inner}; + return new UniScalarValueI64 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueF32Formatter))] -public class UniPrimitiveValueF32 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueF32Formatter))] +public class UniScalarValueF32 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueF32() + public UniScalarValueF32() { Inner = 0; } @@ -612,19 +612,19 @@ public UniPrimitiveValueF32() public float Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.F32; + public UniScalarValueKind Kind() { + return UniScalarValueKind.F32; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.F32; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.F32; } - public static UniPrimitiveValueF32 AsF32(UniPrimitiveValue value) + public static UniScalarValueF32 AsF32(UniScalarValue value) { switch (value) { - case UniPrimitiveValueF32 v: + case UniScalarValueF32 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -632,9 +632,9 @@ public static UniPrimitiveValueF32 AsF32(UniPrimitiveValue value) } } -public class UniPrimitiveValueF32Formatter : IMessagePackFormatter +public class UniScalarValueF32Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueF32? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueF32? value, MessagePackSerializerOptions options) { if (value is null) { @@ -645,7 +645,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueF32? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueF32? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueF32? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -653,16 +653,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueF32? value, } float inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueF32 { Inner= inner}; + return new UniScalarValueF32 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueF64Formatter))] -public class UniPrimitiveValueF64 : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueF64Formatter))] +public class UniScalarValueF64 : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueF64() + public UniScalarValueF64() { Inner = 0; } @@ -670,19 +670,19 @@ public UniPrimitiveValueF64() public double Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.F64; + public UniScalarValueKind Kind() { + return UniScalarValueKind.F64; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.F64; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.F64; } - public static UniPrimitiveValueF64 AsF64(UniPrimitiveValue value) + public static UniScalarValueF64 AsF64(UniScalarValue value) { switch (value) { - case UniPrimitiveValueF64 v: + case UniScalarValueF64 v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -690,9 +690,9 @@ public static UniPrimitiveValueF64 AsF64(UniPrimitiveValue value) } } -public class UniPrimitiveValueF64Formatter : IMessagePackFormatter +public class UniScalarValueF64Formatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueF64? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueF64? value, MessagePackSerializerOptions options) { if (value is null) { @@ -703,7 +703,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueF64? value, MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueF64? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueF64? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -711,16 +711,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueF64? value, } double inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueF64 { Inner= inner}; + return new UniScalarValueF64 { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueCharFormatter))] -public class UniPrimitiveValueChar : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueCharFormatter))] +public class UniScalarValueChar : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueChar() + public UniScalarValueChar() { Inner = '\0'; } @@ -728,19 +728,19 @@ public UniPrimitiveValueChar() public char Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.Char; + public UniScalarValueKind Kind() { + return UniScalarValueKind.Char; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.Char; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.Char; } - public static UniPrimitiveValueChar AsChar(UniPrimitiveValue value) + public static UniScalarValueChar AsChar(UniScalarValue value) { switch (value) { - case UniPrimitiveValueChar v: + case UniScalarValueChar v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -748,9 +748,9 @@ public static UniPrimitiveValueChar AsChar(UniPrimitiveValue value) } } -public class UniPrimitiveValueCharFormatter : IMessagePackFormatter +public class UniScalarValueCharFormatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueChar? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueChar? value, MessagePackSerializerOptions options) { if (value is null) { @@ -761,7 +761,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueChar? value MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueChar? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueChar? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -769,16 +769,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueChar? value } char inner = MessagePackSerializer.Deserialize(ref reader, options); - return new UniPrimitiveValueChar { Inner= inner}; + return new UniScalarValueChar { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueStringFormatter))] -public class UniPrimitiveValueString : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueStringFormatter))] +public class UniScalarValueString : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueString() + public UniScalarValueString() { Inner = string.Empty; } @@ -786,19 +786,19 @@ public UniPrimitiveValueString() public required string Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.String; + public UniScalarValueKind Kind() { + return UniScalarValueKind.String; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.String; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.String; } - public static UniPrimitiveValueString AsString(UniPrimitiveValue value) + public static UniScalarValueString AsString(UniScalarValue value) { switch (value) { - case UniPrimitiveValueString v: + case UniScalarValueString v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -806,9 +806,9 @@ public static UniPrimitiveValueString AsString(UniPrimitiveValue value) } } -public class UniPrimitiveValueStringFormatter : IMessagePackFormatter +public class UniScalarValueStringFormatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueString? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueString? value, MessagePackSerializerOptions options) { if (value is null) { @@ -819,7 +819,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueString? val MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueString? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueString? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -827,16 +827,16 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueString? val } string inner = MessagePackSerializer.Deserialize(ref reader, options)!; - return new UniPrimitiveValueString { Inner= inner}; + return new UniScalarValueString { Inner= inner}; } } -[MessagePackFormatter(typeof(UniPrimitiveValueBlobFormatter))] -public class UniPrimitiveValueBlob : UniPrimitiveValue +[MessagePackFormatter(typeof(UniScalarValueBlobFormatter))] +public class UniScalarValueBlob : UniScalarValue { [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] - public UniPrimitiveValueBlob() + public UniScalarValueBlob() { Inner = []; } @@ -844,19 +844,19 @@ public UniPrimitiveValueBlob() public required byte[] Inner { get; set; } - public UniPrimitiveValueKind Kind() { - return UniPrimitiveValueKind.Blob; + public UniScalarValueKind Kind() { + return UniScalarValueKind.Blob; } - public static UniPrimitiveValueKind KindStatic() { - return UniPrimitiveValueKind.Blob; + public static UniScalarValueKind KindStatic() { + return UniScalarValueKind.Blob; } - public static UniPrimitiveValueBlob AsBlob(UniPrimitiveValue value) + public static UniScalarValueBlob AsBlob(UniScalarValue value) { switch (value) { - case UniPrimitiveValueBlob v: + case UniScalarValueBlob v: return v; default: throw new global::System.InvalidOperationException($"Unknown type: {value?.GetType()}"); @@ -864,9 +864,9 @@ public static UniPrimitiveValueBlob AsBlob(UniPrimitiveValue value) } } -public class UniPrimitiveValueBlobFormatter : IMessagePackFormatter +public class UniScalarValueBlobFormatter : IMessagePackFormatter { - public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueBlob? value, MessagePackSerializerOptions options) + public void Serialize(ref MessagePackWriter writer, UniScalarValueBlob? value, MessagePackSerializerOptions options) { if (value is null) { @@ -877,7 +877,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueBlob? value MessagePackSerializer.Serialize(ref writer, value.Inner, options); } - public UniPrimitiveValueBlob? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) + public UniScalarValueBlob? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.TryReadNil()) { @@ -885,7 +885,7 @@ public void Serialize(ref MessagePackWriter writer, UniPrimitiveValueBlob? value } byte[] inner = MessagePackSerializer.Deserialize(ref reader, options)!; - return new UniPrimitiveValueBlob { Inner= inner}; + return new UniScalarValueBlob { Inner= inner}; } } diff --git a/mudu_api/rust/Cargo.lock b/mudu_api/rust/Cargo.lock index 26121bd..4355329 100644 --- a/mudu_api/rust/Cargo.lock +++ b/mudu_api/rust/Cargo.lock @@ -82,34 +82,19 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - [[package]] name = "foldhash" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - [[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ - "foldhash 0.2.0", + "foldhash", ] [[package]] @@ -118,7 +103,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" dependencies = [ - "hashbrown 0.16.1", + "hashbrown", ] [[package]] @@ -140,23 +125,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown", "serde", "serde_core", ] [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ + "cfg-if", "once_cell", "wasm-bindgen", ] @@ -348,7 +334,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8a1f2315036ef6b1fbacd1972e8ee7688030b0a2121edfc2a6550febd41574d" dependencies = [ - "hashbrown 0.16.1", + "hashbrown", "thiserror", ] @@ -568,9 +554,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -581,9 +567,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -591,9 +577,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -604,18 +590,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-encoder" -version = "0.243.0" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55db9c896d70bd9fa535ce83cd4e1f2ec3726b0edd2142079f594fc3be1cb35" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" dependencies = [ "leb128fmt", "wasmparser", @@ -623,9 +609,9 @@ dependencies = [ [[package]] name = "wasm-metadata" -version = "0.243.0" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae05bf9579f45a62e8d0a4e3f52eaa8da518883ac5afa482ec8256c329ecd56" +checksum = "da55e60097e8b37b475a0fa35c3420dd71d9eb7bd66109978ab55faf56a57efb" dependencies = [ "anyhow", "indexmap", @@ -635,12 +621,12 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.243.0" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d8db401b0528ec316dfbe579e6ab4152d61739cfe076706d2009127970159d" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" dependencies = [ "bitflags", - "hashbrown 0.15.5", + "hashbrown", "indexmap", "semver", ] @@ -662,9 +648,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.50.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f72f96146c1e2648232350c3c59efe5a17738767f72efdc5e766b9e4a8c896" +checksum = "2bb00254d5051d69730ee32580b7373592f10ad786757c372f0f2c7b61f86a2c" dependencies = [ "bitflags", "wit-bindgen-rust-macro", @@ -672,9 +658,9 @@ dependencies = [ [[package]] name = "wit-bindgen-core" -version = "0.50.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee98d5747ec63897e51101c8cafad569cc639346332c0378772ef4baeea8ed2" +checksum = "99cdef5ccf0b0e9bf30868d6f9c5ed116c84ae95f84ba29d2216d3e922de3963" dependencies = [ "anyhow", "heck", @@ -683,9 +669,9 @@ dependencies = [ [[package]] name = "wit-bindgen-rust" -version = "0.50.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8596d6a44bcc2b66e99213c342a85ff72be1109972f5353bb07d05a890a0c257" +checksum = "e76541e2f37ac1729db85765729daa0f3c2b5975d66699114d107525f6d6c8d5" dependencies = [ "anyhow", "heck", @@ -699,9 +685,9 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-macro" -version = "0.50.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098fd8b2c4bab0052159a87d02acad740a9c809afe9dcf5bd0b92eb3f63da154" +checksum = "a284e17b2bc808c72ba008f6694626fa76bcac608b3d1ed0880f9add3f558f8e" dependencies = [ "anyhow", "prettyplease", @@ -714,9 +700,9 @@ dependencies = [ [[package]] name = "wit-component" -version = "0.243.0" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f9fc53513e461ce51dcf17a3e331752cb829f1d187069e54af5608fc998fe4" +checksum = "4894f10d2d5cbc17c77e91f86a1e48e191a788da4425293b55c98b44ba3fcac9" dependencies = [ "anyhow", "bitflags", @@ -733,11 +719,12 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.243.0" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df983a8608e513d8997f435bb74207bf0933d0e49ca97aa9d8a6157164b9b7fc" +checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" dependencies = [ "anyhow", + "hashbrown", "id-arena", "indexmap", "log", diff --git a/mudu_api/rust/demo/src/main.rs b/mudu_api/rust/demo/src/main.rs index a3fca45..218c641 100644 --- a/mudu_api/rust/demo/src/main.rs +++ b/mudu_api/rust/demo/src/main.rs @@ -1,5 +1,5 @@ use mudu_api_rust::{ - MockSqliteMuduSysCall, Mudu, UniCommandArgv, UniDatValue, UniOid, UniPrimitiveValue, + MockSqliteMuduSysCall, Mudu, UniCommandArgv, UniDatValue, UniOid, UniScalarValue, UniQueryArgv, UniSqlParam, UniSqlStmt, }; @@ -32,7 +32,7 @@ async fn main() -> Result<(), Box> { .into(), }, param_list: UniSqlParam { - params: vec![UniDatValue::Primitive(UniPrimitiveValue::I32(10))], + params: vec![UniDatValue::Scalar(UniScalarValue::I32(10))], }, }; @@ -46,15 +46,15 @@ async fn main() -> Result<(), Box> { for row in result.result_set.row_set { let id = match &row.fields[0] { - UniDatValue::Primitive(UniPrimitiveValue::I64(value)) => *value, + UniDatValue::Scalar(UniScalarValue::I64(value)) => *value, other => return Err(format!("unexpected id field: {other:?}").into()), }; let name = match &row.fields[1] { - UniDatValue::Primitive(UniPrimitiveValue::String(value)) => value.clone(), + UniDatValue::Scalar(UniScalarValue::String(value)) => value.clone(), other => return Err(format!("unexpected name field: {other:?}").into()), }; let score = match &row.fields[2] { - UniDatValue::Primitive(UniPrimitiveValue::I64(value)) => *value, + UniDatValue::Scalar(UniScalarValue::I64(value)) => *value, other => return Err(format!("unexpected score field: {other:?}").into()), }; @@ -72,8 +72,8 @@ async fn insert_user(name: &str, score: i32) -> Result<(), Box Self::to_db_primitive(primitive), + UniDatValue::Scalar(scalar) => Self::to_db_scalar(scalar), UniDatValue::Binary(bytes) => Ok(Value::Blob(bytes)), other => Err(format!("unsupported sqlite parameter type: {other:?}")), }) .collect() } - fn to_db_primitive(value: UniPrimitiveValue) -> Result { + fn to_db_scalar(value: UniScalarValue) -> Result { match value { - UniPrimitiveValue::Bool(v) => Ok(Value::Integer(if v { 1 } else { 0 })), - UniPrimitiveValue::U8(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::I8(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::U16(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::I16(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::U32(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::I32(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::U64(v) => Ok(Value::Integer(v as i64)), - UniPrimitiveValue::I64(v) => Ok(Value::Integer(v)), - UniPrimitiveValue::F32(v) => Ok(Value::Real(v as f64)), - UniPrimitiveValue::F64(v) => Ok(Value::Real(v)), - UniPrimitiveValue::Char(v) => Ok(Value::Text(v.to_string())), - UniPrimitiveValue::String(v) => Ok(Value::Text(v)), + UniScalarValue::Bool(v) => Ok(Value::Integer(if v { 1 } else { 0 })), + UniScalarValue::U8(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::I8(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::U16(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::I16(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::U32(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::I32(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::U64(v) => Ok(Value::Integer(v as i64)), + UniScalarValue::I64(v) => Ok(Value::Integer(v)), + UniScalarValue::F32(v) => Ok(Value::Real(v as f64)), + UniScalarValue::F64(v) => Ok(Value::Real(v)), + UniScalarValue::Char(v) => Ok(Value::Text(v.to_string())), + UniScalarValue::String(v) => Ok(Value::Text(v)), } } @@ -195,7 +195,7 @@ impl MockSqliteMuduSysCall { .zip(inferred_types) .map(|(field_name, field_type)| UniRecordField { field_name, - field_type: field_type.unwrap_or(UniDatType::Primitive(UniPrimitive::String)), + field_type: field_type.unwrap_or(UniDatType::Scalar(UniScalar::String)), }) .collect(); @@ -208,9 +208,9 @@ impl MockSqliteMuduSysCall { fn to_uni_dat_value(value: ValueRef<'_>) -> Result { match value { ValueRef::Null => Err("NULL value is not supported".to_string()), - ValueRef::Integer(v) => Ok(UniDatValue::Primitive(UniPrimitiveValue::I64(v))), - ValueRef::Real(v) => Ok(UniDatValue::Primitive(UniPrimitiveValue::F64(v))), - ValueRef::Text(v) => Ok(UniDatValue::Primitive(UniPrimitiveValue::String( + ValueRef::Integer(v) => Ok(UniDatValue::Scalar(UniScalarValue::I64(v))), + ValueRef::Real(v) => Ok(UniDatValue::Scalar(UniScalarValue::F64(v))), + ValueRef::Text(v) => Ok(UniDatValue::Scalar(UniScalarValue::String( String::from_utf8_lossy(v).into_owned(), ))), ValueRef::Blob(v) => Ok(UniDatValue::Binary(v.to_vec())), @@ -219,48 +219,48 @@ impl MockSqliteMuduSysCall { fn infer_uni_dat_type(value: &UniDatValue) -> UniDatType { match value { - UniDatValue::Primitive(UniPrimitiveValue::Bool(_)) => { - UniDatType::Primitive(UniPrimitive::Bool) + UniDatValue::Scalar(UniScalarValue::Bool(_)) => { + UniDatType::Scalar(UniScalar::Bool) } - UniDatValue::Primitive(UniPrimitiveValue::U8(_)) => { - UniDatType::Primitive(UniPrimitive::U8) + UniDatValue::Scalar(UniScalarValue::U8(_)) => { + UniDatType::Scalar(UniScalar::U8) } - UniDatValue::Primitive(UniPrimitiveValue::I8(_)) => { - UniDatType::Primitive(UniPrimitive::I8) + UniDatValue::Scalar(UniScalarValue::I8(_)) => { + UniDatType::Scalar(UniScalar::I8) } - UniDatValue::Primitive(UniPrimitiveValue::U16(_)) => { - UniDatType::Primitive(UniPrimitive::U16) + UniDatValue::Scalar(UniScalarValue::U16(_)) => { + UniDatType::Scalar(UniScalar::U16) } - UniDatValue::Primitive(UniPrimitiveValue::I16(_)) => { - UniDatType::Primitive(UniPrimitive::I16) + UniDatValue::Scalar(UniScalarValue::I16(_)) => { + UniDatType::Scalar(UniScalar::I16) } - UniDatValue::Primitive(UniPrimitiveValue::U32(_)) => { - UniDatType::Primitive(UniPrimitive::U32) + UniDatValue::Scalar(UniScalarValue::U32(_)) => { + UniDatType::Scalar(UniScalar::U32) } - UniDatValue::Primitive(UniPrimitiveValue::I32(_)) => { - UniDatType::Primitive(UniPrimitive::I32) + UniDatValue::Scalar(UniScalarValue::I32(_)) => { + UniDatType::Scalar(UniScalar::I32) } - UniDatValue::Primitive(UniPrimitiveValue::U64(_)) => { - UniDatType::Primitive(UniPrimitive::U64) + UniDatValue::Scalar(UniScalarValue::U64(_)) => { + UniDatType::Scalar(UniScalar::U64) } - UniDatValue::Primitive(UniPrimitiveValue::I64(_)) => { - UniDatType::Primitive(UniPrimitive::I64) + UniDatValue::Scalar(UniScalarValue::I64(_)) => { + UniDatType::Scalar(UniScalar::I64) } - UniDatValue::Primitive(UniPrimitiveValue::F32(_)) => { - UniDatType::Primitive(UniPrimitive::F32) + UniDatValue::Scalar(UniScalarValue::F32(_)) => { + UniDatType::Scalar(UniScalar::F32) } - UniDatValue::Primitive(UniPrimitiveValue::F64(_)) => { - UniDatType::Primitive(UniPrimitive::F64) + UniDatValue::Scalar(UniScalarValue::F64(_)) => { + UniDatType::Scalar(UniScalar::F64) } - UniDatValue::Primitive(UniPrimitiveValue::Char(_)) => { - UniDatType::Primitive(UniPrimitive::Char) + UniDatValue::Scalar(UniScalarValue::Char(_)) => { + UniDatType::Scalar(UniScalar::Char) } - UniDatValue::Primitive(UniPrimitiveValue::String(_)) => { - UniDatType::Primitive(UniPrimitive::String) + UniDatValue::Scalar(UniScalarValue::String(_)) => { + UniDatType::Scalar(UniScalar::String) } - UniDatValue::Binary(_) => UniDatType::Primitive(UniPrimitive::Blob), + UniDatValue::Binary(_) => UniDatType::Scalar(UniScalar::Blob), UniDatValue::Array(_) | UniDatValue::Record(_) => { - UniDatType::Primitive(UniPrimitive::String) + UniDatType::Scalar(UniScalar::String) } } } diff --git a/mudu_api/rust/src/universal/mod.rs b/mudu_api/rust/src/universal/mod.rs index fb3afa8..b124352 100644 --- a/mudu_api/rust/src/universal/mod.rs +++ b/mudu_api/rust/src/universal/mod.rs @@ -16,9 +16,6 @@ pub mod uni_get_result; pub mod uni_key_value; pub mod uni_oid; pub mod uni_oid_impl; -pub mod uni_primitive; -pub mod uni_primitive_impl; -pub mod uni_primitive_value; pub mod uni_procedure_param; pub mod uni_procedure_param_impl; pub mod uni_procedure_result; @@ -34,6 +31,9 @@ pub mod uni_record_type; pub mod uni_result; pub mod uni_result_set; pub mod uni_result_type; +pub mod uni_scalar; +pub mod uni_scalar_impl; +pub mod uni_scalar_value; pub mod uni_session_open_argv; pub mod uni_session_open_argv_impl; pub mod uni_sql_param; diff --git a/mudu_api/rust/src/universal/test_uni.rs b/mudu_api/rust/src/universal/test_uni.rs index 3444440..b3b7855 100644 --- a/mudu_api/rust/src/universal/test_uni.rs +++ b/mudu_api/rust/src/universal/test_uni.rs @@ -7,8 +7,6 @@ mod tests { use crate::universal::uni_get_result::UniGetResult; use crate::universal::uni_key_value::UniKeyValue; use crate::universal::uni_oid::UniOid; - use crate::universal::uni_primitive::UniPrimitive; - use crate::universal::uni_primitive_value::UniPrimitiveValue; use crate::universal::uni_procedure_param::UniProcedureParam; use crate::universal::uni_procedure_result::UniProcedureResult; use crate::universal::uni_query_argv::UniQueryArgv; @@ -18,12 +16,17 @@ mod tests { use crate::universal::uni_result::UniResult; use crate::universal::uni_result_set::UniResultSet; use crate::universal::uni_result_type::UniResultType; + use crate::universal::uni_scalar::UniScalar; + use crate::universal::uni_scalar_value::UniScalarValue; use crate::universal::uni_sql_param::UniSqlParam; use crate::universal::uni_sql_stmt::UniSqlStmt; use crate::universal::uni_tuple_row::UniTupleRow; use mudu::common::serde_utils::{ deserialize_from, deserialize_from_json, serialize_to_json, serialize_to_vec, }; + use mudu::data_type::numeric::Numeric; + use mudu_type::dat_type::DatType; + use mudu_type::dtp_numeric::DTPNumeric; use serde::Serialize; use serde::de::DeserializeOwned; use std::fmt::Debug; @@ -56,17 +59,15 @@ mod tests { record_fields: vec![ UniRecordField { field_name: "id".to_string(), - field_type: UniDatType::Primitive(UniPrimitive::U128), + field_type: UniDatType::Scalar(UniScalar::U128), }, UniRecordField { field_name: "name".to_string(), - field_type: UniDatType::Primitive(UniPrimitive::String), + field_type: UniDatType::Scalar(UniScalar::String), }, UniRecordField { field_name: "tags".to_string(), - field_type: UniDatType::Array(Box::new(UniDatType::Primitive( - UniPrimitive::String, - ))), + field_type: UniDatType::Array(Box::new(UniDatType::Scalar(UniScalar::String))), }, ], } @@ -79,16 +80,16 @@ mod tests { UniRecordField { field_name: "meta".to_string(), field_type: UniDatType::Tuple(vec![ - UniDatType::Primitive(UniPrimitive::U64), - UniDatType::Option(Box::new(UniDatType::Primitive(UniPrimitive::String))), + UniDatType::Scalar(UniScalar::U64), + UniDatType::Option(Box::new(UniDatType::Scalar(UniScalar::String))), ]), }, UniRecordField { field_name: "payload".to_string(), field_type: UniDatType::Result(UniResultType { - ok: Some(Box::new(UniDatType::Array(Box::new( - UniDatType::Primitive(UniPrimitive::I32), - )))), + ok: Some(Box::new(UniDatType::Array(Box::new(UniDatType::Scalar( + UniScalar::I32, + ))))), err: Some(Box::new(UniDatType::Identifier("ErrCode".to_string()))), }), }, @@ -103,12 +104,12 @@ mod tests { fn sample_dat_value() -> UniDatValue { UniDatValue::Record(vec![ UniDatValue::Array(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_i32(10)), - UniDatValue::Primitive(UniPrimitiveValue::from_i32(-4)), + UniDatValue::Scalar(UniScalarValue::from_i32(10)), + UniDatValue::Scalar(UniScalarValue::from_i32(-4)), ]), UniDatValue::Record(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_bool(true)), - UniDatValue::Primitive(UniPrimitiveValue::from_string("ok".to_string())), + UniDatValue::Scalar(UniScalarValue::from_bool(true)), + UniDatValue::Scalar(UniScalarValue::from_string("ok".to_string())), ]), UniDatValue::Binary(vec![1, 2, 3, 4, 200]), ]) @@ -121,11 +122,11 @@ mod tests { eof: false, row_set: vec![UniTupleRow { fields: vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_u128(99)), - UniDatValue::Primitive(UniPrimitiveValue::from_string("alice".to_string())), + UniDatValue::Scalar(UniScalarValue::from_u128(99)), + UniDatValue::Scalar(UniScalarValue::from_string("alice".to_string())), UniDatValue::Array(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_string("x".to_string())), - UniDatValue::Primitive(UniPrimitiveValue::from_string("y".to_string())), + UniDatValue::Scalar(UniScalarValue::from_string("x".to_string())), + UniDatValue::Scalar(UniScalarValue::from_string("y".to_string())), ]), ], }], @@ -148,23 +149,24 @@ mod tests { } #[test] - fn test_uni_primitive_value_roundtrip_matrix() { + fn test_uni_scalar_value_roundtrip_matrix() { let cases = vec![ - UniPrimitiveValue::from_bool(true), - UniPrimitiveValue::from_u8(3), - UniPrimitiveValue::from_i8(7), - UniPrimitiveValue::from_u16(16), - UniPrimitiveValue::from_i16(-16), - UniPrimitiveValue::from_u32(32), - UniPrimitiveValue::from_i32(-32), - UniPrimitiveValue::from_u64(64), - UniPrimitiveValue::from_u128(128), - UniPrimitiveValue::from_i64(-64), - UniPrimitiveValue::from_i128(-128), - UniPrimitiveValue::from_f32(3.25), - UniPrimitiveValue::from_f64(-9.5), - UniPrimitiveValue::from_char('z'), - UniPrimitiveValue::from_string("hello".to_string()), + UniScalarValue::from_bool(true), + UniScalarValue::from_u8(3), + UniScalarValue::from_i8(7), + UniScalarValue::from_u16(16), + UniScalarValue::from_i16(-16), + UniScalarValue::from_u32(32), + UniScalarValue::from_i32(-32), + UniScalarValue::from_u64(64), + UniScalarValue::from_u128(128), + UniScalarValue::from_i64(-64), + UniScalarValue::from_i128(-128), + UniScalarValue::from_f32(3.25), + UniScalarValue::from_f64(-9.5), + UniScalarValue::from_char('z'), + UniScalarValue::from_string("hello".to_string()), + UniScalarValue::from_numeric("12.3400".to_string()), ]; for value in cases { @@ -175,10 +177,10 @@ mod tests { #[test] fn test_uni_dat_value_roundtrip_matrix() { let cases = vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_string("row".to_string())), + UniDatValue::Scalar(UniScalarValue::from_string("row".to_string())), UniDatValue::Array(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_u64(1)), - UniDatValue::Primitive(UniPrimitiveValue::from_u64(2)), + UniDatValue::Scalar(UniScalarValue::from_u64(1)), + UniDatValue::Scalar(UniScalarValue::from_u64(2)), ]), sample_dat_value(), UniDatValue::Binary(vec![0, 1, 2, 3, 255]), @@ -209,7 +211,7 @@ mod tests { sql_string: "select id, name from users where id = ?".to_string(), }; let sql_param = UniSqlParam { - params: vec![UniDatValue::Primitive(UniPrimitiveValue::from_u128(7))], + params: vec![UniDatValue::Scalar(UniScalarValue::from_u128(7))], }; let query_argv = UniQueryArgv { @@ -231,13 +233,13 @@ mod tests { return_list: vec![sample_dat_value()], }; let get_result = UniGetResult { - value: Some(UniDatValue::Primitive(UniPrimitiveValue::from_string( + value: Some(UniDatValue::Scalar(UniScalarValue::from_string( "payload".to_string(), ))), }; let range_result = UniRangeResult { items: vec![UniKeyValue { - key: UniDatValue::Primitive(UniPrimitiveValue::from_u64(1)), + key: UniDatValue::Scalar(UniScalarValue::from_u64(1)), value: sample_dat_value(), }], }; @@ -256,11 +258,11 @@ mod tests { fn test_uni_dat_type_and_value_reject_invalid_tags() { let invalid_dat_type_json = "[99,0]"; let invalid_dat_value_json = "[99,0]"; - let invalid_primitive_json = "[99,0]"; + let invalid_scalar_json = "[99,0]"; assert!(deserialize_from_json::(invalid_dat_type_json).is_err()); assert!(deserialize_from_json::(invalid_dat_value_json).is_err()); - assert!(deserialize_from_json::(invalid_primitive_json).is_err()); + assert!(deserialize_from_json::(invalid_scalar_json).is_err()); } #[test] @@ -275,4 +277,174 @@ mod tests { let truncated = &binary[..binary.len() - 1]; assert!(deserialize_from::(truncated).is_err()); } + + #[test] + fn test_uni_numeric_type_params_roundtrip_through_dat_type() { + let uni_ty = UniDatType::Scalar(UniScalar::Numeric); + let params = vec![ + UniDatValue::Scalar(UniScalarValue::from_i64(18)), + UniDatValue::Scalar(UniScalarValue::from_i64(4)), + ]; + + let dat_type = uni_ty.clone().uni_to_with_params(Some(params)).unwrap(); + assert_eq!( + dat_type.dat_type_id(), + mudu_type::dat_type_id::DatTypeID::Numeric + ); + let numeric = dat_type.expect_numeric_param(); + assert_eq!(numeric.precision(), 18); + assert_eq!(numeric.scale(), 4); + + let uni_back = UniDatType::uni_from(dat_type).unwrap(); + assert_eq!( + serialize_to_json(&uni_back).unwrap(), + serialize_to_json(&uni_ty).unwrap() + ); + } + + #[test] + fn test_uni_numeric_value_roundtrip_through_dat_value() { + let uni_value = UniDatValue::Scalar(UniScalarValue::from_numeric("12.3400".to_string())); + + let dat_value = uni_value.clone().uni_to().unwrap(); + assert_eq!(dat_value.expect_numeric().to_plain_string(), "12.3400"); + + let uni_back = UniDatValue::uni_from(dat_value).unwrap(); + let scalar = uni_back.as_scalar().expect("scalar numeric"); + assert_eq!(scalar.expect_numeric(), "12.3400"); + + assert_json_and_binary_roundtrip(&uni_value); + } + + #[test] + fn test_uni_numeric_rejects_invalid_shapes() { + let invalid_numeric_value = + UniDatValue::Scalar(UniScalarValue::from_numeric("not-a-number".to_string())); + assert!(invalid_numeric_value.uni_to().is_err()); + + let invalid_numeric_type = UniDatType::Scalar(UniScalar::Numeric); + let invalid_params = vec![ + UniDatValue::Scalar(UniScalarValue::from_i64(4)), + UniDatValue::Scalar(UniScalarValue::from_i64(9)), + ]; + assert!( + invalid_numeric_type + .uni_to_with_params(Some(invalid_params)) + .is_err() + ); + + let dat_type = DatType::from_numeric(DTPNumeric::new(9, 2)); + let uni_type = UniDatType::uni_from(dat_type).unwrap(); + assert!(matches!(uni_type, UniDatType::Scalar(UniScalar::Numeric))); + + let dat_value = + mudu_type::dat_value::DatValue::from_numeric(Numeric::parse("7.50").unwrap()); + let uni_value = UniDatValue::uni_from(dat_value).unwrap(); + let scalar = uni_value.as_scalar().expect("numeric scalar"); + assert_eq!(scalar.expect_numeric(), "7.50"); + } + + #[test] + fn test_uni_temporal_type_params_roundtrip_through_dat_type() { + let cases = vec![ + ( + UniDatType::Scalar(UniScalar::Time), + vec![UniDatValue::Scalar(UniScalarValue::from_i64(3))], + mudu_type::dat_type_id::DatTypeID::Time, + 3u8, + ), + ( + UniDatType::Scalar(UniScalar::Timestamp), + vec![UniDatValue::Scalar(UniScalarValue::from_i64(4))], + mudu_type::dat_type_id::DatTypeID::Timestamp, + 4u8, + ), + ( + UniDatType::Scalar(UniScalar::TimestampTz), + vec![UniDatValue::Scalar(UniScalarValue::from_i64(2))], + mudu_type::dat_type_id::DatTypeID::TimestampTz, + 2u8, + ), + ]; + + for (uni_ty, params, expected_id, expected_precision) in cases { + let dat_type = uni_ty.clone().uni_to_with_params(Some(params)).unwrap(); + assert_eq!(dat_type.dat_type_id(), expected_id); + let actual_precision = match expected_id { + mudu_type::dat_type_id::DatTypeID::Time => dat_type.expect_time_param().precision(), + mudu_type::dat_type_id::DatTypeID::Timestamp => { + dat_type.expect_timestamp_param().precision() + } + mudu_type::dat_type_id::DatTypeID::TimestampTz => { + dat_type.expect_timestamptz_param().precision() + } + _ => unreachable!(), + }; + assert_eq!(actual_precision, expected_precision); + + let uni_back = UniDatType::uni_from(dat_type).unwrap(); + assert_eq!( + serialize_to_json(&uni_back).unwrap(), + serialize_to_json(&uni_ty).unwrap() + ); + } + } + + #[test] + fn test_uni_temporal_values_roundtrip_through_dat_value() { + let cases = vec![ + ( + UniDatValue::Scalar(UniScalarValue::from_date("2026-05-20".to_string())), + "2026-05-20", + ), + ( + UniDatValue::Scalar(UniScalarValue::from_time("12:34:56.123456".to_string())), + "12:34:56.123456", + ), + ( + UniDatValue::Scalar(UniScalarValue::from_timestamp( + "2026-05-20 14:30:45.123456".to_string(), + )), + "2026-05-20 14:30:45.123456", + ), + ( + UniDatValue::Scalar(UniScalarValue::from_timestamptz( + "2026-05-20T14:30:45.123456+08:00".to_string(), + )), + "2026-05-20 06:30:45.123456+00:00", + ), + ]; + + for (uni_value, expected_text) in cases { + let dat_value = uni_value.clone().uni_to().unwrap(); + let uni_back = UniDatValue::uni_from(dat_value).unwrap(); + let scalar = uni_back.as_scalar().expect("temporal scalar"); + let text = match scalar { + UniScalarValue::Date(v) + | UniScalarValue::Time(v) + | UniScalarValue::Timestamp(v) + | UniScalarValue::TimestampTz(v) => v.as_str(), + _ => unreachable!(), + }; + assert_eq!(text, expected_text); + assert_json_and_binary_roundtrip(&uni_value); + } + } + + #[test] + fn test_uni_temporal_rejects_invalid_shapes() { + let invalid_values = vec![ + UniDatValue::Scalar(UniScalarValue::from_date("2026-02-30".to_string())), + UniDatValue::Scalar(UniScalarValue::from_time("25:00:00".to_string())), + UniDatValue::Scalar(UniScalarValue::from_timestamp( + "not-a-timestamp".to_string(), + )), + UniDatValue::Scalar(UniScalarValue::from_timestamptz( + "2026-05-20 14:30:45".to_string(), + )), + ]; + for value in invalid_values { + assert!(value.uni_to().is_err()); + } + } } diff --git a/mudu_api/rust/src/universal/uni_dat_type.rs b/mudu_api/rust/src/universal/uni_dat_type.rs index d333c81..77ad40f 100644 --- a/mudu_api/rust/src/universal/uni_dat_type.rs +++ b/mudu_api/rust/src/universal/uni_dat_type.rs @@ -1,4 +1,4 @@ -use crate::universal::uni_primitive::UniPrimitive; +use crate::universal::uni_scalar::UniScalar; use crate::universal::uni_record_type::UniRecordType; @@ -7,7 +7,7 @@ use crate::universal::uni_result_type::UniResultType; #[derive(Debug, Clone)] pub enum UniDatType { - Primitive(UniPrimitive), + Scalar(UniScalar), Array(Box), @@ -28,25 +28,25 @@ pub enum UniDatType { impl Default for UniDatType { fn default() -> Self { - Self::Primitive(Default::default()) + Self::Scalar(Default::default()) } } impl UniDatType { - pub fn from_primitive(inner: UniPrimitive) -> Self { - Self::Primitive(inner) + pub fn from_scalar(inner: UniScalar) -> Self { + Self::Scalar(inner) } - pub fn as_primitive(&self) -> Option<&UniPrimitive> { + pub fn as_scalar(&self) -> Option<&UniScalar> { match self { - Self::Primitive(inner) => Some(inner), + Self::Scalar(inner) => Some(inner), _ => None, } } - pub fn expect_primitive(&self) -> &UniPrimitive { + pub fn expect_scalar(&self) -> &UniScalar { match self { - Self::Primitive(inner) => inner, + Self::Scalar(inner) => inner, _ => unsafe { std::hint::unreachable_unchecked() }, } } @@ -186,7 +186,7 @@ impl serde::Serialize for UniDatType { use serde::ser::SerializeSeq; let mut serialize_seq = serializer.serialize_seq(Some(2))?; match self { - UniDatType::Primitive(inner) => { + UniDatType::Scalar(inner) => { serialize_seq.serialize_element(&0u32)?; serialize_seq.serialize_element(&inner)?; } @@ -262,9 +262,9 @@ impl<'de> serde::de::Visitor<'de> for UniDatTypeVisitor { match id { 0 => { let value = seq - .next_element::()? + .next_element::()? .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; - Ok(Self::Value::Primitive(value)) + Ok(Self::Value::Scalar(value)) } 1 => { diff --git a/mudu_api/rust/src/universal/uni_dat_type_id.rs b/mudu_api/rust/src/universal/uni_dat_type_id.rs index 8021202..f4f2df2 100644 --- a/mudu_api/rust/src/universal/uni_dat_type_id.rs +++ b/mudu_api/rust/src/universal/uni_dat_type_id.rs @@ -45,6 +45,16 @@ pub enum UniDatTypeId { Record = 16, Binary = 17, + + Numeric = 18, + + Date = 19, + + Time = 20, + + Timestamp = 21, + + TimestampTz = 22, } impl Default for UniDatTypeId { diff --git a/mudu_api/rust/src/universal/uni_dat_type_id_impl.rs b/mudu_api/rust/src/universal/uni_dat_type_id_impl.rs index 2bb263d..c2943c4 100644 --- a/mudu_api/rust/src/universal/uni_dat_type_id_impl.rs +++ b/mudu_api/rust/src/universal/uni_dat_type_id_impl.rs @@ -19,6 +19,11 @@ impl UniDatTypeId { Self::Array => DatTypeID::Array, Self::Record => DatTypeID::Record, Self::Binary => DatTypeID::Binary, + Self::Numeric => DatTypeID::Numeric, + Self::Date => DatTypeID::Date, + Self::Time => DatTypeID::Time, + Self::Timestamp => DatTypeID::Timestamp, + Self::TimestampTz => DatTypeID::TimestampTz, _ => return Err(m_error!(EC::TypeErr, "unsupported universal data type id")), }; Ok(ty_id) @@ -36,6 +41,11 @@ impl UniDatTypeId { DatTypeID::Array => Self::Array, DatTypeID::Record => Self::Record, DatTypeID::Binary => Self::Binary, + DatTypeID::Numeric => Self::Numeric, + DatTypeID::Date => Self::Date, + DatTypeID::Time => Self::Time, + DatTypeID::Timestamp => Self::Timestamp, + DatTypeID::TimestampTz => Self::TimestampTz, }; Ok(uni_ty) } diff --git a/mudu_api/rust/src/universal/uni_dat_type_impl.rs b/mudu_api/rust/src/universal/uni_dat_type_impl.rs index 47bddfa..34dd74a 100644 --- a/mudu_api/rust/src/universal/uni_dat_type_impl.rs +++ b/mudu_api/rust/src/universal/uni_dat_type_impl.rs @@ -1,5 +1,7 @@ use crate::universal::uni_dat_type::UniDatType; -use crate::universal::uni_primitive::UniPrimitive; +use crate::universal::uni_dat_value::UniDatValue; +use crate::universal::uni_scalar::UniScalar; +use crate::universal::uni_scalar_value::UniScalarValue; use mudu::common::into_result::ToResult; use mudu::common::result::RS; use mudu::error::ec::EC; @@ -8,17 +10,26 @@ use mudu_type::dat_type::DatType; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dtp_array::DTPArray; use mudu_type::dtp_kind::DTPKind; +use mudu_type::dtp_numeric::DTPNumeric; use mudu_type::dtp_object::DTPRecord; +use mudu_type::dtp_string::DTPString; +use mudu_type::dtp_time::DTPTime; +use mudu_type::dtp_timestamp::DTPTimestamp; +use mudu_type::dtp_timestamptz::DTPTimestampTz; use std::collections::{HashMap, HashSet, VecDeque}; use crate::universal::uni_record_type::{UniRecordField, UniRecordType}; impl UniDatType { pub fn uni_to(self) -> RS { + self.uni_to_with_params(None) + } + + pub fn uni_to_with_params(self, params: Option>) -> RS { let ty = match self { - UniDatType::Primitive(primitive) => primitive.to()?, + UniDatType::Scalar(scalar) => scalar_with_params_to(scalar, params)?, UniDatType::Array(inner) => { - let ty = Box::into_inner(inner); + let ty = *inner; let inner_ty = ty.uni_to()?; let array_kind = DTPKind::Array(Box::new(DTPArray::new(inner_ty))); DatType::from_id_param(DatTypeID::Array, Some(array_kind)) @@ -41,9 +52,9 @@ impl UniDatType { } pub fn uni_from(ty: DatType) -> RS { - let uni_ty = if ty.dat_type_id().is_primitive_type() { - let primitive = UniPrimitive::uni_from(ty)?; - UniDatType::Primitive(primitive) + let uni_ty = if ty.dat_type_id().is_scalar_type() { + let scalar = UniScalar::uni_from(ty)?; + UniDatType::Scalar(scalar) } else { match ty.dat_type_id() { DatTypeID::Array => { @@ -83,6 +94,87 @@ impl UniDatType { } } +fn scalar_with_params_to(scalar: UniScalar, params: Option>) -> RS { + match (scalar, params) { + (UniScalar::String, Some(params)) if !params.is_empty() => { + let Some(UniDatValue::Scalar(UniScalarValue::I64(length))) = params.first().cloned() + else { + return Err(m_error!(EC::TypeErr, "string parameter must be i64")); + }; + Ok(DatType::from_string(DTPString::new(length as u32))) + } + (UniScalar::Numeric, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "numeric precision")?; + let scale = if params.len() > 1 { + extract_param_i64(¶ms, 1, "numeric scale")? + } else { + 0 + }; + if precision < 0 || scale < 0 { + return Err(m_error!( + EC::TypeErr, + "numeric precision/scale must be non-negative" + )); + } + let param = DTPNumeric::new(precision as u8, scale as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_numeric(param)) + } + (UniScalar::Time, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "time precision")?; + if precision < 0 { + return Err(m_error!(EC::TypeErr, "time precision must be non-negative")); + } + let param = DTPTime::new(precision as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_time(param)) + } + (UniScalar::Timestamp, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "timestamp precision")?; + if precision < 0 { + return Err(m_error!( + EC::TypeErr, + "timestamp precision must be non-negative" + )); + } + let param = DTPTimestamp::new(precision as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_timestamp(param)) + } + (UniScalar::TimestampTz, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "timestamptz precision")?; + if precision < 0 { + return Err(m_error!( + EC::TypeErr, + "timestamptz precision must be non-negative" + )); + } + let param = DTPTimestampTz::new(precision as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_timestamptz(param)) + } + (scalar, _) => scalar.to(), + } +} + +fn extract_param_i64(params: &[UniDatValue], index: usize, name: &str) -> RS { + let value = params + .get(index) + .ok_or_else(|| m_error!(EC::TypeErr, format!("missing {}", name)))?; + let UniDatValue::Scalar(UniScalarValue::I64(value)) = value else { + return Err(m_error!(EC::TypeErr, format!("{} must be i64", name))); + }; + Ok(*value) +} + fn _rewrite_inline(vec_ty: Vec) -> RS> { let mut record_ty = HashMap::new(); let mut dependency = HashMap::new(); @@ -216,7 +308,7 @@ fn visit_ty( UniDatType::Box(box_type) => { visit_ty(index, box_type.as_ref(), record_ty, dependency); } - UniDatType::Primitive(_) => {} + UniDatType::Scalar(_) => {} UniDatType::Binary => {} } } @@ -584,4 +676,48 @@ mod tests { let pos: HashMap<_, _> = result.iter().enumerate().map(|(i, &v)| (v, i)).collect(); assert!(pos[&2] < pos[&1]); } + + #[test] + fn test_temporal_scalar_params_parse_and_validate() { + let cases = vec![ + (UniScalar::Time, 3i64, DatTypeID::Time), + (UniScalar::Timestamp, 4i64, DatTypeID::Timestamp), + (UniScalar::TimestampTz, 2i64, DatTypeID::TimestampTz), + ]; + + for (scalar, precision, expected_id) in cases { + let ty = scalar_with_params_to( + scalar, + Some(vec![UniDatValue::Scalar(UniScalarValue::I64(precision))]), + ) + .unwrap(); + assert_eq!(ty.dat_type_id(), expected_id); + } + } + + #[test] + fn test_temporal_scalar_params_reject_invalid_values() { + let err = scalar_with_params_to( + UniScalar::Time, + Some(vec![UniDatValue::Scalar(UniScalarValue::I64(-1))]), + ) + .unwrap_err(); + assert!(err.to_string().contains("non-negative")); + + let err = scalar_with_params_to( + UniScalar::Timestamp, + Some(vec![UniDatValue::Scalar(UniScalarValue::I64(7))]), + ) + .unwrap_err(); + assert!(err.to_string().contains("less than or equal to 6")); + + let err = scalar_with_params_to( + UniScalar::TimestampTz, + Some(vec![UniDatValue::Scalar(UniScalarValue::String( + "x".to_string(), + ))]), + ) + .unwrap_err(); + assert!(err.to_string().contains("must be i64")); + } } diff --git a/mudu_api/rust/src/universal/uni_dat_value.rs b/mudu_api/rust/src/universal/uni_dat_value.rs index dc909d6..6c45ba3 100644 --- a/mudu_api/rust/src/universal/uni_dat_value.rs +++ b/mudu_api/rust/src/universal/uni_dat_value.rs @@ -1,9 +1,9 @@ -use crate::universal::uni_primitive_value::UniPrimitiveValue; +use crate::universal::uni_scalar_value::UniScalarValue; #[derive(Debug, Clone)] pub enum UniDatValue { - Primitive(UniPrimitiveValue), + Scalar(UniScalarValue), Array(Vec), @@ -14,25 +14,25 @@ pub enum UniDatValue { impl Default for UniDatValue { fn default() -> Self { - Self::Primitive(Default::default()) + Self::Scalar(Default::default()) } } impl UniDatValue { - pub fn from_primitive(inner: UniPrimitiveValue) -> Self { - Self::Primitive(inner) + pub fn from_scalar(inner: UniScalarValue) -> Self { + Self::Scalar(inner) } - pub fn as_primitive(&self) -> Option<&UniPrimitiveValue> { + pub fn as_scalar(&self) -> Option<&UniScalarValue> { match self { - Self::Primitive(inner) => Some(inner), + Self::Scalar(inner) => Some(inner), _ => None, } } - pub fn expect_primitive(&self) -> &UniPrimitiveValue { + pub fn expect_scalar(&self) -> &UniScalarValue { match self { - Self::Primitive(inner) => inner, + Self::Scalar(inner) => inner, _ => unsafe { std::hint::unreachable_unchecked() }, } } @@ -100,7 +100,7 @@ impl serde::Serialize for UniDatValue { use serde::ser::SerializeSeq; let mut serialize_seq = serializer.serialize_seq(Some(2))?; match self { - UniDatValue::Primitive(inner) => { + UniDatValue::Scalar(inner) => { serialize_seq.serialize_element(&0u32)?; serialize_seq.serialize_element(&inner)?; } @@ -150,9 +150,9 @@ impl<'de> serde::de::Visitor<'de> for UniDatValueVisitor { match id { 0 => { let value = seq - .next_element::()? + .next_element::()? .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; - Ok(Self::Value::Primitive(value)) + Ok(Self::Value::Scalar(value)) } 1 => { diff --git a/mudu_api/rust/src/universal/uni_dat_value_impl.rs b/mudu_api/rust/src/universal/uni_dat_value_impl.rs index 2ecfd2c..a9b2d36 100644 --- a/mudu_api/rust/src/universal/uni_dat_value_impl.rs +++ b/mudu_api/rust/src/universal/uni_dat_value_impl.rs @@ -1,6 +1,11 @@ use crate::universal::uni_dat_value::UniDatValue; -use crate::universal::uni_primitive_value::UniPrimitiveValue; +use crate::universal::uni_scalar_value::UniScalarValue; use mudu::common::result::RS; +use mudu::data_type::date::DateValue; +use mudu::data_type::numeric::Numeric; +use mudu::data_type::time::TimeValue; +use mudu::data_type::timestamp::TimestampValue; +use mudu::data_type::timestamptz::TimestampTzValue; use mudu::error::ec::EC; use mudu::m_error; use mudu_type::dat_type_id::DatTypeID; @@ -10,39 +15,61 @@ use mudu_type::datum::DatumDyn; impl UniDatValue { pub fn uni_to(self) -> RS { let value = match self { - UniDatValue::Primitive(value) => { + UniDatValue::Scalar(value) => { let v = match value { - UniPrimitiveValue::Bool(_) => { - return Err(m_error!(EC::TypeErr, "primitive bool is not supported")); + UniScalarValue::Bool(_) => { + return Err(m_error!(EC::TypeErr, "scalar bool is not supported")); } - UniPrimitiveValue::U8(_) => { - return Err(m_error!(EC::TypeErr, "primitive u8 is not supported")); + UniScalarValue::U8(_) => { + return Err(m_error!(EC::TypeErr, "scalar u8 is not supported")); } - UniPrimitiveValue::I8(_) => { - return Err(m_error!(EC::TypeErr, "primitive i8 is not supported")); + UniScalarValue::I8(_) => { + return Err(m_error!(EC::TypeErr, "scalar i8 is not supported")); } - UniPrimitiveValue::U16(_) => { - return Err(m_error!(EC::TypeErr, "primitive u16 is not supported")); + UniScalarValue::U16(_) => { + return Err(m_error!(EC::TypeErr, "scalar u16 is not supported")); } - UniPrimitiveValue::I16(_) => { - return Err(m_error!(EC::TypeErr, "primitive i16 is not supported")); + UniScalarValue::I16(_) => { + return Err(m_error!(EC::TypeErr, "scalar i16 is not supported")); } - UniPrimitiveValue::U32(_) => { - return Err(m_error!(EC::TypeErr, "primitive u32 is not supported")); + UniScalarValue::U32(_) => { + return Err(m_error!(EC::TypeErr, "scalar u32 is not supported")); } - UniPrimitiveValue::I32(v) => DatValue::from_i32(v), - UniPrimitiveValue::U64(_) => { - return Err(m_error!(EC::TypeErr, "primitive u64 is not supported")); + UniScalarValue::I32(v) => DatValue::from_i32(v), + UniScalarValue::U64(_) => { + return Err(m_error!(EC::TypeErr, "scalar u64 is not supported")); } - UniPrimitiveValue::U128(v) => DatValue::from_u128(v), - UniPrimitiveValue::I64(v) => DatValue::from_i64(v), - UniPrimitiveValue::I128(v) => DatValue::from_i128(v), - UniPrimitiveValue::F32(v) => DatValue::from_f32(v), - UniPrimitiveValue::F64(v) => DatValue::from_f64(v), - UniPrimitiveValue::Char(_) => { - return Err(m_error!(EC::TypeErr, "primitive char is not supported")); + UniScalarValue::U128(v) => DatValue::from_u128(v), + UniScalarValue::I64(v) => DatValue::from_i64(v), + UniScalarValue::I128(v) => DatValue::from_i128(v), + UniScalarValue::F32(v) => DatValue::from_f32(v), + UniScalarValue::F64(v) => DatValue::from_f64(v), + UniScalarValue::Char(_) => { + return Err(m_error!(EC::TypeErr, "scalar char is not supported")); + } + UniScalarValue::String(v) => DatValue::from_string(v), + UniScalarValue::Numeric(v) => DatValue::from_numeric( + Numeric::parse(v.as_str()) + .map_err(|e| m_error!(EC::TypeErr, format!("invalid numeric {}", e)))?, + ), + UniScalarValue::Date(v) => DatValue::from_date( + DateValue::parse(v.as_str()) + .map_err(|e| m_error!(EC::TypeErr, format!("invalid date {}", e)))?, + ), + UniScalarValue::Time(v) => DatValue::from_time( + TimeValue::parse(v.as_str()) + .map_err(|e| m_error!(EC::TypeErr, format!("invalid time {}", e)))?, + ), + UniScalarValue::Timestamp(v) => { + DatValue::from_timestamp(TimestampValue::parse(v.as_str()).map_err( + |e| m_error!(EC::TypeErr, format!("invalid timestamp {}", e)), + )?) + } + UniScalarValue::TimestampTz(v) => { + DatValue::from_timestamptz(TimestampTzValue::parse(v.as_str()).map_err( + |e| m_error!(EC::TypeErr, format!("invalid timestamptz {}", e)), + )?) } - UniPrimitiveValue::String(v) => DatValue::from_string(v), }; v } @@ -71,25 +98,46 @@ impl UniDatValue { let id = dat_value.dat_type_id()?; let mu_v = match id { DatTypeID::I32 => { - UniDatValue::from_primitive(UniPrimitiveValue::I32(dat_value.expect_i32().clone())) + UniDatValue::from_scalar(UniScalarValue::I32(dat_value.expect_i32().clone())) } DatTypeID::I64 => { - UniDatValue::from_primitive(UniPrimitiveValue::I64(dat_value.expect_i64().clone())) + UniDatValue::from_scalar(UniScalarValue::I64(dat_value.expect_i64().clone())) + } + DatTypeID::I128 => { + UniDatValue::from_scalar(UniScalarValue::I128(dat_value.expect_i128().clone())) + } + DatTypeID::U128 => { + UniDatValue::from_scalar(UniScalarValue::U128(dat_value.expect_u128().clone())) } - DatTypeID::I128 => UniDatValue::from_primitive(UniPrimitiveValue::I128( - dat_value.expect_i128().clone(), - )), - DatTypeID::U128 => UniDatValue::from_primitive(UniPrimitiveValue::U128( - dat_value.expect_u128().clone(), - )), DatTypeID::F32 => { - UniDatValue::from_primitive(UniPrimitiveValue::F32(dat_value.expect_f32().clone())) + UniDatValue::from_scalar(UniScalarValue::F32(dat_value.expect_f32().clone())) } DatTypeID::F64 => { - UniDatValue::from_primitive(UniPrimitiveValue::F64(dat_value.expect_f64().clone())) + UniDatValue::from_scalar(UniScalarValue::F64(dat_value.expect_f64().clone())) } - DatTypeID::String => UniDatValue::from_primitive(UniPrimitiveValue::String( - dat_value.expect_string().clone(), + DatTypeID::String => { + UniDatValue::from_scalar(UniScalarValue::String(dat_value.expect_string().clone())) + } + DatTypeID::Numeric => UniDatValue::from_scalar(UniScalarValue::Numeric( + dat_value.expect_numeric().to_plain_string(), + )), + DatTypeID::Date => { + UniDatValue::from_scalar(UniScalarValue::Date(dat_value.expect_date().format())) + } + DatTypeID::Time => { + UniDatValue::from_scalar(UniScalarValue::Time(dat_value.expect_time().format(6))) + } + DatTypeID::Timestamp => UniDatValue::from_scalar(UniScalarValue::Timestamp( + dat_value + .expect_timestamp() + .format(6) + .map_err(|e| m_error!(EC::TypeErr, e))?, + )), + DatTypeID::TimestampTz => UniDatValue::from_scalar(UniScalarValue::TimestampTz( + dat_value + .expect_timestamptz() + .format(6) + .map_err(|e| m_error!(EC::TypeErr, e))?, )), DatTypeID::Array => { let array = dat_value.into_array(); diff --git a/mudu_api/rust/src/universal/uni_primitive_impl.rs b/mudu_api/rust/src/universal/uni_primitive_impl.rs deleted file mode 100644 index d64d7e9..0000000 --- a/mudu_api/rust/src/universal/uni_primitive_impl.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::universal::uni_primitive::UniPrimitive; -use mudu::common::into_result::ToResult; -use mudu::common::result::RS; -use mudu::common::result_from::ResultFrom; -use mudu::error::ec::EC; -use mudu::m_error; -use mudu_type::dat_type::DatType; -use mudu_type::dat_type_id::DatTypeID; - -impl UniPrimitive { - pub fn uni_to(self) -> RS { - let ty = match self { - UniPrimitive::Bool => { - return Err(m_error!(EC::TypeErr, "primitive bool is not supported")); - } - UniPrimitive::U8 => return Err(m_error!(EC::TypeErr, "primitive u8 is not supported")), - UniPrimitive::I8 => return Err(m_error!(EC::TypeErr, "primitive i8 is not supported")), - UniPrimitive::U16 => { - return Err(m_error!(EC::TypeErr, "primitive u16 is not supported")); - } - UniPrimitive::I16 => { - return Err(m_error!(EC::TypeErr, "primitive i16 is not supported")); - } - UniPrimitive::U32 => { - return Err(m_error!(EC::TypeErr, "primitive u32 is not supported")); - } - UniPrimitive::I32 => DatType::default_for(DatTypeID::I32), - UniPrimitive::U64 => { - return Err(m_error!(EC::TypeErr, "primitive u64 is not supported")); - } - UniPrimitive::U128 => DatType::default_for(DatTypeID::U128), - UniPrimitive::I64 => DatType::default_for(DatTypeID::I64), - UniPrimitive::I128 => DatType::default_for(DatTypeID::I128), - UniPrimitive::F32 => DatType::default_for(DatTypeID::F32), - UniPrimitive::F64 => DatType::default_for(DatTypeID::F64), - UniPrimitive::Char => { - return Err(m_error!(EC::TypeErr, "primitive char is not supported")); - } - UniPrimitive::String => DatType::default_for(DatTypeID::String), - UniPrimitive::Blob => DatType::default_for(DatTypeID::Binary), - }; - Ok(ty) - } - - pub fn uni_from(ty: DatType) -> RS { - let uni_prim = match ty.dat_type_id() { - DatTypeID::I32 => Self::I32, - DatTypeID::I64 => Self::I64, - DatTypeID::I128 => Self::I128, - DatTypeID::U128 => Self::U128, - DatTypeID::F32 => Self::F32, - DatTypeID::F64 => Self::F64, - DatTypeID::String => Self::String, - DatTypeID::Array => { - return Err(m_error!(EC::TypeErr, "array type is not primitive")); - } - DatTypeID::Record => { - return Err(m_error!(EC::TypeErr, "record type is not primitive")); - } - DatTypeID::Binary => Self::Blob, - }; - Ok(uni_prim) - } -} - -impl ToResult for UniPrimitive { - fn to(self) -> RS { - self.uni_to() - } -} - -impl ResultFrom for UniPrimitive { - fn from(value: DatType) -> RS { - Self::uni_from(value) - } -} diff --git a/mudu_api/rust/src/universal/uni_primitive.rs b/mudu_api/rust/src/universal/uni_scalar.rs similarity index 75% rename from mudu_api/rust/src/universal/uni_primitive.rs rename to mudu_api/rust/src/universal/uni_scalar.rs index a0b53b4..aa862e6 100644 --- a/mudu_api/rust/src/universal/uni_primitive.rs +++ b/mudu_api/rust/src/universal/uni_scalar.rs @@ -9,7 +9,7 @@ serde_repr::Deserialize_repr, )] #[repr(u32)] -pub enum UniPrimitive { +pub enum UniScalar { Bool = 0, U8 = 1, @@ -41,9 +41,19 @@ pub enum UniPrimitive { String = 14, Blob = 15, + + Numeric = 16, + + Date = 17, + + Time = 18, + + Timestamp = 19, + + TimestampTz = 20, } -impl Default for UniPrimitive { +impl Default for UniScalar { fn default() -> Self { Self::Bool } diff --git a/mudu_api/rust/src/universal/uni_scalar_impl.rs b/mudu_api/rust/src/universal/uni_scalar_impl.rs new file mode 100644 index 0000000..09295ff --- /dev/null +++ b/mudu_api/rust/src/universal/uni_scalar_impl.rs @@ -0,0 +1,86 @@ +use crate::universal::uni_scalar::UniScalar; +use mudu::common::into_result::ToResult; +use mudu::common::result::RS; +use mudu::common::result_from::ResultFrom; +use mudu::error::ec::EC; +use mudu::m_error; +use mudu_type::dat_type::DatType; +use mudu_type::dat_type_id::DatTypeID; + +impl UniScalar { + pub fn uni_to(self) -> RS { + let ty = match self { + UniScalar::Bool => { + return Err(m_error!(EC::TypeErr, "scalar bool is not supported")); + } + UniScalar::U8 => return Err(m_error!(EC::TypeErr, "scalar u8 is not supported")), + UniScalar::I8 => return Err(m_error!(EC::TypeErr, "scalar i8 is not supported")), + UniScalar::U16 => { + return Err(m_error!(EC::TypeErr, "scalar u16 is not supported")); + } + UniScalar::I16 => { + return Err(m_error!(EC::TypeErr, "scalar i16 is not supported")); + } + UniScalar::U32 => { + return Err(m_error!(EC::TypeErr, "scalar u32 is not supported")); + } + UniScalar::I32 => DatType::default_for(DatTypeID::I32), + UniScalar::U64 => { + return Err(m_error!(EC::TypeErr, "scalar u64 is not supported")); + } + UniScalar::U128 => DatType::default_for(DatTypeID::U128), + UniScalar::I64 => DatType::default_for(DatTypeID::I64), + UniScalar::I128 => DatType::default_for(DatTypeID::I128), + UniScalar::F32 => DatType::default_for(DatTypeID::F32), + UniScalar::F64 => DatType::default_for(DatTypeID::F64), + UniScalar::Char => { + return Err(m_error!(EC::TypeErr, "scalar char is not supported")); + } + UniScalar::String => DatType::default_for(DatTypeID::String), + UniScalar::Blob => DatType::default_for(DatTypeID::Binary), + UniScalar::Numeric => DatType::default_for(DatTypeID::Numeric), + UniScalar::Date => DatType::default_for(DatTypeID::Date), + UniScalar::Time => DatType::default_for(DatTypeID::Time), + UniScalar::Timestamp => DatType::default_for(DatTypeID::Timestamp), + UniScalar::TimestampTz => DatType::default_for(DatTypeID::TimestampTz), + }; + Ok(ty) + } + + pub fn uni_from(ty: DatType) -> RS { + let uni_scalar = match ty.dat_type_id() { + DatTypeID::I32 => Self::I32, + DatTypeID::I64 => Self::I64, + DatTypeID::I128 => Self::I128, + DatTypeID::U128 => Self::U128, + DatTypeID::F32 => Self::F32, + DatTypeID::F64 => Self::F64, + DatTypeID::String => Self::String, + DatTypeID::Numeric => Self::Numeric, + DatTypeID::Date => Self::Date, + DatTypeID::Time => Self::Time, + DatTypeID::Timestamp => Self::Timestamp, + DatTypeID::TimestampTz => Self::TimestampTz, + DatTypeID::Array => { + return Err(m_error!(EC::TypeErr, "array type is not scalar")); + } + DatTypeID::Record => { + return Err(m_error!(EC::TypeErr, "record type is not scalar")); + } + DatTypeID::Binary => Self::Blob, + }; + Ok(uni_scalar) + } +} + +impl ToResult for UniScalar { + fn to(self) -> RS { + self.uni_to() + } +} + +impl ResultFrom for UniScalar { + fn from(value: DatType) -> RS { + Self::uni_from(value) + } +} diff --git a/mudu_binding/src/universal/uni_primitive_value.rs b/mudu_api/rust/src/universal/uni_scalar_value.rs similarity index 70% rename from mudu_binding/src/universal/uni_primitive_value.rs rename to mudu_api/rust/src/universal/uni_scalar_value.rs index f10aa5d..0c0a612 100644 --- a/mudu_binding/src/universal/uni_primitive_value.rs +++ b/mudu_api/rust/src/universal/uni_scalar_value.rs @@ -1,6 +1,6 @@ #[derive(Debug, Clone)] -pub enum UniPrimitiveValue { +pub enum UniScalarValue { Bool(bool), U8(u8), @@ -30,15 +30,25 @@ pub enum UniPrimitiveValue { Char(char), String(String), + + Numeric(String), + + Date(String), + + Time(String), + + Timestamp(String), + + TimestampTz(String), } -impl Default for UniPrimitiveValue { +impl Default for UniScalarValue { fn default() -> Self { Self::Bool(Default::default()) } } -impl UniPrimitiveValue { +impl UniScalarValue { pub fn from_bool(inner: bool) -> Self { Self::Bool(inner) } @@ -308,9 +318,99 @@ impl UniPrimitiveValue { _ => unsafe { std::hint::unreachable_unchecked() }, } } + + pub fn from_numeric(inner: String) -> Self { + Self::Numeric(inner) + } + + pub fn as_numeric(&self) -> Option<&String> { + match self { + Self::Numeric(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_numeric(&self) -> &String { + match self { + Self::Numeric(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_date(inner: String) -> Self { + Self::Date(inner) + } + + pub fn as_date(&self) -> Option<&String> { + match self { + Self::Date(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_date(&self) -> &String { + match self { + Self::Date(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_time(inner: String) -> Self { + Self::Time(inner) + } + + pub fn as_time(&self) -> Option<&String> { + match self { + Self::Time(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_time(&self) -> &String { + match self { + Self::Time(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_timestamp(inner: String) -> Self { + Self::Timestamp(inner) + } + + pub fn as_timestamp(&self) -> Option<&String> { + match self { + Self::Timestamp(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_timestamp(&self) -> &String { + match self { + Self::Timestamp(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_timestamptz(inner: String) -> Self { + Self::TimestampTz(inner) + } + + pub fn as_timestamptz(&self) -> Option<&String> { + match self { + Self::TimestampTz(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_timestamptz(&self) -> &String { + match self { + Self::TimestampTz(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } } -impl serde::Serialize for UniPrimitiveValue { +impl serde::Serialize for UniScalarValue { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, @@ -318,89 +418,114 @@ impl serde::Serialize for UniPrimitiveValue { use serde::ser::SerializeSeq; let mut serialize_seq = serializer.serialize_seq(Some(2))?; match self { - UniPrimitiveValue::Bool(inner) => { + UniScalarValue::Bool(inner) => { serialize_seq.serialize_element(&0u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U8(inner) => { + UniScalarValue::U8(inner) => { serialize_seq.serialize_element(&1u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I8(inner) => { + UniScalarValue::I8(inner) => { serialize_seq.serialize_element(&2u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U16(inner) => { + UniScalarValue::U16(inner) => { serialize_seq.serialize_element(&3u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I16(inner) => { + UniScalarValue::I16(inner) => { serialize_seq.serialize_element(&4u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U32(inner) => { + UniScalarValue::U32(inner) => { serialize_seq.serialize_element(&5u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I32(inner) => { + UniScalarValue::I32(inner) => { serialize_seq.serialize_element(&6u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U64(inner) => { + UniScalarValue::U64(inner) => { serialize_seq.serialize_element(&7u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U128(inner) => { + UniScalarValue::U128(inner) => { serialize_seq.serialize_element(&8u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I64(inner) => { + UniScalarValue::I64(inner) => { serialize_seq.serialize_element(&9u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I128(inner) => { + UniScalarValue::I128(inner) => { serialize_seq.serialize_element(&10u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::F32(inner) => { + UniScalarValue::F32(inner) => { serialize_seq.serialize_element(&11u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::F64(inner) => { + UniScalarValue::F64(inner) => { serialize_seq.serialize_element(&12u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::Char(inner) => { + UniScalarValue::Char(inner) => { serialize_seq.serialize_element(&13u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::String(inner) => { + UniScalarValue::String(inner) => { serialize_seq.serialize_element(&14u32)?; serialize_seq.serialize_element(&inner)?; } + + UniScalarValue::Numeric(inner) => { + serialize_seq.serialize_element(&15u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::Date(inner) => { + serialize_seq.serialize_element(&16u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::Time(inner) => { + serialize_seq.serialize_element(&17u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::Timestamp(inner) => { + serialize_seq.serialize_element(&18u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::TimestampTz(inner) => { + serialize_seq.serialize_element(&19u32)?; + serialize_seq.serialize_element(&inner)?; + } } serialize_seq.end() } } -struct UniPrimitiveValueVisitor {} +struct UniScalarValueVisitor {} -impl<'de> serde::de::Visitor<'de> for UniPrimitiveValueVisitor { - type Value = UniPrimitiveValue; +impl<'de> serde::de::Visitor<'de> for UniScalarValueVisitor { + type Value = UniScalarValue; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a sequence") @@ -526,16 +651,51 @@ impl<'de> serde::de::Visitor<'de> for UniPrimitiveValueVisitor { Ok(Self::Value::String(value)) } + 15 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Numeric(value)) + } + + 16 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Date(value)) + } + + 17 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Time(value)) + } + + 18 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Timestamp(value)) + } + + 19 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::TimestampTz(value)) + } + _ => Err(Error::invalid_value(Unexpected::Map, &self)), } } } -impl<'de> serde::Deserialize<'de> for UniPrimitiveValue { +impl<'de> serde::Deserialize<'de> for UniScalarValue { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { - deserializer.deserialize_seq(UniPrimitiveValueVisitor {}) + deserializer.deserialize_seq(UniScalarValueVisitor {}) } } diff --git a/mudu_binding/src/lib.rs b/mudu_binding/src/lib.rs index af8c24a..c4898d6 100644 --- a/mudu_binding/src/lib.rs +++ b/mudu_binding/src/lib.rs @@ -1,5 +1,3 @@ -#![feature(box_into_inner)] - pub mod codec; pub mod procedure; pub mod record; diff --git a/mudu_binding/src/record/field_def.rs b/mudu_binding/src/record/field_def.rs index 08a048a..bad1f23 100644 --- a/mudu_binding/src/record/field_def.rs +++ b/mudu_binding/src/record/field_def.rs @@ -1,17 +1,25 @@ use crate::universal::uni_dat_type::UniDatType; +use crate::universal::uni_dat_value::UniDatValue; #[derive(Debug, Clone)] pub struct FieldDef { field_name: String, data_type: UniDatType, + data_type_param: Option>, not_null: bool, } impl FieldDef { - pub fn new(column_name: String, data_type: UniDatType, not_null: bool) -> Self { + pub fn new( + column_name: String, + data_type: UniDatType, + data_type_param: Option>, + not_null: bool, + ) -> Self { Self { field_name: column_name, data_type, + data_type_param, not_null, } } @@ -24,6 +32,10 @@ impl FieldDef { &self.data_type } + pub fn data_type_param(&self) -> &Option> { + &self.data_type_param + } + pub fn is_not_null(&self) -> bool { self.not_null } diff --git a/mudu_binding/src/record/record_def.rs b/mudu_binding/src/record/record_def.rs index 4da38f5..9e42d0a 100644 --- a/mudu_binding/src/record/record_def.rs +++ b/mudu_binding/src/record/record_def.rs @@ -76,7 +76,12 @@ impl RecordDef { pub fn row_desc(&self) -> RS { let mut vec = vec![]; for c in &self.fields { - let dd = DatumDesc::new(c.column_name().clone(), c.dat_type().clone().uni_to()?); + let dd = DatumDesc::new( + c.column_name().clone(), + c.dat_type() + .clone() + .uni_to_with_params(c.data_type_param().clone())?, + ); vec.push(dd); } Ok(TupleFieldDesc::new(vec)) diff --git a/mudu_binding/src/universal/mod.rs b/mudu_binding/src/universal/mod.rs index cad1762..b19b20b 100644 --- a/mudu_binding/src/universal/mod.rs +++ b/mudu_binding/src/universal/mod.rs @@ -14,9 +14,6 @@ pub mod uni_get_result; pub mod uni_key_value; pub mod uni_oid; pub mod uni_oid_impl; -pub mod uni_primitive; -pub mod uni_primitive_impl; -pub mod uni_primitive_value; pub mod uni_procedure_param; pub mod uni_procedure_param_impl; pub mod uni_procedure_result; @@ -32,6 +29,9 @@ pub mod uni_record_type; pub mod uni_result; pub mod uni_result_set; pub mod uni_result_type; +pub mod uni_scalar; +pub mod uni_scalar_impl; +pub mod uni_scalar_value; pub mod uni_session_open_argv; pub mod uni_session_open_argv_impl; pub mod uni_sql_param; diff --git a/mudu_binding/src/universal/test_uni.rs b/mudu_binding/src/universal/test_uni.rs index 3444440..b3b7855 100644 --- a/mudu_binding/src/universal/test_uni.rs +++ b/mudu_binding/src/universal/test_uni.rs @@ -7,8 +7,6 @@ mod tests { use crate::universal::uni_get_result::UniGetResult; use crate::universal::uni_key_value::UniKeyValue; use crate::universal::uni_oid::UniOid; - use crate::universal::uni_primitive::UniPrimitive; - use crate::universal::uni_primitive_value::UniPrimitiveValue; use crate::universal::uni_procedure_param::UniProcedureParam; use crate::universal::uni_procedure_result::UniProcedureResult; use crate::universal::uni_query_argv::UniQueryArgv; @@ -18,12 +16,17 @@ mod tests { use crate::universal::uni_result::UniResult; use crate::universal::uni_result_set::UniResultSet; use crate::universal::uni_result_type::UniResultType; + use crate::universal::uni_scalar::UniScalar; + use crate::universal::uni_scalar_value::UniScalarValue; use crate::universal::uni_sql_param::UniSqlParam; use crate::universal::uni_sql_stmt::UniSqlStmt; use crate::universal::uni_tuple_row::UniTupleRow; use mudu::common::serde_utils::{ deserialize_from, deserialize_from_json, serialize_to_json, serialize_to_vec, }; + use mudu::data_type::numeric::Numeric; + use mudu_type::dat_type::DatType; + use mudu_type::dtp_numeric::DTPNumeric; use serde::Serialize; use serde::de::DeserializeOwned; use std::fmt::Debug; @@ -56,17 +59,15 @@ mod tests { record_fields: vec![ UniRecordField { field_name: "id".to_string(), - field_type: UniDatType::Primitive(UniPrimitive::U128), + field_type: UniDatType::Scalar(UniScalar::U128), }, UniRecordField { field_name: "name".to_string(), - field_type: UniDatType::Primitive(UniPrimitive::String), + field_type: UniDatType::Scalar(UniScalar::String), }, UniRecordField { field_name: "tags".to_string(), - field_type: UniDatType::Array(Box::new(UniDatType::Primitive( - UniPrimitive::String, - ))), + field_type: UniDatType::Array(Box::new(UniDatType::Scalar(UniScalar::String))), }, ], } @@ -79,16 +80,16 @@ mod tests { UniRecordField { field_name: "meta".to_string(), field_type: UniDatType::Tuple(vec![ - UniDatType::Primitive(UniPrimitive::U64), - UniDatType::Option(Box::new(UniDatType::Primitive(UniPrimitive::String))), + UniDatType::Scalar(UniScalar::U64), + UniDatType::Option(Box::new(UniDatType::Scalar(UniScalar::String))), ]), }, UniRecordField { field_name: "payload".to_string(), field_type: UniDatType::Result(UniResultType { - ok: Some(Box::new(UniDatType::Array(Box::new( - UniDatType::Primitive(UniPrimitive::I32), - )))), + ok: Some(Box::new(UniDatType::Array(Box::new(UniDatType::Scalar( + UniScalar::I32, + ))))), err: Some(Box::new(UniDatType::Identifier("ErrCode".to_string()))), }), }, @@ -103,12 +104,12 @@ mod tests { fn sample_dat_value() -> UniDatValue { UniDatValue::Record(vec![ UniDatValue::Array(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_i32(10)), - UniDatValue::Primitive(UniPrimitiveValue::from_i32(-4)), + UniDatValue::Scalar(UniScalarValue::from_i32(10)), + UniDatValue::Scalar(UniScalarValue::from_i32(-4)), ]), UniDatValue::Record(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_bool(true)), - UniDatValue::Primitive(UniPrimitiveValue::from_string("ok".to_string())), + UniDatValue::Scalar(UniScalarValue::from_bool(true)), + UniDatValue::Scalar(UniScalarValue::from_string("ok".to_string())), ]), UniDatValue::Binary(vec![1, 2, 3, 4, 200]), ]) @@ -121,11 +122,11 @@ mod tests { eof: false, row_set: vec![UniTupleRow { fields: vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_u128(99)), - UniDatValue::Primitive(UniPrimitiveValue::from_string("alice".to_string())), + UniDatValue::Scalar(UniScalarValue::from_u128(99)), + UniDatValue::Scalar(UniScalarValue::from_string("alice".to_string())), UniDatValue::Array(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_string("x".to_string())), - UniDatValue::Primitive(UniPrimitiveValue::from_string("y".to_string())), + UniDatValue::Scalar(UniScalarValue::from_string("x".to_string())), + UniDatValue::Scalar(UniScalarValue::from_string("y".to_string())), ]), ], }], @@ -148,23 +149,24 @@ mod tests { } #[test] - fn test_uni_primitive_value_roundtrip_matrix() { + fn test_uni_scalar_value_roundtrip_matrix() { let cases = vec![ - UniPrimitiveValue::from_bool(true), - UniPrimitiveValue::from_u8(3), - UniPrimitiveValue::from_i8(7), - UniPrimitiveValue::from_u16(16), - UniPrimitiveValue::from_i16(-16), - UniPrimitiveValue::from_u32(32), - UniPrimitiveValue::from_i32(-32), - UniPrimitiveValue::from_u64(64), - UniPrimitiveValue::from_u128(128), - UniPrimitiveValue::from_i64(-64), - UniPrimitiveValue::from_i128(-128), - UniPrimitiveValue::from_f32(3.25), - UniPrimitiveValue::from_f64(-9.5), - UniPrimitiveValue::from_char('z'), - UniPrimitiveValue::from_string("hello".to_string()), + UniScalarValue::from_bool(true), + UniScalarValue::from_u8(3), + UniScalarValue::from_i8(7), + UniScalarValue::from_u16(16), + UniScalarValue::from_i16(-16), + UniScalarValue::from_u32(32), + UniScalarValue::from_i32(-32), + UniScalarValue::from_u64(64), + UniScalarValue::from_u128(128), + UniScalarValue::from_i64(-64), + UniScalarValue::from_i128(-128), + UniScalarValue::from_f32(3.25), + UniScalarValue::from_f64(-9.5), + UniScalarValue::from_char('z'), + UniScalarValue::from_string("hello".to_string()), + UniScalarValue::from_numeric("12.3400".to_string()), ]; for value in cases { @@ -175,10 +177,10 @@ mod tests { #[test] fn test_uni_dat_value_roundtrip_matrix() { let cases = vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_string("row".to_string())), + UniDatValue::Scalar(UniScalarValue::from_string("row".to_string())), UniDatValue::Array(vec![ - UniDatValue::Primitive(UniPrimitiveValue::from_u64(1)), - UniDatValue::Primitive(UniPrimitiveValue::from_u64(2)), + UniDatValue::Scalar(UniScalarValue::from_u64(1)), + UniDatValue::Scalar(UniScalarValue::from_u64(2)), ]), sample_dat_value(), UniDatValue::Binary(vec![0, 1, 2, 3, 255]), @@ -209,7 +211,7 @@ mod tests { sql_string: "select id, name from users where id = ?".to_string(), }; let sql_param = UniSqlParam { - params: vec![UniDatValue::Primitive(UniPrimitiveValue::from_u128(7))], + params: vec![UniDatValue::Scalar(UniScalarValue::from_u128(7))], }; let query_argv = UniQueryArgv { @@ -231,13 +233,13 @@ mod tests { return_list: vec![sample_dat_value()], }; let get_result = UniGetResult { - value: Some(UniDatValue::Primitive(UniPrimitiveValue::from_string( + value: Some(UniDatValue::Scalar(UniScalarValue::from_string( "payload".to_string(), ))), }; let range_result = UniRangeResult { items: vec![UniKeyValue { - key: UniDatValue::Primitive(UniPrimitiveValue::from_u64(1)), + key: UniDatValue::Scalar(UniScalarValue::from_u64(1)), value: sample_dat_value(), }], }; @@ -256,11 +258,11 @@ mod tests { fn test_uni_dat_type_and_value_reject_invalid_tags() { let invalid_dat_type_json = "[99,0]"; let invalid_dat_value_json = "[99,0]"; - let invalid_primitive_json = "[99,0]"; + let invalid_scalar_json = "[99,0]"; assert!(deserialize_from_json::(invalid_dat_type_json).is_err()); assert!(deserialize_from_json::(invalid_dat_value_json).is_err()); - assert!(deserialize_from_json::(invalid_primitive_json).is_err()); + assert!(deserialize_from_json::(invalid_scalar_json).is_err()); } #[test] @@ -275,4 +277,174 @@ mod tests { let truncated = &binary[..binary.len() - 1]; assert!(deserialize_from::(truncated).is_err()); } + + #[test] + fn test_uni_numeric_type_params_roundtrip_through_dat_type() { + let uni_ty = UniDatType::Scalar(UniScalar::Numeric); + let params = vec![ + UniDatValue::Scalar(UniScalarValue::from_i64(18)), + UniDatValue::Scalar(UniScalarValue::from_i64(4)), + ]; + + let dat_type = uni_ty.clone().uni_to_with_params(Some(params)).unwrap(); + assert_eq!( + dat_type.dat_type_id(), + mudu_type::dat_type_id::DatTypeID::Numeric + ); + let numeric = dat_type.expect_numeric_param(); + assert_eq!(numeric.precision(), 18); + assert_eq!(numeric.scale(), 4); + + let uni_back = UniDatType::uni_from(dat_type).unwrap(); + assert_eq!( + serialize_to_json(&uni_back).unwrap(), + serialize_to_json(&uni_ty).unwrap() + ); + } + + #[test] + fn test_uni_numeric_value_roundtrip_through_dat_value() { + let uni_value = UniDatValue::Scalar(UniScalarValue::from_numeric("12.3400".to_string())); + + let dat_value = uni_value.clone().uni_to().unwrap(); + assert_eq!(dat_value.expect_numeric().to_plain_string(), "12.3400"); + + let uni_back = UniDatValue::uni_from(dat_value).unwrap(); + let scalar = uni_back.as_scalar().expect("scalar numeric"); + assert_eq!(scalar.expect_numeric(), "12.3400"); + + assert_json_and_binary_roundtrip(&uni_value); + } + + #[test] + fn test_uni_numeric_rejects_invalid_shapes() { + let invalid_numeric_value = + UniDatValue::Scalar(UniScalarValue::from_numeric("not-a-number".to_string())); + assert!(invalid_numeric_value.uni_to().is_err()); + + let invalid_numeric_type = UniDatType::Scalar(UniScalar::Numeric); + let invalid_params = vec![ + UniDatValue::Scalar(UniScalarValue::from_i64(4)), + UniDatValue::Scalar(UniScalarValue::from_i64(9)), + ]; + assert!( + invalid_numeric_type + .uni_to_with_params(Some(invalid_params)) + .is_err() + ); + + let dat_type = DatType::from_numeric(DTPNumeric::new(9, 2)); + let uni_type = UniDatType::uni_from(dat_type).unwrap(); + assert!(matches!(uni_type, UniDatType::Scalar(UniScalar::Numeric))); + + let dat_value = + mudu_type::dat_value::DatValue::from_numeric(Numeric::parse("7.50").unwrap()); + let uni_value = UniDatValue::uni_from(dat_value).unwrap(); + let scalar = uni_value.as_scalar().expect("numeric scalar"); + assert_eq!(scalar.expect_numeric(), "7.50"); + } + + #[test] + fn test_uni_temporal_type_params_roundtrip_through_dat_type() { + let cases = vec![ + ( + UniDatType::Scalar(UniScalar::Time), + vec![UniDatValue::Scalar(UniScalarValue::from_i64(3))], + mudu_type::dat_type_id::DatTypeID::Time, + 3u8, + ), + ( + UniDatType::Scalar(UniScalar::Timestamp), + vec![UniDatValue::Scalar(UniScalarValue::from_i64(4))], + mudu_type::dat_type_id::DatTypeID::Timestamp, + 4u8, + ), + ( + UniDatType::Scalar(UniScalar::TimestampTz), + vec![UniDatValue::Scalar(UniScalarValue::from_i64(2))], + mudu_type::dat_type_id::DatTypeID::TimestampTz, + 2u8, + ), + ]; + + for (uni_ty, params, expected_id, expected_precision) in cases { + let dat_type = uni_ty.clone().uni_to_with_params(Some(params)).unwrap(); + assert_eq!(dat_type.dat_type_id(), expected_id); + let actual_precision = match expected_id { + mudu_type::dat_type_id::DatTypeID::Time => dat_type.expect_time_param().precision(), + mudu_type::dat_type_id::DatTypeID::Timestamp => { + dat_type.expect_timestamp_param().precision() + } + mudu_type::dat_type_id::DatTypeID::TimestampTz => { + dat_type.expect_timestamptz_param().precision() + } + _ => unreachable!(), + }; + assert_eq!(actual_precision, expected_precision); + + let uni_back = UniDatType::uni_from(dat_type).unwrap(); + assert_eq!( + serialize_to_json(&uni_back).unwrap(), + serialize_to_json(&uni_ty).unwrap() + ); + } + } + + #[test] + fn test_uni_temporal_values_roundtrip_through_dat_value() { + let cases = vec![ + ( + UniDatValue::Scalar(UniScalarValue::from_date("2026-05-20".to_string())), + "2026-05-20", + ), + ( + UniDatValue::Scalar(UniScalarValue::from_time("12:34:56.123456".to_string())), + "12:34:56.123456", + ), + ( + UniDatValue::Scalar(UniScalarValue::from_timestamp( + "2026-05-20 14:30:45.123456".to_string(), + )), + "2026-05-20 14:30:45.123456", + ), + ( + UniDatValue::Scalar(UniScalarValue::from_timestamptz( + "2026-05-20T14:30:45.123456+08:00".to_string(), + )), + "2026-05-20 06:30:45.123456+00:00", + ), + ]; + + for (uni_value, expected_text) in cases { + let dat_value = uni_value.clone().uni_to().unwrap(); + let uni_back = UniDatValue::uni_from(dat_value).unwrap(); + let scalar = uni_back.as_scalar().expect("temporal scalar"); + let text = match scalar { + UniScalarValue::Date(v) + | UniScalarValue::Time(v) + | UniScalarValue::Timestamp(v) + | UniScalarValue::TimestampTz(v) => v.as_str(), + _ => unreachable!(), + }; + assert_eq!(text, expected_text); + assert_json_and_binary_roundtrip(&uni_value); + } + } + + #[test] + fn test_uni_temporal_rejects_invalid_shapes() { + let invalid_values = vec![ + UniDatValue::Scalar(UniScalarValue::from_date("2026-02-30".to_string())), + UniDatValue::Scalar(UniScalarValue::from_time("25:00:00".to_string())), + UniDatValue::Scalar(UniScalarValue::from_timestamp( + "not-a-timestamp".to_string(), + )), + UniDatValue::Scalar(UniScalarValue::from_timestamptz( + "2026-05-20 14:30:45".to_string(), + )), + ]; + for value in invalid_values { + assert!(value.uni_to().is_err()); + } + } } diff --git a/mudu_binding/src/universal/uni_dat_type.rs b/mudu_binding/src/universal/uni_dat_type.rs index d333c81..77ad40f 100644 --- a/mudu_binding/src/universal/uni_dat_type.rs +++ b/mudu_binding/src/universal/uni_dat_type.rs @@ -1,4 +1,4 @@ -use crate::universal::uni_primitive::UniPrimitive; +use crate::universal::uni_scalar::UniScalar; use crate::universal::uni_record_type::UniRecordType; @@ -7,7 +7,7 @@ use crate::universal::uni_result_type::UniResultType; #[derive(Debug, Clone)] pub enum UniDatType { - Primitive(UniPrimitive), + Scalar(UniScalar), Array(Box), @@ -28,25 +28,25 @@ pub enum UniDatType { impl Default for UniDatType { fn default() -> Self { - Self::Primitive(Default::default()) + Self::Scalar(Default::default()) } } impl UniDatType { - pub fn from_primitive(inner: UniPrimitive) -> Self { - Self::Primitive(inner) + pub fn from_scalar(inner: UniScalar) -> Self { + Self::Scalar(inner) } - pub fn as_primitive(&self) -> Option<&UniPrimitive> { + pub fn as_scalar(&self) -> Option<&UniScalar> { match self { - Self::Primitive(inner) => Some(inner), + Self::Scalar(inner) => Some(inner), _ => None, } } - pub fn expect_primitive(&self) -> &UniPrimitive { + pub fn expect_scalar(&self) -> &UniScalar { match self { - Self::Primitive(inner) => inner, + Self::Scalar(inner) => inner, _ => unsafe { std::hint::unreachable_unchecked() }, } } @@ -186,7 +186,7 @@ impl serde::Serialize for UniDatType { use serde::ser::SerializeSeq; let mut serialize_seq = serializer.serialize_seq(Some(2))?; match self { - UniDatType::Primitive(inner) => { + UniDatType::Scalar(inner) => { serialize_seq.serialize_element(&0u32)?; serialize_seq.serialize_element(&inner)?; } @@ -262,9 +262,9 @@ impl<'de> serde::de::Visitor<'de> for UniDatTypeVisitor { match id { 0 => { let value = seq - .next_element::()? + .next_element::()? .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; - Ok(Self::Value::Primitive(value)) + Ok(Self::Value::Scalar(value)) } 1 => { diff --git a/mudu_binding/src/universal/uni_dat_type_id.rs b/mudu_binding/src/universal/uni_dat_type_id.rs index 8021202..f4f2df2 100644 --- a/mudu_binding/src/universal/uni_dat_type_id.rs +++ b/mudu_binding/src/universal/uni_dat_type_id.rs @@ -45,6 +45,16 @@ pub enum UniDatTypeId { Record = 16, Binary = 17, + + Numeric = 18, + + Date = 19, + + Time = 20, + + Timestamp = 21, + + TimestampTz = 22, } impl Default for UniDatTypeId { diff --git a/mudu_binding/src/universal/uni_dat_type_id_impl.rs b/mudu_binding/src/universal/uni_dat_type_id_impl.rs index 2bb263d..c2943c4 100644 --- a/mudu_binding/src/universal/uni_dat_type_id_impl.rs +++ b/mudu_binding/src/universal/uni_dat_type_id_impl.rs @@ -19,6 +19,11 @@ impl UniDatTypeId { Self::Array => DatTypeID::Array, Self::Record => DatTypeID::Record, Self::Binary => DatTypeID::Binary, + Self::Numeric => DatTypeID::Numeric, + Self::Date => DatTypeID::Date, + Self::Time => DatTypeID::Time, + Self::Timestamp => DatTypeID::Timestamp, + Self::TimestampTz => DatTypeID::TimestampTz, _ => return Err(m_error!(EC::TypeErr, "unsupported universal data type id")), }; Ok(ty_id) @@ -36,6 +41,11 @@ impl UniDatTypeId { DatTypeID::Array => Self::Array, DatTypeID::Record => Self::Record, DatTypeID::Binary => Self::Binary, + DatTypeID::Numeric => Self::Numeric, + DatTypeID::Date => Self::Date, + DatTypeID::Time => Self::Time, + DatTypeID::Timestamp => Self::Timestamp, + DatTypeID::TimestampTz => Self::TimestampTz, }; Ok(uni_ty) } diff --git a/mudu_binding/src/universal/uni_dat_type_impl.rs b/mudu_binding/src/universal/uni_dat_type_impl.rs index 47bddfa..34dd74a 100644 --- a/mudu_binding/src/universal/uni_dat_type_impl.rs +++ b/mudu_binding/src/universal/uni_dat_type_impl.rs @@ -1,5 +1,7 @@ use crate::universal::uni_dat_type::UniDatType; -use crate::universal::uni_primitive::UniPrimitive; +use crate::universal::uni_dat_value::UniDatValue; +use crate::universal::uni_scalar::UniScalar; +use crate::universal::uni_scalar_value::UniScalarValue; use mudu::common::into_result::ToResult; use mudu::common::result::RS; use mudu::error::ec::EC; @@ -8,17 +10,26 @@ use mudu_type::dat_type::DatType; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dtp_array::DTPArray; use mudu_type::dtp_kind::DTPKind; +use mudu_type::dtp_numeric::DTPNumeric; use mudu_type::dtp_object::DTPRecord; +use mudu_type::dtp_string::DTPString; +use mudu_type::dtp_time::DTPTime; +use mudu_type::dtp_timestamp::DTPTimestamp; +use mudu_type::dtp_timestamptz::DTPTimestampTz; use std::collections::{HashMap, HashSet, VecDeque}; use crate::universal::uni_record_type::{UniRecordField, UniRecordType}; impl UniDatType { pub fn uni_to(self) -> RS { + self.uni_to_with_params(None) + } + + pub fn uni_to_with_params(self, params: Option>) -> RS { let ty = match self { - UniDatType::Primitive(primitive) => primitive.to()?, + UniDatType::Scalar(scalar) => scalar_with_params_to(scalar, params)?, UniDatType::Array(inner) => { - let ty = Box::into_inner(inner); + let ty = *inner; let inner_ty = ty.uni_to()?; let array_kind = DTPKind::Array(Box::new(DTPArray::new(inner_ty))); DatType::from_id_param(DatTypeID::Array, Some(array_kind)) @@ -41,9 +52,9 @@ impl UniDatType { } pub fn uni_from(ty: DatType) -> RS { - let uni_ty = if ty.dat_type_id().is_primitive_type() { - let primitive = UniPrimitive::uni_from(ty)?; - UniDatType::Primitive(primitive) + let uni_ty = if ty.dat_type_id().is_scalar_type() { + let scalar = UniScalar::uni_from(ty)?; + UniDatType::Scalar(scalar) } else { match ty.dat_type_id() { DatTypeID::Array => { @@ -83,6 +94,87 @@ impl UniDatType { } } +fn scalar_with_params_to(scalar: UniScalar, params: Option>) -> RS { + match (scalar, params) { + (UniScalar::String, Some(params)) if !params.is_empty() => { + let Some(UniDatValue::Scalar(UniScalarValue::I64(length))) = params.first().cloned() + else { + return Err(m_error!(EC::TypeErr, "string parameter must be i64")); + }; + Ok(DatType::from_string(DTPString::new(length as u32))) + } + (UniScalar::Numeric, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "numeric precision")?; + let scale = if params.len() > 1 { + extract_param_i64(¶ms, 1, "numeric scale")? + } else { + 0 + }; + if precision < 0 || scale < 0 { + return Err(m_error!( + EC::TypeErr, + "numeric precision/scale must be non-negative" + )); + } + let param = DTPNumeric::new(precision as u8, scale as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_numeric(param)) + } + (UniScalar::Time, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "time precision")?; + if precision < 0 { + return Err(m_error!(EC::TypeErr, "time precision must be non-negative")); + } + let param = DTPTime::new(precision as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_time(param)) + } + (UniScalar::Timestamp, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "timestamp precision")?; + if precision < 0 { + return Err(m_error!( + EC::TypeErr, + "timestamp precision must be non-negative" + )); + } + let param = DTPTimestamp::new(precision as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_timestamp(param)) + } + (UniScalar::TimestampTz, Some(params)) if !params.is_empty() => { + let precision = extract_param_i64(¶ms, 0, "timestamptz precision")?; + if precision < 0 { + return Err(m_error!( + EC::TypeErr, + "timestamptz precision must be non-negative" + )); + } + let param = DTPTimestampTz::new(precision as u8); + param + .validate() + .map_err(|message| m_error!(EC::TypeErr, message))?; + Ok(DatType::from_timestamptz(param)) + } + (scalar, _) => scalar.to(), + } +} + +fn extract_param_i64(params: &[UniDatValue], index: usize, name: &str) -> RS { + let value = params + .get(index) + .ok_or_else(|| m_error!(EC::TypeErr, format!("missing {}", name)))?; + let UniDatValue::Scalar(UniScalarValue::I64(value)) = value else { + return Err(m_error!(EC::TypeErr, format!("{} must be i64", name))); + }; + Ok(*value) +} + fn _rewrite_inline(vec_ty: Vec) -> RS> { let mut record_ty = HashMap::new(); let mut dependency = HashMap::new(); @@ -216,7 +308,7 @@ fn visit_ty( UniDatType::Box(box_type) => { visit_ty(index, box_type.as_ref(), record_ty, dependency); } - UniDatType::Primitive(_) => {} + UniDatType::Scalar(_) => {} UniDatType::Binary => {} } } @@ -584,4 +676,48 @@ mod tests { let pos: HashMap<_, _> = result.iter().enumerate().map(|(i, &v)| (v, i)).collect(); assert!(pos[&2] < pos[&1]); } + + #[test] + fn test_temporal_scalar_params_parse_and_validate() { + let cases = vec![ + (UniScalar::Time, 3i64, DatTypeID::Time), + (UniScalar::Timestamp, 4i64, DatTypeID::Timestamp), + (UniScalar::TimestampTz, 2i64, DatTypeID::TimestampTz), + ]; + + for (scalar, precision, expected_id) in cases { + let ty = scalar_with_params_to( + scalar, + Some(vec![UniDatValue::Scalar(UniScalarValue::I64(precision))]), + ) + .unwrap(); + assert_eq!(ty.dat_type_id(), expected_id); + } + } + + #[test] + fn test_temporal_scalar_params_reject_invalid_values() { + let err = scalar_with_params_to( + UniScalar::Time, + Some(vec![UniDatValue::Scalar(UniScalarValue::I64(-1))]), + ) + .unwrap_err(); + assert!(err.to_string().contains("non-negative")); + + let err = scalar_with_params_to( + UniScalar::Timestamp, + Some(vec![UniDatValue::Scalar(UniScalarValue::I64(7))]), + ) + .unwrap_err(); + assert!(err.to_string().contains("less than or equal to 6")); + + let err = scalar_with_params_to( + UniScalar::TimestampTz, + Some(vec![UniDatValue::Scalar(UniScalarValue::String( + "x".to_string(), + ))]), + ) + .unwrap_err(); + assert!(err.to_string().contains("must be i64")); + } } diff --git a/mudu_binding/src/universal/uni_dat_value.rs b/mudu_binding/src/universal/uni_dat_value.rs index dc909d6..6c45ba3 100644 --- a/mudu_binding/src/universal/uni_dat_value.rs +++ b/mudu_binding/src/universal/uni_dat_value.rs @@ -1,9 +1,9 @@ -use crate::universal::uni_primitive_value::UniPrimitiveValue; +use crate::universal::uni_scalar_value::UniScalarValue; #[derive(Debug, Clone)] pub enum UniDatValue { - Primitive(UniPrimitiveValue), + Scalar(UniScalarValue), Array(Vec), @@ -14,25 +14,25 @@ pub enum UniDatValue { impl Default for UniDatValue { fn default() -> Self { - Self::Primitive(Default::default()) + Self::Scalar(Default::default()) } } impl UniDatValue { - pub fn from_primitive(inner: UniPrimitiveValue) -> Self { - Self::Primitive(inner) + pub fn from_scalar(inner: UniScalarValue) -> Self { + Self::Scalar(inner) } - pub fn as_primitive(&self) -> Option<&UniPrimitiveValue> { + pub fn as_scalar(&self) -> Option<&UniScalarValue> { match self { - Self::Primitive(inner) => Some(inner), + Self::Scalar(inner) => Some(inner), _ => None, } } - pub fn expect_primitive(&self) -> &UniPrimitiveValue { + pub fn expect_scalar(&self) -> &UniScalarValue { match self { - Self::Primitive(inner) => inner, + Self::Scalar(inner) => inner, _ => unsafe { std::hint::unreachable_unchecked() }, } } @@ -100,7 +100,7 @@ impl serde::Serialize for UniDatValue { use serde::ser::SerializeSeq; let mut serialize_seq = serializer.serialize_seq(Some(2))?; match self { - UniDatValue::Primitive(inner) => { + UniDatValue::Scalar(inner) => { serialize_seq.serialize_element(&0u32)?; serialize_seq.serialize_element(&inner)?; } @@ -150,9 +150,9 @@ impl<'de> serde::de::Visitor<'de> for UniDatValueVisitor { match id { 0 => { let value = seq - .next_element::()? + .next_element::()? .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; - Ok(Self::Value::Primitive(value)) + Ok(Self::Value::Scalar(value)) } 1 => { diff --git a/mudu_binding/src/universal/uni_dat_value_impl.rs b/mudu_binding/src/universal/uni_dat_value_impl.rs index 2ecfd2c..a9b2d36 100644 --- a/mudu_binding/src/universal/uni_dat_value_impl.rs +++ b/mudu_binding/src/universal/uni_dat_value_impl.rs @@ -1,6 +1,11 @@ use crate::universal::uni_dat_value::UniDatValue; -use crate::universal::uni_primitive_value::UniPrimitiveValue; +use crate::universal::uni_scalar_value::UniScalarValue; use mudu::common::result::RS; +use mudu::data_type::date::DateValue; +use mudu::data_type::numeric::Numeric; +use mudu::data_type::time::TimeValue; +use mudu::data_type::timestamp::TimestampValue; +use mudu::data_type::timestamptz::TimestampTzValue; use mudu::error::ec::EC; use mudu::m_error; use mudu_type::dat_type_id::DatTypeID; @@ -10,39 +15,61 @@ use mudu_type::datum::DatumDyn; impl UniDatValue { pub fn uni_to(self) -> RS { let value = match self { - UniDatValue::Primitive(value) => { + UniDatValue::Scalar(value) => { let v = match value { - UniPrimitiveValue::Bool(_) => { - return Err(m_error!(EC::TypeErr, "primitive bool is not supported")); + UniScalarValue::Bool(_) => { + return Err(m_error!(EC::TypeErr, "scalar bool is not supported")); } - UniPrimitiveValue::U8(_) => { - return Err(m_error!(EC::TypeErr, "primitive u8 is not supported")); + UniScalarValue::U8(_) => { + return Err(m_error!(EC::TypeErr, "scalar u8 is not supported")); } - UniPrimitiveValue::I8(_) => { - return Err(m_error!(EC::TypeErr, "primitive i8 is not supported")); + UniScalarValue::I8(_) => { + return Err(m_error!(EC::TypeErr, "scalar i8 is not supported")); } - UniPrimitiveValue::U16(_) => { - return Err(m_error!(EC::TypeErr, "primitive u16 is not supported")); + UniScalarValue::U16(_) => { + return Err(m_error!(EC::TypeErr, "scalar u16 is not supported")); } - UniPrimitiveValue::I16(_) => { - return Err(m_error!(EC::TypeErr, "primitive i16 is not supported")); + UniScalarValue::I16(_) => { + return Err(m_error!(EC::TypeErr, "scalar i16 is not supported")); } - UniPrimitiveValue::U32(_) => { - return Err(m_error!(EC::TypeErr, "primitive u32 is not supported")); + UniScalarValue::U32(_) => { + return Err(m_error!(EC::TypeErr, "scalar u32 is not supported")); } - UniPrimitiveValue::I32(v) => DatValue::from_i32(v), - UniPrimitiveValue::U64(_) => { - return Err(m_error!(EC::TypeErr, "primitive u64 is not supported")); + UniScalarValue::I32(v) => DatValue::from_i32(v), + UniScalarValue::U64(_) => { + return Err(m_error!(EC::TypeErr, "scalar u64 is not supported")); } - UniPrimitiveValue::U128(v) => DatValue::from_u128(v), - UniPrimitiveValue::I64(v) => DatValue::from_i64(v), - UniPrimitiveValue::I128(v) => DatValue::from_i128(v), - UniPrimitiveValue::F32(v) => DatValue::from_f32(v), - UniPrimitiveValue::F64(v) => DatValue::from_f64(v), - UniPrimitiveValue::Char(_) => { - return Err(m_error!(EC::TypeErr, "primitive char is not supported")); + UniScalarValue::U128(v) => DatValue::from_u128(v), + UniScalarValue::I64(v) => DatValue::from_i64(v), + UniScalarValue::I128(v) => DatValue::from_i128(v), + UniScalarValue::F32(v) => DatValue::from_f32(v), + UniScalarValue::F64(v) => DatValue::from_f64(v), + UniScalarValue::Char(_) => { + return Err(m_error!(EC::TypeErr, "scalar char is not supported")); + } + UniScalarValue::String(v) => DatValue::from_string(v), + UniScalarValue::Numeric(v) => DatValue::from_numeric( + Numeric::parse(v.as_str()) + .map_err(|e| m_error!(EC::TypeErr, format!("invalid numeric {}", e)))?, + ), + UniScalarValue::Date(v) => DatValue::from_date( + DateValue::parse(v.as_str()) + .map_err(|e| m_error!(EC::TypeErr, format!("invalid date {}", e)))?, + ), + UniScalarValue::Time(v) => DatValue::from_time( + TimeValue::parse(v.as_str()) + .map_err(|e| m_error!(EC::TypeErr, format!("invalid time {}", e)))?, + ), + UniScalarValue::Timestamp(v) => { + DatValue::from_timestamp(TimestampValue::parse(v.as_str()).map_err( + |e| m_error!(EC::TypeErr, format!("invalid timestamp {}", e)), + )?) + } + UniScalarValue::TimestampTz(v) => { + DatValue::from_timestamptz(TimestampTzValue::parse(v.as_str()).map_err( + |e| m_error!(EC::TypeErr, format!("invalid timestamptz {}", e)), + )?) } - UniPrimitiveValue::String(v) => DatValue::from_string(v), }; v } @@ -71,25 +98,46 @@ impl UniDatValue { let id = dat_value.dat_type_id()?; let mu_v = match id { DatTypeID::I32 => { - UniDatValue::from_primitive(UniPrimitiveValue::I32(dat_value.expect_i32().clone())) + UniDatValue::from_scalar(UniScalarValue::I32(dat_value.expect_i32().clone())) } DatTypeID::I64 => { - UniDatValue::from_primitive(UniPrimitiveValue::I64(dat_value.expect_i64().clone())) + UniDatValue::from_scalar(UniScalarValue::I64(dat_value.expect_i64().clone())) + } + DatTypeID::I128 => { + UniDatValue::from_scalar(UniScalarValue::I128(dat_value.expect_i128().clone())) + } + DatTypeID::U128 => { + UniDatValue::from_scalar(UniScalarValue::U128(dat_value.expect_u128().clone())) } - DatTypeID::I128 => UniDatValue::from_primitive(UniPrimitiveValue::I128( - dat_value.expect_i128().clone(), - )), - DatTypeID::U128 => UniDatValue::from_primitive(UniPrimitiveValue::U128( - dat_value.expect_u128().clone(), - )), DatTypeID::F32 => { - UniDatValue::from_primitive(UniPrimitiveValue::F32(dat_value.expect_f32().clone())) + UniDatValue::from_scalar(UniScalarValue::F32(dat_value.expect_f32().clone())) } DatTypeID::F64 => { - UniDatValue::from_primitive(UniPrimitiveValue::F64(dat_value.expect_f64().clone())) + UniDatValue::from_scalar(UniScalarValue::F64(dat_value.expect_f64().clone())) } - DatTypeID::String => UniDatValue::from_primitive(UniPrimitiveValue::String( - dat_value.expect_string().clone(), + DatTypeID::String => { + UniDatValue::from_scalar(UniScalarValue::String(dat_value.expect_string().clone())) + } + DatTypeID::Numeric => UniDatValue::from_scalar(UniScalarValue::Numeric( + dat_value.expect_numeric().to_plain_string(), + )), + DatTypeID::Date => { + UniDatValue::from_scalar(UniScalarValue::Date(dat_value.expect_date().format())) + } + DatTypeID::Time => { + UniDatValue::from_scalar(UniScalarValue::Time(dat_value.expect_time().format(6))) + } + DatTypeID::Timestamp => UniDatValue::from_scalar(UniScalarValue::Timestamp( + dat_value + .expect_timestamp() + .format(6) + .map_err(|e| m_error!(EC::TypeErr, e))?, + )), + DatTypeID::TimestampTz => UniDatValue::from_scalar(UniScalarValue::TimestampTz( + dat_value + .expect_timestamptz() + .format(6) + .map_err(|e| m_error!(EC::TypeErr, e))?, )), DatTypeID::Array => { let array = dat_value.into_array(); diff --git a/mudu_binding/src/universal/uni_primitive_impl.rs b/mudu_binding/src/universal/uni_primitive_impl.rs deleted file mode 100644 index d64d7e9..0000000 --- a/mudu_binding/src/universal/uni_primitive_impl.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::universal::uni_primitive::UniPrimitive; -use mudu::common::into_result::ToResult; -use mudu::common::result::RS; -use mudu::common::result_from::ResultFrom; -use mudu::error::ec::EC; -use mudu::m_error; -use mudu_type::dat_type::DatType; -use mudu_type::dat_type_id::DatTypeID; - -impl UniPrimitive { - pub fn uni_to(self) -> RS { - let ty = match self { - UniPrimitive::Bool => { - return Err(m_error!(EC::TypeErr, "primitive bool is not supported")); - } - UniPrimitive::U8 => return Err(m_error!(EC::TypeErr, "primitive u8 is not supported")), - UniPrimitive::I8 => return Err(m_error!(EC::TypeErr, "primitive i8 is not supported")), - UniPrimitive::U16 => { - return Err(m_error!(EC::TypeErr, "primitive u16 is not supported")); - } - UniPrimitive::I16 => { - return Err(m_error!(EC::TypeErr, "primitive i16 is not supported")); - } - UniPrimitive::U32 => { - return Err(m_error!(EC::TypeErr, "primitive u32 is not supported")); - } - UniPrimitive::I32 => DatType::default_for(DatTypeID::I32), - UniPrimitive::U64 => { - return Err(m_error!(EC::TypeErr, "primitive u64 is not supported")); - } - UniPrimitive::U128 => DatType::default_for(DatTypeID::U128), - UniPrimitive::I64 => DatType::default_for(DatTypeID::I64), - UniPrimitive::I128 => DatType::default_for(DatTypeID::I128), - UniPrimitive::F32 => DatType::default_for(DatTypeID::F32), - UniPrimitive::F64 => DatType::default_for(DatTypeID::F64), - UniPrimitive::Char => { - return Err(m_error!(EC::TypeErr, "primitive char is not supported")); - } - UniPrimitive::String => DatType::default_for(DatTypeID::String), - UniPrimitive::Blob => DatType::default_for(DatTypeID::Binary), - }; - Ok(ty) - } - - pub fn uni_from(ty: DatType) -> RS { - let uni_prim = match ty.dat_type_id() { - DatTypeID::I32 => Self::I32, - DatTypeID::I64 => Self::I64, - DatTypeID::I128 => Self::I128, - DatTypeID::U128 => Self::U128, - DatTypeID::F32 => Self::F32, - DatTypeID::F64 => Self::F64, - DatTypeID::String => Self::String, - DatTypeID::Array => { - return Err(m_error!(EC::TypeErr, "array type is not primitive")); - } - DatTypeID::Record => { - return Err(m_error!(EC::TypeErr, "record type is not primitive")); - } - DatTypeID::Binary => Self::Blob, - }; - Ok(uni_prim) - } -} - -impl ToResult for UniPrimitive { - fn to(self) -> RS { - self.uni_to() - } -} - -impl ResultFrom for UniPrimitive { - fn from(value: DatType) -> RS { - Self::uni_from(value) - } -} diff --git a/mudu_binding/src/universal/uni_primitive.rs b/mudu_binding/src/universal/uni_scalar.rs similarity index 75% rename from mudu_binding/src/universal/uni_primitive.rs rename to mudu_binding/src/universal/uni_scalar.rs index a0b53b4..aa862e6 100644 --- a/mudu_binding/src/universal/uni_primitive.rs +++ b/mudu_binding/src/universal/uni_scalar.rs @@ -9,7 +9,7 @@ serde_repr::Deserialize_repr, )] #[repr(u32)] -pub enum UniPrimitive { +pub enum UniScalar { Bool = 0, U8 = 1, @@ -41,9 +41,19 @@ pub enum UniPrimitive { String = 14, Blob = 15, + + Numeric = 16, + + Date = 17, + + Time = 18, + + Timestamp = 19, + + TimestampTz = 20, } -impl Default for UniPrimitive { +impl Default for UniScalar { fn default() -> Self { Self::Bool } diff --git a/mudu_binding/src/universal/uni_scalar_impl.rs b/mudu_binding/src/universal/uni_scalar_impl.rs new file mode 100644 index 0000000..09295ff --- /dev/null +++ b/mudu_binding/src/universal/uni_scalar_impl.rs @@ -0,0 +1,86 @@ +use crate::universal::uni_scalar::UniScalar; +use mudu::common::into_result::ToResult; +use mudu::common::result::RS; +use mudu::common::result_from::ResultFrom; +use mudu::error::ec::EC; +use mudu::m_error; +use mudu_type::dat_type::DatType; +use mudu_type::dat_type_id::DatTypeID; + +impl UniScalar { + pub fn uni_to(self) -> RS { + let ty = match self { + UniScalar::Bool => { + return Err(m_error!(EC::TypeErr, "scalar bool is not supported")); + } + UniScalar::U8 => return Err(m_error!(EC::TypeErr, "scalar u8 is not supported")), + UniScalar::I8 => return Err(m_error!(EC::TypeErr, "scalar i8 is not supported")), + UniScalar::U16 => { + return Err(m_error!(EC::TypeErr, "scalar u16 is not supported")); + } + UniScalar::I16 => { + return Err(m_error!(EC::TypeErr, "scalar i16 is not supported")); + } + UniScalar::U32 => { + return Err(m_error!(EC::TypeErr, "scalar u32 is not supported")); + } + UniScalar::I32 => DatType::default_for(DatTypeID::I32), + UniScalar::U64 => { + return Err(m_error!(EC::TypeErr, "scalar u64 is not supported")); + } + UniScalar::U128 => DatType::default_for(DatTypeID::U128), + UniScalar::I64 => DatType::default_for(DatTypeID::I64), + UniScalar::I128 => DatType::default_for(DatTypeID::I128), + UniScalar::F32 => DatType::default_for(DatTypeID::F32), + UniScalar::F64 => DatType::default_for(DatTypeID::F64), + UniScalar::Char => { + return Err(m_error!(EC::TypeErr, "scalar char is not supported")); + } + UniScalar::String => DatType::default_for(DatTypeID::String), + UniScalar::Blob => DatType::default_for(DatTypeID::Binary), + UniScalar::Numeric => DatType::default_for(DatTypeID::Numeric), + UniScalar::Date => DatType::default_for(DatTypeID::Date), + UniScalar::Time => DatType::default_for(DatTypeID::Time), + UniScalar::Timestamp => DatType::default_for(DatTypeID::Timestamp), + UniScalar::TimestampTz => DatType::default_for(DatTypeID::TimestampTz), + }; + Ok(ty) + } + + pub fn uni_from(ty: DatType) -> RS { + let uni_scalar = match ty.dat_type_id() { + DatTypeID::I32 => Self::I32, + DatTypeID::I64 => Self::I64, + DatTypeID::I128 => Self::I128, + DatTypeID::U128 => Self::U128, + DatTypeID::F32 => Self::F32, + DatTypeID::F64 => Self::F64, + DatTypeID::String => Self::String, + DatTypeID::Numeric => Self::Numeric, + DatTypeID::Date => Self::Date, + DatTypeID::Time => Self::Time, + DatTypeID::Timestamp => Self::Timestamp, + DatTypeID::TimestampTz => Self::TimestampTz, + DatTypeID::Array => { + return Err(m_error!(EC::TypeErr, "array type is not scalar")); + } + DatTypeID::Record => { + return Err(m_error!(EC::TypeErr, "record type is not scalar")); + } + DatTypeID::Binary => Self::Blob, + }; + Ok(uni_scalar) + } +} + +impl ToResult for UniScalar { + fn to(self) -> RS { + self.uni_to() + } +} + +impl ResultFrom for UniScalar { + fn from(value: DatType) -> RS { + Self::uni_from(value) + } +} diff --git a/mudu_api/rust/src/universal/uni_primitive_value.rs b/mudu_binding/src/universal/uni_scalar_value.rs similarity index 70% rename from mudu_api/rust/src/universal/uni_primitive_value.rs rename to mudu_binding/src/universal/uni_scalar_value.rs index f10aa5d..0c0a612 100644 --- a/mudu_api/rust/src/universal/uni_primitive_value.rs +++ b/mudu_binding/src/universal/uni_scalar_value.rs @@ -1,6 +1,6 @@ #[derive(Debug, Clone)] -pub enum UniPrimitiveValue { +pub enum UniScalarValue { Bool(bool), U8(u8), @@ -30,15 +30,25 @@ pub enum UniPrimitiveValue { Char(char), String(String), + + Numeric(String), + + Date(String), + + Time(String), + + Timestamp(String), + + TimestampTz(String), } -impl Default for UniPrimitiveValue { +impl Default for UniScalarValue { fn default() -> Self { Self::Bool(Default::default()) } } -impl UniPrimitiveValue { +impl UniScalarValue { pub fn from_bool(inner: bool) -> Self { Self::Bool(inner) } @@ -308,9 +318,99 @@ impl UniPrimitiveValue { _ => unsafe { std::hint::unreachable_unchecked() }, } } + + pub fn from_numeric(inner: String) -> Self { + Self::Numeric(inner) + } + + pub fn as_numeric(&self) -> Option<&String> { + match self { + Self::Numeric(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_numeric(&self) -> &String { + match self { + Self::Numeric(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_date(inner: String) -> Self { + Self::Date(inner) + } + + pub fn as_date(&self) -> Option<&String> { + match self { + Self::Date(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_date(&self) -> &String { + match self { + Self::Date(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_time(inner: String) -> Self { + Self::Time(inner) + } + + pub fn as_time(&self) -> Option<&String> { + match self { + Self::Time(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_time(&self) -> &String { + match self { + Self::Time(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_timestamp(inner: String) -> Self { + Self::Timestamp(inner) + } + + pub fn as_timestamp(&self) -> Option<&String> { + match self { + Self::Timestamp(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_timestamp(&self) -> &String { + match self { + Self::Timestamp(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } + + pub fn from_timestamptz(inner: String) -> Self { + Self::TimestampTz(inner) + } + + pub fn as_timestamptz(&self) -> Option<&String> { + match self { + Self::TimestampTz(inner) => Some(inner), + _ => None, + } + } + + pub fn expect_timestamptz(&self) -> &String { + match self { + Self::TimestampTz(inner) => inner, + _ => unsafe { std::hint::unreachable_unchecked() }, + } + } } -impl serde::Serialize for UniPrimitiveValue { +impl serde::Serialize for UniScalarValue { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, @@ -318,89 +418,114 @@ impl serde::Serialize for UniPrimitiveValue { use serde::ser::SerializeSeq; let mut serialize_seq = serializer.serialize_seq(Some(2))?; match self { - UniPrimitiveValue::Bool(inner) => { + UniScalarValue::Bool(inner) => { serialize_seq.serialize_element(&0u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U8(inner) => { + UniScalarValue::U8(inner) => { serialize_seq.serialize_element(&1u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I8(inner) => { + UniScalarValue::I8(inner) => { serialize_seq.serialize_element(&2u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U16(inner) => { + UniScalarValue::U16(inner) => { serialize_seq.serialize_element(&3u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I16(inner) => { + UniScalarValue::I16(inner) => { serialize_seq.serialize_element(&4u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U32(inner) => { + UniScalarValue::U32(inner) => { serialize_seq.serialize_element(&5u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I32(inner) => { + UniScalarValue::I32(inner) => { serialize_seq.serialize_element(&6u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U64(inner) => { + UniScalarValue::U64(inner) => { serialize_seq.serialize_element(&7u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::U128(inner) => { + UniScalarValue::U128(inner) => { serialize_seq.serialize_element(&8u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I64(inner) => { + UniScalarValue::I64(inner) => { serialize_seq.serialize_element(&9u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::I128(inner) => { + UniScalarValue::I128(inner) => { serialize_seq.serialize_element(&10u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::F32(inner) => { + UniScalarValue::F32(inner) => { serialize_seq.serialize_element(&11u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::F64(inner) => { + UniScalarValue::F64(inner) => { serialize_seq.serialize_element(&12u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::Char(inner) => { + UniScalarValue::Char(inner) => { serialize_seq.serialize_element(&13u32)?; serialize_seq.serialize_element(&inner)?; } - UniPrimitiveValue::String(inner) => { + UniScalarValue::String(inner) => { serialize_seq.serialize_element(&14u32)?; serialize_seq.serialize_element(&inner)?; } + + UniScalarValue::Numeric(inner) => { + serialize_seq.serialize_element(&15u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::Date(inner) => { + serialize_seq.serialize_element(&16u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::Time(inner) => { + serialize_seq.serialize_element(&17u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::Timestamp(inner) => { + serialize_seq.serialize_element(&18u32)?; + serialize_seq.serialize_element(&inner)?; + } + + UniScalarValue::TimestampTz(inner) => { + serialize_seq.serialize_element(&19u32)?; + serialize_seq.serialize_element(&inner)?; + } } serialize_seq.end() } } -struct UniPrimitiveValueVisitor {} +struct UniScalarValueVisitor {} -impl<'de> serde::de::Visitor<'de> for UniPrimitiveValueVisitor { - type Value = UniPrimitiveValue; +impl<'de> serde::de::Visitor<'de> for UniScalarValueVisitor { + type Value = UniScalarValue; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a sequence") @@ -526,16 +651,51 @@ impl<'de> serde::de::Visitor<'de> for UniPrimitiveValueVisitor { Ok(Self::Value::String(value)) } + 15 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Numeric(value)) + } + + 16 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Date(value)) + } + + 17 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Time(value)) + } + + 18 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::Timestamp(value)) + } + + 19 => { + let value = seq + .next_element::()? + .map_or_else(|| Err(A::Error::invalid_length(1, &self)), Ok)?; + Ok(Self::Value::TimestampTz(value)) + } + _ => Err(Error::invalid_value(Unexpected::Map, &self)), } } } -impl<'de> serde::Deserialize<'de> for UniPrimitiveValue { +impl<'de> serde::Deserialize<'de> for UniScalarValue { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { - deserializer.deserialize_seq(UniPrimitiveValueVisitor {}) + deserializer.deserialize_seq(UniScalarValueVisitor {}) } } diff --git a/mudu_binding/wit/uni-dat-type.wit b/mudu_binding/wit/uni-dat-type.wit index a8ec7cb..873e2c3 100644 --- a/mudu_binding/wit/uni-dat-type.wit +++ b/mudu_binding/wit/uni-dat-type.wit @@ -1,10 +1,10 @@ -use crate:universal:uni-primitive/uni-primitive; +use crate:universal:uni-scalar/uni-scalar; use crate:universal:uni-record-type/uni-record-type; use crate:universal:uni-result-type/uni-result-type; interface universal { variant uni-dat-type { - primitive(uni-primitive), + scalar(uni-scalar), array(box), record(uni-record-type), option(box), diff --git a/mudu_binding/wit/uni-dat-value.wit b/mudu_binding/wit/uni-dat-value.wit index 2d3e916..c40dd4b 100644 --- a/mudu_binding/wit/uni-dat-value.wit +++ b/mudu_binding/wit/uni-dat-value.wit @@ -1,8 +1,8 @@ -use crate:universal:uni-primitive-value/uni-primitive-value; +use crate:universal:uni-scalar-value/uni-scalar-value; interface universal { variant uni-dat-value { - primitive(uni-primitive-value), + scalar(uni-scalar-value), array(list), record(list), binary(list) diff --git a/mudu_binding/wit/uni-primitive-value.wit b/mudu_binding/wit/uni-scalar-value.wit similarity index 88% rename from mudu_binding/wit/uni-primitive-value.wit rename to mudu_binding/wit/uni-scalar-value.wit index fd03f6f..4b3084a 100644 --- a/mudu_binding/wit/uni-primitive-value.wit +++ b/mudu_binding/wit/uni-scalar-value.wit @@ -1,5 +1,5 @@ interface universal { -variant uni-primitive-value { +variant uni-scalar-value { bool(bool), %u8(u8), i8(s8), diff --git a/mudu_binding/wit/uni-primitive.wit b/mudu_binding/wit/uni-scalar.wit similarity index 88% rename from mudu_binding/wit/uni-primitive.wit rename to mudu_binding/wit/uni-scalar.wit index 3a25011..a8310a3 100644 --- a/mudu_binding/wit/uni-primitive.wit +++ b/mudu_binding/wit/uni-scalar.wit @@ -1,5 +1,5 @@ interface universal { -enum uni-primitive { +enum uni-scalar { bool, %u8, i8, diff --git a/mudu_cli/src/client/json_client.rs b/mudu_cli/src/client/json_client.rs index b0952c9..fe6b799 100644 --- a/mudu_cli/src/client/json_client.rs +++ b/mudu_cli/src/client/json_client.rs @@ -5,7 +5,7 @@ use mudu::error::ec::EC; use mudu::m_error; use mudu_binding::universal::uni_dat_value::UniDatValue; use mudu_binding::universal::uni_oid::UniOid; -use mudu_binding::universal::uni_primitive_value::UniPrimitiveValue; +use mudu_binding::universal::uni_scalar_value::UniScalarValue; use mudu_contract::protocol::{ ClientRequest, GetRequest, KeyValue, ProcedureInvokeRequest, PutRequest, RangeScanRequest, ServerResponse, @@ -183,29 +183,19 @@ fn json_value_to_uni_dat_value(value: Value) -> RS { serde_json::to_vec(&Value::Null) .map_err(|e| m_error!(EC::EncodeErr, "encode null payload error", e))?, )), - Value::Bool(inner) => Ok(UniDatValue::from_primitive(UniPrimitiveValue::from_bool( - inner, - ))), + Value::Bool(inner) => Ok(UniDatValue::from_scalar(UniScalarValue::from_bool(inner))), Value::Number(inner) => { if let Some(value) = inner.as_i64() { - Ok(UniDatValue::from_primitive(UniPrimitiveValue::from_i64( - value, - ))) + Ok(UniDatValue::from_scalar(UniScalarValue::from_i64(value))) } else if let Some(value) = inner.as_u64() { - Ok(UniDatValue::from_primitive(UniPrimitiveValue::from_u64( - value, - ))) + Ok(UniDatValue::from_scalar(UniScalarValue::from_u64(value))) } else if let Some(value) = inner.as_f64() { - Ok(UniDatValue::from_primitive(UniPrimitiveValue::from_f64( - value, - ))) + Ok(UniDatValue::from_scalar(UniScalarValue::from_f64(value))) } else { Err(m_error!(EC::DecodeErr, "unsupported numeric json payload")) } } - Value::String(inner) => Ok(UniDatValue::from_primitive(UniPrimitiveValue::from_string( - inner, - ))), + Value::String(inner) => Ok(UniDatValue::from_scalar(UniScalarValue::from_string(inner))), Value::Array(inner) => inner .into_iter() .map(json_value_to_uni_dat_value) @@ -241,22 +231,27 @@ fn decode_uni_dat_value(bytes: &[u8]) -> RS { fn uni_dat_value_to_json_value(value: UniDatValue) -> RS { match value { - UniDatValue::Primitive(inner) => match inner { - UniPrimitiveValue::Bool(v) => Ok(Value::Bool(v)), - UniPrimitiveValue::U8(v) => Ok(json!(v)), - UniPrimitiveValue::I8(v) => Ok(json!(v)), - UniPrimitiveValue::U16(v) => Ok(json!(v)), - UniPrimitiveValue::I16(v) => Ok(json!(v)), - UniPrimitiveValue::U32(v) => Ok(json!(v)), - UniPrimitiveValue::I32(v) => Ok(json!(v)), - UniPrimitiveValue::U64(v) => Ok(json!(v)), - UniPrimitiveValue::U128(v) => Ok(Value::String(v.to_string())), - UniPrimitiveValue::I64(v) => Ok(json!(v)), - UniPrimitiveValue::I128(v) => Ok(Value::String(v.to_string())), - UniPrimitiveValue::F32(v) => Ok(json!(v)), - UniPrimitiveValue::F64(v) => Ok(json!(v)), - UniPrimitiveValue::Char(v) => Ok(json!(v.to_string())), - UniPrimitiveValue::String(v) => Ok(Value::String(v)), + UniDatValue::Scalar(inner) => match inner { + UniScalarValue::Bool(v) => Ok(Value::Bool(v)), + UniScalarValue::U8(v) => Ok(json!(v)), + UniScalarValue::I8(v) => Ok(json!(v)), + UniScalarValue::U16(v) => Ok(json!(v)), + UniScalarValue::I16(v) => Ok(json!(v)), + UniScalarValue::U32(v) => Ok(json!(v)), + UniScalarValue::I32(v) => Ok(json!(v)), + UniScalarValue::U64(v) => Ok(json!(v)), + UniScalarValue::U128(v) => Ok(Value::String(v.to_string())), + UniScalarValue::I64(v) => Ok(json!(v)), + UniScalarValue::I128(v) => Ok(Value::String(v.to_string())), + UniScalarValue::F32(v) => Ok(json!(v)), + UniScalarValue::F64(v) => Ok(json!(v)), + UniScalarValue::Char(v) => Ok(json!(v.to_string())), + UniScalarValue::String(v) => Ok(Value::String(v)), + UniScalarValue::Numeric(v) => Ok(Value::String(v)), + UniScalarValue::Date(v) => Ok(Value::String(v)), + UniScalarValue::Time(v) => Ok(Value::String(v)), + UniScalarValue::Timestamp(v) => Ok(Value::String(v)), + UniScalarValue::TimestampTz(v) => Ok(Value::String(v)), }, UniDatValue::Array(items) | UniDatValue::Record(items) => items .into_iter() diff --git a/mudu_contract/src/database/sql.rs b/mudu_contract/src/database/sql.rs index 6d07799..bd92752 100644 --- a/mudu_contract/src/database/sql.rs +++ b/mudu_contract/src/database/sql.rs @@ -13,12 +13,12 @@ use mudu::common::id::OID; use mudu::common::result::RS; use mudu::common::result_of::rs_option; use mudu::common::xid::XID; +use mudu::error::ec::EC; +use mudu::m_error; use mudu_type::datum::DatumDyn; use scc::HashMap; use std::sync::{Arc, Mutex}; use tracing::debug; -use mudu::error::ec::EC; -use mudu::m_error; pub fn function_sql_stmt(stmt: &dyn SQLStmt) -> &dyn SQLStmt { stmt @@ -81,7 +81,7 @@ pub struct Context { struct ContextInner { session_id: OID, - xid:Mutex, + xid: Mutex, result_set: Mutex>, conn: DBConn, } @@ -137,15 +137,15 @@ impl ContextInner { fn set_xid(&self, xid: XID) { let mut g = self.xid.lock(); match &mut g { - Ok(v) => { **v = xid } - Err(_) => { } + Ok(v) => **v = xid, + Err(_) => {} } } - fn xid(&self) -> XID { + fn xid(&self) -> XID { let g = self.xid.lock(); match g { - Ok(v) => { *v } - Err(_) => { 0 } + Ok(v) => *v, + Err(_) => 0, } } fn session_id(&self) -> OID { @@ -255,7 +255,6 @@ impl Context { } } - pub async fn commit_async(oid: XID) -> RS<()> { let ctx = Self::context_async(oid).await?; ctx.commit_tx_async().await?; @@ -277,10 +276,8 @@ impl Context { Some(e) => { let ctx = e.get().clone(); ctx - }, - None => { - return Err(m_error!(EC::NoSuchElement, "no such context")) - }, + } + None => return Err(m_error!(EC::NoSuchElement, "no such context")), } }; Ok(ctx) diff --git a/mudu_gen/src/lang_impl/csharp/lang_def.rs b/mudu_gen/src/lang_impl/csharp/lang_def.rs index 2109025..14d31f8 100644 --- a/mudu_gen/src/lang_impl/csharp/lang_def.rs +++ b/mudu_gen/src/lang_impl/csharp/lang_def.rs @@ -1,13 +1,13 @@ use crate::lang_impl::csharp::render_cs::create_render; use crate::lang_impl::lang::lang_handle_tuple::lang_handle_tuple; -use crate::lang_impl::lang::non_primitive::NonPrimitiveType; +use crate::lang_impl::lang::non_scalar::NonScalarType; use crate::lang_impl::lang::render::Render; -use crate::{impl_non_primitive, impl_primitive}; -use mudu_binding::universal::uni_primitive::UniPrimitive; +use crate::{impl_non_scalar, impl_scalar}; +use mudu_binding::universal::uni_scalar::UniScalar; use paste::paste; use std::sync::Arc; -impl_primitive! { +impl_scalar! { csharp, (Bool, "bool"), (U8, "byte"), @@ -25,9 +25,14 @@ impl_primitive! { (Char, "char"), (String, "string"), (Blob, "byte[]"), + (Numeric, "string"), + (Date, "string"), + (Time, "string"), + (Timestamp, "string"), + (TimestampTz, "string"), } -impl_non_primitive! { +impl_non_scalar! { csharp, (Array, fn_handle_array), (Option, fn_handle_option), diff --git a/mudu_gen/src/lang_impl/lang/lang_data_type.rs b/mudu_gen/src/lang_impl/lang/lang_data_type.rs index c51d702..6b3c9fe 100644 --- a/mudu_gen/src/lang_impl/lang/lang_data_type.rs +++ b/mudu_gen/src/lang_impl/lang/lang_data_type.rs @@ -1,10 +1,10 @@ use crate::lang_impl; use crate::lang_impl::lang::lang_kind::LangKind; -use crate::lang_impl::lang::non_primitive::NonPrimitiveType; +use crate::lang_impl::lang::non_scalar::NonScalarType; use mudu::common::result::RS; use mudu::utils::case_convert::to_pascal_case; use mudu_binding::universal::uni_dat_type::UniDatType; -use mudu_binding::universal::uni_primitive::UniPrimitive; +use mudu_binding::universal::uni_scalar::UniScalar; pub fn uni_data_type_to_name(wit_ty: &UniDatType, lang: &LangKind) -> RS { _to_lang_type(wit_ty, lang) @@ -12,23 +12,28 @@ pub fn uni_data_type_to_name(wit_ty: &UniDatType, lang: &LangKind) -> RS pub fn csharp_default_value_expr(wit_ty: &UniDatType) -> RS { match wit_ty { - UniDatType::Primitive(p_ty) => Ok(match p_ty { - UniPrimitive::Bool => "false".to_string(), - UniPrimitive::U8 => "0".to_string(), - UniPrimitive::U16 => "0".to_string(), - UniPrimitive::U32 => "0".to_string(), - UniPrimitive::U64 => "0".to_string(), - UniPrimitive::U128 => "default".to_string(), - UniPrimitive::I8 => "0".to_string(), - UniPrimitive::I16 => "0".to_string(), - UniPrimitive::I32 => "0".to_string(), - UniPrimitive::I64 => "0".to_string(), - UniPrimitive::I128 => "0".to_string(), - UniPrimitive::F32 => "0".to_string(), - UniPrimitive::F64 => "0".to_string(), - UniPrimitive::Char => "'\\0'".to_string(), - UniPrimitive::String => "string.Empty".to_string(), - UniPrimitive::Blob => "[]".to_string(), + UniDatType::Scalar(p_ty) => Ok(match p_ty { + UniScalar::Bool => "false".to_string(), + UniScalar::U8 => "0".to_string(), + UniScalar::U16 => "0".to_string(), + UniScalar::U32 => "0".to_string(), + UniScalar::U64 => "0".to_string(), + UniScalar::U128 => "default".to_string(), + UniScalar::I8 => "0".to_string(), + UniScalar::I16 => "0".to_string(), + UniScalar::I32 => "0".to_string(), + UniScalar::I64 => "0".to_string(), + UniScalar::I128 => "0".to_string(), + UniScalar::F32 => "0".to_string(), + UniScalar::F64 => "0".to_string(), + UniScalar::Char => "'\\0'".to_string(), + UniScalar::String => "string.Empty".to_string(), + UniScalar::Blob => "[]".to_string(), + UniScalar::Numeric => "string.Empty".to_string(), + UniScalar::Date => "string.Empty".to_string(), + UniScalar::Time => "string.Empty".to_string(), + UniScalar::Timestamp => "string.Empty".to_string(), + UniScalar::TimestampTz => "string.Empty".to_string(), }), UniDatType::Tuple(_) => Ok("default".to_string()), UniDatType::Array(_) => Ok("[]".to_string()), @@ -49,7 +54,18 @@ pub fn csharp_default_value_expr(wit_ty: &UniDatType) -> RS { pub fn csharp_is_reference_type(wit_ty: &UniDatType) -> bool { match wit_ty { - UniDatType::Primitive(p_ty) => matches!(p_ty, UniPrimitive::String | UniPrimitive::Blob), + UniDatType::Scalar(p_ty) => { + matches!( + p_ty, + UniScalar::String + | UniScalar::Blob + | UniScalar::Numeric + | UniScalar::Date + | UniScalar::Time + | UniScalar::Timestamp + | UniScalar::TimestampTz + ) + } UniDatType::Tuple(_) => false, UniDatType::Array(_) => true, UniDatType::Option(inner_ty) => csharp_is_reference_type(inner_ty), @@ -61,12 +77,12 @@ pub fn csharp_is_reference_type(wit_ty: &UniDatType) -> bool { } } -fn to_primitive_type(wit_prim: &UniPrimitive, lang: &LangKind) -> RS { - Ok(lang_impl::lang_primitive_name(lang, wit_prim)) +fn to_scalar_type(wit_prim: &UniScalar, lang: &LangKind) -> RS { + Ok(lang_impl::lang_scalar_name(lang, wit_prim)) } -fn to_non_primitive_type(non_prim: &NonPrimitiveType, lang: &LangKind) -> RS { - Ok(lang_impl::lang_non_primitive_name(lang, non_prim)) +fn to_non_scalar_type(non_scalar: &NonScalarType, lang: &LangKind) -> RS { + Ok(lang_impl::lang_non_scalar_name(lang, non_scalar)) } fn handle_wit_tuple(vec_wit_ty: &Vec, lang: &LangKind) -> RS { @@ -75,33 +91,33 @@ fn handle_wit_tuple(vec_wit_ty: &Vec, lang: &LangKind) -> RS let ty = uni_data_type_to_name(wit_ty, lang)?; vec.push(ty); } - let non_prim = NonPrimitiveType::Tuple(vec); - let s = to_non_primitive_type(&non_prim, lang)?; + let non_scalar = NonScalarType::Tuple(vec); + let s = to_non_scalar_type(&non_scalar, lang)?; Ok(s) } fn _to_lang_type(wit_ty: &UniDatType, lang: &LangKind) -> RS { let ty_str = match wit_ty { - UniDatType::Primitive(p_ty) => { - let s = to_primitive_type(p_ty, lang)?; + UniDatType::Scalar(p_ty) => { + let s = to_scalar_type(p_ty, lang)?; s } UniDatType::Tuple(vec) => handle_wit_tuple(vec, lang)?, UniDatType::Array(inner_ty) => { let inner = uni_data_type_to_name(inner_ty, lang)?; - let non_prim = NonPrimitiveType::Array(inner); - to_non_primitive_type(&non_prim, lang)? + let non_scalar = NonScalarType::Array(inner); + to_non_scalar_type(&non_scalar, lang)? } UniDatType::Option(inner_ty) => { let inner = uni_data_type_to_name(inner_ty, lang)?; - let non_prim = NonPrimitiveType::Option(inner); - to_non_primitive_type(&non_prim, lang)? + let non_scalar = NonScalarType::Option(inner); + to_non_scalar_type(&non_scalar, lang)? } UniDatType::Identifier(ty_name) => to_pascal_case(ty_name), UniDatType::Box(inner_ty) => { let inner = uni_data_type_to_name(inner_ty, lang)?; - let non_prim = NonPrimitiveType::Box(inner); - to_non_primitive_type(&non_prim, lang)? + let non_scalar = NonScalarType::Box(inner); + to_non_scalar_type(&non_scalar, lang)? } UniDatType::Result { .. } => { unimplemented!() diff --git a/mudu_gen/src/lang_impl/lang/lang_kind.rs b/mudu_gen/src/lang_impl/lang/lang_kind.rs index de853dc..e451049 100644 --- a/mudu_gen/src/lang_impl/lang/lang_kind.rs +++ b/mudu_gen/src/lang_impl/lang/lang_kind.rs @@ -1,5 +1,5 @@ use mudu::common::result::RS; -use mudu_binding::universal::uni_primitive::UniPrimitive; +use mudu_binding::universal::uni_scalar::UniScalar; use crate::lang_impl; use crate::lang_impl::lang::lang_data_type::uni_data_type_to_name; @@ -27,8 +27,8 @@ impl LangKind { } } - pub fn name_of_primitive(&self, p: &UniPrimitive) -> RS { - Ok(lang_impl::lang_primitive_name(self, p)) + pub fn name_of_scalar(&self, p: &UniScalar) -> RS { + Ok(lang_impl::lang_scalar_name(self, p)) } pub fn name_of_wit_type(&self, wit_type: &UniDatType) -> RS { diff --git a/mudu_gen/src/lang_impl/lang/lang_macro_rule.rs b/mudu_gen/src/lang_impl/lang/lang_macro_rule.rs index 45939b0..77d103c 100644 --- a/mudu_gen/src/lang_impl/lang/lang_macro_rule.rs +++ b/mudu_gen/src/lang_impl/lang/lang_macro_rule.rs @@ -1,5 +1,5 @@ #[macro_export] -macro_rules! impl_primitive { +macro_rules! impl_scalar { ( $lang:ident, $(( @@ -9,10 +9,10 @@ macro_rules! impl_primitive { $(,)? ) => { paste!{ - pub fn [](primitive_type:&UniPrimitive) -> String { - match primitive_type { + pub fn [](scalar_type:&UniScalar) -> String { + match scalar_type { $( - UniPrimitive::$wit_ty => { + UniScalar::$wit_ty => { $lang_ty_name.to_string() } )+ @@ -24,21 +24,21 @@ macro_rules! impl_primitive { } #[macro_export] -macro_rules! impl_non_primitive { +macro_rules! impl_non_scalar { ( $lang:ident, $(( - $non_prim_wit_ty:ident, - $fn_non_prim_handle:expr + $non_scalar_wit_ty:ident, + $fn_non_scalar_handle:expr )),+ $(,)? ) => { paste!{ - pub fn [](non_prim_type:&NonPrimitiveType) -> String { - match non_prim_type { + pub fn [](non_scalar_type:&NonScalarType) -> String { + match non_scalar_type { $( - NonPrimitiveType::$non_prim_wit_ty(inner) => { - $fn_non_prim_handle(inner) + NonScalarType::$non_scalar_wit_ty(inner) => { + $fn_non_scalar_handle(inner) } )+ } @@ -58,21 +58,21 @@ macro_rules! impl_lang { ) => { paste!{ - pub fn lang_primitive_name(lang:&LangKind, primitive_type:&UniPrimitive) -> String { + pub fn lang_scalar_name(lang:&LangKind, scalar_type:&UniScalar) -> String { match lang { $( LangKind::$lang_upper => { - [<$lang_lower>]::lang_def::[](primitive_type) + [<$lang_lower>]::lang_def::[](scalar_type) } )+ } } - pub fn lang_non_primitive_name(lang:&LangKind, non_primitive_type:&NonPrimitiveType) -> String { + pub fn lang_non_scalar_name(lang:&LangKind, non_scalar_type:&NonScalarType) -> String { match lang { $( LangKind::$lang_upper => { - [<$lang_lower>]::lang_def::[](non_primitive_type) + [<$lang_lower>]::lang_def::[](non_scalar_type) } )+ } diff --git a/mudu_gen/src/lang_impl/lang/mod.rs b/mudu_gen/src/lang_impl/lang/mod.rs index 0aebaa6..f848c48 100644 --- a/mudu_gen/src/lang_impl/lang/mod.rs +++ b/mudu_gen/src/lang_impl/lang/mod.rs @@ -4,7 +4,7 @@ pub mod lang_data_type; pub mod lang_handle_tuple; pub mod lang_kind; pub mod lang_macro_rule; -pub mod non_primitive; +pub mod non_scalar; mod record_fields; pub(crate) mod record_info; pub(crate) mod render; diff --git a/mudu_gen/src/lang_impl/lang/non_primitive.rs b/mudu_gen/src/lang_impl/lang/non_scalar.rs similarity index 74% rename from mudu_gen/src/lang_impl/lang/non_primitive.rs rename to mudu_gen/src/lang_impl/lang/non_scalar.rs index 1b057dc..4be2c12 100644 --- a/mudu_gen/src/lang_impl/lang/non_primitive.rs +++ b/mudu_gen/src/lang_impl/lang/non_scalar.rs @@ -1,4 +1,4 @@ -pub enum NonPrimitiveType { +pub enum NonScalarType { Array(String), Option(String), Box(String), diff --git a/mudu_gen/src/lang_impl/lang/variant_info.rs b/mudu_gen/src/lang_impl/lang/variant_info.rs index 51b065a..c042e81 100644 --- a/mudu_gen/src/lang_impl/lang/variant_info.rs +++ b/mudu_gen/src/lang_impl/lang/variant_info.rs @@ -6,7 +6,7 @@ use mudu::common::result::RS; use mudu::utils::case_convert::{to_pascal_case, to_snake_case}; use mudu_binding::universal::uni_dat_type::UniDatType; use mudu_binding::universal::uni_def::UniVariantDef; -use mudu_binding::universal::uni_primitive::UniPrimitive; +use mudu_binding::universal::uni_scalar::UniScalar; #[derive(Debug, Clone)] pub struct VariantInfo { @@ -36,12 +36,12 @@ impl VariantInfo { let case_ty = v .vc_case_type .clone() - .unwrap_or(UniDatType::Primitive(UniPrimitive::U8)); + .unwrap_or(UniDatType::Scalar(UniScalar::U8)); let (vc_has_inner_type, vc_inner_type_name) = match &v.vc_case_type { Some(ty) => (true, uni_data_type_to_name(&ty, &lang)?), None => ( false, - uni_data_type_to_name(&UniDatType::Primitive(UniPrimitive::U8), &lang)?, + uni_data_type_to_name(&UniDatType::Scalar(UniScalar::U8), &lang)?, ), }; let (vc_inner_required, vc_inner_default_value, vc_inner_deserialize_suffix) = diff --git a/mudu_gen/src/lang_impl/mod.rs b/mudu_gen/src/lang_impl/mod.rs index fdeeb0c..0b79bca 100644 --- a/mudu_gen/src/lang_impl/mod.rs +++ b/mudu_gen/src/lang_impl/mod.rs @@ -1,7 +1,7 @@ use crate::impl_lang; use crate::lang_impl::lang::lang_kind::LangKind; -use crate::lang_impl::lang::non_primitive::NonPrimitiveType; -use mudu_binding::universal::uni_primitive::UniPrimitive; +use crate::lang_impl::lang::non_scalar::NonScalarType; +use mudu_binding::universal::uni_scalar::UniScalar; use paste::paste; pub mod csharp; diff --git a/mudu_gen/src/lang_impl/rust/lang_def.rs b/mudu_gen/src/lang_impl/rust/lang_def.rs index 0141232..910469b 100644 --- a/mudu_gen/src/lang_impl/rust/lang_def.rs +++ b/mudu_gen/src/lang_impl/rust/lang_def.rs @@ -1,13 +1,13 @@ use crate::lang_impl::lang::lang_handle_tuple::lang_handle_tuple; -use crate::lang_impl::lang::non_primitive::NonPrimitiveType; +use crate::lang_impl::lang::non_scalar::NonScalarType; use crate::lang_impl::lang::render::Render; use crate::lang_impl::rust::render_rs::create_render; -use crate::{impl_non_primitive, impl_primitive}; -use mudu_binding::universal::uni_primitive::UniPrimitive; +use crate::{impl_non_scalar, impl_scalar}; +use mudu_binding::universal::uni_scalar::UniScalar; use paste::paste; use std::sync::Arc; -impl_primitive! { +impl_scalar! { rust, (Bool, "bool"), (U8, "u8"), @@ -25,9 +25,14 @@ impl_primitive! { (Char, "char"), (String, "String"), (Blob, "Vec"), + (Numeric, "String"), + (Date, "String"), + (Time, "String"), + (Timestamp, "String"), + (TimestampTz, "String"), } -impl_non_primitive! { +impl_non_scalar! { rust, (Array, fn_handle_array), (Option, fn_handle_option), diff --git a/mudu_gen/src/src_gen/wit_parser.rs b/mudu_gen/src/src_gen/wit_parser.rs index 94ffd4e..f031b40 100644 --- a/mudu_gen/src/src_gen/wit_parser.rs +++ b/mudu_gen/src/src_gen/wit_parser.rs @@ -7,8 +7,8 @@ use mudu_binding::universal::uni_dat_type::UniDatType; use mudu_binding::universal::uni_def::{ EnumCase, RecordField, UniEnumDef, UniRecordDef, UniTableDef, UniVariantDef, VariantCase, }; -use mudu_binding::universal::uni_primitive::UniPrimitive; use mudu_binding::universal::uni_result_type::UniResultType; +use mudu_binding::universal::uni_scalar::UniScalar; use std::collections::HashSet; use tree_sitter::{Language, Node, Parser, Point, Tree}; use tree_sitter_wit; @@ -593,7 +593,7 @@ impl WitParser { fn parse_custom_type(&self, context: &ParseContext, node: &Node) -> RS { let type_name = context.text_of_node(&node)?; if type_name == "blob" { - return Ok(UniDatType::Primitive(UniPrimitive::Blob)); + return Ok(UniDatType::Scalar(UniScalar::Blob)); } Ok(UniDatType::Identifier(type_name)) } @@ -605,19 +605,19 @@ impl WitParser { fn parse_type_node(&self, context: &ParseContext, node: &Node) -> RS { let ty = match node.kind() { - ts_const::ts_kind_name::S_BOOL => UniDatType::Primitive(UniPrimitive::Bool), - ts_const::ts_kind_name::S_U8 => UniDatType::Primitive(UniPrimitive::U8), - ts_const::ts_kind_name::S_U16 => UniDatType::Primitive(UniPrimitive::U16), - ts_const::ts_kind_name::S_U32 => UniDatType::Primitive(UniPrimitive::U32), - ts_const::ts_kind_name::S_U64 => UniDatType::Primitive(UniPrimitive::U64), - ts_const::ts_kind_name::S_S8 => UniDatType::Primitive(UniPrimitive::U8), - ts_const::ts_kind_name::S_S16 => UniDatType::Primitive(UniPrimitive::I16), - ts_const::ts_kind_name::S_S32 => UniDatType::Primitive(UniPrimitive::I32), - ts_const::ts_kind_name::S_S64 => UniDatType::Primitive(UniPrimitive::I64), - ts_const::ts_kind_name::S_F32 => UniDatType::Primitive(UniPrimitive::F32), - ts_const::ts_kind_name::S_F64 => UniDatType::Primitive(UniPrimitive::F64), - ts_const::ts_kind_name::S_CHAR => UniDatType::Primitive(UniPrimitive::Char), - ts_const::ts_kind_name::S_STRING => UniDatType::Primitive(UniPrimitive::String), + ts_const::ts_kind_name::S_BOOL => UniDatType::Scalar(UniScalar::Bool), + ts_const::ts_kind_name::S_U8 => UniDatType::Scalar(UniScalar::U8), + ts_const::ts_kind_name::S_U16 => UniDatType::Scalar(UniScalar::U16), + ts_const::ts_kind_name::S_U32 => UniDatType::Scalar(UniScalar::U32), + ts_const::ts_kind_name::S_U64 => UniDatType::Scalar(UniScalar::U64), + ts_const::ts_kind_name::S_S8 => UniDatType::Scalar(UniScalar::U8), + ts_const::ts_kind_name::S_S16 => UniDatType::Scalar(UniScalar::I16), + ts_const::ts_kind_name::S_S32 => UniDatType::Scalar(UniScalar::I32), + ts_const::ts_kind_name::S_S64 => UniDatType::Scalar(UniScalar::I64), + ts_const::ts_kind_name::S_F32 => UniDatType::Scalar(UniScalar::F32), + ts_const::ts_kind_name::S_F64 => UniDatType::Scalar(UniScalar::F64), + ts_const::ts_kind_name::S_CHAR => UniDatType::Scalar(UniScalar::Char), + ts_const::ts_kind_name::S_STRING => UniDatType::Scalar(UniScalar::String), ts_const::ts_kind_name::S_TUPLE => self.parse_tuple_type(context, node)?, ts_const::ts_kind_name::S_LIST => self.parse_list_type(context, node)?, ts_const::ts_kind_name::S_OPTION => self.parse_option_type(context, node)?, diff --git a/mudu_kernel/Cargo.toml b/mudu_kernel/Cargo.toml index 136e1c3..3b764ca 100644 --- a/mudu_kernel/Cargo.toml +++ b/mudu_kernel/Cargo.toml @@ -20,7 +20,6 @@ short-uuid = "0.2.0" serde = { workspace = true } rmp-serde = { workspace = true } -tokio = { workspace = true } lazy_static = { workspace = true } @@ -48,3 +47,5 @@ crossbeam-queue = "0.3.11" byteorder = "1.5.0" +[dev-dependencies] +tokio = { workspace = true } diff --git a/mudu_kernel/src/async_rt/contract.rs b/mudu_kernel/src/async_rt/contract.rs new file mode 100644 index 0000000..cf3bfba --- /dev/null +++ b/mudu_kernel/src/async_rt/contract.rs @@ -0,0 +1,99 @@ +use crate::async_rt::mode::AsyncMode; +use async_trait::async_trait; +use mudu::common::result::RS; +use std::path::Path; +use std::sync::Arc; + +pub trait AsyncRuntime: Send + Sync { + fn mode(&self) -> AsyncMode; + fn net(&self) -> &dyn AsyncNet; + fn fs(&self) -> &dyn AsyncFs; + fn fs_arc(&self) -> Arc; +} + +#[async_trait] +pub trait AsyncNet: Send + Sync { + async fn bind_tcp(&self, _addr: std::net::SocketAddr) -> RS> { + Err(mudu::m_error!( + mudu::error::ec::EC::NotImplemented, + "async net bind_tcp is not implemented" + )) + } + + async fn connect_tcp(&self, _addr: std::net::SocketAddr) -> RS> { + Err(mudu::m_error!( + mudu::error::ec::EC::NotImplemented, + "async net connect_tcp is not implemented" + )) + } +} + +#[async_trait] +pub trait AsyncListener: Send + Sync { + fn local_addr(&self) -> RS; + async fn accept(&self) -> RS<(Box, std::net::SocketAddr)>; +} + +#[async_trait] +pub trait AsyncStream: Send + Sync + Unpin { + async fn read(&mut self, buf: &mut [u8]) -> RS; + async fn write_all(&mut self, buf: &[u8]) -> RS<()>; + async fn shutdown(&mut self) -> RS<()>; +} + +#[derive(Debug, Clone, Copy, Default)] +pub struct FileOpenOptions { + pub read: bool, + pub write: bool, + pub create: bool, + pub truncate: bool, + pub append: bool, + pub create_new: bool, +} + +impl FileOpenOptions { + pub const fn read_only() -> Self { + Self { + read: true, + write: false, + create: false, + truncate: false, + append: false, + create_new: false, + } + } + + pub const fn read_write_create() -> Self { + Self { + read: true, + write: true, + create: true, + truncate: false, + append: false, + create_new: false, + } + } +} + +#[async_trait] +pub trait AsyncFs: Send + Sync { + async fn open(&self, path: &Path, options: FileOpenOptions) -> RS>; + async fn create_dir_all(&self, path: &Path) -> RS<()>; + async fn metadata_len(&self, path: &Path) -> RS; + async fn path_exists(&self, path: &Path) -> RS; + async fn remove_file_if_exists(&self, path: &Path) -> RS<()>; + + async fn read_all(&self, path: &Path) -> RS> { + let file = self.open(path, FileOpenOptions::read_only()).await?; + let len = file.file_len().await?; + file.read_exact_at(0, len as usize).await + } +} + +#[async_trait] +pub trait AsyncFile: Send + Sync { + async fn read_exact_at(&self, offset: u64, len: usize) -> RS>; + async fn write_all_at(&self, offset: u64, payload: &[u8]) -> RS<()>; + async fn fsync(&self) -> RS<()>; + async fn file_len(&self) -> RS; +} diff --git a/mudu_kernel/src/async_rt/linux/fs.rs b/mudu_kernel/src/async_rt/linux/fs.rs new file mode 100644 index 0000000..2d321c0 --- /dev/null +++ b/mudu_kernel/src/async_rt/linux/fs.rs @@ -0,0 +1,134 @@ +use crate::async_rt::contract::{AsyncFile, AsyncFs, FileOpenOptions}; +use crate::io::file::{self, IoFile}; +use crate::io::path; +use async_trait::async_trait; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use mudu_utils::scoped_task_trace; +use mudu_utils::sync::a_mutex::AMutex; +use std::mem::ManuallyDrop; +use std::os::fd::RawFd; +use std::os::unix::io::FromRawFd; +use std::path::Path; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tracing::trace; + +#[derive(Default)] +pub struct IoUringFs; + +impl IoUringFs { + pub const fn new() -> Self { + Self + } +} + +pub struct IoUringFile { + fd: RawFd, + closed: AtomicBool, + inner: AMutex, +} + +impl IoUringFile { + fn new(file: IoFile) -> Self { + Self { + fd: file.fd(), + closed: AtomicBool::new(false), + inner: AMutex::new(file), + } + } +} + +impl Drop for IoUringFile { + fn drop(&mut self) { + if self.closed.swap(true, Ordering::Relaxed) { + return; + } + let _ = file::close_sync(IoFile::from_raw_fd(self.fd)); + } +} + +#[async_trait] +impl AsyncFs for IoUringFs { + async fn open(&self, path: &Path, options: FileOpenOptions) -> RS> { + scoped_task_trace!(); + trace!(path = %path.display(), create = options.create, truncate = options.truncate, append = options.append, "iouring_fs open start"); + let mut flags = 0; + if options.read && options.write { + flags |= libc::O_RDWR; + } else if options.write { + flags |= libc::O_WRONLY; + } else { + flags |= libc::O_RDONLY; + } + if options.create { + flags |= libc::O_CREAT; + } + if options.truncate { + flags |= libc::O_TRUNC; + } + if options.append { + flags |= libc::O_APPEND; + } + if options.create_new { + flags |= libc::O_EXCL | libc::O_CREAT; + } + let file = file::open(path, flags, 0o644).await?; + Ok(Arc::new(IoUringFile::new(file))) + } + + async fn create_dir_all(&self, path: &Path) -> RS<()> { + path::create_dir_all(path).await + } + + async fn metadata_len(&self, path: &Path) -> RS { + path::metadata_len(path).await + } + + async fn path_exists(&self, path: &Path) -> RS { + path::path_exists(path).await + } + + async fn remove_file_if_exists(&self, path: &Path) -> RS<()> { + path::remove_file_if_exists(path).await + } +} + +#[async_trait] +impl AsyncFile for IoUringFile { + async fn read_exact_at(&self, offset: u64, len: usize) -> RS> { + let file = self.inner.lock().await; + file::read(&file, len, offset).await + } + + async fn write_all_at(&self, offset: u64, payload: &[u8]) -> RS<()> { + let file = self.inner.lock().await; + let written = file::write(&file, payload.to_vec(), offset).await?; + if written != payload.len() { + return Err(m_error!( + EC::IOErr, + format!( + "io_uring file write incomplete: wrote {}, expected {}", + written, + payload.len() + ) + )); + } + Ok(()) + } + + async fn fsync(&self) -> RS<()> { + let file = self.inner.lock().await; + file::flush(&file).await + } + + async fn file_len(&self) -> RS { + let file = self.inner.lock().await; + let std_file = unsafe { ManuallyDrop::new(std::fs::File::from_raw_fd(file.fd())) }; + std_file + .metadata() + .map(|metadata| metadata.len()) + .map_err(|e| m_error!(EC::IOErr, "read io_uring file metadata error", e)) + } +} diff --git a/mudu_kernel/src/async_rt/linux/mod.rs b/mudu_kernel/src/async_rt/linux/mod.rs new file mode 100644 index 0000000..3b8a417 --- /dev/null +++ b/mudu_kernel/src/async_rt/linux/mod.rs @@ -0,0 +1,3 @@ +pub mod fs; +pub mod net; +pub mod runtime; diff --git a/mudu_kernel/src/async_rt/linux/net.rs b/mudu_kernel/src/async_rt/linux/net.rs new file mode 100644 index 0000000..92bd415 --- /dev/null +++ b/mudu_kernel/src/async_rt/linux/net.rs @@ -0,0 +1,142 @@ +use crate::async_rt::contract::{AsyncListener, AsyncNet, AsyncStream}; +use crate::io::socket::{self, IoSocket}; +use async_trait::async_trait; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use std::io::{Read, Write}; +use std::net::{SocketAddr, TcpListener, TcpStream}; +use std::os::fd::IntoRawFd; +use std::sync::Arc; + +#[derive(Default)] +pub struct IoUringNet; + +impl IoUringNet { + pub fn new() -> Self { + Self + } +} + +#[async_trait] +impl AsyncNet for IoUringNet { + async fn bind_tcp(&self, addr: SocketAddr) -> RS> { + let listener = TcpListener::bind(addr) + .map_err(|e| m_error!(EC::NetErr, format!("bind tcp listener error: {addr}"), e))?; + Ok(Arc::new(IoUringListener { inner: listener })) + } + + async fn connect_tcp(&self, addr: SocketAddr) -> RS> { + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + let sock = + socket::socket(libc::AF_INET, libc::SOCK_STREAM | libc::SOCK_CLOEXEC, 0).await?; + socket::connect(&sock, addr).await?; + set_nodelay_fd(sock.fd())?; + return Ok(Box::new(IoUringStream::Ring(sock))); + } + + let stream = TcpStream::connect(addr) + .map_err(|e| m_error!(EC::NetErr, format!("connect tcp stream error: {addr}"), e))?; + stream + .set_nodelay(true) + .map_err(|e| m_error!(EC::NetErr, format!("set tcp nodelay error: {addr}"), e))?; + Ok(Box::new(IoUringStream::Std(stream))) + } +} + +struct IoUringListener { + inner: TcpListener, +} + +#[async_trait] +impl AsyncListener for IoUringListener { + fn local_addr(&self) -> RS { + self.inner + .local_addr() + .map_err(|e| m_error!(EC::NetErr, "read tcp listener local addr error", e)) + } + + async fn accept(&self) -> RS<(Box, SocketAddr)> { + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + let listener = self.inner.try_clone().map_err(|e| { + m_error!( + EC::NetErr, + "clone tcp listener for io_uring accept error", + e + ) + })?; + let fd = listener.into_raw_fd(); + let (sock, addr) = socket::accept(&IoSocket::from_raw_fd(fd)).await?; + let _ = mudu_sys::sync_sync::close_fd(fd); + set_nodelay_fd(sock.fd())?; + return Ok((Box::new(IoUringStream::Ring(sock)), addr)); + } + + let (stream, addr) = self + .inner + .accept() + .map_err(|e| m_error!(EC::NetErr, "accept tcp stream error", e))?; + stream + .set_nodelay(true) + .map_err(|e| m_error!(EC::NetErr, "set accepted tcp nodelay error", e))?; + Ok((Box::new(IoUringStream::Std(stream)), addr)) + } +} + +enum IoUringStream { + Ring(IoSocket), + Std(TcpStream), +} + +#[async_trait] +impl AsyncStream for IoUringStream { + async fn read(&mut self, buf: &mut [u8]) -> RS { + match self { + IoUringStream::Ring(sock) => socket::recv_into(sock, buf, 0).await, + IoUringStream::Std(stream) => stream + .read(buf) + .map_err(|e| m_error!(EC::NetErr, "read tcp stream error", e)), + } + } + + async fn write_all(&mut self, buf: &[u8]) -> RS<()> { + match self { + IoUringStream::Ring(sock) => socket::send_all(sock, buf).await, + IoUringStream::Std(stream) => stream + .write_all(buf) + .map_err(|e| m_error!(EC::NetErr, "write tcp stream error", e)), + } + } + + async fn shutdown(&mut self) -> RS<()> { + match self { + IoUringStream::Ring(sock) => socket::shutdown(sock, libc::SHUT_RDWR).await, + IoUringStream::Std(stream) => stream + .shutdown(std::net::Shutdown::Both) + .map_err(|e| m_error!(EC::NetErr, "shutdown tcp stream error", e)), + } + } +} + +fn set_nodelay_fd(fd: std::os::fd::RawFd) -> RS<()> { + let flag: libc::c_int = 1; + let rc = unsafe { + libc::setsockopt( + fd, + libc::IPPROTO_TCP, + libc::TCP_NODELAY, + &flag as *const _ as *const libc::c_void, + std::mem::size_of_val(&flag) as libc::socklen_t, + ) + }; + if rc != 0 { + return Err(m_error!( + EC::NetErr, + "set tcp nodelay on raw fd error", + std::io::Error::last_os_error() + )); + } + Ok(()) +} diff --git a/mudu_kernel/src/async_rt/linux/runtime.rs b/mudu_kernel/src/async_rt/linux/runtime.rs new file mode 100644 index 0000000..60a868f --- /dev/null +++ b/mudu_kernel/src/async_rt/linux/runtime.rs @@ -0,0 +1,43 @@ +use crate::async_rt::contract::{AsyncFs, AsyncNet, AsyncRuntime}; +use crate::async_rt::linux::fs::IoUringFs; +use crate::async_rt::linux::net::IoUringNet; +use crate::async_rt::mode::AsyncMode; +use std::sync::Arc; + +pub struct IoUringRuntime { + net: Arc, + fs: Arc, +} + +impl IoUringRuntime { + pub fn new() -> Self { + Self { + net: Arc::new(IoUringNet::new()), + fs: Arc::new(IoUringFs::new()), + } + } +} + +impl Default for IoUringRuntime { + fn default() -> Self { + Self::new() + } +} + +impl AsyncRuntime for IoUringRuntime { + fn mode(&self) -> AsyncMode { + AsyncMode::IoUring + } + + fn net(&self) -> &dyn AsyncNet { + self.net.as_ref() + } + + fn fs(&self) -> &dyn AsyncFs { + self.fs.as_ref() + } + + fn fs_arc(&self) -> Arc { + self.fs.clone() + } +} diff --git a/mudu_kernel/src/async_rt/mod.rs b/mudu_kernel/src/async_rt/mod.rs new file mode 100644 index 0000000..92229d2 --- /dev/null +++ b/mudu_kernel/src/async_rt/mod.rs @@ -0,0 +1,5 @@ +pub mod contract; +#[cfg(target_os = "linux")] +pub mod linux; +pub mod mode; +pub mod tokio; diff --git a/mudu_kernel/src/async_rt/mode.rs b/mudu_kernel/src/async_rt/mode.rs new file mode 100644 index 0000000..ad2e5be --- /dev/null +++ b/mudu_kernel/src/async_rt/mode.rs @@ -0,0 +1,5 @@ +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AsyncMode { + Tokio, + IoUring, +} diff --git a/mudu_kernel/src/async_rt/tokio/fs.rs b/mudu_kernel/src/async_rt/tokio/fs.rs new file mode 100644 index 0000000..c67ca2e --- /dev/null +++ b/mudu_kernel/src/async_rt/tokio/fs.rs @@ -0,0 +1,156 @@ +use crate::async_rt::contract::{AsyncFile, AsyncFs, FileOpenOptions}; +use async_trait::async_trait; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use mudu_sys::tokio::fs::{self, File, OpenOptions}; +use mudu_sys::tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt, SeekFrom}; +use mudu_utils::sync::a_mutex::AMutex; +use std::io::ErrorKind; +use std::path::Path; +use std::sync::Arc; + +#[derive(Default)] +pub struct TokioFs; + +impl TokioFs { + pub const fn new() -> Self { + Self + } +} + +pub struct TokioFile { + inner: AMutex, +} + +impl TokioFile { + pub fn new(file: File) -> Self { + Self { + inner: AMutex::new(file), + } + } +} + +#[async_trait] +impl AsyncFs for TokioFs { + async fn open(&self, path: &Path, options: FileOpenOptions) -> RS> { + let mut open = OpenOptions::new(); + open.read(options.read); + open.write(options.write || options.append); + open.create(options.create); + open.truncate(options.truncate); + open.append(options.append); + open.create_new(options.create_new); + let file = open + .open(path) + .await + .map_err(|e| m_error!(EC::IOErr, "open tokio file error", e))?; + Ok(Arc::new(TokioFile::new(file))) + } + + async fn create_dir_all(&self, path: &Path) -> RS<()> { + fs::create_dir_all(path) + .await + .map_err(|e| m_error!(EC::IOErr, "create tokio directory error", e)) + } + + async fn metadata_len(&self, path: &Path) -> RS { + fs::metadata(path) + .await + .map(|metadata| metadata.len()) + .map_err(|e| m_error!(EC::IOErr, "read tokio metadata error", e)) + } + + async fn path_exists(&self, path: &Path) -> RS { + fs::try_exists(path) + .await + .map_err(|e| m_error!(EC::IOErr, "check tokio path exists error", e)) + } + + async fn remove_file_if_exists(&self, path: &Path) -> RS<()> { + match fs::remove_file(path).await { + Ok(()) => Ok(()), + Err(err) if err.kind() == ErrorKind::NotFound => Ok(()), + Err(err) => Err(m_error!(EC::IOErr, "remove tokio file error", err)), + } + } +} + +#[async_trait] +impl AsyncFile for TokioFile { + async fn read_exact_at(&self, offset: u64, len: usize) -> RS> { + let mut file = self.inner.lock().await; + file.seek(SeekFrom::Start(offset)) + .await + .map_err(|e| m_error!(EC::IOErr, "seek tokio file for read error", e))?; + let mut buf = vec![0u8; len]; + file.read_exact(&mut buf) + .await + .map_err(|e| m_error!(EC::IOErr, "read tokio file error", e))?; + Ok(buf) + } + + async fn write_all_at(&self, offset: u64, payload: &[u8]) -> RS<()> { + let mut file = self.inner.lock().await; + file.seek(SeekFrom::Start(offset)) + .await + .map_err(|e| m_error!(EC::IOErr, "seek tokio file for write error", e))?; + file.write_all(payload) + .await + .map_err(|e| m_error!(EC::IOErr, "write tokio file error", e)) + } + + async fn fsync(&self) -> RS<()> { + let file = self.inner.lock().await; + file.sync_all() + .await + .map_err(|e| m_error!(EC::IOErr, "fsync tokio file error", e)) + } + + async fn file_len(&self) -> RS { + let file = self.inner.lock().await; + file.metadata() + .await + .map(|metadata| metadata.len()) + .map_err(|e| m_error!(EC::IOErr, "read tokio file metadata error", e)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use project_root::get_project_root; + use std::path::PathBuf; + + fn temp_path(name: &str) -> PathBuf { + get_project_root() + .unwrap() + .join("target") + .join("tmp") + .join(format!("tokio-fs-{name}-{}", mudu_sys::random::uuid_v4())) + } + + #[tokio::test(flavor = "current_thread")] + async fn tokio_fs_simulates_positioned_io() { + let fs = TokioFs::new(); + let path = temp_path("positioned.dat"); + if let Some(parent) = path.parent() { + fs.create_dir_all(parent).await.unwrap(); + } + + let file = fs + .open(&path, FileOpenOptions::read_write_create()) + .await + .unwrap(); + file.write_all_at(4, b"bc").await.unwrap(); + file.write_all_at(0, b"a").await.unwrap(); + file.write_all_at(8, b"z").await.unwrap(); + file.fsync().await.unwrap(); + + assert_eq!(file.read_exact_at(0, 1).await.unwrap(), b"a".to_vec()); + assert_eq!(file.read_exact_at(4, 2).await.unwrap(), b"bc".to_vec()); + assert_eq!(file.read_exact_at(8, 1).await.unwrap(), b"z".to_vec()); + + fs.remove_file_if_exists(&path).await.unwrap(); + } +} diff --git a/mudu_kernel/src/async_rt/tokio/mod.rs b/mudu_kernel/src/async_rt/tokio/mod.rs new file mode 100644 index 0000000..3b8a417 --- /dev/null +++ b/mudu_kernel/src/async_rt/tokio/mod.rs @@ -0,0 +1,3 @@ +pub mod fs; +pub mod net; +pub mod runtime; diff --git a/mudu_kernel/src/async_rt/tokio/net.rs b/mudu_kernel/src/async_rt/tokio/net.rs new file mode 100644 index 0000000..7cddc29 --- /dev/null +++ b/mudu_kernel/src/async_rt/tokio/net.rs @@ -0,0 +1,150 @@ +use crate::async_rt::contract::{AsyncListener, AsyncNet, AsyncStream}; +use async_trait::async_trait; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use mudu_sys::tokio::io::{AsyncReadExt, AsyncWriteExt}; +use mudu_sys::tokio::net::{TcpListener, TcpStream}; +use std::net::SocketAddr; +use std::sync::Arc; + +#[derive(Default)] +pub struct TokioNet; + +impl TokioNet { + pub fn new() -> Self { + Self + } +} + +#[async_trait] +impl AsyncNet for TokioNet { + async fn bind_tcp(&self, addr: SocketAddr) -> RS> { + let listener = TcpListener::bind(addr).await.map_err(|e| { + m_error!( + EC::NetErr, + format!("bind tokio tcp listener error: {addr}"), + e + ) + })?; + Ok(Arc::new(TokioListener { inner: listener })) + } + + async fn connect_tcp(&self, addr: SocketAddr) -> RS> { + let stream = TcpStream::connect(addr).await.map_err(|e| { + m_error!( + EC::NetErr, + format!("connect tokio tcp stream error: {addr}"), + e + ) + })?; + stream + .set_nodelay(true) + .map_err(|e| m_error!(EC::NetErr, format!("set tcp nodelay error: {addr}"), e))?; + Ok(Box::new(TokioStream { inner: stream })) + } +} + +struct TokioListener { + inner: TcpListener, +} + +#[async_trait] +impl AsyncListener for TokioListener { + fn local_addr(&self) -> RS { + self.inner + .local_addr() + .map_err(|e| m_error!(EC::NetErr, "read tokio listener local addr error", e)) + } + + async fn accept(&self) -> RS<(Box, SocketAddr)> { + let (stream, addr) = self + .inner + .accept() + .await + .map_err(|e| m_error!(EC::NetErr, "accept tokio tcp stream error", e))?; + stream + .set_nodelay(true) + .map_err(|e| m_error!(EC::NetErr, "set accepted tcp nodelay error", e))?; + Ok((Box::new(TokioStream { inner: stream }), addr)) + } +} + +struct TokioStream { + inner: TcpStream, +} + +#[async_trait] +impl AsyncStream for TokioStream { + async fn read(&mut self, buf: &mut [u8]) -> RS { + self.inner + .read(buf) + .await + .map_err(|e| m_error!(EC::NetErr, "read tokio tcp stream error", e)) + } + + async fn write_all(&mut self, buf: &[u8]) -> RS<()> { + self.inner + .write_all(buf) + .await + .map_err(|e| m_error!(EC::NetErr, "write tokio tcp stream error", e)) + } + + async fn shutdown(&mut self) -> RS<()> { + self.inner + .shutdown() + .await + .map_err(|e| m_error!(EC::NetErr, "shutdown tokio tcp stream error", e)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + async fn read_exact(stream: &mut dyn AsyncStream, len: usize) -> RS> { + let mut buf = vec![0u8; len]; + let mut done = 0usize; + while done < len { + let n = stream.read(&mut buf[done..]).await?; + if n == 0 { + return Err(m_error!( + EC::NetErr, + "unexpected eof while reading exact bytes" + )); + } + done += n; + } + Ok(buf) + } + + #[tokio::test] + async fn tokio_net_connects_and_transfers_bytes() { + let net = TokioNet::new(); + let std_listener = match std::net::TcpListener::bind("127.0.0.1:0") { + Ok(listener) => listener, + Err(err) if err.kind() == std::io::ErrorKind::PermissionDenied => return, + Err(err) => panic!("bind tcp listener failed: {err}"), + }; + std_listener.set_nonblocking(true).unwrap(); + let addr = std_listener.local_addr().unwrap(); + let listener = TokioListener { + inner: TcpListener::from_std(std_listener).unwrap(), + }; + + let accept_task = mudu_sys::tokio::spawn(async move { + let (mut stream, _) = AsyncListener::accept(&listener).await.unwrap(); + let payload = read_exact(stream.as_mut(), 4).await.unwrap(); + assert_eq!(payload, b"ping"); + stream.write_all(b"pong").await.unwrap(); + stream.shutdown().await.unwrap(); + }); + + let mut client = net.connect_tcp(addr).await.unwrap(); + client.write_all(b"ping").await.unwrap(); + let response = read_exact(client.as_mut(), 4).await.unwrap(); + assert_eq!(response, b"pong"); + client.shutdown().await.unwrap(); + accept_task.await.unwrap(); + } +} diff --git a/mudu_kernel/src/async_rt/tokio/runtime.rs b/mudu_kernel/src/async_rt/tokio/runtime.rs new file mode 100644 index 0000000..e9ef877 --- /dev/null +++ b/mudu_kernel/src/async_rt/tokio/runtime.rs @@ -0,0 +1,43 @@ +use crate::async_rt::contract::{AsyncFs, AsyncNet, AsyncRuntime}; +use crate::async_rt::mode::AsyncMode; +use crate::async_rt::tokio::fs::TokioFs; +use crate::async_rt::tokio::net::TokioNet; +use std::sync::Arc; + +pub struct TokioRuntime { + net: Arc, + fs: Arc, +} + +impl TokioRuntime { + pub fn new() -> Self { + Self { + net: Arc::new(TokioNet::new()), + fs: Arc::new(TokioFs::new()), + } + } +} + +impl Default for TokioRuntime { + fn default() -> Self { + Self::new() + } +} + +impl AsyncRuntime for TokioRuntime { + fn mode(&self) -> AsyncMode { + AsyncMode::Tokio + } + + fn net(&self) -> &dyn AsyncNet { + self.net.as_ref() + } + + fn fs(&self) -> &dyn AsyncFs { + self.fs.as_ref() + } + + fn fs_arc(&self) -> Arc { + self.fs.clone() + } +} diff --git a/mudu_kernel/src/command/create_partition_placement.rs b/mudu_kernel/src/command/create_partition_placement.rs index eb76ddb..0c8d85c 100644 --- a/mudu_kernel/src/command/create_partition_placement.rs +++ b/mudu_kernel/src/command/create_partition_placement.rs @@ -4,7 +4,6 @@ use crate::x_engine::x_param::PCreatePartitionPlacement; use async_trait::async_trait; use mudu::common::result::RS; use mudu_utils::sync::a_mutex::AMutex; -use mudu_utils::task_trace; use std::sync::Arc; pub struct CreatePartitionPlacement { @@ -31,7 +30,7 @@ impl CmdExec for CreatePartitionPlacement { } async fn run(&self) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let inner = self.inner.lock().await; inner .meta_mgr diff --git a/mudu_kernel/src/command/create_partition_rule.rs b/mudu_kernel/src/command/create_partition_rule.rs index 1a3616f..a0e9fa1 100644 --- a/mudu_kernel/src/command/create_partition_rule.rs +++ b/mudu_kernel/src/command/create_partition_rule.rs @@ -6,7 +6,6 @@ use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; use mudu_utils::sync::a_mutex::AMutex; -use mudu_utils::task_trace; use std::sync::Arc; pub struct CreatePartitionRule { @@ -34,7 +33,7 @@ impl CmdExec for CreatePartitionRule { } async fn run(&self) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let inner = self.inner.lock().await; inner.run().await } diff --git a/mudu_kernel/src/command/create_table.rs b/mudu_kernel/src/command/create_table.rs index 9c44a71..723432b 100644 --- a/mudu_kernel/src/command/create_table.rs +++ b/mudu_kernel/src/command/create_table.rs @@ -7,8 +7,8 @@ use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; use mudu_utils::sync::a_mutex::AMutex; -use mudu_utils::task_trace; use std::sync::Arc; +use tracing::trace; pub struct CreateTable { inner: AMutex<_InnerCreateTable>, @@ -35,19 +35,19 @@ impl CreateTable { #[async_trait] impl CmdExec for CreateTable { async fn prepare(&self) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let inner = self.inner.lock().await; inner.prepare().await } async fn run(&self) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let mut inner = self.inner.lock().await; inner.run().await } async fn affected_rows(&self) -> RS { - task_trace!(); + mudu_utils::scoped_task_trace!(); Ok(0) } } @@ -82,13 +82,16 @@ impl _InnerCreateTable { } async fn run(&mut self) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); + trace!(table = %self.param.schema.table_name(), "create_table command run start"); self.x_contract .create_table(self.param.tx_mgr.clone(), &self.param.schema) .await?; + trace!(table = %self.param.schema.table_name(), "create_table storage create finished"); if let Some(binding) = &self.param.partition_binding { self.meta_mgr.bind_table_partition(binding).await?; } + trace!(table = %self.param.schema.table_name(), "create_table command run done"); Ok(()) } } diff --git a/mudu_kernel/src/command/delete_key_value.rs b/mudu_kernel/src/command/delete_key_value.rs index 338ad98..36f0c7c 100644 --- a/mudu_kernel/src/command/delete_key_value.rs +++ b/mudu_kernel/src/command/delete_key_value.rs @@ -6,11 +6,12 @@ use async_trait::async_trait; use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; -use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::sync::f_mutex::FMutex; +use mudu_utils::task_trace; use std::sync::Arc; pub struct DeleteKeyValue { - inner: AMutex<_DeleteKeyValue>, + inner: FMutex<_DeleteKeyValue>, } struct _DeleteKeyValue { @@ -27,7 +28,7 @@ impl DeleteKeyValue { meta_mgr: Arc, ) -> Self { Self { - inner: AMutex::new(_DeleteKeyValue::new(param, x_contract, meta_mgr)), + inner: FMutex::new(_DeleteKeyValue::new(param, x_contract, meta_mgr)), } } } @@ -78,17 +79,29 @@ impl _DeleteKeyValue { #[async_trait] impl CmdExec for DeleteKeyValue { async fn prepare(&self) -> RS<()> { + let trace = task_trace!(); + trace.watch("cmd.kind", "delete"); + trace.watch("cmd.stage", "prepare_lock"); let inner = self.inner.lock().await; + trace.watch("cmd.stage", "prepare_inner"); inner.prepare().await } async fn run(&self) -> RS<()> { + let trace = task_trace!(); + trace.watch("cmd.kind", "delete"); + trace.watch("cmd.stage", "run_lock"); let mut inner = self.inner.lock().await; + trace.watch("cmd.stage", "run_inner"); inner.run().await } async fn affected_rows(&self) -> RS { + let trace = task_trace!(); + trace.watch("cmd.kind", "delete"); + trace.watch("cmd.stage", "affected_rows_lock"); let inner = self.inner.lock().await; + trace.watch("cmd.stage", "affected_rows_done"); Ok(inner.affected_rows()) } } diff --git a/mudu_kernel/src/command/drop_table.rs b/mudu_kernel/src/command/drop_table.rs index 0d1169e..c711908 100644 --- a/mudu_kernel/src/command/drop_table.rs +++ b/mudu_kernel/src/command/drop_table.rs @@ -4,7 +4,6 @@ use crate::x_engine::api::XContract; use crate::x_engine::x_param::PDropTable; use async_trait::async_trait; use mudu::common::result::RS; -use mudu_utils::task_trace; use std::sync::Arc; pub struct DropTable { @@ -37,7 +36,7 @@ impl CmdExec for DropTable { } async fn run(&self) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); if let Some(table_id) = self.drop_param.oid { self.x_contract .drop_table(self.drop_param.tx_mgr.clone(), table_id) diff --git a/mudu_kernel/src/command/insert_key_value.rs b/mudu_kernel/src/command/insert_key_value.rs index cee194a..d932b2b 100644 --- a/mudu_kernel/src/command/insert_key_value.rs +++ b/mudu_kernel/src/command/insert_key_value.rs @@ -6,19 +6,16 @@ use async_trait::async_trait; use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; -use mudu_utils::sync::a_mutex::AMutex; -use mudu_utils::task_trace; -use std::sync::Arc; +use std::sync::{ + atomic::{AtomicU64, Ordering}, + Arc, +}; pub struct InsertKeyValue { - inner: AMutex<_InsertKeyValue>, -} - -struct _InsertKeyValue { param: PInsertKeyValue, x_contract: Arc, meta_mgr: Arc, - affected_rows: u64, + affected_rows: AtomicU64, } impl InsertKeyValue { @@ -26,24 +23,12 @@ impl InsertKeyValue { param: PInsertKeyValue, x_contract: Arc, meta_mgr: Arc, - ) -> Self { - Self { - inner: AMutex::new(_InsertKeyValue::new(param, x_contract, meta_mgr)), - } - } -} - -impl _InsertKeyValue { - fn new( - param: PInsertKeyValue, - x_contract: Arc, - meta_mgr: Arc, ) -> Self { Self { param, x_contract, meta_mgr, - affected_rows: 0, + affected_rows: AtomicU64::new(0), } } } @@ -51,23 +36,20 @@ impl _InsertKeyValue { #[async_trait] impl CmdExec for InsertKeyValue { async fn prepare(&self) -> RS<()> { - let inner = self.inner.lock().await; - inner.prepare().await + self.prepare_inner().await } async fn run(&self) -> RS<()> { - let mut inner = self.inner.lock().await; - inner.insert().await + self.insert_inner().await } async fn affected_rows(&self) -> RS { - let inner = self.inner.lock().await; - Ok(inner.affected_rows()) + Ok(self.affected_rows.load(Ordering::Relaxed)) } } -impl _InsertKeyValue { - async fn prepare(&self) -> RS<()> { +impl InsertKeyValue { + async fn prepare_inner(&self) -> RS<()> { let _ = self.meta_mgr.get_table_by_id(self.param.table_id).await?; for (key, _value) in &self.param.rows { if key.data().is_empty() { @@ -77,8 +59,8 @@ impl _InsertKeyValue { Ok(()) } - async fn insert(&mut self) -> RS<()> { - task_trace!(); + async fn insert_inner(&self) -> RS<()> { + mudu_utils::scoped_task_trace!(); let mut affected_rows = 0; for (key, value) in &self.param.rows { self.x_contract @@ -92,11 +74,7 @@ impl _InsertKeyValue { .await?; affected_rows += 1; } - self.affected_rows = affected_rows; + self.affected_rows.store(affected_rows, Ordering::Relaxed); Ok(()) } - - fn affected_rows(&self) -> u64 { - self.affected_rows - } } diff --git a/mudu_kernel/src/command/load_from_file.rs b/mudu_kernel/src/command/load_from_file.rs index c09cf69..a520f4e 100644 --- a/mudu_kernel/src/command/load_from_file.rs +++ b/mudu_kernel/src/command/load_from_file.rs @@ -1,6 +1,6 @@ use crate::contract::cmd_exec::CmdExec; use crate::contract::meta_mgr::MetaMgr; -use crate::io::file; +use crate::io::file as async_file; use crate::x_engine::api::{OptInsert, VecDatum, XContract}; use crate::x_engine::tx_mgr::TxMgr; use async_trait::async_trait; @@ -10,13 +10,13 @@ use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; use mudu_type::dat_type_id::DatTypeID; +use mudu_utils::sync::a_mutex::AMutex; use std::io::Cursor; use std::sync::Arc; -use tokio::sync::Mutex; use tracing::debug; pub struct LoadFromFile { - inner: Arc>, + inner: Arc>, } struct _LoadFromFile { @@ -41,7 +41,7 @@ impl LoadFromFile { meta_mgr: Arc, ) -> Self { Self { - inner: Arc::new(Mutex::new(_LoadFromFile::new( + inner: Arc::new(AMutex::new(_LoadFromFile::new( csv_file, tx_mgr, table_id, @@ -100,34 +100,8 @@ impl _LoadFromFile { "copy from start loading" ); let table_desc = self.meta_mgr.get_table_by_id(self.table_id).await?; - let file = file::open(&self.csv_file, libc::O_RDONLY | file::cloexec_flag(), 0) - .await - .map_err(|e| { - m_error!( - ER::IOErr, - format!("load failed, open csv file {} error, {}", self.csv_file, e) - ) - })?; - let len = std::fs::metadata(&self.csv_file) - .map_err(|e| { - m_error!( - ER::IOErr, - format!("load failed, stat csv file {} error, {}", self.csv_file, e) - ) - })? - .len() as usize; - let payload = file::read(&file, len, 0).await.map_err(|e| { - m_error!( - ER::IOErr, - format!("load failed, read csv file {} error, {}", self.csv_file, e) - ) - })?; - file::close(file).await.map_err(|e| { - m_error!( - ER::IOErr, - format!("load failed, close csv file {} error, {}", self.csv_file, e) - ) - })?; + let csv_path = normalized_copy_path(&self.csv_file); + let payload = read_csv_payload(&csv_path).await?; let mut reader = csv::ReaderBuilder::new() .has_headers(true) @@ -259,6 +233,55 @@ impl _LoadFromFile { } } +async fn read_csv_payload(path: &str) -> RS> { + // Even on the io_uring backend, worker threads run inside a Tokio runtime. + // Routing COPY FROM through `mudu_sys::tokio::fs` here would silently bypass the + // worker-ring/io_uring file path and reintroduce the hang we fixed. + // Always use the kernel async file abstraction instead. + let file = async_file::open(path, libc::O_RDONLY | async_file::cloexec_flag(), 0) + .await + .map_err(|e| { + m_error!( + ER::IOErr, + format!("load failed, open csv file {} error, {}", path, e) + ) + })?; + // Query the length from the opened fd so COPY FROM does not depend on a + // second path-based metadata lookup after open succeeds. + let len = async_file::metadata_len_by_file(&file).map_err(|e| { + m_error!( + ER::IOErr, + format!("load failed, stat csv file {} error, {}", path, e) + ) + })? as usize; + let result = async_file::read(&file, len, 0).await.map_err(|e| { + m_error!( + ER::IOErr, + format!("load failed, read csv file {} error, {}", path, e) + ) + }); + let close_result = async_file::close(file).await; + let payload = result?; + close_result.map_err(|e| { + m_error!( + ER::IOErr, + format!("load failed, close csv file {} error, {}", path, e) + ) + })?; + Ok(payload) +} + +fn normalized_copy_path(path: &str) -> String { + let bytes = path.as_bytes(); + if bytes.len() >= 2 + && ((bytes[0] == b'\'' && bytes[bytes.len() - 1] == b'\'') + || (bytes[0] == b'"' && bytes[bytes.len() - 1] == b'"')) + { + return path[1..path.len() - 1].to_string(); + } + path.to_string() +} + #[async_trait] impl CmdExec for LoadFromFile { async fn prepare(&self) -> RS<()> { diff --git a/mudu_kernel/src/command/save_to_file.rs b/mudu_kernel/src/command/save_to_file.rs index 4826f65..ee9493f 100644 --- a/mudu_kernel/src/command/save_to_file.rs +++ b/mudu_kernel/src/command/save_to_file.rs @@ -1,7 +1,7 @@ use crate::contract::cmd_exec::CmdExec; use crate::contract::meta_mgr::MetaMgr; use crate::contract::table_desc::TableDesc; -use crate::io::file; +use crate::io::file as async_file; use crate::x_engine::api::{OptRead, Predicate, RangeData, VecSelTerm, XContract}; use crate::x_engine::tx_mgr::TxMgr; use async_trait::async_trait; @@ -167,64 +167,8 @@ impl _SaveToFile { ) ) })?; - - let file = file::open( - &self.file_path, - libc::O_CREAT | libc::O_TRUNC | libc::O_WRONLY | file::cloexec_flag(), - 0o644, - ) - .await - .map_err(|e| { - m_error!( - ER::IOErr, - format!( - "save failed, create csv file {} error, {}", - self.file_path, e - ) - ) - })?; - let mut offset = 0usize; - while offset < payload.len() { - let written = file::write(&file, payload[offset..].to_vec(), offset as u64) - .await - .map_err(|e| { - m_error!( - ER::IOErr, - format!( - "save failed, write csv file {} error, {}", - self.file_path, e - ) - ) - })?; - if written == 0 { - return Err(m_error!( - ER::IOErr, - format!( - "save failed, write csv file {} wrote zero bytes", - self.file_path - ) - )); - } - offset += written; - } - file::flush(&file).await.map_err(|e| { - m_error!( - ER::IOErr, - format!( - "save failed, flush csv file {} error, {}", - self.file_path, e - ) - ) - })?; - file::close(file).await.map_err(|e| { - m_error!( - ER::IOErr, - format!( - "save failed, close csv file {} error, {}", - self.file_path, e - ) - ) - })?; + let file_path = normalized_copy_path(&self.file_path); + write_csv_payload(&file_path, payload).await?; Ok(rows) } @@ -284,3 +228,54 @@ impl _SaveToFile { Ok(ordered) } } + +async fn write_csv_payload(path: &str, payload: Vec) -> RS<()> { + // io_uring workers also have a Tokio runtime, so checking for a current + // Tokio handle is not a valid backend switch. Keep COPY TO on the shared + // kernel async file path instead of falling back to `mudu_sys::tokio::fs`. + let file = async_file::open( + path, + libc::O_CREAT | libc::O_TRUNC | libc::O_WRONLY | async_file::cloexec_flag(), + 0o644, + ) + .await + .map_err(|e| { + m_error!( + ER::IOErr, + format!("save failed, open csv file {} error, {}", path, e) + ) + })?; + let write_result = async_file::write(&file, payload, 0).await.map_err(|e| { + m_error!( + ER::IOErr, + format!("save failed, write csv file {} error, {}", path, e) + ) + }); + let flush_result = async_file::flush(&file).await; + let close_result = async_file::close(file).await; + write_result?; + flush_result.map_err(|e| { + m_error!( + ER::IOErr, + format!("save failed, flush csv file {} error, {}", path, e) + ) + })?; + close_result.map_err(|e| { + m_error!( + ER::IOErr, + format!("save failed, close csv file {} error, {}", path, e) + ) + })?; + Ok(()) +} + +fn normalized_copy_path(path: &str) -> String { + let bytes = path.as_bytes(); + if bytes.len() >= 2 + && ((bytes[0] == b'\'' && bytes[bytes.len() - 1] == b'\'') + || (bytes[0] == b'"' && bytes[bytes.len() - 1] == b'"')) + { + return path[1..path.len() - 1].to_string(); + } + path.to_string() +} diff --git a/mudu_kernel/src/command/update_key_value.rs b/mudu_kernel/src/command/update_key_value.rs index bdb2f44..9c4c35d 100644 --- a/mudu_kernel/src/command/update_key_value.rs +++ b/mudu_kernel/src/command/update_key_value.rs @@ -6,11 +6,12 @@ use async_trait::async_trait; use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; -use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::sync::f_mutex::FMutex; +use mudu_utils::task_trace; use std::sync::Arc; pub struct UpdateKeyValue { - inner: AMutex<_UpdateKeyValue>, + inner: FMutex<_UpdateKeyValue>, } struct _UpdateKeyValue { @@ -27,7 +28,7 @@ impl UpdateKeyValue { meta_mgr: Arc, ) -> Self { Self { - inner: AMutex::new(_UpdateKeyValue::new(param, x_contract, meta_mgr)), + inner: FMutex::new(_UpdateKeyValue::new(param, x_contract, meta_mgr)), } } } @@ -82,17 +83,29 @@ impl _UpdateKeyValue { #[async_trait] impl CmdExec for UpdateKeyValue { async fn prepare(&self) -> RS<()> { + let trace = task_trace!(); + trace.watch("cmd.kind", "update"); + trace.watch("cmd.stage", "prepare_lock"); let inner = self.inner.lock().await; + trace.watch("cmd.stage", "prepare_inner"); inner.prepare().await } async fn run(&self) -> RS<()> { + let trace = task_trace!(); + trace.watch("cmd.kind", "update"); + trace.watch("cmd.stage", "run_lock"); let mut inner = self.inner.lock().await; + trace.watch("cmd.stage", "run_inner"); inner.run().await } async fn affected_rows(&self) -> RS { + let trace = task_trace!(); + trace.watch("cmd.kind", "update"); + trace.watch("cmd.stage", "affected_rows_lock"); let inner = self.inner.lock().await; + trace.watch("cmd.stage", "affected_rows_done"); Ok(inner.affected_rows()) } } diff --git a/mudu_kernel/src/contract/data_row.rs b/mudu_kernel/src/contract/data_row.rs index fc5032f..99cacfd 100644 --- a/mudu_kernel/src/contract/data_row.rs +++ b/mudu_kernel/src/contract/data_row.rs @@ -112,6 +112,7 @@ impl DataRow { } pub async fn tuple_id(&self) -> RS> { + mudu_utils::scoped_task_trace!(); self.tuple_id_sync() } diff --git a/mudu_kernel/src/executor/index_access_key.rs b/mudu_kernel/src/executor/index_access_key.rs index 2f265cd..ab90568 100644 --- a/mudu_kernel/src/executor/index_access_key.rs +++ b/mudu_kernel/src/executor/index_access_key.rs @@ -6,12 +6,12 @@ use crate::x_engine::x_param::PAccessKey; use async_trait::async_trait; use mudu::common::result::RS; use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc as TupleDesc; -use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::sync::f_mutex::FMutex; use std::sync::Arc; pub struct IndexAccessKey { tuple_desc: TupleDesc, - inner: AMutex<_IndexAccessKey>, + inner: FMutex<_IndexAccessKey>, } struct _IndexAccessKey { @@ -30,7 +30,7 @@ impl IndexAccessKey { let tuple_desc = project_tuple_desc(&table_desc, ¶m.select); Ok(Self { tuple_desc, - inner: AMutex::new(_IndexAccessKey::new(param, x_contract)), + inner: FMutex::new(_IndexAccessKey::new(param, x_contract)), }) } } diff --git a/mudu_kernel/src/executor/index_access_range.rs b/mudu_kernel/src/executor/index_access_range.rs index e6710c3..8193569 100644 --- a/mudu_kernel/src/executor/index_access_range.rs +++ b/mudu_kernel/src/executor/index_access_range.rs @@ -6,12 +6,12 @@ use crate::x_engine::x_param::PAccessRange; use async_trait::async_trait; use mudu::common::result::RS; use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc as TupleDesc; -use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::sync::f_mutex::FMutex; use std::sync::Arc; pub struct IndexAccessRange { tuple_desc: TupleDesc, - inner: AMutex<_IndexAccessRange>, + inner: FMutex<_IndexAccessRange>, } struct _IndexAccessRange { @@ -30,7 +30,7 @@ impl IndexAccessRange { let tuple_desc = project_tuple_desc(&table_desc, ¶m.select); Ok(Self { tuple_desc, - inner: AMutex::new(_IndexAccessRange::new(param, x_contract)), + inner: FMutex::new(_IndexAccessRange::new(param, x_contract)), }) } } diff --git a/mudu_kernel/src/index/hash/linear_hash.rs b/mudu_kernel/src/index/hash/linear_hash.rs deleted file mode 100644 index 619fc5e..0000000 --- a/mudu_kernel/src/index/hash/linear_hash.rs +++ /dev/null @@ -1,957 +0,0 @@ -use mudu::common::result::RS; -use mudu::error::ec::EC as ER; -use mudu::m_error; -use serde::{Deserialize, Serialize}; -use std::path::{Path, PathBuf}; -use std::sync::Arc; - -use crate::io::file::{self, IoFile}; -use crate::io::worker_ring; -use tokio::sync::{Mutex, MutexGuard}; - -pub const META_FILE_NAME: &str = "linear_hash.meta.json"; -pub const PAGE_FILE_NAME: &str = "linear_hash.pages"; - -const META_VERSION: u32 = 1; -const PAGE_HEADER_SIZE: usize = 16; -const NONE_PAGE_ID: u64 = u64::MAX; -const FILE_MODE_644: u32 = 0o644; - -#[derive(Debug, Clone)] -pub struct LinearHashConfig { - pub page_size: usize, - pub key_size: usize, - pub value_size: usize, - pub target_load_factor: f64, - pub initial_buckets: u32, -} - -impl Default for LinearHashConfig { - fn default() -> Self { - Self { - page_size: 4096, - key_size: 32, - value_size: 128, - target_load_factor: 0.80, - initial_buckets: 4, - } - } -} - -#[derive(Debug, Clone)] -pub struct LinearHashOpenOptions { - pub create_if_missing: bool, - pub create_new: bool, -} - -impl Default for LinearHashOpenOptions { - fn default() -> Self { - Self { - create_if_missing: true, - create_new: false, - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct LinearHashMeta { - version: u32, - page_size: usize, - key_size: usize, - value_size: usize, - bucket_capacity: usize, - target_load_factor: f64, - level: u32, - split_pointer: u32, - bucket_page_ids: Vec, - next_page_id: u64, - free_page_ids: Vec, - total_entries: u64, -} - -#[derive(Debug, Clone)] -struct BucketPage { - next_page_id: Option, - entries: Vec<(Vec, Vec)>, -} - -struct DirectoryState { - meta: LinearHashMeta, - bucket_locks: Vec>>, -} - -pub struct LinearHash { - dir: PathBuf, - directory: Mutex, -} - -impl LinearHash { - pub async fn open>( - dir: P, - config: LinearHashConfig, - options: LinearHashOpenOptions, - ) -> RS { - config.validate()?; - let dir = dir.as_ref().to_path_buf(); - let meta_path = dir.join(META_FILE_NAME); - let page_path = dir.join(PAGE_FILE_NAME); - let meta_exists = meta_path.exists(); - let page_exists = page_path.exists(); - - if options.create_new && (meta_exists || page_exists) { - return Err(m_error!( - ER::ExistingSuchElement, - "linear hash already exists for this path" - )); - } - - if !meta_exists || !page_exists { - if !options.create_if_missing { - return Err(m_error!( - ER::NoSuchElement, - "linear hash files not found and create_if_missing=false" - )); - } - tokio::fs::create_dir_all(&dir) - .await - .map_err(|e| m_error!(ER::IOErr, "create index dir error", e))?; - return Self::create_new(dir, config).await; - } - - let meta = Self::read_meta(&meta_path).await?; - Self::validate_meta_compat(&meta, &config)?; - let bucket_locks = (0..meta.bucket_page_ids.len()) - .map(|_| Arc::new(Mutex::new(()))) - .collect::>(); - - Ok(Self { - dir, - directory: Mutex::new(DirectoryState { meta, bucket_locks }), - }) - } - - pub async fn get(&self, key: &[u8], _optional_argv: Option<&[u8]>) -> RS>> { - let (meta, bucket_index, bucket_lock) = self.lock_bucket_for_key(key).await?; - let _bucket_guard = bucket_lock.lock().await; - let entries = self.read_bucket_entries(&meta, bucket_index).await?; - for (k, v) in entries { - if k == key { - return Ok(Some(v)); - } - } - Ok(None) - } - - pub async fn set(&self, key: &[u8], value: &[u8], _optional_argv: Option<&[u8]>) -> RS<()> { - let mut dir = self.directory.lock().await; - validate_key_len(&dir.meta, key)?; - validate_value_len(&dir.meta, value)?; - let bucket_index = bucket_index_for_key(&dir.meta, key); - let bucket_lock = dir.bucket_locks.get(bucket_index).cloned().ok_or_else(|| { - m_error!( - ER::IndexOutOfRange, - format!("invalid bucket {}", bucket_index) - ) - })?; - - let inserted = { - let _bucket_guard = bucket_lock.lock().await; - let mut entries = self.read_bucket_entries(&dir.meta, bucket_index).await?; - let mut replaced = false; - for (k, v) in &mut entries { - if k.as_slice() == key { - *v = value.to_vec(); - replaced = true; - break; - } - } - if !replaced { - entries.push((key.to_vec(), value.to_vec())); - } - self.rewrite_bucket(&mut dir.meta, bucket_index, &entries) - .await?; - !replaced - }; - - if inserted { - dir.meta.total_entries += 1; - } - self.expand_if_needed_locked(&mut dir).await?; - self.write_meta_file(&self.meta_path(), &dir.meta).await?; - Ok(()) - } - - pub async fn delete(&self, key: &[u8], _optional_argv: Option<&[u8]>) -> RS { - let mut dir = self.directory.lock().await; - validate_key_len(&dir.meta, key)?; - let bucket_index = bucket_index_for_key(&dir.meta, key); - let bucket_lock = dir.bucket_locks.get(bucket_index).cloned().ok_or_else(|| { - m_error!( - ER::IndexOutOfRange, - format!("invalid bucket {}", bucket_index) - ) - })?; - - let deleted = { - let _bucket_guard = bucket_lock.lock().await; - let mut entries = self.read_bucket_entries(&dir.meta, bucket_index).await?; - let old_len = entries.len(); - entries.retain(|(k, _)| k.as_slice() != key); - if entries.len() == old_len { - false - } else { - self.rewrite_bucket(&mut dir.meta, bucket_index, &entries) - .await?; - true - } - }; - - if !deleted { - return Ok(false); - } - - dir.meta.total_entries = dir.meta.total_entries.saturating_sub(1); - self.write_meta_file(&self.meta_path(), &dir.meta).await?; - Ok(true) - } - - pub async fn config(&self) -> LinearHashConfig { - let dir = self.directory.lock().await; - LinearHashConfig { - page_size: dir.meta.page_size, - key_size: dir.meta.key_size, - value_size: dir.meta.value_size, - target_load_factor: dir.meta.target_load_factor, - initial_buckets: 1 << dir.meta.level, - } - } - - #[cfg(test)] - async fn bucket_count(&self) -> usize { - let dir = self.directory.lock().await; - dir.meta.bucket_page_ids.len() - } - - async fn lock_bucket_for_key(&self, key: &[u8]) -> RS<(LinearHashMeta, usize, Arc>)> { - let dir = self.directory.lock().await; - validate_key_len(&dir.meta, key)?; - let bucket_index = bucket_index_for_key(&dir.meta, key); - let bucket_lock = dir.bucket_locks.get(bucket_index).cloned().ok_or_else(|| { - m_error!( - ER::IndexOutOfRange, - format!("invalid bucket {}", bucket_index) - ) - })?; - Ok((dir.meta.clone(), bucket_index, bucket_lock)) - } - - async fn expand_if_needed_locked(&self, dir: &mut MutexGuard<'_, DirectoryState>) -> RS<()> { - while current_load_factor(&dir.meta) > dir.meta.target_load_factor { - self.expand_one_bucket_locked(dir).await?; - } - Ok(()) - } - - async fn expand_one_bucket_locked(&self, dir: &mut MutexGuard<'_, DirectoryState>) -> RS<()> { - let base = 1usize << dir.meta.level; - let split_bucket = dir.meta.split_pointer as usize; - let new_bucket_index = base + split_bucket; - - let split_lock = dir - .bucket_locks - .get(split_bucket) - .cloned() - .ok_or_else(|| m_error!(ER::IndexOutOfRange, "split bucket lock not found"))?; - let new_lock = Arc::new(Mutex::new(())); - dir.bucket_locks.push(new_lock.clone()); - let _split_guard = split_lock.lock().await; - let _new_guard = new_lock.lock().await; - - let new_page_id = alloc_page_id(&mut dir.meta); - dir.meta.bucket_page_ids.push(new_page_id); - - self.write_bucket_page( - &dir.meta, - new_page_id, - &BucketPage { - next_page_id: None, - entries: vec![], - }, - ) - .await?; - - let old_entries = self.read_bucket_entries(&dir.meta, split_bucket).await?; - let mut stay = vec![]; - let mut moved = vec![]; - let next_base = (base * 2) as u64; - - for (k, v) in old_entries { - let h = fnv1a_hash(&k); - let idx = (h % next_base) as usize; - if idx == split_bucket { - stay.push((k, v)); - } else { - moved.push((k, v)); - } - } - - self.rewrite_bucket(&mut dir.meta, split_bucket, &stay) - .await?; - self.rewrite_bucket(&mut dir.meta, new_bucket_index, &moved) - .await?; - - dir.meta.split_pointer += 1; - if dir.meta.split_pointer as usize == base { - dir.meta.level += 1; - dir.meta.split_pointer = 0; - } - Ok(()) - } - - async fn read_bucket_entries( - &self, - meta: &LinearHashMeta, - bucket_index: usize, - ) -> RS, Vec)>> { - let chain = self.read_bucket_chain(meta, bucket_index).await?; - let mut entries = Vec::with_capacity(chain.iter().map(|p| p.entries.len()).sum()); - for p in chain { - entries.extend(p.entries.into_iter()); - } - Ok(entries) - } - - async fn read_bucket_chain( - &self, - meta: &LinearHashMeta, - bucket_index: usize, - ) -> RS> { - let mut pages = vec![]; - let mut page_id = primary_page_id(meta, bucket_index)?; - loop { - let page = self.read_bucket_page(meta, page_id).await?; - let next = page.next_page_id; - pages.push(page); - if let Some(next_id) = next { - page_id = next_id; - } else { - break; - } - } - Ok(pages) - } - - async fn read_bucket_chain_ids( - &self, - meta: &LinearHashMeta, - bucket_index: usize, - ) -> RS> { - let mut ids = vec![]; - let mut page_id = primary_page_id(meta, bucket_index)?; - loop { - let page = self.read_bucket_page(meta, page_id).await?; - let next = page.next_page_id; - ids.push(page_id); - if let Some(next_id) = next { - page_id = next_id; - } else { - break; - } - } - Ok(ids) - } - - async fn rewrite_bucket( - &self, - meta: &mut LinearHashMeta, - bucket_index: usize, - entries: &[(Vec, Vec)], - ) -> RS<()> { - let mut chain_ids = self.read_bucket_chain_ids(meta, bucket_index).await?; - if chain_ids.is_empty() { - return Err(m_error!(ER::StorageErr, "bucket chain is empty")); - } - let primary_id = chain_ids[0]; - - for released in chain_ids.drain(1..) { - meta.free_page_ids.push(released); - } - - let page_count = if entries.is_empty() { - 1 - } else { - entries.len().div_ceil(meta.bucket_capacity) - }; - - let mut target_ids = vec![primary_id]; - while target_ids.len() < page_count { - target_ids.push(alloc_page_id(meta)); - } - - for (i, page_id) in target_ids.iter().enumerate() { - let begin = i * meta.bucket_capacity; - let end = ((i + 1) * meta.bucket_capacity).min(entries.len()); - let chunk = if begin < end { - &entries[begin..end] - } else { - &[] - }; - let next = if i + 1 < target_ids.len() { - Some(target_ids[i + 1]) - } else { - None - }; - let page = BucketPage { - next_page_id: next, - entries: chunk.to_vec(), - }; - self.write_bucket_page(meta, *page_id, &page).await?; - } - Ok(()) - } - - async fn read_bucket_page(&self, meta: &LinearHashMeta, page_id: u64) -> RS { - read_page_data( - &self.page_path(), - page_id, - meta.page_size, - meta.key_size, - meta.value_size, - meta.bucket_capacity, - ) - .await - } - - async fn write_bucket_page( - &self, - meta: &LinearHashMeta, - page_id: u64, - page: &BucketPage, - ) -> RS<()> { - write_page_data( - &self.page_path(), - page_id, - meta.page_size, - meta.key_size, - meta.value_size, - page, - ) - .await - } - - async fn create_new(dir: PathBuf, config: LinearHashConfig) -> RS { - let page_path = dir.join(PAGE_FILE_NAME); - let meta_path = dir.join(META_FILE_NAME); - let page_file = open_rw_create_truncate(&page_path).await?; - close_file(page_file).await?; - - let initial_buckets = config.initial_buckets.max(1); - let level = initial_buckets.trailing_zeros(); - let bucket_capacity = config.bucket_capacity()?; - let mut bucket_page_ids = Vec::with_capacity(initial_buckets as usize); - - for page_id in 0..initial_buckets as u64 { - bucket_page_ids.push(page_id); - write_page_data( - &page_path, - page_id, - config.page_size, - config.key_size, - config.value_size, - &BucketPage { - next_page_id: None, - entries: vec![], - }, - ) - .await?; - } - - let meta = LinearHashMeta { - version: META_VERSION, - page_size: config.page_size, - key_size: config.key_size, - value_size: config.value_size, - bucket_capacity, - target_load_factor: config.target_load_factor, - level, - split_pointer: 0, - bucket_page_ids, - next_page_id: initial_buckets as u64, - free_page_ids: vec![], - total_entries: 0, - }; - - write_all_file( - &meta_path, - &serde_json::to_vec_pretty(&meta) - .map_err(|e| m_error!(ER::EncodeErr, "encode meta error", e))?, - true, - ) - .await?; - - let bucket_locks = (0..meta.bucket_page_ids.len()) - .map(|_| Arc::new(Mutex::new(()))) - .collect::>(); - - Ok(Self { - dir, - directory: Mutex::new(DirectoryState { meta, bucket_locks }), - }) - } - - fn validate_meta_compat(meta: &LinearHashMeta, cfg: &LinearHashConfig) -> RS<()> { - if meta.version != META_VERSION { - return Err(m_error!( - ER::ParseErr, - format!("unsupported meta version {}", meta.version) - )); - } - if meta.page_size != cfg.page_size - || meta.key_size != cfg.key_size - || meta.value_size != cfg.value_size - { - return Err(m_error!( - ER::ParseErr, - "config mismatch with persisted linear hash" - )); - } - Ok(()) - } - - fn page_path(&self) -> PathBuf { - self.dir.join(PAGE_FILE_NAME) - } - - fn meta_path(&self) -> PathBuf { - self.dir.join(META_FILE_NAME) - } - - async fn write_meta_file(&self, path: &Path, meta: &LinearHashMeta) -> RS<()> { - write_all_file( - path, - &serde_json::to_vec_pretty(meta) - .map_err(|e| m_error!(ER::EncodeErr, "encode meta error", e))?, - true, - ) - .await?; - Ok(()) - } - - async fn read_meta(path: &Path) -> RS { - let buf = read_all_file(path).await?; - serde_json::from_slice(&buf) - .map_err(|e| m_error!(ER::DecodeErr, "decode meta file error", e)) - } -} - -impl LinearHashConfig { - fn validate(&self) -> RS<()> { - if self.page_size <= PAGE_HEADER_SIZE { - return Err(m_error!(ER::ParseErr, "page_size too small")); - } - if self.key_size == 0 || self.value_size == 0 { - return Err(m_error!(ER::ParseErr, "key_size/value_size must be > 0")); - } - if !(0.1..=0.99).contains(&self.target_load_factor) { - return Err(m_error!( - ER::ParseErr, - "target_load_factor must be in [0.1, 0.99]" - )); - } - if !self.initial_buckets.is_power_of_two() { - return Err(m_error!( - ER::ParseErr, - "initial_buckets must be power of two" - )); - } - let capacity = self.bucket_capacity()?; - if capacity == 0 { - return Err(m_error!(ER::ParseErr, "page cannot hold any entry")); - } - Ok(()) - } - - fn bucket_capacity(&self) -> RS { - let entry_size = self.key_size + self.value_size; - if entry_size == 0 || self.page_size <= PAGE_HEADER_SIZE { - return Err(m_error!(ER::ParseErr, "invalid page or entry size")); - } - Ok((self.page_size - PAGE_HEADER_SIZE) / entry_size) - } -} - -async fn read_page_data( - page_path: &Path, - page_id: u64, - page_size: usize, - key_size: usize, - value_size: usize, - bucket_capacity: usize, -) -> RS { - let file = open_rw(page_path).await?; - let offset = page_offset(page_id, page_size)?; - let read_result = if worker_ring::has_current_worker_ring() { - file::read(&file, page_size, offset).await - } else { - file::read_sync(&file, page_size, offset) - }; - let close_result = close_file(file).await; - let buf = read_result.map_err(|e| m_error!(ER::IOErr, "read page error", e))?; - close_result?; - - let next = read_u64(&buf[0..8]); - let count = read_u32(&buf[8..12]) as usize; - if count > bucket_capacity { - return Err(m_error!( - ER::DecodeErr, - format!("invalid entry count {} > {}", count, bucket_capacity) - )); - } - - let mut entries = Vec::with_capacity(count); - let mut offset = PAGE_HEADER_SIZE; - for _ in 0..count { - let key = buf[offset..offset + key_size].to_vec(); - offset += key_size; - let value = buf[offset..offset + value_size].to_vec(); - offset += value_size; - entries.push((key, value)); - } - - Ok(BucketPage { - next_page_id: if next == NONE_PAGE_ID { - None - } else { - Some(next) - }, - entries, - }) -} - -async fn write_page_data( - page_path: &Path, - page_id: u64, - page_size: usize, - key_size: usize, - value_size: usize, - page: &BucketPage, -) -> RS<()> { - let entry_size = key_size + value_size; - let bucket_capacity = (page_size - PAGE_HEADER_SIZE) / entry_size; - if page.entries.len() > bucket_capacity { - return Err(m_error!( - ER::StorageErr, - format!( - "entry count {} exceeds page capacity {}", - page.entries.len(), - bucket_capacity - ) - )); - } - - let mut buf = vec![0u8; page_size]; - write_u64(&mut buf[0..8], page.next_page_id.unwrap_or(NONE_PAGE_ID)); - write_u32(&mut buf[8..12], page.entries.len() as u32); - - let mut offset = PAGE_HEADER_SIZE; - for (key, value) in &page.entries { - if key.len() != key_size || value.len() != value_size { - return Err(m_error!( - ER::TypeErr, - "entry key/value size does not match config" - )); - } - buf[offset..offset + key_size].copy_from_slice(key); - offset += key_size; - buf[offset..offset + value_size].copy_from_slice(value); - offset += value_size; - } - - let file = open_rw(page_path).await?; - let offset = page_offset(page_id, page_size)?; - let write_result = if worker_ring::has_current_worker_ring() { - file::write(&file, buf, offset).await.map(|_| ()) - } else { - file::write_sync(&file, &buf, offset) - }; - let flush_result = if worker_ring::has_current_worker_ring() { - file::flush(&file).await - } else { - file::flush_sync(&file) - }; - let close_result = close_file(file).await; - write_result.map_err(|e| m_error!(ER::IOErr, "write page error", e))?; - flush_result.map_err(|e| m_error!(ER::IOErr, "flush page file error", e))?; - close_result?; - Ok(()) -} - -async fn open_rw(path: &Path) -> RS { - if worker_ring::has_current_worker_ring() { - file::open(path, libc::O_RDWR | file::cloexec_flag(), FILE_MODE_644).await - } else { - file::open_sync(path, libc::O_RDWR | file::cloexec_flag(), FILE_MODE_644) - } -} - -async fn open_rw_create_truncate(path: &Path) -> RS { - if worker_ring::has_current_worker_ring() { - file::open( - path, - libc::O_CREAT | libc::O_TRUNC | libc::O_RDWR | file::cloexec_flag(), - FILE_MODE_644, - ) - .await - } else { - file::open_sync( - path, - libc::O_CREAT | libc::O_TRUNC | libc::O_RDWR | file::cloexec_flag(), - FILE_MODE_644, - ) - } -} - -async fn read_all_file(path: &Path) -> RS> { - let file = open_rw(path).await?; - let len = std::fs::metadata(path) - .map_err(|e| m_error!(ER::IOErr, "read meta file metadata error", e))? - .len() as usize; - let read_result = if worker_ring::has_current_worker_ring() { - file::read(&file, len, 0).await - } else { - file::read_sync(&file, len, 0) - }; - let close_result = close_file(file).await; - let buf = read_result.map_err(|e| m_error!(ER::IOErr, "read meta file error", e))?; - close_result?; - Ok(buf) -} - -async fn write_all_file(path: &Path, buf: &[u8], truncate: bool) -> RS<()> { - let file = if truncate { - open_rw_create_truncate(path).await? - } else { - open_rw(path).await? - }; - let write_result = if worker_ring::has_current_worker_ring() { - file::write(&file, buf.to_vec(), 0).await.map(|_| ()) - } else { - file::write_sync(&file, buf, 0) - }; - let flush_result = if worker_ring::has_current_worker_ring() { - file::flush(&file).await - } else { - file::flush_sync(&file) - }; - let close_result = close_file(file).await; - write_result.map_err(|e| m_error!(ER::IOErr, "write meta file error", e))?; - flush_result.map_err(|e| m_error!(ER::IOErr, "flush meta file error", e))?; - close_result?; - Ok(()) -} - -fn page_offset(page_id: u64, page_size: usize) -> RS { - page_id - .checked_mul(page_size as u64) - .ok_or_else(|| m_error!(ER::IndexOutOfRange, "page seek overflow")) -} - -async fn close_file(file: IoFile) -> RS<()> { - if worker_ring::has_current_worker_ring() { - file::close(file).await - } else { - file::close_sync(file) - } -} - -fn validate_key_len(meta: &LinearHashMeta, key: &[u8]) -> RS<()> { - if key.len() != meta.key_size { - return Err(m_error!( - ER::TypeErr, - format!("invalid key len {}, expected {}", key.len(), meta.key_size) - )); - } - Ok(()) -} - -fn validate_value_len(meta: &LinearHashMeta, value: &[u8]) -> RS<()> { - if value.len() != meta.value_size { - return Err(m_error!( - ER::TypeErr, - format!( - "invalid value len {}, expected {}", - value.len(), - meta.value_size - ) - )); - } - Ok(()) -} - -fn bucket_index_for_key(meta: &LinearHashMeta, key: &[u8]) -> usize { - let hash = fnv1a_hash(key); - let base = 1u64 << meta.level; - let mut index = hash % base; - if index < meta.split_pointer as u64 { - index = hash % (base * 2); - } - index as usize -} - -fn primary_page_id(meta: &LinearHashMeta, bucket_index: usize) -> RS { - meta.bucket_page_ids - .get(bucket_index) - .copied() - .ok_or_else(|| { - m_error!( - ER::IndexOutOfRange, - format!("invalid bucket {}", bucket_index) - ) - }) -} - -fn current_load_factor(meta: &LinearHashMeta) -> f64 { - let buckets = meta.bucket_page_ids.len(); - if buckets == 0 || meta.bucket_capacity == 0 { - return 0.0; - } - meta.total_entries as f64 / (buckets * meta.bucket_capacity) as f64 -} - -fn alloc_page_id(meta: &mut LinearHashMeta) -> u64 { - if let Some(page_id) = meta.free_page_ids.pop() { - return page_id; - } - let page_id = meta.next_page_id; - meta.next_page_id += 1; - page_id -} - -fn fnv1a_hash(key: &[u8]) -> u64 { - let mut hash = 0xcbf29ce484222325u64; - for &b in key { - hash ^= b as u64; - hash = hash.wrapping_mul(0x100000001b3); - } - hash -} - -fn read_u64(buf: &[u8]) -> u64 { - let mut arr = [0u8; 8]; - arr.copy_from_slice(buf); - u64::from_le_bytes(arr) -} - -fn read_u32(buf: &[u8]) -> u32 { - let mut arr = [0u8; 4]; - arr.copy_from_slice(buf); - u32::from_le_bytes(arr) -} - -fn write_u64(buf: &mut [u8], v: u64) { - buf.copy_from_slice(&v.to_le_bytes()); -} - -fn write_u32(buf: &mut [u8], v: u32) { - buf.copy_from_slice(&v.to_le_bytes()); -} - -#[cfg(test)] -mod tests { - use super::*; - use std::time::UNIX_EPOCH; - - fn test_dir() -> PathBuf { - let ts = mudu_sys::time::system_time_now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_nanos(); - std::env::temp_dir().join(format!("linear_hash_test_{}", ts)) - } - - fn cfg() -> LinearHashConfig { - LinearHashConfig { - page_size: 128, - key_size: 8, - value_size: 16, - target_load_factor: 0.7, - initial_buckets: 2, - } - } - - fn key_u64(v: u64) -> [u8; 8] { - v.to_le_bytes() - } - - fn value_u64(v: u64) -> [u8; 16] { - let mut out = [0u8; 16]; - out[0..8].copy_from_slice(&v.to_le_bytes()); - out - } - - #[tokio::test] - async fn test_set_get_delete() { - let dir = test_dir(); - let idx = LinearHash::open(&dir, cfg(), LinearHashOpenOptions::default()) - .await - .unwrap(); - let k1 = key_u64(1); - let v1 = value_u64(10); - - idx.set(&k1, &v1, None).await.unwrap(); - assert_eq!(idx.get(&k1, None).await.unwrap(), Some(v1.to_vec())); - - assert!(idx.delete(&k1, None).await.unwrap()); - assert_eq!(idx.get(&k1, None).await.unwrap(), None); - } - - #[tokio::test] - async fn test_persistent_reopen() { - let dir = test_dir(); - let k1 = key_u64(42); - let v1 = value_u64(99); - { - let idx = LinearHash::open(&dir, cfg(), LinearHashOpenOptions::default()) - .await - .unwrap(); - idx.set(&k1, &v1, None).await.unwrap(); - } - { - let idx = LinearHash::open( - &dir, - cfg(), - LinearHashOpenOptions { - create_if_missing: false, - create_new: false, - }, - ) - .await - .unwrap(); - assert_eq!(idx.get(&k1, None).await.unwrap(), Some(v1.to_vec())); - } - } - - #[tokio::test] - async fn test_partial_expansion_happens() { - let dir = test_dir(); - let idx = LinearHash::open(&dir, cfg(), LinearHashOpenOptions::default()) - .await - .unwrap(); - let before = idx.bucket_count().await; - - for i in 0..50u64 { - let k = key_u64(i); - let v = value_u64(i * 10); - idx.set(&k, &v, None).await.unwrap(); - } - - let after = idx.bucket_count().await; - assert!(after > before); - - for i in 0..50u64 { - let k = key_u64(i); - let v = value_u64(i * 10); - assert_eq!(idx.get(&k, None).await.unwrap(), Some(v.to_vec())); - } - } -} diff --git a/mudu_kernel/src/index/hash/mod.rs b/mudu_kernel/src/index/hash/mod.rs deleted file mode 100644 index 1b753c7..0000000 --- a/mudu_kernel/src/index/hash/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod linear_hash; - -pub use linear_hash::{ - LinearHash, LinearHashConfig, LinearHashOpenOptions, META_FILE_NAME, PAGE_FILE_NAME, -}; diff --git a/mudu_kernel/src/index/mod.rs b/mudu_kernel/src/index/mod.rs index 4422028..970ff0c 100644 --- a/mudu_kernel/src/index/mod.rs +++ b/mudu_kernel/src/index/mod.rs @@ -1,3 +1,2 @@ pub mod btree; -pub mod hash; pub mod index_key; diff --git a/mudu_kernel/src/io/file.rs b/mudu_kernel/src/io/file.rs index 342a197..4e237b7 100644 --- a/mudu_kernel/src/io/file.rs +++ b/mudu_kernel/src/io/file.rs @@ -1,23 +1,29 @@ use std::any::Any; +#[cfg(target_os = "linux")] use std::ffi::CString; -use std::future::{poll_fn, Future}; +use std::future::poll_fn; +#[cfg(target_os = "linux")] +use std::future::Future; use std::mem::ManuallyDrop; use std::path::Path; +#[cfg(target_os = "linux")] use std::pin::Pin; use std::sync::Arc; +#[cfg(target_os = "linux")] use std::task::{Context, Poll}; #[cfg(target_os = "linux")] use crate::io::user_io::completion_error; -use crate::io::user_io::{complete_op, op_state, poll_op, try_take_op, OpState}; +#[cfg(target_os = "linux")] +use crate::io::user_io::{complete_op, op_state}; +use crate::io::user_io::{poll_op, try_take_op, OpState}; #[cfg(target_os = "linux")] use crate::io::worker_ring::{with_current_ring, WorkerLocalRing, WorkerRingOp}; -#[cfg(not(target_os = "linux"))] -use crate::io::worker_ring::{with_current_ring, WorkerRingOp}; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; - +use mudu_utils::sync::a_mutex::AMutex; +use mudu_utils::{scoped_task_trace, task_trace}; #[cfg(unix)] use std::os::fd::{FromRawFd, IntoRawFd, RawFd}; #[cfg(windows)] @@ -26,12 +32,13 @@ use std::os::windows::io::{FromRawHandle, IntoRawHandle, RawHandle}; #[cfg(windows)] type RawFd = usize; -pub type File = tokio::fs::File; -pub type TFile = tokio::fs::File; +pub type File = mudu_sys::tokio::fs::File; +pub type TFile = mudu_sys::tokio::fs::File; #[derive(Debug)] pub struct IoFile { fd: RawFd, + portable_io_lock: Arc>, } #[derive(Clone)] @@ -50,6 +57,7 @@ pub struct OptionWrite { pub blind_write: bool, } +#[cfg(target_os = "linux")] pub(crate) enum FileIoRequest { Open(FileOpenRequest), Close(FileCloseRequest), @@ -58,6 +66,7 @@ pub(crate) enum FileIoRequest { Flush(FileFlushRequest), } +#[cfg(target_os = "linux")] pub(crate) enum FileInflightOp { Open(Box), Close(Box), @@ -69,6 +78,7 @@ pub(crate) enum FileInflightOp { Flush(Box), } +#[cfg(target_os = "linux")] pub(crate) struct FileOpenRequest { path: CString, flags: i32, @@ -76,11 +86,13 @@ pub(crate) struct FileOpenRequest { state: Arc>, } +#[cfg(target_os = "linux")] pub(crate) struct FileCloseRequest { fd: RawFd, state: Arc>, } +#[cfg(target_os = "linux")] pub(crate) struct FileReadRequest { fd: RawFd, len: usize, @@ -88,6 +100,7 @@ pub(crate) struct FileReadRequest { state: Arc>>, } +#[cfg(target_os = "linux")] pub(crate) struct FileWriteRequest { fd: RawFd, offset: u64, @@ -97,6 +110,7 @@ pub(crate) struct FileWriteRequest { state: Arc>, } +#[cfg(target_os = "linux")] pub(crate) struct FileFlushRequest { fd: RawFd, payload: Option>, @@ -110,6 +124,7 @@ impl Default for IoFile { fd: 0, #[cfg(windows)] fd: 0, + portable_io_lock: Arc::new(AMutex::new(())), } } } @@ -127,28 +142,68 @@ impl IoFile { } pub fn new(fd: RawFd) -> Self { - Self { fd } + Self { + fd, + portable_io_lock: Arc::new(AMutex::new(())), + } } } pub async fn open>(path: P, flags: i32, mode: u32) -> RS { - let path = CString::new(path.as_ref().as_os_str().as_encoded_bytes()) - .map_err(|_| m_error!(EC::ParseErr, "path contains NUL byte"))?; - let fd = FileOpenFuture::new(path, flags, mode).await?; - Ok(IoFile { fd }) + scoped_task_trace!(); + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + let path = CString::new(path.as_ref().as_os_str().as_encoded_bytes()) + .map_err(|_| m_error!(EC::ParseErr, "path contains NUL byte"))?; + let fd = FileOpenFuture::new(path, flags, mode).await?; + return Ok(IoFile::from_raw_fd(fd)); + } + + open_async_portable(path.as_ref(), flags, mode).await } pub async fn close(file: IoFile) -> RS<()> { - FileCloseFuture::new(file.fd).await + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return FileCloseFuture::new(file.fd).await; + } + + close_async_portable(file).await } pub async fn read(file: &IoFile, len: usize, offset: u64) -> RS> { - FileReadFuture::new(file.fd, len, offset).await + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return FileReadFuture::new(file.fd, len, offset).await; + } + + read_async_portable(file, len, offset).await +} + +pub async fn metadata_len>(path: P) -> RS { + mudu_sys::fs::metadata_len(path.as_ref()) + .map_err(|e| m_error!(EC::IOErr, "read file metadata error", e)) +} + +pub fn metadata_len_by_file(file: &IoFile) -> RS { + with_std_file(file, |std_file| { + std_file + .metadata() + .map(|metadata| metadata.len()) + .map_err(|e| m_error!(EC::IOErr, "read file metadata by fd error", e)) + }) } pub async fn write(file: &IoFile, data: Vec, offset: u64) -> RS { - write_submit_option(file, data, offset, OptionWrite::default())? - .wait() - .await + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return write_submit_option(file, data, offset, OptionWrite::default())? + .wait() + .await; + } + + let len = data.len(); + write_async_portable(file, data, offset).await?; + Ok(len) } pub fn open_sync(path: &Path, flags: i32, mode: u32) -> RS { @@ -192,9 +247,17 @@ pub async fn write_option( offset: u64, option: OptionWrite, ) -> RS { - write_submit_option(file, data, offset, option)? - .wait() - .await + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return write_submit_option(file, data, offset, option)? + .wait() + .await; + } + + let len = data.len(); + let _ = option; + write_async_portable(file, data, offset).await?; + Ok(len) } pub fn write_submit(file: &IoFile, data: Vec, offset: u64) -> RS { @@ -206,6 +269,25 @@ pub fn write_submit_option( data: Vec, offset: u64, option: OptionWrite, +) -> RS { + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return write_submit_option_iouring(file, data, offset, option); + } + + let _ = (file, data, offset, option); + Err(m_error!( + EC::NotImplemented, + "file write submit requires a worker ring; use async write outside io_uring workers" + )) +} + +#[cfg(target_os = "linux")] +fn write_submit_option_iouring( + file: &IoFile, + data: Vec, + offset: u64, + option: OptionWrite, ) -> RS { let total_len = data.len(); let state = op_state(); @@ -222,11 +304,22 @@ pub fn write_submit_option( } pub async fn flush(file: &IoFile) -> RS<()> { - flush_submit(file)?.wait().await + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return flush_submit(file)?.wait().await; + } + + flush_async_portable(file).await } pub async fn flush_lsn(file: &IoFile, ready_lsn: Vec) -> RS> { - flush_submit_lsn(file, ready_lsn)?.wait().await + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return flush_submit_lsn(file, ready_lsn)?.wait().await; + } + + flush_async_portable(file).await?; + Ok(ready_lsn) } pub fn flush_submit(file: &IoFile) -> RS> { @@ -238,6 +331,23 @@ pub fn flush_submit_lsn(file: &IoFile, ready_lsn: Vec) -> RS(file: &IoFile, payload: P) -> RS> +where + P: Send + 'static, +{ + #[cfg(target_os = "linux")] + if crate::io::worker_ring::has_current_worker_ring() { + return flush_submit_payload_iouring(file, payload); + } + + let _ = (file, payload); + Err(m_error!( + EC::NotImplemented, + "file flush submit requires a worker ring; use async flush outside io_uring workers" + )) +} + +#[cfg(target_os = "linux")] +fn flush_submit_payload_iouring

(file: &IoFile, payload: P) -> RS> where P: Send + 'static, { @@ -260,7 +370,7 @@ impl IoFile { } pub(crate) fn from_raw_fd(fd: RawFd) -> Self { - Self { fd } + Self::new(fd) } } @@ -299,6 +409,7 @@ where } } +#[cfg(target_os = "linux")] impl FileOpenRequest { fn new(path: CString, flags: i32, mode: u32, state: Arc>) -> Self { Self { @@ -326,6 +437,7 @@ impl FileOpenRequest { } } +#[cfg(target_os = "linux")] impl FileCloseRequest { fn new(fd: RawFd, state: Arc>) -> Self { Self { fd, state } @@ -340,6 +452,7 @@ impl FileCloseRequest { } } +#[cfg(target_os = "linux")] impl FileReadRequest { fn new(fd: RawFd, len: usize, offset: u64, state: Arc>>) -> Self { Self { @@ -367,6 +480,7 @@ impl FileReadRequest { } } +#[cfg(target_os = "linux")] impl FileWriteRequest { fn new( fd: RawFd, @@ -422,6 +536,7 @@ impl FileWriteRequest { } } +#[cfg(target_os = "linux")] impl FileFlushRequest { fn new

(fd: RawFd, payload: P, state: Arc>>) -> Self where @@ -455,12 +570,14 @@ impl FileFlushRequest { } } +#[cfg(target_os = "linux")] enum FileFutureState { Init, Pending(Arc>), Done, } +#[cfg(target_os = "linux")] struct FileOpenFuture { path: Option, flags: i32, @@ -468,11 +585,13 @@ struct FileOpenFuture { state: FileFutureState, } +#[cfg(target_os = "linux")] struct FileCloseFuture { fd: RawFd, state: FileFutureState<()>, } +#[cfg(target_os = "linux")] struct FileReadFuture { fd: RawFd, len: usize, @@ -480,22 +599,7 @@ struct FileReadFuture { state: FileFutureState>, } -#[allow(dead_code)] -struct FileWriteFuture { - fd: RawFd, - offset: u64, - data: Option>, - option: OptionWrite, - state: FileFutureState, -} - -#[allow(dead_code)] -struct FileFlushFuture

{ - fd: RawFd, - payload: Option

, - state: FileFutureState>, -} - +#[cfg(target_os = "linux")] impl FileOpenFuture { fn new(path: CString, flags: i32, mode: u32) -> Self { Self { @@ -507,6 +611,7 @@ impl FileOpenFuture { } } +#[cfg(target_os = "linux")] impl FileCloseFuture { fn new(fd: RawFd) -> Self { Self { @@ -516,6 +621,7 @@ impl FileCloseFuture { } } +#[cfg(target_os = "linux")] impl FileReadFuture { fn new(fd: RawFd, len: usize, offset: u64) -> Self { Self { @@ -527,30 +633,7 @@ impl FileReadFuture { } } -#[allow(dead_code)] -impl FileWriteFuture { - fn new(fd: RawFd, offset: u64, data: Vec, option: OptionWrite) -> Self { - Self { - fd, - offset, - data: Some(data), - option, - state: FileFutureState::Init, - } - } -} - -#[allow(dead_code)] -impl

FileFlushFuture

{ - fn new(fd: RawFd, payload: P) -> Self { - Self { - fd, - payload: Some(payload), - state: FileFutureState::Init, - } - } -} - +#[cfg(target_os = "linux")] impl Future for FileOpenFuture { type Output = RS; @@ -583,6 +666,7 @@ impl Future for FileOpenFuture { } } +#[cfg(target_os = "linux")] impl Future for FileCloseFuture { type Output = RS<()>; @@ -614,6 +698,7 @@ impl Future for FileCloseFuture { } } +#[cfg(target_os = "linux")] impl Future for FileReadFuture { type Output = RS>; @@ -645,92 +730,6 @@ impl Future for FileReadFuture { } } -impl Future for FileWriteFuture { - type Output = RS; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - match &self.state { - FileFutureState::Init => { - let state = op_state(); - let data = self.data.take().unwrap(); - let total_len = data.len(); - if let Err(err) = with_current_ring(|ring| { - ring.register(WorkerRingOp::File(FileIoRequest::Write( - FileWriteRequest::new( - self.fd, - self.offset, - data, - self.option.blind_write, - state.clone(), - ), - ))) - .map(|_| ()) - }) { - self.state = FileFutureState::Done; - return Poll::Ready(Err(err)); - } - if self.option.blind_write { - self.state = FileFutureState::Done; - return Poll::Ready(Ok(total_len)); - } - self.state = FileFutureState::Pending(state); - self.poll(cx) - } - FileFutureState::Pending(state) => match poll_op(state, cx) { - Poll::Ready(result) => { - self.state = FileFutureState::Done; - Poll::Ready(result) - } - Poll::Pending => Poll::Pending, - }, - FileFutureState::Done => Poll::Pending, - } - } -} - -impl

Future for FileFlushFuture

-where - P: Send + Unpin + 'static, -{ - type Output = RS

; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.as_mut().get_mut(); - match &this.state { - FileFutureState::Init => { - let state = op_state(); - let payload = this - .payload - .take() - .expect("flush future payload must be present before registration"); - if let Err(err) = with_current_ring(|ring| { - ring.register(WorkerRingOp::File(FileIoRequest::Flush( - FileFlushRequest::new(this.fd, payload, state.clone()), - ))) - .map(|_| ()) - }) { - this.state = FileFutureState::Done; - return Poll::Ready(Err(err)); - } - this.state = FileFutureState::Pending(state); - self.poll(cx) - } - FileFutureState::Pending(state) => match poll_op(state, cx) { - Poll::Ready(result) => { - this.state = FileFutureState::Done; - Poll::Ready(result.and_then(|payload| { - payload.downcast::

().map(|boxed| *boxed).map_err(|_| { - m_error!(EC::InternalErr, "file flush payload type mismatch") - }) - })) - } - Poll::Pending => Poll::Pending, - }, - FileFutureState::Done => Poll::Pending, - } - } -} - #[cfg(target_os = "linux")] pub(crate) fn submit_file_io( request: FileIoRequest, @@ -843,6 +842,96 @@ pub(crate) fn complete_file_io( } } +async fn open_async_portable(path: &Path, flags: i32, _mode: u32) -> RS { + mudu_sys::fs::open(path, flags, _mode) + .map(std_file_to_io_file) + .map_err(|e| m_error!(EC::IOErr, "open file error", e)) +} + +async fn close_async_portable(file: IoFile) -> RS<()> { + close_sync(file) +} + +async fn read_async_portable(file: &IoFile, len: usize, offset: u64) -> RS> { + let trace = task_trace!(); + trace.watch("portable_io.op", "read"); + trace.watch("portable_io.offset", &offset.to_string()); + trace.watch("portable_io.len", &len.to_string()); + trace.watch("portable_io.stage", "lock_wait"); + let _guard = file.portable_io_lock.lock().await; + trace.watch("portable_io.stage", "locked"); + let result = read_async_portable_std(clone_std_file(file)?, len, offset).await; + trace.watch( + "portable_io.stage", + if result.is_ok() { + "read_done" + } else { + "read_err" + }, + ); + result +} + +async fn read_async_portable_std(std_file: std::fs::File, len: usize, offset: u64) -> RS> { + mudu_sys::fs::read_exact_at(&std_file, len, offset) + .map_err(|e| m_error!(EC::IOErr, "read file error", e)) +} + +async fn write_async_portable(file: &IoFile, data: Vec, offset: u64) -> RS<()> { + let trace = task_trace!(); + trace.watch("portable_io.op", "write"); + trace.watch("portable_io.offset", &offset.to_string()); + trace.watch("portable_io.len", &data.len().to_string()); + trace.watch("portable_io.stage", "lock_wait"); + let _guard = file.portable_io_lock.lock().await; + trace.watch("portable_io.stage", "locked"); + let result = write_async_portable_std(clone_std_file(file)?, data, offset).await; + trace.watch( + "portable_io.stage", + if result.is_ok() { + "write_done" + } else { + "write_err" + }, + ); + result +} + +async fn write_async_portable_std(std_file: std::fs::File, data: Vec, offset: u64) -> RS<()> { + mudu_sys::fs::write_all_at(&std_file, &data, offset) + .map_err(|e| m_error!(EC::IOErr, "write file error", e)) +} + +async fn flush_async_portable_std(std_file: std::fs::File) -> RS<()> { + mudu_sys::fs::fsync(&std_file).map_err(|e| m_error!(EC::IOErr, "fsync file error", e)) +} + +async fn flush_async_portable(file: &IoFile) -> RS<()> { + let trace = task_trace!(); + trace.watch("portable_io.op", "flush"); + trace.watch("portable_io.stage", "lock_wait"); + let _guard = file.portable_io_lock.lock().await; + trace.watch("portable_io.stage", "locked"); + let result = flush_async_portable_std(clone_std_file(file)?).await; + trace.watch( + "portable_io.stage", + if result.is_ok() { + "flush_done" + } else { + "flush_err" + }, + ); + result +} + +fn clone_std_file(file: &IoFile) -> RS { + with_std_file(file, |std_file| { + std_file + .try_clone() + .map_err(|e| m_error!(EC::IOErr, "clone file handle for tokio io error", e)) + }) +} + fn std_file_to_io_file(file: std::fs::File) -> IoFile { #[cfg(unix)] { @@ -877,7 +966,7 @@ fn io_file_into_std(file: IoFile) -> std::fs::File { mod tests { use super::*; use crate::io::worker_ring::{set_current_worker_ring, unset_current_worker_ring}; - use tokio::task::yield_now; + use mudu_sys::tokio::task::yield_now; fn install_test_ring() -> Arc { let ring = Arc::new(WorkerLocalRing::new()); @@ -888,7 +977,8 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn open_enqueues_request_and_returns_file() { let ring = install_test_ring(); - let task = tokio::spawn(async { open("/tmp/test-open", libc::O_RDONLY, 0).await }); + let task = + mudu_sys::tokio::spawn(async { open("/tmp/test-open", libc::O_RDONLY, 0).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { @@ -907,8 +997,8 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn read_enqueues_request_and_receives_payload() { let ring = install_test_ring(); - let file = IoFile { fd: 21 }; - let task = tokio::spawn(async move { read(&file, 8, 12).await }); + let file = IoFile::new(21); + let task = mudu_sys::tokio::spawn(async move { read(&file, 8, 12).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { @@ -929,9 +1019,10 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn write_flush_and_close_enqueue_requests() { let ring = install_test_ring(); - let file = IoFile { fd: 33 }; + let file = IoFile::new(33); - let write_task = tokio::spawn(async move { write(&file, vec![9, 8, 7], 4).await }); + let write_task = + mudu_sys::tokio::spawn(async move { write(&file, vec![9, 8, 7], 4).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::File(FileIoRequest::Write(request)) => { @@ -944,8 +1035,8 @@ mod tests { } assert_eq!(write_task.await.unwrap().unwrap(), 3); - let file = IoFile { fd: 33 }; - let flush_task = tokio::spawn(async move { flush(&file).await }); + let file = IoFile::new(33); + let flush_task = mudu_sys::tokio::spawn(async move { flush(&file).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::File(FileIoRequest::Flush(request)) => { @@ -956,7 +1047,7 @@ mod tests { } flush_task.await.unwrap().unwrap(); - let close_task = tokio::spawn(async move { close(IoFile { fd: 33 }).await }); + let close_task = mudu_sys::tokio::spawn(async move { close(IoFile::new(33)).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::File(FileIoRequest::Close(request)) => { @@ -972,7 +1063,7 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn write_submit_and_wait_split_registration_from_completion() { let ring = install_test_ring(); - let file = IoFile { fd: 44 }; + let file = IoFile::new(44); let handle = write_submit(&file, vec![5, 6, 7], 16).unwrap(); match ring.take_pending().unwrap().unwrap().1 { @@ -991,9 +1082,9 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn blind_write_returns_after_registration() { let ring = install_test_ring(); - let file = IoFile { fd: 55 }; + let file = IoFile::new(55); - let write_task = tokio::spawn(async move { + let write_task = mudu_sys::tokio::spawn(async move { write_option( &file, vec![1, 2, 3, 4], @@ -1021,7 +1112,7 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn flush_submit_lsn_and_wait_split_registration_from_completion() { let ring = install_test_ring(); - let file = IoFile { fd: 61 }; + let file = IoFile::new(61); let handle = flush_submit_lsn(&file, vec![10, 11]).unwrap(); match ring.take_pending().unwrap().unwrap().1 { @@ -1039,8 +1130,8 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn flush_lsn_enqueues_request_and_returns_payload() { let ring = install_test_ring(); - let file = IoFile { fd: 41 }; - let task = tokio::spawn(async move { flush_lsn(&file, vec![7, 8, 9]).await }); + let file = IoFile::new(41); + let task = mudu_sys::tokio::spawn(async move { flush_lsn(&file, vec![7, 8, 9]).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { @@ -1057,9 +1148,50 @@ mod tests { } #[tokio::test(flavor = "current_thread")] - async fn open_without_current_ring_returns_error() { + async fn open_without_current_ring_uses_tokio_io() { unset_current_worker_ring(); - let err = open("/tmp/test-open", libc::O_RDONLY, 0).await.unwrap_err(); - assert_eq!(err.ec(), EC::NoSuchElement); + let path = std::env::temp_dir().join(format!( + "mudu-portable-file-{}", + mudu::common::id::gen_oid() + )); + let file = open( + &path, + libc::O_CREAT | libc::O_TRUNC | libc::O_RDWR | cloexec_flag(), + 0o644, + ) + .await + .unwrap(); + + assert_eq!(write(&file, b"abcdef".to_vec(), 0).await.unwrap(), 6); + flush(&file).await.unwrap(); + assert_eq!(read(&file, 3, 2).await.unwrap(), b"cde".to_vec()); + close(file).await.unwrap(); + + let _ = std::fs::remove_file(path); + } +} + +#[cfg(test)] +mod portable_tests { + use super::*; + use mudu::common::id::gen_oid; + + #[tokio::test(flavor = "current_thread")] + async fn portable_async_file_ops_use_tokio_io() { + let path = std::env::temp_dir().join(format!("mudu-portable-file-{}", gen_oid())); + let file = open( + &path, + libc::O_CREAT | libc::O_TRUNC | libc::O_RDWR | cloexec_flag(), + 0o644, + ) + .await + .unwrap(); + + assert_eq!(write(&file, b"abcdef".to_vec(), 0).await.unwrap(), 6); + flush(&file).await.unwrap(); + assert_eq!(read(&file, 3, 2).await.unwrap(), b"cde".to_vec()); + close(file).await.unwrap(); + + let _ = std::fs::remove_file(path); } } diff --git a/mudu_kernel/src/io/linux/path.rs b/mudu_kernel/src/io/linux/path.rs new file mode 100644 index 0000000..124c35c --- /dev/null +++ b/mudu_kernel/src/io/linux/path.rs @@ -0,0 +1,475 @@ +use std::ffi::CString; +use std::future::Future; +use std::os::unix::ffi::OsStrExt; +use std::path::{Component, Path, PathBuf}; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll}; +use tracing::trace; + +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; + +use crate::io::user_io::{complete_op, completion_error, op_state, poll_op, OpState}; +use crate::io::worker_ring::{ + has_current_worker_ring, with_current_ring, WorkerLocalRing, WorkerRingOp, +}; + +pub(crate) enum PathIoRequest { + CreateDir(PathCreateDirRequest), + PathExists(PathExistsRequest), + MetadataLen(PathMetadataLenRequest), + RemoveFile(PathRemoveFileRequest), +} + +pub(crate) enum PathInflightOp { + CreateDir(Box), + PathExists(Box), + MetadataLen(Box), + RemoveFile(Box), +} + +pub(crate) struct PathCreateDirRequest { + path: CString, + mode: u32, + state: Arc>, +} + +pub(crate) struct PathExistsRequest { + path: CString, + statx: Box, + state: Arc>, +} + +pub(crate) struct PathMetadataLenRequest { + path: CString, + statx: Box, + state: Arc>, +} + +pub(crate) struct PathRemoveFileRequest { + path: CString, + state: Arc>, +} + +enum PathFutureState { + Init, + Pending(Arc>), + Done, +} + +struct PathCreateDirFuture { + path: Option, + mode: u32, + state: PathFutureState<()>, +} + +struct PathExistsFuture { + path: Option, + state: PathFutureState, +} + +struct PathMetadataLenFuture { + path: Option, + state: PathFutureState, +} + +struct PathRemoveFileFuture { + path: Option, + state: PathFutureState<()>, +} + +impl PathCreateDirRequest { + fn new(path: CString, mode: u32, state: Arc>) -> Self { + Self { path, mode, state } + } + + fn path(&self) -> &CString { + &self.path + } + + fn mode(&self) -> u32 { + self.mode + } + + fn finish(self, result: RS<()>) { + complete_op(self.state, result); + } +} + +impl PathExistsRequest { + fn new(path: CString, state: Arc>) -> Self { + Self { + path, + statx: Box::new(unsafe { std::mem::zeroed() }), + state, + } + } + + fn path(&self) -> &CString { + &self.path + } + + fn statx_mut_ptr(&mut self) -> *mut libc::statx { + self.statx.as_mut() + } + + fn finish(self, result: RS) { + complete_op(self.state, result); + } +} + +impl PathMetadataLenRequest { + fn new(path: CString, state: Arc>) -> Self { + Self { + path, + statx: Box::new(unsafe { std::mem::zeroed() }), + state, + } + } + + fn path(&self) -> &CString { + &self.path + } + + fn statx_mut_ptr(&mut self) -> *mut libc::statx { + self.statx.as_mut() + } + + fn finish(self, result: RS) { + complete_op(self.state, result); + } +} + +impl PathRemoveFileRequest { + fn new(path: CString, state: Arc>) -> Self { + Self { path, state } + } + + fn path(&self) -> &CString { + &self.path + } + + fn finish(self, result: RS<()>) { + complete_op(self.state, result); + } +} + +impl PathCreateDirFuture { + fn new(path: CString, mode: u32) -> Self { + Self { + path: Some(path), + mode, + state: PathFutureState::Init, + } + } +} + +impl PathExistsFuture { + fn new(path: CString) -> Self { + Self { + path: Some(path), + state: PathFutureState::Init, + } + } +} + +impl PathMetadataLenFuture { + fn new(path: CString) -> Self { + Self { + path: Some(path), + state: PathFutureState::Init, + } + } +} + +impl PathRemoveFileFuture { + fn new(path: CString) -> Self { + Self { + path: Some(path), + state: PathFutureState::Init, + } + } +} + +impl Future for PathCreateDirFuture { + type Output = RS<()>; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + match &self.state { + PathFutureState::Init => { + let state = op_state(); + let path = self.path.take().unwrap(); + if let Err(err) = with_current_ring(|ring| { + ring.register(WorkerRingOp::Path(PathIoRequest::CreateDir( + PathCreateDirRequest::new(path, self.mode, state.clone()), + ))) + .map(|_| ()) + }) { + self.state = PathFutureState::Done; + return Poll::Ready(Err(err)); + } + self.state = PathFutureState::Pending(state); + self.poll(cx) + } + PathFutureState::Pending(state) => match poll_op(state, cx) { + Poll::Ready(result) => { + self.state = PathFutureState::Done; + Poll::Ready(result) + } + Poll::Pending => Poll::Pending, + }, + PathFutureState::Done => Poll::Pending, + } + } +} + +impl Future for PathExistsFuture { + type Output = RS; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + match &self.state { + PathFutureState::Init => { + let state = op_state(); + let path = self.path.take().unwrap(); + if let Err(err) = with_current_ring(|ring| { + ring.register(WorkerRingOp::Path(PathIoRequest::PathExists( + PathExistsRequest::new(path, state.clone()), + ))) + .map(|_| ()) + }) { + self.state = PathFutureState::Done; + return Poll::Ready(Err(err)); + } + self.state = PathFutureState::Pending(state); + self.poll(cx) + } + PathFutureState::Pending(state) => match poll_op(state, cx) { + Poll::Ready(result) => { + self.state = PathFutureState::Done; + Poll::Ready(result) + } + Poll::Pending => Poll::Pending, + }, + PathFutureState::Done => Poll::Pending, + } + } +} + +impl Future for PathMetadataLenFuture { + type Output = RS; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + match &self.state { + PathFutureState::Init => { + let state = op_state(); + let path = self.path.take().unwrap(); + if let Err(err) = with_current_ring(|ring| { + ring.register(WorkerRingOp::Path(PathIoRequest::MetadataLen( + PathMetadataLenRequest::new(path, state.clone()), + ))) + .map(|_| ()) + }) { + self.state = PathFutureState::Done; + return Poll::Ready(Err(err)); + } + self.state = PathFutureState::Pending(state); + self.poll(cx) + } + PathFutureState::Pending(state) => match poll_op(state, cx) { + Poll::Ready(result) => { + self.state = PathFutureState::Done; + Poll::Ready(result) + } + Poll::Pending => Poll::Pending, + }, + PathFutureState::Done => Poll::Pending, + } + } +} + +impl Future for PathRemoveFileFuture { + type Output = RS<()>; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + match &self.state { + PathFutureState::Init => { + let state = op_state(); + let path = self.path.take().unwrap(); + if let Err(err) = with_current_ring(|ring| { + ring.register(WorkerRingOp::Path(PathIoRequest::RemoveFile( + PathRemoveFileRequest::new(path, state.clone()), + ))) + .map(|_| ()) + }) { + self.state = PathFutureState::Done; + return Poll::Ready(Err(err)); + } + self.state = PathFutureState::Pending(state); + self.poll(cx) + } + PathFutureState::Pending(state) => match poll_op(state, cx) { + Poll::Ready(result) => { + self.state = PathFutureState::Done; + Poll::Ready(result) + } + Poll::Pending => Poll::Pending, + }, + PathFutureState::Done => Poll::Pending, + } + } +} + +pub async fn create_dir_all(path: &Path) -> RS<()> { + if !has_current_worker_ring() { + return mudu_sys::fs::create_dir_all(path); + } + for segment in path_prefixes(path) { + trace!(segment = %segment.display(), "io_path create_dir_all segment"); + let c_path = path_to_cstring(&segment)?; + PathCreateDirFuture::new(c_path, 0o755).await?; + } + Ok(()) +} + +pub async fn path_exists(path: &Path) -> RS { + if !has_current_worker_ring() { + return Ok(std::fs::metadata(path).is_ok()); + } + PathExistsFuture::new(path_to_cstring(path)?).await +} + +pub async fn metadata_len(path: &Path) -> RS { + if !has_current_worker_ring() { + return mudu_sys::fs::metadata_len(path); + } + PathMetadataLenFuture::new(path_to_cstring(path)?).await +} + +pub async fn remove_file_if_exists(path: &Path) -> RS<()> { + if !has_current_worker_ring() { + return mudu_sys::fs::remove_file_if_exists(path); + } + PathRemoveFileFuture::new(path_to_cstring(path)?).await +} + +pub(crate) fn submit_path_io( + request: PathIoRequest, + sqe: &mut mudu_sys::uring::SubmissionQueueEntry<'_>, +) -> PathInflightOp { + match request { + PathIoRequest::CreateDir(request) => { + trace!(path = %request.path().to_string_lossy(), "io_path submit mkdirat"); + sqe.prep_mkdirat(libc::AT_FDCWD, request.path(), request.mode()); + PathInflightOp::CreateDir(Box::new(request)) + } + PathIoRequest::PathExists(mut request) => { + let path = request.path().clone(); + trace!(path = %path.to_string_lossy(), "io_path submit statx exists"); + sqe.prep_statx( + libc::AT_FDCWD, + &path, + 0, + libc::STATX_BASIC_STATS, + request.statx_mut_ptr(), + ); + PathInflightOp::PathExists(Box::new(request)) + } + PathIoRequest::MetadataLen(mut request) => { + let path = request.path().clone(); + trace!(path = %path.to_string_lossy(), "io_path submit statx len"); + sqe.prep_statx( + libc::AT_FDCWD, + &path, + 0, + libc::STATX_SIZE, + request.statx_mut_ptr(), + ); + PathInflightOp::MetadataLen(Box::new(request)) + } + PathIoRequest::RemoveFile(request) => { + trace!(path = %request.path().to_string_lossy(), "io_path submit unlinkat"); + sqe.prep_unlinkat(libc::AT_FDCWD, request.path(), 0); + PathInflightOp::RemoveFile(Box::new(request)) + } + } +} + +pub(crate) fn complete_path_io( + _op_id: u64, + op: PathInflightOp, + result: i32, + _ring: &WorkerLocalRing, +) -> RS { + match op { + PathInflightOp::CreateDir(request) => { + trace!(path = %request.path().to_string_lossy(), result, "io_path complete mkdirat"); + if result < 0 && result != -libc::EEXIST { + request.finish(Err(completion_error("mkdirat", result))); + } else { + request.finish(Ok(())); + } + Ok(true) + } + PathInflightOp::PathExists(request) => { + trace!(path = %request.path().to_string_lossy(), result, "io_path complete statx exists"); + if result == -libc::ENOENT { + request.finish(Ok(false)); + } else if result < 0 { + request.finish(Err(completion_error("statx", result))); + } else { + request.finish(Ok(true)); + } + Ok(true) + } + PathInflightOp::MetadataLen(request) => { + trace!(path = %request.path().to_string_lossy(), result, "io_path complete statx len"); + if result < 0 { + request.finish(Err(completion_error("statx", result))); + } else { + let len = request.statx.stx_size; + request.finish(Ok(len)); + } + Ok(true) + } + PathInflightOp::RemoveFile(request) => { + trace!(path = %request.path().to_string_lossy(), result, "io_path complete unlinkat"); + if result == -libc::ENOENT { + request.finish(Ok(())); + } else if result < 0 { + request.finish(Err(completion_error("unlinkat", result))); + } else { + request.finish(Ok(())); + } + Ok(true) + } + } +} + +fn path_to_cstring(path: &Path) -> RS { + CString::new(path.as_os_str().as_bytes()).map_err(|_| { + m_error!( + EC::EncodeErr, + format!("path contains interior NUL: {}", path.display()) + ) + }) +} + +fn path_prefixes(path: &Path) -> Vec { + let mut prefixes = Vec::new(); + let mut current = PathBuf::new(); + for component in path.components() { + match component { + Component::Prefix(prefix) => current.push(prefix.as_os_str()), + Component::RootDir => current.push(component.as_os_str()), + Component::CurDir => {} + Component::ParentDir => current.push(component.as_os_str()), + Component::Normal(part) => { + current.push(part); + prefixes.push(current.clone()); + } + } + } + prefixes +} diff --git a/mudu_kernel/src/io/linux/socket.rs b/mudu_kernel/src/io/linux/socket.rs index c39727a..f454ddf 100644 --- a/mudu_kernel/src/io/linux/socket.rs +++ b/mudu_kernel/src/io/linux/socket.rs @@ -988,7 +988,7 @@ pub(crate) fn complete_socket_io( mod tests { use super::*; use crate::io::worker_ring::{set_current_worker_ring, unset_current_worker_ring}; - use tokio::task::yield_now; + use mudu_sys::tokio::task::yield_now; fn install_test_ring() -> Arc { let ring = Arc::new(WorkerLocalRing::new()); @@ -999,7 +999,8 @@ mod tests { #[tokio::test(flavor = "current_thread")] async fn socket_and_connect_enqueue_requests() { let ring = install_test_ring(); - let create_task = tokio::spawn(async { socket(libc::AF_INET, libc::SOCK_STREAM, 0).await }); + let create_task = + mudu_sys::tokio::spawn(async { socket(libc::AF_INET, libc::SOCK_STREAM, 0).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::Socket(SocketIoRequest::Socket(request)) => { @@ -1013,8 +1014,9 @@ mod tests { let sock = create_task.await.unwrap().unwrap(); assert_eq!(sock.fd(), 41); - let connect_task = - tokio::spawn(async move { connect(&sock, "127.0.0.1:9527".parse().unwrap()).await }); + let connect_task = mudu_sys::tokio::spawn(async move { + connect(&sock, "127.0.0.1:9527".parse().unwrap()).await + }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::Socket(SocketIoRequest::Connect(request)) => { @@ -1032,7 +1034,7 @@ mod tests { let ring = install_test_ring(); let sock = IoSocket { fd: 51 }; - let accept_task = tokio::spawn(async move { accept(&sock).await }); + let accept_task = mudu_sys::tokio::spawn(async move { accept(&sock).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::Socket(SocketIoRequest::Accept(request)) => { @@ -1045,7 +1047,7 @@ mod tests { assert_eq!(accepted.fd(), 61); assert_eq!(addr, "127.0.0.1:9010".parse::().unwrap()); - let recv_task = tokio::spawn(async move { + let recv_task = mudu_sys::tokio::spawn(async move { let mut buf = [0u8; 8]; let read = recv_into(&accepted, &mut buf, libc::MSG_DONTWAIT).await?; Ok::<_, mudu::error::err::MError>((read, buf)) @@ -1072,8 +1074,9 @@ mod tests { assert_eq!(&recv_buf[..3], &[7, 8, 9]); let send_sock = IoSocket { fd: 71 }; - let send_task = - tokio::spawn(async move { send(&send_sock, vec![1, 2, 3], libc::MSG_NOSIGNAL).await }); + let send_task = mudu_sys::tokio::spawn(async move { + send(&send_sock, vec![1, 2, 3], libc::MSG_NOSIGNAL).await + }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::Socket(SocketIoRequest::Send(request)) => { @@ -1088,7 +1091,7 @@ mod tests { let shutdown_sock = IoSocket { fd: 71 }; let shutdown_task = - tokio::spawn(async move { shutdown(&shutdown_sock, libc::SHUT_WR).await }); + mudu_sys::tokio::spawn(async move { shutdown(&shutdown_sock, libc::SHUT_WR).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::Socket(SocketIoRequest::Shutdown(request)) => { @@ -1100,7 +1103,7 @@ mod tests { } shutdown_task.await.unwrap().unwrap(); - let close_task = tokio::spawn(async move { close(IoSocket { fd: 71 }).await }); + let close_task = mudu_sys::tokio::spawn(async move { close(IoSocket { fd: 71 }).await }); yield_now().await; match ring.take_pending().unwrap().unwrap().1 { WorkerRingOp::Socket(SocketIoRequest::Close(request)) => { diff --git a/mudu_kernel/src/io/linux/worker_ring.rs b/mudu_kernel/src/io/linux/worker_ring.rs index 56dcf6c..e6a452d 100644 --- a/mudu_kernel/src/io/linux/worker_ring.rs +++ b/mudu_kernel/src/io/linux/worker_ring.rs @@ -6,10 +6,11 @@ use std::sync::{Arc, Mutex}; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; -use mudu_utils::task::try_this_task_id; +use mudu_utils::task_async::try_this_task_id; use mudu_utils::task_id::TaskID; use crate::io::file::{complete_file_io, submit_file_io, FileInflightOp, FileIoRequest}; +use crate::io::path::{complete_path_io, submit_path_io, PathInflightOp, PathIoRequest}; use crate::io::socket::{complete_socket_io, submit_socket_io, SocketInflightOp, SocketIoRequest}; use crate::server::task_registry::WorkerTaskRegistry; @@ -20,11 +21,13 @@ thread_local! { pub(crate) enum WorkerRingOp { File(FileIoRequest), + Path(PathIoRequest), Socket(SocketIoRequest), } pub(crate) enum UserIoInflight { File { op_id: u64, op: FileInflightOp }, + Path { op_id: u64, op: PathInflightOp }, Socket { op_id: u64, op: SocketInflightOp }, } @@ -32,6 +35,7 @@ impl UserIoInflight { pub(crate) fn op_id(&self) -> u64 { match self { Self::File { op_id, .. } => *op_id, + Self::Path { op_id, .. } => *op_id, Self::Socket { op_id, .. } => *op_id, } } @@ -39,6 +43,7 @@ impl UserIoInflight { pub(crate) fn kind(&self) -> &'static str { match self { Self::File { .. } => "file", + Self::Path { .. } => "path", Self::Socket { .. } => "socket", } } @@ -181,6 +186,10 @@ pub(crate) fn submit_user_ring_op( op_id, op: submit_file_io(request, sqe), }, + WorkerRingOp::Path(request) => UserIoInflight::Path { + op_id, + op: submit_path_io(request, sqe), + }, WorkerRingOp::Socket(request) => UserIoInflight::Socket { op_id, op: submit_socket_io(request, sqe), @@ -195,6 +204,7 @@ pub(crate) fn complete_user_ring_op( ) -> RS<()> { let (op_id, done) = match op { UserIoInflight::File { op_id, op } => (op_id, complete_file_io(op_id, op, result, ring)?), + UserIoInflight::Path { op_id, op } => (op_id, complete_path_io(op_id, op, result, ring)?), UserIoInflight::Socket { op_id, op } => { (op_id, complete_socket_io(op_id, op, result, ring)?) } diff --git a/mudu_kernel/src/io/mod.rs b/mudu_kernel/src/io/mod.rs index 011a0fe..55977bc 100644 --- a/mudu_kernel/src/io/mod.rs +++ b/mudu_kernel/src/io/mod.rs @@ -1,5 +1,8 @@ pub mod file; #[cfg(target_os = "linux")] +#[path = "linux/path.rs"] +pub mod path; +#[cfg(target_os = "linux")] #[path = "linux/socket.rs"] pub mod socket; pub(crate) mod user_io; diff --git a/mudu_kernel/src/io/portable/worker_ring.rs b/mudu_kernel/src/io/portable/worker_ring.rs index 9e0232f..d86ea71 100644 --- a/mudu_kernel/src/io/portable/worker_ring.rs +++ b/mudu_kernel/src/io/portable/worker_ring.rs @@ -1,42 +1,18 @@ use std::sync::Arc; -use mudu::common::result::RS; -use mudu::error::ec::EC; -use mudu::m_error; - pub(crate) struct WorkerLocalRing; -pub(crate) enum WorkerRingOp { - File(crate::io::file::FileIoRequest), -} - -impl WorkerLocalRing { - pub(crate) fn register(&self, _op: WorkerRingOp) -> RS { - Err(m_error!( - EC::NotImplemented, - "worker ring is only available on linux" - )) - } -} - +#[allow(dead_code)] pub(crate) fn set_current_worker_ring(_ring: Arc) {} +#[allow(dead_code)] pub(crate) fn unset_current_worker_ring() {} pub(crate) fn has_current_worker_ring() -> bool { false } +#[allow(dead_code)] pub(crate) fn current_ring() -> &'static WorkerLocalRing { panic!("worker ring is only available on linux") } - -pub(crate) fn with_current_ring(_f: F) -> RS -where - F: FnOnce(&Arc) -> RS, -{ - Err(m_error!( - EC::NotImplemented, - "worker ring is only available on linux" - )) -} diff --git a/mudu_kernel/src/io/user_io.rs b/mudu_kernel/src/io/user_io.rs index 303f13b..b2d3545 100644 --- a/mudu_kernel/src/io/user_io.rs +++ b/mudu_kernel/src/io/user_io.rs @@ -1,10 +1,14 @@ use mudu::common::result::RS; +#[cfg(target_os = "linux")] use mudu::error::ec::EC; +#[cfg(target_os = "linux")] use mudu::error::err::MError; +#[cfg(target_os = "linux")] use mudu::m_error; use std::sync::{Arc, Mutex}; use std::task::{Context, Poll, Waker}; +#[cfg(target_os = "linux")] pub(crate) fn completion_error(kind: &'static str, result: i32) -> MError { m_error!( EC::IOErr, @@ -12,41 +16,45 @@ pub(crate) fn completion_error(kind: &'static str, result: i32) -> MError { ) } +struct OpStateInner { + result: Option>, + waker: Option, +} + pub(crate) struct OpState { - result: Mutex>>, - waker: Mutex>, + inner: Mutex>, } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] pub(crate) fn op_state() -> Arc> { Arc::new(OpState { - result: Mutex::new(None), - waker: Mutex::new(None), + inner: Mutex::new(OpStateInner { + result: None, + waker: None, + }), }) } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] pub(crate) fn complete_op(state: Arc>, result: RS) { - if let Ok(mut slot) = state.result.lock() { - *slot = Some(result); - } - if let Ok(mut waker) = state.waker.lock() { - if let Some(waker) = waker.take() { + if let Ok(mut inner) = state.inner.lock() { + inner.result = Some(result); + if let Some(waker) = inner.waker.take() { waker.wake(); } } } pub(crate) fn poll_op(state: &Arc>, cx: &mut Context<'_>) -> Poll> { - if let Ok(mut slot) = state.result.lock() { - if let Some(result) = slot.take() { + if let Ok(mut inner) = state.inner.lock() { + if let Some(result) = inner.result.take() { return Poll::Ready(result); } - } - if let Ok(mut waker) = state.waker.lock() { - *waker = Some(cx.waker().clone()); + inner.waker = Some(cx.waker().clone()); } Poll::Pending } pub(crate) fn try_take_op(state: &Arc>) -> Option> { - state.result.lock().ok()?.take() + state.inner.lock().ok()?.result.take() } diff --git a/mudu_kernel/src/lib.rs b/mudu_kernel/src/lib.rs index e3f24af..50a7f23 100644 --- a/mudu_kernel/src/lib.rs +++ b/mudu_kernel/src/lib.rs @@ -1,3 +1,4 @@ +pub mod async_rt; mod common; pub mod contract; pub mod fuzz; @@ -16,3 +17,5 @@ pub mod server; pub mod storage; mod tx; pub mod x_engine; + +pub use mudu_sys::tokio; diff --git a/mudu_kernel/src/meta/meta_mgr.rs b/mudu_kernel/src/meta/meta_mgr.rs index bc2f425..bbfd827 100644 --- a/mudu_kernel/src/meta/meta_mgr.rs +++ b/mudu_kernel/src/meta/meta_mgr.rs @@ -10,6 +10,8 @@ use mudu::common::id::OID; use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; +use mudu_utils::sync::a_mutex::AMutex; +use tracing::trace; use crate::contract::meta_mgr::MetaMgr; use crate::contract::partition_rule::PartitionRuleDesc; @@ -35,7 +37,7 @@ use crate::meta::schema_catalog::{ use crate::storage::relation::relation::Relation; type MetaMgrRegistry = HashMap>>; -type DdlLockRegistry = HashMap>>; +type DdlLockRegistry = HashMap>>; fn registry() -> &'static StdMutex { static REGISTRY: OnceLock> = OnceLock::new(); @@ -47,19 +49,19 @@ fn ddl_lock_registry() -> &'static StdMutex { DDL_LOCKS.get_or_init(|| StdMutex::new(HashMap::new())) } -fn ddl_lock_for(path: &str) -> Arc> { +fn ddl_lock_for(path: &str) -> Arc> { let mut guard = ddl_lock_registry().lock().unwrap(); if let Some(existing) = guard.get(path).and_then(Weak::upgrade) { return existing; } - let created = Arc::new(tokio::sync::Mutex::new(())); + let created = Arc::new(AMutex::new(())); let _ = guard.insert(path.to_string(), Arc::downgrade(&created)); created } pub struct MetaMgrImpl { path: String, - ddl_lock: Arc>, + ddl_lock: Arc>, schema_catalog: Relation, partition_rule_catalog: Relation, partition_binding_catalog: Relation, @@ -193,13 +195,19 @@ impl MetaMgrImpl { } pub async fn create_table_inner(&self, schema: &SchemaTable) -> RS<()> { + trace!(table = %schema.table_name(), oid = schema.id(), "meta_mgr create_table_inner start"); let _ddl_guard = self.ddl_lock.lock().await; + trace!(table = %schema.table_name(), oid = schema.id(), "meta_mgr create_table_inner acquired ddl lock"); if self.table.contains_sync(schema.table_name()) { return Err(m_error!(ER::ExistingSuchElement, "")); } + trace!(table = %schema.table_name(), oid = schema.id(), "meta_mgr writing schema to catalog"); write_schema_to_catalog(&self.schema_catalog, schema, self.next_catalog_xid()).await?; - self.broadcast_create(schema) + trace!(table = %schema.table_name(), oid = schema.id(), "meta_mgr wrote schema to catalog"); + let r = self.broadcast_create(schema); + trace!(table = %schema.table_name(), oid = schema.id(), "meta_mgr broadcast create done"); + r } pub async fn drop_table_inner(&self, oid: OID) -> RS<()> { @@ -483,14 +491,21 @@ unsafe impl Send for MetaMgrImpl {} #[cfg(test)] mod tests { use std::env::temp_dir; - + use std::future::Future; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dt_info::DTInfo; - use crate::contract::schema_column::SchemaColumn; use super::*; + fn block_on(fut: F) -> F::Output + where + F: Future + 'static, + F::Output: 'static, + { + mudu_sys::task_async::block_on_tokio_current_thread(fut).unwrap() + } + fn test_schema() -> SchemaTable { SchemaTable::new( "meta_recovery_t".to_string(), @@ -516,9 +531,10 @@ mod tests { let dir = temp_dir().join(format!("meta_mgr_catalog_{}", mudu::common::id::gen_oid())); let mgr = Arc::new(MetaMgrImpl::new(&dir).unwrap()); mgr.register_global(); - + let _mgr = mgr.clone(); let schema = test_schema(); - futures::executor::block_on(mgr.create_table(&schema)).unwrap(); + let _schema = schema.clone(); + let _ = block_on(async move { _mgr.create_table(&_schema).await }); assert_eq!( crate::meta::schema_catalog::load_schemas_from_catalog(&mgr.schema_catalog) .unwrap() @@ -528,24 +544,37 @@ mod tests { drop(mgr); let reopened = MetaMgrImpl::new(&dir).unwrap(); - let table = futures::executor::block_on(reopened.get_table_by_id(schema.id())).unwrap(); + let schema_id = schema.id(); + let table = block_on(async move { + reopened.get_table_by_id(schema_id).await + }).unwrap(); assert_eq!(table.name(), schema.table_name()); } #[test] - fn meta_mgr_broadcasts_ddl_to_peer_instances() { + fn meta_mgr_broadcasts_ddl_to_peer_instances() { + block_on(async move { + let r = _meta_mgr_broadcasts_ddl_to_peer_instances().await; + assert!(r.is_ok()); + }); + } + async fn _meta_mgr_broadcasts_ddl_to_peer_instances() -> RS<()> { let dir = temp_dir().join(format!("meta_mgr_peer_{}", mudu::common::id::gen_oid())); - let mgr1 = Arc::new(MetaMgrImpl::new(&dir).unwrap()); + let mgr1 = Arc::new(MetaMgrImpl::new(&dir)?); mgr1.register_global(); - let mgr2 = Arc::new(MetaMgrImpl::new(&dir).unwrap()); + let mgr2 = Arc::new(MetaMgrImpl::new(&dir)?); mgr2.register_global(); let schema = test_schema(); - futures::executor::block_on(mgr1.create_table(&schema)).unwrap(); - let table = futures::executor::block_on(mgr2.get_table_by_id(schema.id())).unwrap(); + mgr1.create_table(&schema).await?; + let table = mgr2.get_table_by_id(schema.id()).await?; assert_eq!(table.name(), schema.table_name()); - futures::executor::block_on(mgr2.drop_table(schema.id())).unwrap(); - assert!(futures::executor::block_on(mgr1.get_table_by_id(schema.id())).is_err()); + mgr2.drop_table(schema.id()).await?; + assert!(mgr1.get_table_by_id(schema.id()).await.is_err()); + Ok(()) } + + + } diff --git a/mudu_kernel/src/mudu_conn/mudu_conn_async.rs b/mudu_kernel/src/mudu_conn/mudu_conn_async.rs index 0966fa8..6c725f8 100644 --- a/mudu_kernel/src/mudu_conn/mudu_conn_async.rs +++ b/mudu_kernel/src/mudu_conn/mudu_conn_async.rs @@ -14,19 +14,21 @@ use mudu_contract::protocol::{ encode_batch_request, encode_client_request_with_message_type, encode_session_create_request, ClientRequest, Frame, FrameHeader, MessageType, SessionCreateRequest, HEADER_LEN, }; +use mudu_utils::sync::a_mutex::{AMutex, AMutexGuard}; use sql_parser::ast::parser::SQLParser; use sql_parser::ast::stmt_type::StmtType; +use std::net::SocketAddr; use std::sync::{Arc, Mutex, OnceLock}; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; -use tokio::net::TcpStream; -use tokio::sync::Mutex as AsyncMutex; +use crate::async_rt::contract::{AsyncRuntime, AsyncStream}; use crate::mudu_conn::mudu_prepared_stmt::MuduPreparedStmt; use crate::server::worker_local::{try_current_worker_local, WorkerExecute, WorkerLocalRef}; use crate::sql::describer::Describer; static DEFAULT_REMOTE_ADDR: OnceLock>> = OnceLock::new(); static DEFAULT_REMOTE_WORKER_ID: OnceLock>> = OnceLock::new(); +static DEFAULT_REMOTE_ASYNC_RUNTIME: OnceLock>>> = + OnceLock::new(); enum ConnBackend { WorkerLocal(WorkerLocalRef), @@ -36,19 +38,20 @@ enum ConnBackend { struct RemoteWorkerConn { addr: String, worker_id: Option, - session_id: AsyncMutex>, - stream: AsyncMutex>, + async_runtime: Option>, + session_id: Mutex>, + stream: AMutex>, } struct RemoteProtocolClient { - stream: TcpStream, + stream: Box, next_request_id: u64, } pub struct MuduConnAsync { backend: ConnBackend, parser: Arc, - session_id: Arc>>, + session_id: Arc>>, } pub fn set_default_remote_addr(addr: Option) { @@ -65,6 +68,24 @@ pub fn set_default_remote_worker_id(worker_id: Option) { } } +pub fn set_default_remote_async_runtime(async_runtime: Option>) { + let slot = DEFAULT_REMOTE_ASYNC_RUNTIME.get_or_init(|| Mutex::new(None)); + if let Ok(mut guard) = slot.lock() { + *guard = async_runtime; + } +} + +pub fn clear_default_remote_if_current(addr: &str, worker_id: Option) { + let current_addr = default_remote_addr(); + let current_worker_id = default_remote_worker_id(); + if current_addr.as_deref() != Some(addr) || current_worker_id != worker_id { + return; + } + set_default_remote_addr(None); + set_default_remote_worker_id(None); + set_default_remote_async_runtime(None); +} + fn default_remote_addr() -> Option { DEFAULT_REMOTE_ADDR .get() @@ -77,13 +98,23 @@ fn default_remote_worker_id() -> Option { .and_then(|slot| slot.lock().ok().and_then(|guard| *guard)) } +fn default_remote_async_runtime() -> Option> { + DEFAULT_REMOTE_ASYNC_RUNTIME + .get() + .and_then(|slot| slot.lock().ok().and_then(|guard| guard.clone())) +} + impl MuduConnAsync { pub fn new() -> RS { + Self::new_with_runtime(default_remote_async_runtime()) + } + + pub fn new_with_runtime(async_runtime: Option>) -> RS { if let Some(worker_local) = try_current_worker_local() { return Ok(Self { backend: ConnBackend::WorkerLocal(worker_local), parser: Arc::new(SQLParser::new()), - session_id: Arc::new(AsyncMutex::new(None)), + session_id: Arc::new(Mutex::new(None)), }); } let addr = default_remote_addr().ok_or_else(|| { @@ -96,13 +127,14 @@ impl MuduConnAsync { let remote = Arc::new(RemoteWorkerConn { addr, worker_id: default_remote_worker_id(), - session_id: AsyncMutex::new(None), - stream: AsyncMutex::new(None), + async_runtime, + session_id: Mutex::new(None), + stream: AMutex::new(None), }); Ok(Self { backend: ConnBackend::Remote(remote), parser, - session_id: Arc::new(AsyncMutex::new(None)), + session_id: Arc::new(Mutex::new(None)), }) } @@ -118,12 +150,18 @@ impl MuduConnAsync { async fn ensure_session_id(&self) -> RS { match &self.backend { ConnBackend::WorkerLocal(worker_local) => { - let mut guard = self.session_id.lock().await; - if let Some(session_id) = *guard { + let trace = mudu_utils::task_trace!(); + if let Some(session_id) = *self.session_id.lock().unwrap() { + trace.watch("mudu_conn.ensure_session_id.stage", "cached"); return Ok(session_id); } let session_id = worker_local.open_async().await?; + let mut guard = self.session_id.lock().unwrap(); + if let Some(existing) = *guard { + return Ok(existing); + } *guard = Some(session_id); + trace.watch("mudu_conn.ensure_session_id.stage", "store_done"); Ok(session_id) } ConnBackend::Remote(remote) => remote.ensure_session_id().await, @@ -132,27 +170,28 @@ impl MuduConnAsync { async fn active_session_id(&self) -> RS { match &self.backend { - ConnBackend::WorkerLocal(_) => { - let guard = self.session_id.lock().await; - guard.ok_or_else(|| m_error!(EC::NoSuchElement, "no active session")) - } + ConnBackend::WorkerLocal(_) => self + .session_id + .lock() + .unwrap() + .ok_or_else(|| m_error!(EC::NoSuchElement, "no active session")), ConnBackend::Remote(remote) => remote.active_session_id().await, } } } impl RemoteWorkerConn { - async fn client(&self) -> RS>> { + async fn client(&self) -> RS>> { let mut guard = self.stream.lock().await; if guard.is_none() { - *guard = Some(RemoteProtocolClient::connect(&self.addr).await?); + *guard = + Some(RemoteProtocolClient::connect(&self.addr, self.async_runtime.clone()).await?); } Ok(guard) } async fn ensure_session_id(&self) -> RS { - let mut guard = self.session_id.lock().await; - if let Some(session_id) = *guard { + if let Some(session_id) = *self.session_id.lock().unwrap() { return Ok(session_id); } let mut client_guard = self.client().await?; @@ -171,13 +210,19 @@ impl RemoteWorkerConn { encode_session_create_request(request_id, &SessionCreateRequest::new(config_json))?; let frame = client.send_and_receive(&payload).await?; let session_id = decode_session_create_response(&frame)?.session_id(); + let mut guard = self.session_id.lock().unwrap(); + if let Some(existing) = *guard { + return Ok(existing); + } *guard = Some(session_id); Ok(session_id) } async fn active_session_id(&self) -> RS { - let guard = self.session_id.lock().await; - guard.ok_or_else(|| m_error!(EC::NoSuchElement, "no active session")) + self.session_id + .lock() + .unwrap() + .ok_or_else(|| m_error!(EC::NoSuchElement, "no active session")) } async fn batch_sql(&self, sql: String) -> RS { @@ -211,17 +256,21 @@ impl RemoteWorkerConn { } impl RemoteProtocolClient { - async fn connect(addr: &str) -> RS { - let stream = TcpStream::connect(addr).await.map_err(|e| { + async fn connect(addr: &str, async_runtime: Option>) -> RS { + let addr: SocketAddr = addr.parse().map_err(|e| { m_error!( - EC::NetErr, - format!("connect io_uring tcp server error: addr={addr}"), + EC::ParseErr, + format!("parse remote mududb addr error: {addr}"), e ) })?; - stream - .set_nodelay(true) - .map_err(|e| m_error!(EC::NetErr, format!("set tcp nodelay error: addr={addr}"), e))?; + let stream = match async_runtime.or_else(default_remote_async_runtime) { + Some(async_runtime) => async_runtime.net().connect_tcp(addr).await?, + None => { + let runtime = crate::async_rt::tokio::runtime::TokioRuntime::new(); + runtime.net().connect_tcp(addr).await? + } + }; Ok(Self { stream, next_request_id: 1, @@ -239,25 +288,15 @@ impl RemoteProtocolClient { .write_all(payload) .await .map_err(|e| m_error!(EC::NetErr, "write request frame error", e))?; - self.stream - .flush() - .await - .map_err(|e| m_error!(EC::NetErr, "flush request frame error", e))?; let mut header = [0u8; HEADER_LEN]; - self.stream - .read_exact(&mut header) - .await - .map_err(|e| m_error!(EC::NetErr, "read response header error", e))?; + read_exact(self.stream.as_mut(), &mut header).await?; let payload_len = FrameHeader::decode_header_bytes(&header)?.payload_len() as usize; let mut frame_bytes = Vec::with_capacity(HEADER_LEN + payload_len); frame_bytes.extend_from_slice(&header); if payload_len > 0 { let mut body = vec![0u8; payload_len]; - self.stream - .read_exact(&mut body) - .await - .map_err(|e| m_error!(EC::NetErr, "read response payload error", e))?; + read_exact(self.stream.as_mut(), &mut body).await?; frame_bytes.extend_from_slice(&body); } let frame = Frame::decode(&frame_bytes)?; @@ -269,6 +308,21 @@ impl RemoteProtocolClient { } } +async fn read_exact(stream: &mut dyn AsyncStream, buf: &mut [u8]) -> RS<()> { + let mut done = 0usize; + while done < buf.len() { + let n = stream.read(&mut buf[done..]).await?; + if n == 0 { + return Err(m_error!( + EC::NetErr, + "unexpected eof while reading remote response" + )); + } + done += n; + } + Ok(()) +} + #[async_trait] impl DBConnAsync for MuduConnAsync { async fn prepare(&self, stmt: Box) -> RS> { @@ -307,12 +361,15 @@ impl DBConnAsync for MuduConnAsync { } async fn begin_tx(&self) -> RS { + let trace = mudu_utils::task_trace!(); let session_id = self.ensure_session_id().await?; + trace.watch("mudu_conn.begin_tx.stage", "ensure_session_id_done"); match &self.backend { ConnBackend::WorkerLocal(worker_local) => { worker_local .execute_async(session_id, WorkerExecute::BeginTx) .await?; + trace.watch("mudu_conn.begin_tx.stage", "execute_async_done"); Ok(session_id) } ConnBackend::Remote(_) => Err(m_error!( diff --git a/mudu_kernel/src/mudu_conn/mudu_conn_core.rs b/mudu_kernel/src/mudu_conn/mudu_conn_core.rs index e2c0349..6550a03 100644 --- a/mudu_kernel/src/mudu_conn/mudu_conn_core.rs +++ b/mudu_kernel/src/mudu_conn/mudu_conn_core.rs @@ -7,6 +7,7 @@ use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; use mudu_contract::tuple::typed_bin::TypedBin; use mudu_type::datum::DatumDyn; +use mudu_utils::{scoped_task_trace, task_trace}; use sql_parser::ast::parser::SQLParser; use sql_parser::ast::stmt_type::StmtType; use std::sync::Arc; @@ -81,6 +82,7 @@ impl MuduConnCore { tx_mgr: Arc, x_contract: Arc, ) -> RS { + scoped_task_trace!(); self.execute_inner(stmt, params, tx_mgr, x_contract).await } @@ -91,6 +93,8 @@ impl MuduConnCore { tx_mgr: Arc, x_contract: Arc, ) -> RS<(Vec, TupleFieldDesc)> { + let trace = task_trace!(); + trace.watch("query.stage", "bind"); let bound = Binder::new(self.meta_mgr.clone()) .bind(stmt, params.as_ref()) .await?; @@ -102,7 +106,9 @@ impl MuduConnCore { meta_mgr: self.meta_mgr.clone(), x_contract, }); + trace.watch("query.stage", "plan"); let exec = planner.plan_query(bound_query).await?; + trace.watch("query.stage", "exec_rows"); query_exec_to_rows(exec).await } @@ -113,9 +119,12 @@ impl MuduConnCore { tx_mgr: Arc, x_contract: Arc, ) -> RS { + let trace = task_trace!(); + trace.watch("procedure.core_execute.stage", "bind_start"); let bound = Binder::new(self.meta_mgr.clone()) .bind(stmt, params.as_ref()) .await?; + trace.watch("procedure.core_execute.stage", "bind_done"); let BoundStmt::Command(bound_command) = bound else { return Err(m_error!(EC::TypeErr, "statement is not a command")); }; @@ -124,18 +133,34 @@ impl MuduConnCore { meta_mgr: self.meta_mgr.clone(), x_contract, }); + trace.watch("procedure.core_execute.stage", "plan_command_start"); let cmd = planner.plan_command(bound_command).await?; + trace.watch("procedure.core_execute.stage", "plan_command_done"); + trace.watch("procedure.core_execute.stage", "prepare_start"); cmd.prepare().await?; + trace.watch("procedure.core_execute.stage", "prepare_done"); + trace.watch("procedure.core_execute.stage", "run_start"); cmd.run().await?; + trace.watch("procedure.core_execute.stage", "run_done"); + trace.watch("procedure.core_execute.stage", "affected_rows_start"); cmd.affected_rows().await } } pub async fn query_exec_to_rows(exec: Arc) -> RS<(Vec, TupleFieldDesc)> { + let trace = task_trace!(); + trace.watch("query.exec.stage", "open"); exec.open().await?; let desc = exec.tuple_desc()?; let mut rows = Vec::new(); - while let Some(row) = exec.next().await? { + loop { + trace.watch("query.exec.stage", "next"); + trace.watch("query.exec.row_index", &rows.len().to_string()); + let next = exec.next().await?; + let Some(row) = next else { + trace.watch("query.exec.stage", "done"); + break; + }; rows.push(tuple_field_to_value(row, &desc)?); } Ok((rows, desc)) diff --git a/mudu_kernel/src/mudu_conn/mudu_prepared_stmt.rs b/mudu_kernel/src/mudu_conn/mudu_prepared_stmt.rs index fccfce7..db6b846 100644 --- a/mudu_kernel/src/mudu_conn/mudu_prepared_stmt.rs +++ b/mudu_kernel/src/mudu_conn/mudu_prepared_stmt.rs @@ -6,8 +6,7 @@ use mudu_contract::database::result_set::ResultSetAsync; use mudu_contract::database::sql_params::SQLParams; use mudu_contract::database::sql_stmt::SQLStmt; use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; -use std::sync::Arc; -use tokio::sync::Mutex; +use std::sync::{Arc, Mutex}; use crate::server::worker_local::WorkerLocalRef; @@ -34,8 +33,7 @@ impl MuduPreparedStmt { } async fn current_oid(&self) -> OID { - let guard = self.session_id.lock().await; - guard.unwrap_or(0) + self.session_id.lock().unwrap().unwrap_or(0) } } diff --git a/mudu_kernel/src/mudu_conn/mudu_result_set_async.rs b/mudu_kernel/src/mudu_conn/mudu_result_set_async.rs index ef22424..ed03b8f 100644 --- a/mudu_kernel/src/mudu_conn/mudu_result_set_async.rs +++ b/mudu_kernel/src/mudu_conn/mudu_result_set_async.rs @@ -3,14 +3,14 @@ use mudu::common::result::RS; use mudu_contract::database::result_set::ResultSetAsync; use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; +use mudu_utils::sync::f_mutex::FMutex; use std::sync::Arc; -use tokio::sync::Mutex; use crate::contract::query_exec::QueryExec; pub struct MuduResultSetAsync { desc: Arc, - inner: Mutex, + inner: FMutex, } struct ResultRows { @@ -22,7 +22,7 @@ impl MuduResultSetAsync { pub fn from_rows(rows: Vec, desc: TupleFieldDesc) -> Self { Self { desc: Arc::new(desc), - inner: Mutex::new(ResultRows { rows, index: 0 }), + inner: FMutex::new(ResultRows { rows, index: 0 }), } } diff --git a/mudu_kernel/src/server/async_func_task.rs b/mudu_kernel/src/server/async_func_task.rs index 5eeb07a..1c50c2b 100644 --- a/mudu_kernel/src/server/async_func_task.rs +++ b/mudu_kernel/src/server/async_func_task.rs @@ -3,6 +3,7 @@ use crate::server::routing::SessionOpenTransferAction; use mudu::common::id::OID; use mudu::common::result::RS; +use mudu_utils::task_id::TaskID; use std::future::Future; use std::pin::Pin; use std::sync::atomic::{AtomicBool, Ordering}; @@ -10,6 +11,7 @@ use std::sync::Arc; pub struct AsyncFuncTask { conn_id: u64, + trace_task_id: TaskID, request_id: u64, future: AsyncFuncFuture, queued: Arc, @@ -58,12 +60,14 @@ impl SessionTransferDispatch { impl AsyncFuncTask { pub(in crate::server) fn new( conn_id: u64, + trace_task_id: TaskID, request_id: u64, future: AsyncFuncFuture, completed: Arc, ) -> Self { Self { conn_id, + trace_task_id, request_id, future, queued: Arc::new(AtomicBool::new(false)), @@ -76,6 +80,10 @@ impl AsyncFuncTask { self.conn_id } + pub(in crate::server) fn trace_task_id(&self) -> TaskID { + self.trace_task_id + } + pub(in crate::server) fn request_id(&self) -> u64 { self.request_id } diff --git a/mudu_kernel/src/server/frame_dispatch.rs b/mudu_kernel/src/server/frame_dispatch.rs index b94457b..689cd87 100644 --- a/mudu_kernel/src/server/frame_dispatch.rs +++ b/mudu_kernel/src/server/frame_dispatch.rs @@ -4,7 +4,7 @@ use crate::server::async_func_task::HandleResult; use crate::server::message_dispatcher::MessageDispatcher; use crate::server::request_ctx::RequestCtx; use crate::server::session_bound_worker_runtime::new_session_bound_worker_runtime; -use crate::server::worker::IoUringWorker; +use crate::server::worker::WorkerRuntime; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; @@ -25,7 +25,7 @@ pub fn try_decode_next_frame(buf: &[u8]) -> RS> { } pub async fn dispatch_frame_async( - worker: &IoUringWorker, + worker: &WorkerRuntime, conn_id: u64, frame: &Frame, ) -> RS { diff --git a/mudu_kernel/src/server/linux/connection_worker_task.rs b/mudu_kernel/src/server/linux/connection_worker_task.rs index 3ee42b5..742aa5b 100644 --- a/mudu_kernel/src/server/linux/connection_worker_task.rs +++ b/mudu_kernel/src/server/linux/connection_worker_task.rs @@ -4,20 +4,20 @@ use crate::server::frame_dispatch::dispatch_frame_async; use crate::server::protocol_codec::{read_next_frame, write_response}; use crate::server::routing::ConnectionTransfer; use crate::server::transferred_connection::TransferredConnection; -use crate::server::worker::IoUringWorker; +use crate::server::worker::WorkerRuntime; use crate::server::worker_mailbox::WorkerMailboxMsg; use crate::server::worker_ring_loop::WorkerRingLoop; use crate::server::worker_task::WorkerTaskFuture; use crossbeam_queue::SegQueue; use mudu::common::result::RS; use mudu_contract::protocol::encode_merror_response; -use mudu_utils::task_trace; use std::net::SocketAddr; use std::os::fd::RawFd; use std::sync::Arc; +use tracing::trace; pub(in crate::server) fn spawn_connection_worker_task( - worker: IoUringWorker, + worker: WorkerRuntime, mailbox_fds: Vec, mailboxes: Vec>>, connections: Arc>, @@ -42,7 +42,7 @@ pub(in crate::server) fn spawn_connection_worker_task( } async fn run_connection_worker_task( - worker: IoUringWorker, + worker: WorkerRuntime, mailbox_fds: Vec, mailboxes: Vec>>, connections: Arc>, @@ -51,7 +51,7 @@ async fn run_connection_worker_task( remote_addr: SocketAddr, initial_response: Option>, ) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let r = _run_connection_worker_task( worker, mailbox_fds, @@ -66,7 +66,7 @@ async fn run_connection_worker_task( r } async fn _run_connection_worker_task( - worker: IoUringWorker, + worker: WorkerRuntime, mailbox_fds: Vec, mailboxes: Vec>>, conn_id: u64, @@ -74,34 +74,67 @@ async fn _run_connection_worker_task( remote_addr: SocketAddr, initial_response: Option>, ) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let mut socket = Some(socket); let mut read_buf = Vec::with_capacity(8192); + trace!( + conn_id, + remote_addr = %remote_addr, + "io_uring connection worker started" + ); if let Some(response) = initial_response { + trace!( + conn_id, + bytes = response.len(), + "sending initial connection response" + ); write_response(socket.as_ref().unwrap(), &response).await?; } loop { + trace!(conn_id, "waiting for next protocol frame"); let frame = match read_next_frame(socket.as_ref().unwrap(), &mut read_buf).await { Ok(Some(frame)) => frame, Ok(None) => { + trace!(conn_id, "connection closed by peer"); close(socket.take().unwrap()).await?; worker.close_connection_sessions(conn_id)?; break; } Err(err) => { + trace!(conn_id, error = %err, "read protocol frame failed"); let _ = close(socket.take().unwrap()).await; return Err(err); } }; let request_id = frame.header().request_id(); + trace!( + conn_id, + request_id, + message_type = ?frame.header().message_type(), + payload_len = frame.header().payload_len(), + "received protocol frame" + ); match dispatch_frame_async(&worker, conn_id, &frame).await { Ok(HandleResult::Response(response)) => { + trace!( + conn_id, + request_id, + response_bytes = response.len(), + "dispatch completed with response" + ); write_response(socket.as_ref().unwrap(), &response).await?; } Ok(HandleResult::Transfer(transfer)) => { + trace!( + conn_id, + request_id, + target_worker = transfer.target_worker(), + session_count = transfer.session_ids().len(), + "dispatch requested connection transfer" + ); let connection = build_transfer( conn_id, remote_addr, @@ -117,12 +150,19 @@ async fn _run_connection_worker_task( break; } Err(err) => { + trace!( + conn_id, + request_id, + error = %err, + "dispatch returned error response" + ); let response = encode_merror_response(request_id, &err)?; write_response(socket.as_ref().unwrap(), &response).await?; } } read_buf = frame.into_payload(); } + trace!(conn_id, "io_uring connection worker stopped"); Ok(()) } diff --git a/mudu_kernel/src/server/linux/loop_mailbox.rs b/mudu_kernel/src/server/linux/loop_mailbox.rs index 9c76152..2108e61 100644 --- a/mudu_kernel/src/server/linux/loop_mailbox.rs +++ b/mudu_kernel/src/server/linux/loop_mailbox.rs @@ -2,12 +2,14 @@ use std::collections::HashMap; use crossbeam_queue::SegQueue; use mudu::common::result::RS; +use tracing::debug; use crate::server::inflight_op::InflightOp; use crate::server::worker_loop_stats::WorkerLoopStats; use crate::server::worker_mailbox::WorkerMailboxMsg; pub(in crate::server) struct LoopMailboxSubmitCtx<'a> { + pub worker_id: u128, pub ring: &'a mut mudu_sys::uring::IoUring, pub mailbox_fd: i32, pub mailbox_read_submitted: &'a mut bool, @@ -26,11 +28,19 @@ pub(in crate::server) fn drain_messages( stats.mailbox_drained += 1; drained.push(msg); } + debug!(count = drained.len(), "loop_mailbox drained messages"); drained } pub(in crate::server) fn submit_read_if_needed(ctx: &mut LoopMailboxSubmitCtx<'_>) -> RS<()> { if *ctx.mailbox_read_submitted || ctx.shutting_down { + debug!( + worker_id = ctx.worker_id, + mailbox_fd = ctx.mailbox_fd, + mailbox_read_submitted = *ctx.mailbox_read_submitted, + shutting_down = ctx.shutting_down, + "loop_mailbox skip submit mailbox read" + ); return Ok(()); } let Some(mut sqe) = ctx.ring.next_sqe() else { @@ -49,15 +59,31 @@ pub(in crate::server) fn submit_read_if_needed(ctx: &mut LoopMailboxSubmitCtx<'_ .insert(token, InflightOp::MailboxRead { _value: value }); *ctx.mailbox_read_submitted = true; ctx.stats.mailbox_submit += 1; + debug!( + mailbox_fd = ctx.mailbox_fd, + token, "loop_mailbox submit mailbox read" + ); + debug!( + worker_id = ctx.worker_id, + mailbox_fd = ctx.mailbox_fd, + token, + "loop_mailbox submit mailbox read" + ); Ok(()) } pub(in crate::server) fn handle_read_completion( + worker_id: u128, + mailbox_fd: i32, mailbox_read_submitted: &mut bool, stats: &mut WorkerLoopStats, ) { stats.cqe_mailbox += 1; *mailbox_read_submitted = false; + debug!( + worker_id, + mailbox_fd, "loop_mailbox mailbox read completion" + ); } fn alloc_token(next_token: &mut u64) -> u64 { diff --git a/mudu_kernel/src/server/linux/message_bus_runtime.rs b/mudu_kernel/src/server/linux/message_bus_runtime.rs index 487c8df..bb45caf 100644 --- a/mudu_kernel/src/server/linux/message_bus_runtime.rs +++ b/mudu_kernel/src/server/linux/message_bus_runtime.rs @@ -4,49 +4,29 @@ use mudu::common::id::OID; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; -use std::collections::VecDeque; use std::os::fd::RawFd; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Arc, Mutex}; -use tokio::sync::oneshot; -use crate::io::worker_ring::WorkerLocalRing; use crate::server::message_bus_api::{ EndpointId, Envelope, MessageBus, MessageBusRef, MessageId, OnRecvCallback, OutgoingMessage, RecvFilter, SubscriptionId, }; +use crate::server::message_bus_state::WorkerMessageBusState; use crate::server::server_iouring; +use crate::server::task; use crate::server::worker_mailbox::WorkerMailboxMsg; use crate::server::worker_registry::WorkerRegistry; use crate::server::worker_task::spawn_system_worker_task; - -struct RecvWaiter { - filter: RecvFilter, - sender: oneshot::Sender, -} - -struct RegisteredCallback { - id: SubscriptionId, - filter: RecvFilter, - callback: OnRecvCallback, -} - -#[derive(Default)] -struct MessageBusState { - inbox: VecDeque, - recv_waiters: VecDeque, - callbacks: Vec, - next_subscription_id: SubscriptionId, -} +use tracing::debug; pub(crate) struct WorkerMessageBus { local_worker_id: OID, registry: Arc, mailbox_fds: Vec, mailboxes: Vec>>, - worker_local_ring: Arc, next_msg_id: AtomicU64, - state: Mutex, + state: Mutex, } unsafe impl Send for WorkerMessageBus {} @@ -58,19 +38,14 @@ impl WorkerMessageBus { registry: Arc, mailbox_fds: Vec, mailboxes: Vec>>, - worker_local_ring: Arc, ) -> Arc { Arc::new(Self { local_worker_id, registry, mailbox_fds, mailboxes, - worker_local_ring, next_msg_id: AtomicU64::new(1), - state: Mutex::new(MessageBusState { - next_subscription_id: 1, - ..MessageBusState::default() - }), + state: Mutex::new(WorkerMessageBusState::new()), }) } @@ -79,6 +54,15 @@ impl WorkerMessageBus { } pub(crate) fn handle_incoming(&self, envelope: Envelope) -> RS<()> { + debug!( + local_worker_id = self.local_worker_id, + src = ?envelope.src(), + dst = ?envelope.dst(), + kind = ?envelope.kind(), + msg_id = envelope.msg_id(), + correlation_id = ?envelope.correlation_id(), + "message_bus handle incoming" + ); let maybe_callback = { let mut state = self .state @@ -87,10 +71,16 @@ impl WorkerMessageBus { state.handle_incoming(envelope) }; if let Some((callback, envelope)) = maybe_callback { + debug!( + local_worker_id = self.local_worker_id, + src = ?envelope.src(), + dst = ?envelope.dst(), + kind = ?envelope.kind(), + msg_id = envelope.msg_id(), + "message_bus dispatching callback task" + ); let future = (callback)(envelope); - self.worker_local_ring - .worker_task_registry() - .spawn_system(spawn_system_worker_task(future)); + task::spawn_system("iouring-message-bus-callback", spawn_system_worker_task(future)); } Ok(()) } @@ -133,6 +123,13 @@ impl WorkerMessageBus { ) )); }; + debug!( + local_worker_id = self.local_worker_id, + target_worker, + mailbox_fd = fd, + msg = ?msg, + "message_bus enqueue mailbox message" + ); mailbox.push(msg); server_iouring::notify_mailbox_fd(fd) } @@ -145,6 +142,7 @@ impl MessageBus for WorkerMessageBus { } async fn send(&self, dst: EndpointId, message: OutgoingMessage) -> RS { + mudu_utils::scoped_task_trace!(); let msg_id = self.next_msg_id.fetch_add(1, Ordering::Relaxed); let envelope = Envelope::new( msg_id, @@ -156,11 +154,21 @@ impl MessageBus for WorkerMessageBus { message.delivery(), ); let target_worker = self.route_worker_index(&dst)?; + debug!( + local_worker_id = self.local_worker_id, + dst = ?dst, + target_worker, + kind = ?envelope.kind(), + msg_id, + correlation_id = ?envelope.correlation_id(), + "message_bus send" + ); self.dispatch_mailbox_message(target_worker, WorkerMailboxMsg::BusMessage(envelope))?; Ok(msg_id) } async fn recv(&self, filter: RecvFilter) -> RS { + mudu_utils::scoped_task_trace!(); let receiver = { let mut state = self .state @@ -172,8 +180,9 @@ impl MessageBus for WorkerMessageBus { state.register_waiter(filter) }; receiver - .await - .map_err(|_| m_error!(EC::ThreadErr, "message bus waiter dropped before delivery")) + .wait() + .await? + .ok_or_else(|| m_error!(EC::ThreadErr, "message bus waiter dropped before delivery")) } fn on_recv_callback(&self, filter: RecvFilter, callback: OnRecvCallback) -> RS { @@ -186,9 +195,7 @@ impl MessageBus for WorkerMessageBus { }; if let Some(envelope) = maybe_envelope { let future = (callback)(envelope); - self.worker_local_ring - .worker_task_registry() - .spawn_system(spawn_system_worker_task(future)); + task::spawn_system("iouring-message-bus-on-recv", spawn_system_worker_task(future)); } Ok(callback_id) } @@ -202,75 +209,9 @@ impl MessageBus for WorkerMessageBus { } } -impl MessageBusState { - fn try_take_message(&mut self, filter: &RecvFilter) -> Option { - let index = self - .inbox - .iter() - .position(|message| message.matches(filter))?; - self.inbox.remove(index) - } - - fn register_waiter(&mut self, filter: RecvFilter) -> oneshot::Receiver { - let (sender, receiver) = oneshot::channel(); - self.recv_waiters.push_back(RecvWaiter { filter, sender }); - receiver - } - - fn register_callback( - &mut self, - filter: RecvFilter, - callback: OnRecvCallback, - ) -> (SubscriptionId, Option) { - let id = self.next_subscription_id; - self.next_subscription_id += 1; - let maybe_envelope = self.try_take_message(&filter); - self.callbacks.push(RegisteredCallback { - id, - filter, - callback, - }); - (id, maybe_envelope) - } - - fn cancel_callback(&mut self, id: SubscriptionId) -> bool { - let Some(index) = self.callbacks.iter().position(|callback| callback.id == id) else { - return false; - }; - self.callbacks.remove(index); - true - } - - fn handle_incoming(&mut self, envelope: Envelope) -> Option<(OnRecvCallback, Envelope)> { - if let Some(index) = self - .recv_waiters - .iter() - .position(|waiter| envelope.matches(&waiter.filter)) - { - if let Some(waiter) = self.recv_waiters.remove(index) { - let _ = waiter.sender.send(envelope); - return None; - } - } - - if let Some(index) = self - .callbacks - .iter() - .position(|callback| envelope.matches(&callback.filter)) - { - let callback = self.callbacks[index].callback.clone(); - return Some((callback, envelope)); - } - - self.inbox.push_back(envelope); - None - } -} - #[cfg(test)] mod tests { use super::*; - use crate::io::worker_ring::WorkerLocalRing; use crate::server::message_bus_api::{DeliveryMode, MessageKind, SystemMessageKind}; use crate::server::worker_registry::WorkerRegistry; @@ -298,7 +239,6 @@ mod tests { test_registry(), vec![0, 1], vec![Arc::new(SegQueue::new()), Arc::new(SegQueue::new())], - Arc::new(WorkerLocalRing::new()), ) } diff --git a/mudu_kernel/src/server/linux/perf_test.rs b/mudu_kernel/src/server/linux/perf_test.rs index 17e62b4..a29af80 100644 --- a/mudu_kernel/src/server/linux/perf_test.rs +++ b/mudu_kernel/src/server/linux/perf_test.rs @@ -1,5 +1,5 @@ use crate::server::routing::{route_worker, RoutingContext, RoutingMode}; -use crate::server::server::{IoUringTcpBackend, IoUringTcpServerConfig}; +use crate::server::server::{WorkerTcpBackend, WorkerTcpServerConfig}; use crate::server::worker_registry::{load_or_create_worker_registry, WorkerRegistry}; use mudu::common::result::RS; use mudu::error::ec::EC; @@ -11,9 +11,13 @@ use mudu_contract::protocol::{ encode_session_create_request, Frame, FrameHeader, GetRequest, MessageType, PutRequest, SessionCreateRequest, HEADER_LEN, }; +use mudu_sys::tokio::io::{AsyncReadExt, AsyncWriteExt}; +use mudu_sys::tokio::net::{TcpSocket as TokioTcpSocket, TcpStream as TokioTcpStream}; +use mudu_sys::tokio::sync::Notify; +use mudu_sys::tokio::task::JoinSet; use mudu_utils::log::log_setup; use mudu_utils::notifier::{notify_wait, NotifyWait}; -use mudu_utils::task::spawn_task; +use mudu_utils::task_async::spawn_task; use mudu_utils::{debug, task_trace}; use short_uuid::ShortUuid; use std::env::temp_dir; @@ -24,10 +28,6 @@ use std::sync::mpsc::{self, Receiver, TryRecvError}; use std::sync::{Arc, Mutex, MutexGuard, OnceLock}; use std::thread; use std::time::Duration; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; -use tokio::net::{TcpSocket as TokioTcpSocket, TcpStream as TokioTcpStream}; -use tokio::sync::Notify; -use tokio::task::JoinSet; use tracing::debug; use tracing::info; use uuid::Uuid; @@ -67,7 +67,7 @@ impl AsyncPerfClient { } async fn put(&mut self, key: Vec, value: Vec) -> RS<()> { - let _ = task_trace!(); + mudu_utils::scoped_task_trace!(); let request_id = self.take_request_id(); let payload = @@ -134,7 +134,7 @@ impl AsyncPerfClient { Ok(()) } async fn _receive(&mut self) -> RS { - let _ = task_trace!(); + mudu_utils::scoped_task_trace!(); let mut header = [0u8; HEADER_LEN]; self.stream .read_exact(&mut header) @@ -259,7 +259,7 @@ async fn wait_for_clients_ready( if ready == clients { return Ok(()); } - mudu_sys::task::sleep(Duration::from_millis(25)) + mudu_sys::task_async::sleep(Duration::from_millis(25)) .await .expect("linux sleep wrapper should not fail"); } @@ -337,7 +337,7 @@ async fn wait_until_server_ready_or_exit_async(port: u16, server: &TestServerHan } Err(_) => {} } - mudu_sys::task::sleep(Duration::from_millis(25)).await?; + mudu_sys::task_async::sleep(Duration::from_millis(25)).await?; } Err(m_error!( EC::NetErr, @@ -355,7 +355,7 @@ fn spawn_iouring_server( let (stop_notifier, server_stop) = notify_wait(); let (exit_tx, exit_rx) = mpsc::channel(); let port = listener.local_addr().unwrap().port(); - let mut server_cfg = IoUringTcpServerConfig::new( + let mut server_cfg = WorkerTcpServerConfig::new( worker_count, "127.0.0.1".to_string(), port, @@ -371,7 +371,7 @@ fn spawn_iouring_server( server_cfg = server_cfg.with_worker_registry(worker_registry).unwrap(); } let join_handle = thread::spawn(move || { - let result = IoUringTcpBackend::sync_serve_with_stop(server_cfg, server_stop); + let result = WorkerTcpBackend::sync_serve_with_stop(server_cfg, server_stop); let exit_msg = match &result { Ok(()) => Ok(()), Err(err) => Err(err.to_string()), @@ -450,7 +450,7 @@ async fn iouring_backend_perf_put_get() -> RS<()> { let get_ops = Arc::new(AtomicU64::new(0)); let put_latencies_us = Arc::new(Mutex::new(Vec::::new())); let get_latencies_us = Arc::new(Mutex::new(Vec::::new())); - let mut join_set: JoinSet> = tokio::task::JoinSet::new(); + let mut join_set: JoinSet> = mudu_sys::tokio::task::JoinSet::new(); for client_id in 0..clients { let start_clients = start_clients.clone(); let start_notify = start_notify.clone(); @@ -535,7 +535,7 @@ async fn iouring_backend_perf_put_get() -> RS<()> { start_notify.notify_waiters(); let started_at = mudu_sys::time::instant_now(); - mudu_sys::task::sleep(bench_duration).await?; + mudu_sys::task_async::sleep(bench_duration).await?; let elapsed = started_at.elapsed(); stop_clients.store(true, Ordering::Relaxed); while let Some(result) = join_set.join_next().await { diff --git a/mudu_kernel/src/server/linux/protocol_codec.rs b/mudu_kernel/src/server/linux/protocol_codec.rs index 79c9b87..9d4d562 100644 --- a/mudu_kernel/src/server/linux/protocol_codec.rs +++ b/mudu_kernel/src/server/linux/protocol_codec.rs @@ -1,15 +1,14 @@ +use crate::io::socket::{recv_into, send_all, IoSocket}; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; use mudu_contract::protocol::{Frame, FrameHeader, HEADER_LEN}; -use mudu_utils::task_trace; -use crate::io::socket::{recv_into, send_all, IoSocket}; pub(in crate::server) async fn read_next_frame( socket: &IoSocket, read_buf: &mut Vec, ) -> RS> { - task_trace!(); + mudu_utils::scoped_task_trace!(); let mut header_buf = [0u8; HEADER_LEN]; match read_exact(socket, &mut header_buf).await? { Some(()) => {} @@ -33,11 +32,12 @@ pub(in crate::server) async fn read_next_frame( } pub(in crate::server) async fn write_response(socket: &IoSocket, payload: &[u8]) -> RS<()> { - task_trace!(); + mudu_utils::scoped_task_trace!(); send_all(socket, payload).await } async fn read_exact(socket: &IoSocket, mut dst: &mut [u8]) -> RS> { + mudu_utils::scoped_task_trace!(); let mut read_any = false; while !dst.is_empty() { let read = recv_into(socket, dst, 0).await?; diff --git a/mudu_kernel/src/server/linux/server_iouring.rs b/mudu_kernel/src/server/linux/server_iouring.rs index a17d98f..247611d 100644 --- a/mudu_kernel/src/server/linux/server_iouring.rs +++ b/mudu_kernel/src/server/linux/server_iouring.rs @@ -1,6 +1,6 @@ use crate::server::frame_dispatch::{dispatch_frame_async, try_decode_next_frame}; -use crate::server::server::IoUringTcpServerConfig; -use crate::server::worker::IoUringWorker; +use crate::server::server::WorkerTcpServerConfig; +use crate::server::worker::WorkerRuntime; use crate::server::worker_loop_stats::WorkerLoopStats; use crate::server::worker_mailbox::WorkerMailboxMsg; use crate::server::worker_ring_loop::WorkerRingLoop; @@ -9,14 +9,16 @@ use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; use mudu_contract::protocol::Frame; -use mudu_utils::notifier::Waiter; +use mudu_utils::notifier::{Notifier, Waiter}; +use mudu_utils::task_async::{build_current_thread_runtime, CurrentThreadTaskRuntime}; use std::os::fd::{IntoRawFd, RawFd}; use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; use std::sync::{Arc, Condvar, Mutex}; -use tracing::debug; +use tracing::{debug, trace}; pub(crate) struct RecoveryCoordinator { total_workers: usize, + ready_notifier: Option, state: Mutex, condvar: Condvar, } @@ -27,7 +29,11 @@ struct RecoveryState { failed: bool, } -pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) -> RS<()> { +pub(crate) fn sync_serve_iouring( + mut cfg: WorkerTcpServerConfig, + stop: Waiter, + ready: Option, +) -> RS<()> { if cfg.worker_count() == 0 { return Err(m_error!(EC::ParseErr, "invalid io_uring worker count")); } @@ -43,34 +49,34 @@ pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) .map(|_| create_mailbox_event_fd()) .collect::>>()?; let stop_flag = Arc::new(AtomicBool::new(false)); - let recovery_coordinator = Arc::new(RecoveryCoordinator::new(cfg.worker_count())); + let recovery_coordinator = Arc::new(RecoveryCoordinator::new(cfg.worker_count(), ready)); let stop_for_notifier = stop.clone(); let shutdown_mailboxes = mailboxes.clone(); let shutdown_mailbox_fds = mailbox_fds.clone(); let notifier_stop_flag = stop_flag.clone(); - let notifier = mudu_sys::task::spawn_thread_named("iouring-shutdown-notifier", move || { - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .map_err(|e| { + let notifier = + mudu_sys::task_sync::spawn_thread_named("iouring-shutdown-notifier", move || { + let runtime = build_current_thread_runtime().map_err(|e| { m_error!( EC::TokioErr, "create runtime for io_uring shutdown notifier error", e ) })?; - runtime.block_on(stop_for_notifier.wait()); - notifier_stop_flag.store(true, Ordering::Relaxed); - for (mailbox, fd) in shutdown_mailboxes - .into_iter() - .zip(shutdown_mailbox_fds.into_iter()) - { - mailbox.push(WorkerMailboxMsg::Shutdown); - notify_mailbox_fd(fd)?; - } - Ok(()) - })?; + debug!("iouring shutdown notifier waiting for stop"); + runtime.block_on(stop_for_notifier.wait()); + debug!("iouring shutdown notifier observed stop"); + notifier_stop_flag.store(true, Ordering::Relaxed); + for (mailbox, fd) in shutdown_mailboxes + .into_iter() + .zip(shutdown_mailbox_fds.into_iter()) + { + mailbox.push(WorkerMailboxMsg::Shutdown); + notify_mailbox_fd(fd)?; + } + Ok(()) + })?; let mut handles = Vec::with_capacity(cfg.worker_count()); for worker_id in 0..cfg.worker_count() { @@ -97,6 +103,7 @@ pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) let log_chunk_size = cfg.log_chunk_size(); let log_batching = cfg.log_batching(); let worker_count = cfg.worker_count(); + let server_instance_id = cfg.server_instance_id(); let listener = match &prebound_listener { Some(listener) => Some( listener @@ -108,13 +115,17 @@ pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) let stop = stop_flag.clone(); let recovery_coordinator = recovery_coordinator.clone(); let mailbox_fd = mailbox_fds[worker_id]; + let async_runtime = cfg.async_runtime(); let handle = - mudu_sys::task::spawn_thread_named(format!("worker-{worker_id}"), move || { + mudu_sys::task_sync::spawn_thread_named(format!("worker-{worker_id}"), move || { + let runtime = CurrentThreadTaskRuntime::new().map_err(|e| { + m_error!(EC::TokioErr, "create runtime for io_uring worker error", e) + })?; let listener_fd = match listener { Some(listener) => listener.into_raw_fd(), None => create_listener_fd(listen_addr)?, }; - let worker = IoUringWorker::new_with_log_batching( + let worker = WorkerRuntime::new_with_log_batching_and_runtime( worker_identity, worker_count, routing_mode, @@ -124,6 +135,8 @@ pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) log_batching, procedure_runtime, worker_registry, + async_runtime, + server_instance_id, )?; let mut loop_state = WorkerRingLoop::new( worker, @@ -136,8 +149,7 @@ pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) recovery_coordinator, stop, )?; - let r = loop_state.run(); - r + runtime.block_on(async move { loop_state.run() }) })?; handles.push(handle); } @@ -185,9 +197,10 @@ pub(crate) fn sync_serve_iouring(mut cfg: IoUringTcpServerConfig, stop: Waiter) } impl RecoveryCoordinator { - pub(crate) fn new(total_workers: usize) -> Self { + pub(crate) fn new(total_workers: usize, ready_notifier: Option) -> Self { Self { total_workers, + ready_notifier, state: Mutex::new(RecoveryState::default()), condvar: Condvar::new(), } @@ -205,7 +218,21 @@ impl RecoveryCoordinator { )); } state.recovered_workers += 1; + trace!( + recovered_workers = state.recovered_workers, + total_workers = self.total_workers, + "iouring recovery coordinator worker reached barrier" + ); if state.recovered_workers == self.total_workers { + // In io_uring mode the listener can start accepting sockets before + // every worker has finished WAL recovery. Publish readiness only + // after the final worker reaches the common recovery barrier so + // callers do not race listener availability with service + // availability. + if let Some(ready_notifier) = &self.ready_notifier { + trace!("iouring recovery coordinator publishing ready barrier"); + ready_notifier.notify_all(); + } self.condvar.notify_all(); return Ok(()); } @@ -213,6 +240,11 @@ impl RecoveryCoordinator { // starts. If one worker fails recovery, wake everybody and abort // instead of leaving the successful workers stuck forever. while !state.failed && state.recovered_workers < self.total_workers { + trace!( + recovered_workers = state.recovered_workers, + total_workers = self.total_workers, + "iouring recovery coordinator waiting for peers" + ); state = self.condvar.wait(state).map_err(|_| { m_error!( EC::InternalErr, @@ -239,10 +271,11 @@ impl RecoveryCoordinator { #[allow(dead_code)] pub async fn dispatch_frame_iouring( - worker: &IoUringWorker, + worker: &WorkerRuntime, conn_id: u64, frame: &Frame, ) -> RS { + mudu_utils::scoped_task_trace!(); dispatch_frame_async(worker, conn_id, frame).await } @@ -264,15 +297,16 @@ fn create_mailbox_event_fd() -> RS { } fn create_event_fd(message: &str) -> RS { - mudu_sys::sync::eventfd().map_err(|e| m_error!(EC::NetErr, message, e)) + mudu_sys::sync_sync::eventfd().map_err(|e| m_error!(EC::NetErr, message, e)) } pub(super) fn notify_mailbox_fd(fd: RawFd) -> RS<()> { + debug!(fd, "server_iouring notify mailbox fd"); notify_event_fd(fd, "write io_uring worker mailbox eventfd error") } fn notify_event_fd(fd: RawFd, message: &str) -> RS<()> { - mudu_sys::sync::notify_eventfd(fd).map_err(|e| m_error!(EC::NetErr, message, e)) + mudu_sys::sync_sync::notify_eventfd(fd).map_err(|e| m_error!(EC::NetErr, message, e)) } fn log_worker_stats(stats: &[WorkerLoopStats]) { @@ -320,10 +354,10 @@ mod tests { notify_mailbox_fd(fd).unwrap(); notify_mailbox_fd(fd).unwrap(); - let value = mudu_sys::sync::read_eventfd(fd).unwrap(); + let value = mudu_sys::sync_sync::read_eventfd(fd).unwrap(); assert_eq!(value, 2); - mudu_sys::sync::close_fd(fd).unwrap(); + mudu_sys::sync_sync::close_fd(fd).unwrap(); } #[test] diff --git a/mudu_kernel/src/server/linux/task_registry.rs b/mudu_kernel/src/server/linux/task_registry.rs index df0773e..e443318 100644 --- a/mudu_kernel/src/server/linux/task_registry.rs +++ b/mudu_kernel/src/server/linux/task_registry.rs @@ -5,9 +5,10 @@ use std::task::{Context, Poll}; use crossbeam_queue::SegQueue; use futures::task::waker; use mudu::common::result::RS; -use mudu_utils::task::{try_this_task_id, PollTaskIdGuard}; +use mudu_utils::task_async::{try_this_task_id, PollTaskIdGuard}; use mudu_utils::task_context::TaskContext; -use mudu_utils::task_id::new_task_id; +use mudu_utils::task_id::{new_task_id, TaskID}; +use tracing::trace; use crate::server::async_func_task_waker::AsyncFuncTaskWaker; use crate::server::worker_task::{WorkerTask, WorkerTaskFuture}; @@ -39,18 +40,28 @@ impl WorkerTaskRegistry { } } - pub(in crate::server) fn spawn(&self, conn_id: Option, future: WorkerTaskFuture) { + pub(in crate::server) fn spawn_with_trace_id( + &self, + conn_id: Option, + trace_task_id: TaskID, + future: WorkerTaskFuture, + ) { let task_id = self.next_task_id.fetch_add(1, Ordering::Relaxed); + let _ = self + .tasks + .insert_sync(task_id, WorkerTask::new(conn_id, trace_task_id, future)); + self.ready_queue.push(task_id); + } + + pub(in crate::server) fn spawn(&self, conn_id: Option, future: WorkerTaskFuture) { + let task_id = self.next_task_id.load(Ordering::Relaxed); let trace_task_id = new_task_id(); let task_name = match conn_id { Some(conn_id) => format!("iouring-task-{task_id}-conn-{conn_id}"), None => format!("iouring-system-task-{task_id}"), }; let _ = TaskContext::new_context(trace_task_id, task_name, false); - let _ = self - .tasks - .insert_sync(task_id, WorkerTask::new(conn_id, trace_task_id, future)); - self.ready_queue.push(task_id); + self.spawn_with_trace_id(conn_id, trace_task_id, future); } #[allow(dead_code)] @@ -104,12 +115,25 @@ impl WorkerTaskRegistry { } } match task.future_mut().poll(&mut cx) { - Poll::Ready(result) => completed.push(CompletedWorkerTask { - conn_id: task.conn_id(), - is_system: task.conn_id().is_none(), - result, - }), + Poll::Ready(result) => { + trace!( + task_id, + conn_id = task.conn_id(), + "worker_task_registry task ready" + ); + completed.push(CompletedWorkerTask { + conn_id: task.conn_id(), + is_system: task.conn_id().is_none(), + result, + }) + } Poll::Pending => { + trace!( + task_id, + conn_id = task.conn_id(), + op_id, + "worker_task_registry task pending" + ); task.set_waiting_on(op_id); if let Some(ctx) = TaskContext::get(trace_task_id) { ctx.watch("state", "pending"); diff --git a/mudu_kernel/src/server/linux/worker_ring_loop.rs b/mudu_kernel/src/server/linux/worker_ring_loop.rs index 36b9c9a..0202555 100644 --- a/mudu_kernel/src/server/linux/worker_ring_loop.rs +++ b/mudu_kernel/src/server/linux/worker_ring_loop.rs @@ -21,7 +21,8 @@ use crate::server::server_iouring::RecoveryCoordinator; use crate::server::session_bound_worker_runtime::{ as_worker_local_ref, new_session_bound_worker_runtime, }; -use crate::server::worker::IoUringWorker; +use crate::server::task; +use crate::server::worker::WorkerRuntime; use crate::server::worker_local::{set_current_worker_local, unset_current_worker_local}; use crate::server::worker_loop_stats::WorkerLoopStats; use crate::server::worker_mailbox::WorkerMailboxMsg; @@ -44,6 +45,8 @@ use std::sync::Arc; #[cfg(test)] use std::thread; use std::time::Duration; +use tracing::{debug, trace}; +use mudu_utils::scoped_task_trace; #[path = "worker_ring_loop/recovery.rs"] mod recovery; @@ -60,7 +63,7 @@ type XLWorkerLog = /// lifecycle. It also performs worker-log recovery before the steady-state loop /// starts so replayed state is visible to newly accepted connections. pub(in crate::server) struct WorkerRingLoop { - worker: IoUringWorker, + worker: WorkerRuntime, log: Option, ring: mudu_sys::uring::IoUring, listener_fd: RawFd, @@ -91,7 +94,7 @@ impl WorkerRingLoop { /// Builds the runtime state for one worker loop and initializes its /// private io_uring instance. pub(in crate::server) fn new( - worker: IoUringWorker, + worker: WorkerRuntime, listener_fd: RawFd, mailbox_fd: RawFd, mailbox: Arc>, @@ -124,7 +127,6 @@ impl WorkerRingLoop { worker.registry().clone(), mailbox_fds.clone(), mailboxes.clone(), - worker_local_ring.clone(), ); Ok(Self { log, @@ -161,16 +163,32 @@ impl WorkerRingLoop { /// The worker-local ring pointer is installed for the duration of the run /// so user-level async file I/O can enqueue requests onto this loop. pub(in crate::server) fn run(&mut self) -> RS { + scoped_task_trace!(); + trace!( + worker_id = self.worker.worker_id(), + "worker_ring_loop run start" + ); set_current_worker_local(as_worker_local_ref(new_session_bound_worker_runtime( self.worker.clone(), 0, ))); set_current_worker_ring(self.worker_local_ring.clone()); set_current_message_bus(self.message_bus.as_ref()); - register_worker_message_bus(self.worker.worker_id(), &self.message_bus.as_ref())?; + register_worker_message_bus( + self.worker.server_instance_id(), + self.worker.worker_id(), + &self.message_bus.as_ref(), + )?; self.worker.ensure_partition_rpc_handler()?; + trace!( + worker_id = self.worker.worker_id(), + "worker_ring_loop partition rpc ready" + ); if let Err(err) = self.recover_worker_log() { - let _ = unregister_worker_message_bus(self.worker.worker_id()); + let _ = unregister_worker_message_bus( + self.worker.server_instance_id(), + self.worker.worker_id(), + ); unset_current_message_bus(); unset_current_worker_ring(); unset_current_worker_local(); @@ -178,8 +196,15 @@ impl WorkerRingLoop { return Err(err); } self.recovery_coordinator.worker_succeeded()?; + trace!( + worker_id = self.worker.worker_id(), + "worker_ring_loop recovery barrier passed" + ); let r = self.run_service_loop(); - let _ = unregister_worker_message_bus(self.worker.worker_id()); + let _ = unregister_worker_message_bus( + self.worker.server_instance_id(), + self.worker.worker_id(), + ); unset_current_message_bus(); unset_current_worker_ring(); unset_current_worker_local(); @@ -240,7 +265,18 @@ impl WorkerRingLoop { } } InflightOp::MailboxRead { .. } => { - handle_read_completion(&mut self.mailbox_read_submitted, &mut self.stats); + debug!( + worker_id = self.worker.worker_id(), + mailbox_fd = self.mailbox_fd, + result, + "worker_ring_loop mailbox read cqe" + ); + handle_read_completion( + self.worker.worker_id(), + self.mailbox_fd, + &mut self.mailbox_read_submitted, + &mut self.stats, + ); for msg in drain_messages(self.mailbox.as_ref(), &mut self.stats) { self.handle_mailbox_message(msg)?; } @@ -265,6 +301,14 @@ impl WorkerRingLoop { fn handle_mailbox_message(&self, msg: WorkerMailboxMsg) -> RS<()> { match msg { WorkerMailboxMsg::AdoptConnection(connection) => { + debug!( + worker_id = self.worker.worker_id(), + conn_id = connection.transfer().conn_id(), + remote_addr = %connection.transfer().remote_addr(), + session_ids = ?connection.session_ids(), + has_session_open_action = connection.session_open_action().is_some(), + "worker_ring_loop handling adopt connection mailbox message" + ); server_iouring::set_connection_options(connection.fd())?; self.worker.adopt_connection_sessions( connection.transfer().conn_id(), @@ -292,11 +336,33 @@ impl WorkerRingLoop { connection.transfer().remote_addr(), initial_response, )?; + debug!( + worker_id = self.worker.worker_id(), + conn_id = connection.transfer().conn_id(), + "worker_ring_loop handled adopt connection mailbox message" + ); } WorkerMailboxMsg::BusMessage(envelope) => { + debug!( + worker_id = self.worker.worker_id(), + src = ?envelope.src(), + dst = ?envelope.dst(), + kind = ?envelope.kind(), + msg_id = envelope.msg_id(), + correlation_id = ?envelope.correlation_id(), + "worker_ring_loop received bus mailbox message" + ); self.message_bus.handle_incoming(envelope)?; + debug!( + worker_id = self.worker.worker_id(), + "worker_ring_loop handled bus mailbox message" + ); } WorkerMailboxMsg::Shutdown => { + debug!( + worker_id = self.worker.worker_id(), + "worker_ring_loop received shutdown mailbox message" + ); self.shutdown_triggered.store(true, Ordering::Relaxed); } } @@ -331,7 +397,15 @@ impl WorkerRingLoop { } pub(in crate::server) fn submit_mailbox_read_if_needed(&mut self) -> RS<()> { + debug!( + worker_id = self.worker.worker_id(), + mailbox_fd = self.mailbox_fd, + mailbox_read_submitted = self.mailbox_read_submitted, + shutting_down = self.shutting_down, + "worker_ring_loop submit_mailbox_read_if_needed" + ); let mut ctx = LoopMailboxSubmitCtx { + worker_id: self.worker.worker_id(), ring: &mut self.ring, mailbox_fd: self.mailbox_fd, mailbox_read_submitted: &mut self.mailbox_read_submitted, @@ -393,7 +467,7 @@ impl WorkerRingLoop { ) -> RS<()> { let socket = crate::io::socket::IoSocket::from_raw_fd(fd); let _ = self.connection_task_fds.insert_sync(conn_id, fd); - self.worker_local_ring.worker_task_registry().spawn( + task::spawn( Some(conn_id), spawn_connection_worker_task( self.worker.clone(), @@ -458,9 +532,7 @@ impl WorkerRingLoop { fn spawn_ready_callbacks(&mut self, callbacks: Vec) -> RS<()> { for pending in callbacks { let future = (pending.callback)(); - self.worker_local_ring - .worker_task_registry() - .spawn_system(spawn_system_worker_task(future)); + self.spawn(None, spawn_system_worker_task(future)); } Ok(()) } @@ -477,10 +549,10 @@ mod tests { use crate::server::routing::RoutingMode; use crate::server::worker_registry::load_or_create_worker_registry; use mudu::common::id::gen_oid; + use mudu_sys::tokio::task::{yield_now, JoinHandle}; use std::env::temp_dir; use std::io::{Read, Write}; use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering}; - use tokio::task::{yield_now, JoinHandle}; fn test_worker_loop() -> WorkerRingLoop { let dir = temp_dir() @@ -489,7 +561,7 @@ mod tests { .into_owned(); let registry = load_or_create_worker_registry(&dir, 1).unwrap(); let identity = registry.worker(0).cloned().unwrap(); - let worker = IoUringWorker::new( + let worker = WorkerRuntime::new( identity, 1, RoutingMode::ConnectionId, @@ -498,9 +570,10 @@ mod tests { 4096, None, registry, + 0, ) .unwrap(); - let mailbox_fd = mudu_sys::sync::eventfd().unwrap(); + let mailbox_fd = mudu_sys::sync_sync::eventfd().unwrap(); WorkerRingLoop::new( worker, -1, @@ -509,7 +582,7 @@ mod tests { vec![Arc::new(SegQueue::new())], vec![mailbox_fd], Arc::new(AtomicU64::new(1)), - Arc::new(RecoveryCoordinator::new(1)), + Arc::new(RecoveryCoordinator::new(1, None)), Arc::new(AtomicBool::new(false)), ) .unwrap() @@ -555,7 +628,7 @@ mod tests { let path = temp_dir().join(format!("iouring_file_io_{}", gen_oid())); let path_str = path.to_string_lossy().into_owned(); - let open_task = tokio::spawn({ + let open_task = mudu_sys::tokio::spawn({ let path_str = path_str.clone(); async move { open( @@ -573,7 +646,7 @@ mod tests { let file = open_task.await.unwrap().unwrap(); let fd = file.fd(); - let write_task = tokio::spawn(async move { + let write_task = mudu_sys::tokio::spawn(async move { write( &crate::io::file::IoFile::from_raw_fd(fd), b"hello iouring".to_vec(), @@ -588,8 +661,9 @@ mod tests { assert_eq!(write_task.await.unwrap().unwrap(), b"hello iouring".len()); let fd = file.fd(); - let flush_task = - tokio::spawn(async move { flush(&crate::io::file::IoFile::from_raw_fd(fd)).await }); + let flush_task = mudu_sys::tokio::spawn(async move { + flush(&crate::io::file::IoFile::from_raw_fd(fd)).await + }); yield_now().await; drive_ring_future(&mut loop_state, &flush_task) .await @@ -597,10 +671,9 @@ mod tests { flush_task.await.unwrap().unwrap(); let fd = file.fd(); - let read_task = - tokio::spawn( - async move { read(&crate::io::file::IoFile::from_raw_fd(fd), 13, 0).await }, - ); + let read_task = mudu_sys::tokio::spawn(async move { + read(&crate::io::file::IoFile::from_raw_fd(fd), 13, 0).await + }); yield_now().await; drive_ring_future(&mut loop_state, &read_task) .await @@ -609,7 +682,7 @@ mod tests { assert_eq!(std::fs::read(&path).unwrap(), b"hello iouring".to_vec()); - let close_task = tokio::spawn(async move { close(file).await }); + let close_task = mudu_sys::tokio::spawn(async move { close(file).await }); yield_now().await; drive_ring_future(&mut loop_state, &close_task) .await @@ -618,7 +691,7 @@ mod tests { unset_current_worker_ring(); loop_state.ring.exit(); - mudu_sys::sync::close_fd(loop_state.mailbox_fd).unwrap(); + mudu_sys::sync_sync::close_fd(loop_state.mailbox_fd).unwrap(); let _ = std::fs::remove_file(&path); } @@ -644,7 +717,7 @@ mod tests { Ok(()) }); - let socket_task = tokio::spawn(async { + let socket_task = mudu_sys::tokio::spawn(async { socket(libc::AF_INET, libc::SOCK_STREAM | libc::SOCK_CLOEXEC, 0).await }); yield_now().await; @@ -655,7 +728,7 @@ mod tests { let fd = sock.fd(); let connect_task = - tokio::spawn(async move { connect(&IoSocket::from_raw_fd(fd), addr).await }); + mudu_sys::tokio::spawn(async move { connect(&IoSocket::from_raw_fd(fd), addr).await }); yield_now().await; drive_ring_future(&mut loop_state, &connect_task) .await @@ -663,10 +736,9 @@ mod tests { connect_task.await.unwrap().unwrap(); let fd = sock.fd(); - let send_task = - tokio::spawn( - async move { send(&IoSocket::from_raw_fd(fd), b"ping".to_vec(), 0).await }, - ); + let send_task = mudu_sys::tokio::spawn(async move { + send(&IoSocket::from_raw_fd(fd), b"ping".to_vec(), 0).await + }); yield_now().await; drive_ring_future(&mut loop_state, &send_task) .await @@ -674,7 +746,8 @@ mod tests { assert_eq!(send_task.await.unwrap().unwrap(), 4); let fd = sock.fd(); - let recv_task = tokio::spawn(async move { recv(&IoSocket::from_raw_fd(fd), 4, 0).await }); + let recv_task = + mudu_sys::tokio::spawn(async move { recv(&IoSocket::from_raw_fd(fd), 4, 0).await }); yield_now().await; drive_ring_future(&mut loop_state, &recv_task) .await @@ -682,15 +755,16 @@ mod tests { assert_eq!(recv_task.await.unwrap().unwrap(), b"pong".to_vec()); let fd = sock.fd(); - let shutdown_task = - tokio::spawn(async move { shutdown(&IoSocket::from_raw_fd(fd), libc::SHUT_WR).await }); + let shutdown_task = mudu_sys::tokio::spawn(async move { + shutdown(&IoSocket::from_raw_fd(fd), libc::SHUT_WR).await + }); yield_now().await; drive_ring_future(&mut loop_state, &shutdown_task) .await .unwrap(); shutdown_task.await.unwrap().unwrap(); - let close_task = tokio::spawn(async move { close_socket(sock).await }); + let close_task = mudu_sys::tokio::spawn(async move { close_socket(sock).await }); yield_now().await; drive_ring_future(&mut loop_state, &close_task) .await @@ -701,7 +775,7 @@ mod tests { unset_current_worker_ring(); loop_state.ring.exit(); - mudu_sys::sync::close_fd(loop_state.mailbox_fd).unwrap(); + mudu_sys::sync_sync::close_fd(loop_state.mailbox_fd).unwrap(); } #[tokio::test(flavor = "current_thread")] @@ -729,7 +803,7 @@ mod tests { let accept_fd = listener_sock.fd(); let accept_task = - tokio::spawn(async move { accept(&IoSocket::from_raw_fd(accept_fd)).await }); + mudu_sys::tokio::spawn(async move { accept(&IoSocket::from_raw_fd(accept_fd)).await }); yield_now().await; drive_ring_future(&mut loop_state, &accept_task) .await @@ -742,7 +816,9 @@ mod tests { let accepted_fd = accepted.fd(); let recv_task = - tokio::spawn(async move { recv(&IoSocket::from_raw_fd(accepted_fd), 4, 0).await }); + mudu_sys::tokio::spawn( + async move { recv(&IoSocket::from_raw_fd(accepted_fd), 4, 0).await }, + ); yield_now().await; drive_ring_future(&mut loop_state, &recv_task) .await @@ -750,7 +826,7 @@ mod tests { assert_eq!(recv_task.await.unwrap().unwrap(), b"ping".to_vec()); let accepted_fd = accepted.fd(); - let send_task = tokio::spawn(async move { + let send_task = mudu_sys::tokio::spawn(async move { send(&IoSocket::from_raw_fd(accepted_fd), b"pong".to_vec(), 0).await }); yield_now().await; @@ -760,7 +836,7 @@ mod tests { assert_eq!(send_task.await.unwrap().unwrap(), 4); let accepted_fd = accepted.fd(); - let shutdown_task = tokio::spawn(async move { + let shutdown_task = mudu_sys::tokio::spawn(async move { shutdown(&IoSocket::from_raw_fd(accepted_fd), libc::SHUT_WR).await }); yield_now().await; @@ -769,14 +845,16 @@ mod tests { .unwrap(); shutdown_task.await.unwrap().unwrap(); - let close_accepted_task = tokio::spawn(async move { close_socket(accepted).await }); + let close_accepted_task = + mudu_sys::tokio::spawn(async move { close_socket(accepted).await }); yield_now().await; drive_ring_future(&mut loop_state, &close_accepted_task) .await .unwrap(); close_accepted_task.await.unwrap().unwrap(); - let close_listener_task = tokio::spawn(async move { close_socket(listener_sock).await }); + let close_listener_task = + mudu_sys::tokio::spawn(async move { close_socket(listener_sock).await }); yield_now().await; drive_ring_future(&mut loop_state, &close_listener_task) .await @@ -787,7 +865,7 @@ mod tests { unset_current_worker_ring(); loop_state.ring.exit(); - mudu_sys::sync::close_fd(loop_state.mailbox_fd).unwrap(); + mudu_sys::sync_sync::close_fd(loop_state.mailbox_fd).unwrap(); } #[tokio::test(flavor = "current_thread")] @@ -818,7 +896,7 @@ mod tests { assert_eq!(hit.load(AtomicOrdering::SeqCst), 1); loop_state.ring.exit(); - mudu_sys::sync::close_fd(loop_state.mailbox_fd).unwrap(); + mudu_sys::sync_sync::close_fd(loop_state.mailbox_fd).unwrap(); } #[tokio::test(flavor = "current_thread")] @@ -875,6 +953,6 @@ mod tests { assert_eq!(hit.load(AtomicOrdering::SeqCst), 1); loop_state.ring.exit(); - mudu_sys::sync::close_fd(loop_state.mailbox_fd).unwrap(); + mudu_sys::sync_sync::close_fd(loop_state.mailbox_fd).unwrap(); } } diff --git a/mudu_kernel/src/server/linux/worker_ring_loop/recovery.rs b/mudu_kernel/src/server/linux/worker_ring_loop/recovery.rs index 238787f..5c6d45c 100644 --- a/mudu_kernel/src/server/linux/worker_ring_loop/recovery.rs +++ b/mudu_kernel/src/server/linux/worker_ring_loop/recovery.rs @@ -6,7 +6,7 @@ use crate::wal::xl_batch::XLBatch; use std::path::{Path, PathBuf}; pub(super) struct WorkerRingLoopRecoveryHandler { - pub(super) worker: IoUringWorker, + pub(super) worker: WorkerRuntime, } impl WorkerLogRecoveryHandler for WorkerRingLoopRecoveryHandler { @@ -59,6 +59,10 @@ impl WorkerRingLoop { Some(log) => log, None => return Ok(()), }; + trace!( + worker_id = self.worker.worker_id(), + "worker_ring_loop recover_worker_log start" + ); let backend = log.backend().clone(); let mut source = WorkerRingLoopRecoverySource { loop_ref: self, @@ -66,6 +70,11 @@ impl WorkerRingLoop { }; let result = log.recover(&mut source); self.log = Some(log); + trace!( + worker_id = self.worker.worker_id(), + ok = result.is_ok(), + "worker_ring_loop recover_worker_log finished" + ); result } diff --git a/mudu_kernel/src/server/linux/worker_ring_loop/runtime.rs b/mudu_kernel/src/server/linux/worker_ring_loop/runtime.rs index a8e51b2..7daa6ee 100644 --- a/mudu_kernel/src/server/linux/worker_ring_loop/runtime.rs +++ b/mudu_kernel/src/server/linux/worker_ring_loop/runtime.rs @@ -1,4 +1,5 @@ use super::*; +use tracing::trace; impl WorkerRingLoop { /// Main poll/submit loop for the worker. /// @@ -31,6 +32,7 @@ impl WorkerRingLoop { self.submit_user_ring_io_if_needed()?; self.stats.submit_calls += 1; let submitted = self.ring.submit(); + trace!(submitted, "worker_ring_loop ring.submit done"); if submitted < 0 { return Err(m_error!( EC::NetErr, @@ -43,7 +45,7 @@ impl WorkerRingLoop { } if self.inflight.is_empty() { - mudu_sys::task::sleep_blocking(Duration::from_millis(1)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(1)); continue; } @@ -59,6 +61,11 @@ impl WorkerRingLoop { )) } }; + trace!( + user_data = cqe.user_data(), + result = cqe.result(), + "worker_ring_loop got cqe" + ); self.process_cqe(cqe)?; loop { @@ -155,8 +162,13 @@ impl WorkerRingLoop { fn wait_for_cqe(&mut self) -> RS> { if let Some(timeout) = self.log_flush_wait_timeout()? { + trace!( + timeout_us = timeout.as_micros() as u64, + "worker_ring_loop wait_for_cqe_timeout" + ); return Ok(self.ring.wait_timeout(timeout)); } + trace!("worker_ring_loop wait_for_cqe_blocking"); Ok(self.ring.wait()) } @@ -176,7 +188,8 @@ impl WorkerRingLoop { let Some(log) = &self.log else { return Ok(()); }; - let _ = log.backend().poll_flush_log()?; + let started = log.backend().poll_flush_log()?; + trace!(started, "worker_ring_loop poll_flush_log result"); Ok(()) } } diff --git a/mudu_kernel/src/server/message_bus_api.rs b/mudu_kernel/src/server/message_bus_api.rs index 76a4043..ac54134 100644 --- a/mudu_kernel/src/server/message_bus_api.rs +++ b/mudu_kernel/src/server/message_bus_api.rs @@ -86,9 +86,11 @@ pub trait MessageBus: Send + Sync { } pub type MessageBusRef = Arc; +pub type ServerInstanceId = OID; -fn message_bus_registry() -> &'static Mutex> { - static REGISTRY: OnceLock>> = OnceLock::new(); +fn message_bus_registry() -> &'static Mutex> { + static REGISTRY: OnceLock>> = + OnceLock::new(); REGISTRY.get_or_init(|| Mutex::new(HashMap::new())) } @@ -226,32 +228,48 @@ pub(crate) fn current_message_bus() -> RS { }) } -pub(crate) fn register_worker_message_bus(worker_id: OID, message_bus: &MessageBusRef) -> RS<()> { +pub(crate) fn register_worker_message_bus( + server_instance_id: ServerInstanceId, + worker_id: OID, + message_bus: &MessageBusRef, +) -> RS<()> { let mut registry = message_bus_registry() .lock() .map_err(|_| m_error!(EC::InternalErr, "message bus registry lock poisoned"))?; - registry.insert(worker_id, message_bus.clone()); + registry.insert((server_instance_id, worker_id), message_bus.clone()); Ok(()) } -pub(crate) fn unregister_worker_message_bus(worker_id: OID) -> RS<()> { +pub(crate) fn unregister_worker_message_bus( + server_instance_id: ServerInstanceId, + worker_id: OID, +) -> RS<()> { let mut registry = message_bus_registry() .lock() .map_err(|_| m_error!(EC::InternalErr, "message bus registry lock poisoned"))?; - let Some(_bus) = registry.remove(&worker_id) else { + let Some(_bus) = registry.remove(&(server_instance_id, worker_id)) else { return Ok(()); }; Ok(()) } -pub(crate) fn message_bus_for_worker(worker_id: OID) -> RS { +pub(crate) fn message_bus_for_worker( + server_instance_id: ServerInstanceId, + worker_id: OID, +) -> RS { let registry = message_bus_registry() .lock() .map_err(|_| m_error!(EC::InternalErr, "message bus registry lock poisoned"))?; - registry.get(&worker_id).cloned().ok_or_else(|| { - m_error!( - EC::NoSuchElement, - format!("message bus for worker {} is not registered", worker_id) - ) - }) + registry + .get(&(server_instance_id, worker_id)) + .cloned() + .ok_or_else(|| { + m_error!( + EC::NoSuchElement, + format!( + "message bus for server {} worker {} is not registered", + server_instance_id, worker_id + ) + ) + }) } diff --git a/mudu_kernel/src/server/message_bus_state.rs b/mudu_kernel/src/server/message_bus_state.rs new file mode 100644 index 0000000..32b6254 --- /dev/null +++ b/mudu_kernel/src/server/message_bus_state.rs @@ -0,0 +1,98 @@ +use crate::server::message_bus_api::{Envelope, OnRecvCallback, RecvFilter, SubscriptionId}; +use mudu_utils::sync::notify_wait::{create_notify_wait, Notify, Wait}; +use std::collections::VecDeque; + +struct MessageBusRecvWaiter { + filter: RecvFilter, + sender: Notify, +} + +struct RegisteredMessageCallback { + id: SubscriptionId, + filter: RecvFilter, + callback: OnRecvCallback, +} + +#[derive(Default)] +pub(in crate::server) struct WorkerMessageBusState { + inbox: VecDeque, + recv_waiters: VecDeque, + callbacks: Vec, + next_subscription_id: SubscriptionId, +} + +impl WorkerMessageBusState { + pub(in crate::server) fn new() -> Self { + Self { + next_subscription_id: 1, + ..Self::default() + } + } + + pub(in crate::server) fn try_take_message(&mut self, filter: &RecvFilter) -> Option { + let index = self + .inbox + .iter() + .position(|message| message.matches(filter))?; + self.inbox.remove(index) + } + + pub(in crate::server) fn register_waiter(&mut self, filter: RecvFilter) -> Wait { + let (sender, receiver) = create_notify_wait(); + self.recv_waiters + .push_back(MessageBusRecvWaiter { filter, sender }); + receiver + } + + pub(in crate::server) fn register_callback( + &mut self, + filter: RecvFilter, + callback: OnRecvCallback, + ) -> (SubscriptionId, Option) { + let id = self.next_subscription_id; + self.next_subscription_id += 1; + let maybe_envelope = self.try_take_message(&filter); + self.callbacks.push(RegisteredMessageCallback { + id, + filter, + callback, + }); + (id, maybe_envelope) + } + + pub(in crate::server) fn cancel_callback(&mut self, id: SubscriptionId) -> bool { + let Some(index) = self.callbacks.iter().position(|callback| callback.id == id) else { + return false; + }; + self.callbacks.remove(index); + true + } + + pub(in crate::server) fn handle_incoming( + &mut self, + envelope: Envelope, + ) -> Option<(OnRecvCallback, Envelope)> { + if let Some(index) = self + .recv_waiters + .iter() + .position(|waiter| envelope.matches(&waiter.filter)) + { + if let Some(waiter) = self.recv_waiters.remove(index) { + let _ = waiter.sender.notify(envelope); + return None; + } + } + + if let Some(index) = self + .callbacks + .iter() + .position(|callback| envelope.matches(&callback.filter)) + { + let callback = self.callbacks[index].callback.clone(); + return Some((callback, envelope)); + } + + self.inbox.push_back(envelope); + None + } +} diff --git a/mudu_kernel/src/server/mod.rs b/mudu_kernel/src/server/mod.rs index f966bd6..3b3ef33 100644 --- a/mudu_kernel/src/server/mod.rs +++ b/mudu_kernel/src/server/mod.rs @@ -30,6 +30,7 @@ pub mod message_bus_api; #[cfg(target_os = "linux")] #[path = "linux/message_bus_runtime.rs"] mod message_bus_runtime; +mod message_bus_state; mod message_dispatcher; pub mod partition_router; mod partition_rpc; @@ -51,6 +52,8 @@ mod task; #[cfg(target_os = "linux")] #[path = "linux/task_registry.rs"] pub(crate) mod task_registry; +#[cfg(test)] +pub(crate) mod test_meta_mgr; #[cfg(target_os = "linux")] #[path = "linux/transferred_connection.rs"] mod transferred_connection; diff --git a/mudu_kernel/src/server/request_ctx.rs b/mudu_kernel/src/server/request_ctx.rs index e404df6..7567bb5 100644 --- a/mudu_kernel/src/server/request_ctx.rs +++ b/mudu_kernel/src/server/request_ctx.rs @@ -93,10 +93,25 @@ impl RequestCtx { &self, request: mudu_contract::protocol::ProcedureInvokeRequest, ) -> RS { + let trace = mudu_utils::task_trace!(); + trace.watch("procedure.kernel.request_ctx.stage", "handle_request_start"); + trace.watch( + "procedure.kernel.request_ctx.session_id", + &request.session_id().to_string(), + ); + trace.watch( + "procedure.kernel.request_ctx.name", + request.procedure_name(), + ); let response = self .worker .handle_procedure_request(self.conn_id, &request) .await?; + trace.watch("procedure.kernel.request_ctx.stage", "handle_request_done"); + trace.watch( + "procedure.kernel.request_ctx.stage", + "encode_response_start", + ); Ok(HandleResult::Response(encode_procedure_invoke_response( self.request_id, &ProcedureInvokeResponse::new(response.into_result()), diff --git a/mudu_kernel/src/server/request_response_worker.rs b/mudu_kernel/src/server/request_response_worker.rs index 4f47c6e..21b2e87 100644 --- a/mudu_kernel/src/server/request_response_worker.rs +++ b/mudu_kernel/src/server/request_response_worker.rs @@ -33,8 +33,8 @@ pub trait RequestResponseWorker: Send + Sync { ) -> RS; } -pub trait WorkerRuntime: RequestResponseWorker + WorkerLocal {} +pub trait WorkerRuntimeApi: RequestResponseWorker + WorkerLocal {} -impl WorkerRuntime for T where T: RequestResponseWorker + WorkerLocal + ?Sized {} +impl WorkerRuntimeApi for T where T: RequestResponseWorker + WorkerLocal + ?Sized {} -pub type WorkerRuntimeRef = Arc; +pub type WorkerRuntimeRef = Arc; diff --git a/mudu_kernel/src/server/server.rs b/mudu_kernel/src/server/server.rs index b3dc7eb..d978094 100644 --- a/mudu_kernel/src/server/server.rs +++ b/mudu_kernel/src/server/server.rs @@ -1,42 +1,65 @@ #![allow(dead_code)] +use crate::async_rt::contract::AsyncRuntime; use crate::server::async_func_runtime::AsyncFuncInvokerPtr; use crate::server::async_func_task::{AsyncFuncFuture, AsyncFuncTask, HandleResult}; use crate::server::async_func_task_waker::AsyncFuncTaskWaker; use crate::server::frame_dispatch::{dispatch_frame_async, try_decode_next_frame}; +use crate::server::message_bus_api::{ + register_worker_message_bus, set_current_message_bus, unregister_worker_message_bus, + unset_current_message_bus, EndpointId, Envelope, MessageBus, MessageBusRef, MessageId, + OnRecvCallback, OutgoingMessage, RecvFilter, ServerInstanceId, SubscriptionId, +}; +use crate::server::message_bus_state::WorkerMessageBusState; use crate::server::routing::{ConnectionTransfer, RoutingMode, SessionOpenTransferAction}; -use crate::server::worker::IoUringWorker; -use crate::server::worker_registry::{load_or_create_worker_registry, WorkerRegistry}; +use crate::server::session_bound_worker_runtime::{ + as_worker_local_ref, new_session_bound_worker_runtime, +}; +use crate::server::worker::WorkerRuntime; +use crate::server::worker_local::{set_current_worker_local, unset_current_worker_local}; +use crate::server::worker_registry::{ + load_or_create_worker_registry, WorkerIdentity, WorkerRegistry, +}; use crate::wal::worker_log::WorkerLogBatching; +use async_trait::async_trait; use crossbeam_queue::SegQueue; +use futures::future::poll_fn; use futures::task::{waker, Context}; use futures::Future; -use mudu::common::id::OID; +use mudu::common::id::{gen_oid, OID}; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; use mudu_contract::protocol::{ encode_merror_response, encode_session_create_response, Frame, SessionCreateResponse, }; -use mudu_utils::notifier::{notify_wait, Waiter}; +use mudu_sys::tokio::net::{TcpListener as TokioTcpListener, TcpStream as TokioTcpStream}; +use mudu_utils::notifier::{notify_wait, Notifier, Waiter}; +use mudu_utils::task_async::{ + build_current_thread_runtime, spawn_local_detached, spawn_local_task, CurrentThreadTaskRuntime, + PollTaskIdGuard, +}; +use mudu_utils::task_context::TaskContext; +use mudu_utils::task_id::new_task_id; use socket2::{Domain, Protocol, Socket, Type}; use std::collections::HashMap; -use std::io::{ErrorKind, Read, Write}; +use std::io::ErrorKind; use std::net::{SocketAddr, TcpListener, TcpStream}; use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::{atomic::AtomicBool, Arc}; +use std::sync::{atomic::AtomicBool, Arc, Mutex}; use std::task::Poll; use std::thread; +use std::thread::JoinHandle; use std::time::Duration; +use tracing::trace; /// Configuration shared by both execution paths of the `client` backend. /// -/// The `IoUring*` naming is historical and preserved to avoid breaking callers. -/// On Linux this configuration is consumed by the native `io_uring` backend. -/// On non-Linux targets the same configuration is used by a compatible -/// fallback implementation that keeps the worker model and protocol surface -/// unchanged without depending on `io_uring`. -pub struct IoUringTcpServerConfig { +/// The same configuration is consumed by both the io_uring worker-ring backend +/// and the Tokio backend so they keep the worker model and protocol surface +/// aligned. +pub struct WorkerTcpServerConfig { + server_instance_id: ServerInstanceId, worker_count: usize, listen_ip: String, listen_port: u16, @@ -49,14 +72,22 @@ pub struct IoUringTcpServerConfig { procedure_runtime: Option, worker_procedure_runtimes: Option>, worker_registry: Arc, + async_runtime: Option>, } -impl IoUringTcpServerConfig { +/// Backward-compatible name for callers that still refer to the historical +/// io_uring-only server configuration. +pub type IoUringTcpServerConfig = WorkerTcpServerConfig; + +/// Alias used by backend construction code that does not need a transport- +/// specific name. +pub type WorkerTcpBackendConfig = WorkerTcpServerConfig; + +impl WorkerTcpServerConfig { /// Creates a backend configuration. /// - /// The resulting value can be used on all supported targets. Linux uses the - /// native `io_uring` path, while other platforms use the fallback path with - /// the same externally visible behavior. + /// The resulting value can be used by both the io_uring and Tokio TCP + /// backends with the same externally visible behavior. pub fn new( worker_count: usize, listen_ip: String, @@ -68,6 +99,7 @@ impl IoUringTcpServerConfig { ) -> RS { let worker_registry = load_or_create_worker_registry(&log_dir, worker_count)?; Ok(Self { + server_instance_id: gen_oid(), worker_count, listen_ip, listen_port, @@ -80,6 +112,7 @@ impl IoUringTcpServerConfig { procedure_runtime, worker_procedure_runtimes: None, worker_registry, + async_runtime: None, }) } @@ -117,13 +150,22 @@ impl IoUringTcpServerConfig { /// /// When this is not set, every worker uses `procedure_runtime()`. This hook /// exists so upper layers can give each worker an isolated invoker instance - /// while keeping the transport API unchanged across Linux and non-Linux + /// while keeping the transport API unchanged across io_uring and Tokio /// implementations. pub fn with_worker_procedure_runtimes(mut self, runtimes: Vec) -> Self { self.worker_procedure_runtimes = Some(runtimes); self } + pub fn with_async_runtime(mut self, async_runtime: Arc) -> Self { + self.async_runtime = Some(async_runtime); + self + } + + pub fn server_instance_id(&self) -> ServerInstanceId { + self.server_instance_id + } + pub fn worker_count(&self) -> usize { self.worker_count } @@ -174,14 +216,23 @@ impl IoUringTcpServerConfig { .and_then(|runtimes| runtimes.get(worker_id).cloned()) .or_else(|| self.procedure_runtime()) } + + pub fn async_runtime(&self) -> Option> { + self.async_runtime.clone() + } } -/// Historical backend entry point for the `client` transport. +/// Backend entry point for the `client` transport. /// -/// The name is preserved for compatibility. Actual behavior is target-specific: -/// Linux runs the native `io_uring` backend, and other platforms run a -/// semantically compatible fallback implementation. -pub struct IoUringTcpBackend; +/// Actual behavior is target-specific: Linux runs the native `io_uring` +/// backend, and other platforms run a semantically compatible fallback +/// implementation. +pub struct WorkerTcpBackend; +pub struct TokioTcpBackend; + +/// Backward-compatible name for callers that still refer to the historical +/// io_uring-only backend entry point. +pub type IoUringTcpBackend = WorkerTcpBackend; #[derive(Debug)] struct TransferredConnection { @@ -191,49 +242,362 @@ struct TransferredConnection { session_open_action: Option, } -struct WorkerConnection { +struct TokioWorkerConnection { + core: ConnectionCore, + stream: Option, +} + +struct ConnectionCore { conn_id: u64, state: crate::server::connection_state::ConnectionState, - stream: TcpStream, remote_addr: SocketAddr, transferred: bool, read_buf: Vec, write_buf: Vec, } -fn apply_handle_result_to_connection( - connection: &mut WorkerConnection, +impl ConnectionCore { + fn new(conn_id: u64, remote_addr: SocketAddr) -> Self { + Self { + conn_id, + state: crate::server::connection_state::ConnectionState::Active, + remote_addr, + transferred: false, + read_buf: Vec::with_capacity(4096), + write_buf: Vec::with_capacity(4096), + } + } +} + +trait BackendConnection { + fn core(&self) -> &ConnectionCore; + fn core_mut(&mut self) -> &mut ConnectionCore; + fn read_available(&mut self) -> RS; + fn write_pending(&mut self) -> RS; + fn take_transfer_stream(&mut self) -> RS; +} + +impl BackendConnection for TokioWorkerConnection { + fn core(&self) -> &ConnectionCore { + &self.core + } + + fn core_mut(&mut self) -> &mut ConnectionCore { + &mut self.core + } + + fn read_available(&mut self) -> RS { + let mut progressed = false; + let Some(stream) = self.stream.as_mut() else { + return Ok(progressed); + }; + let mut buf = [0u8; 8192]; + loop { + match stream.try_read(&mut buf) { + Ok(0) => { + self.core.state = crate::server::connection_state::ConnectionState::Closing; + break; + } + Ok(read) => { + progressed = true; + self.core.read_buf.extend_from_slice(&buf[..read]); + } + Err(err) if err.kind() == ErrorKind::WouldBlock => break, + Err(err) => return Err(m_error!(EC::NetErr, "read tokio tcp request error", err)), + } + } + Ok(progressed) + } + + fn write_pending(&mut self) -> RS { + let mut progressed = false; + let Some(stream) = self.stream.as_mut() else { + return Ok(progressed); + }; + while !self.core.write_buf.is_empty() { + match stream.try_write(&self.core.write_buf) { + Ok(0) => { + self.core.state = crate::server::connection_state::ConnectionState::Closing; + break; + } + Ok(written) => { + progressed = true; + self.core.write_buf.drain(0..written); + } + Err(err) if err.kind() == ErrorKind::WouldBlock => break, + Err(err) => { + return Err(m_error!(EC::NetErr, "write tokio tcp response error", err)) + } + } + } + Ok(progressed) + } + + fn take_transfer_stream(&mut self) -> RS { + let stream = self + .stream + .take() + .ok_or_else(|| m_error!(EC::InternalErr, "tokio connection stream missing"))?; + stream + .into_std() + .map_err(|e| m_error!(EC::NetErr, "convert tokio stream for transfer error", e)) + } +} + +struct TokioWorkerMessageBus { + local_worker_id: OID, + registry: Arc, + mailboxes: Vec>>, + next_msg_id: AtomicU64, + state: Mutex, +} + +impl TokioWorkerMessageBus { + fn new( + local_worker_id: OID, + registry: Arc, + mailboxes: Vec>>, + ) -> Arc { + Arc::new(Self { + local_worker_id, + registry, + mailboxes, + next_msg_id: AtomicU64::new(1), + state: Mutex::new(WorkerMessageBusState::new()), + }) + } + + fn bus_ref(self: &Arc) -> MessageBusRef { + self.clone() + } + + fn handle_incoming(&self, envelope: Envelope) -> RS<()> { + let maybe_callback = { + let mut state = self + .state + .lock() + .map_err(|_| m_error!(EC::InternalErr, "tokio message bus state lock poisoned"))?; + state.handle_incoming(envelope) + }; + if let Some((callback, envelope)) = maybe_callback { + let _ = spawn_local_detached("tokio_message_bus_handle_incoming", async move { + let _ = (callback)(envelope).await; + }); + } + Ok(()) + } + + fn route_worker_index(&self, endpoint: &EndpointId) -> RS { + match endpoint { + EndpointId::Worker(worker_id) => self + .registry + .worker_index_by_worker_id(*worker_id) + .ok_or_else(|| { + m_error!( + EC::NoSuchElement, + format!("no such worker id {}", worker_id) + ) + }), + EndpointId::External(external_id) => Err(m_error!( + EC::NotImplemented, + format!("external endpoint {} is not implemented yet", external_id) + )), + EndpointId::Session(session_id) => Err(m_error!( + EC::NotImplemented, + format!("session endpoint {} is not implemented yet", session_id) + )), + } + } +} + +#[async_trait] +impl MessageBus for TokioWorkerMessageBus { + fn local_endpoint(&self) -> EndpointId { + EndpointId::Worker(self.local_worker_id) + } + + async fn send(&self, dst: EndpointId, message: OutgoingMessage) -> RS { + let msg_id = self.next_msg_id.fetch_add(1, Ordering::Relaxed); + let envelope = Envelope::new( + msg_id, + message.correlation_id(), + self.local_endpoint(), + dst.clone(), + message.kind(), + message.payload_owned(), + message.delivery(), + ); + let target_worker = self.route_worker_index(&dst)?; + let Some(mailbox) = self.mailboxes.get(target_worker) else { + return Err(m_error!( + EC::InternalErr, + format!("mailbox target worker {} is out of range", target_worker) + )); + }; + mailbox.push(envelope); + Ok(msg_id) + } + + async fn recv(&self, filter: RecvFilter) -> RS { + let receiver = { + let mut state = self + .state + .lock() + .map_err(|_| m_error!(EC::InternalErr, "tokio message bus state lock poisoned"))?; + if let Some(envelope) = state.try_take_message(&filter) { + return Ok(envelope); + } + state.register_waiter(filter) + }; + receiver + .wait() + .await? + .ok_or_else(|| m_error!(EC::ThreadErr, "message bus waiter dropped before delivery")) + } + + fn on_recv_callback(&self, filter: RecvFilter, callback: OnRecvCallback) -> RS { + let (callback_id, maybe_envelope) = { + let mut state = self + .state + .lock() + .map_err(|_| m_error!(EC::InternalErr, "tokio message bus state lock poisoned"))?; + state.register_callback(filter, callback.clone()) + }; + if let Some(envelope) = maybe_envelope { + let _ = spawn_local_detached("tokio_message_bus_on_recv_callback", async move { + let _ = (callback)(envelope).await; + }); + } + Ok(callback_id) + } + + fn cancel_callback(&self, id: SubscriptionId) -> RS { + let mut state = self + .state + .lock() + .map_err(|_| m_error!(EC::InternalErr, "tokio message bus state lock poisoned"))?; + Ok(state.cancel_callback(id)) + } +} + +unsafe impl Send for TokioWorkerMessageBus {} +unsafe impl Sync for TokioWorkerMessageBus {} + +struct WorkerBuildConfig { + server_instance_id: ServerInstanceId, + worker_count: usize, + log_dir: String, + data_dir: String, + log_chunk_size: u64, + log_batching: WorkerLogBatching, + routing_mode: RoutingMode, + procedure_runtime: Option, + worker_identity: WorkerIdentity, + worker_registry: Arc, + async_runtime: Option>, +} + +impl WorkerBuildConfig { + fn from_server_config(cfg: &WorkerTcpBackendConfig, worker_id: usize) -> RS { + let worker_identity = cfg + .worker_registry() + .worker(worker_id) + .cloned() + .ok_or_else(|| { + m_error!( + EC::NoSuchElement, + format!("missing worker identity {}", worker_id) + ) + })?; + Ok(Self { + server_instance_id: cfg.server_instance_id(), + worker_count: cfg.worker_count(), + log_dir: cfg.log_dir().to_string(), + data_dir: cfg.data_dir().to_string(), + log_chunk_size: cfg.log_chunk_size(), + log_batching: cfg.log_batching(), + routing_mode: cfg.routing_mode(), + procedure_runtime: cfg.procedure_runtime_for_worker(worker_id), + worker_identity, + worker_registry: cfg.worker_registry(), + async_runtime: cfg.async_runtime(), + }) + } + + fn build_worker(self) -> RS { + WorkerRuntime::new_with_log_batching_and_runtime( + self.worker_identity, + self.worker_count, + self.routing_mode, + self.log_dir, + self.data_dir, + self.log_chunk_size, + self.log_batching, + self.procedure_runtime, + self.worker_registry, + self.async_runtime, + self.server_instance_id, + ) + } +} + +fn spawn_stop_bridge( + name: &'static str, + stop: Waiter, + stop_flag: Arc, +) -> RS>> { + thread::Builder::new() + .name(name.to_string()) + .spawn(move || { + let runtime = build_current_thread_runtime().map_err(|e| { + m_error!(EC::TokioErr, format!("create runtime for {name} error"), e) + })?; + trace!(bridge = name, "tokio stop bridge waiting for stop"); + runtime.block_on(stop.wait()); + trace!(bridge = name, "tokio stop bridge observed stop"); + stop_flag.store(true, Ordering::Relaxed); + Ok(()) + }) + .map_err(|e| m_error!(EC::ThreadErr, format!("spawn {name} error"), e)) +} + +fn wait_stop_bridge(name: &'static str, handle: JoinHandle>) -> RS<()> { + handle + .join() + .map_err(|_| m_error!(EC::ThreadErr, format!("join {name} error")))? +} + +fn apply_handle_result_to_connection( + connection: &mut C, inboxes: &[Arc>], result: HandleResult, ) -> RS<()> { match result { HandleResult::Response(payload) => { - connection.write_buf.extend_from_slice(&payload); + connection.core_mut().write_buf.extend_from_slice(&payload); } HandleResult::Transfer(transfer) => { - let stream = connection - .stream - .try_clone() - .map_err(|e| m_error!(EC::NetErr, "clone transferred stream error", e))?; + let stream = connection.take_transfer_stream()?; enqueue_transfer( inboxes, - connection.conn_id, + connection.core().conn_id, transfer.target_worker(), - connection.remote_addr, + connection.core().remote_addr, stream, transfer.session_ids().to_vec(), Some(transfer.action()), )?; - connection.transferred = true; - connection.state = crate::server::connection_state::ConnectionState::Closing; - connection.write_buf.clear(); + let core = connection.core_mut(); + core.transferred = true; + core.state = crate::server::connection_state::ConnectionState::Closing; + core.write_buf.clear(); } } Ok(()) } -fn apply_handle_result( - connections: &mut HashMap, +fn apply_handle_result( + connections: &mut HashMap, inboxes: &[Arc>], conn_id: u64, result: HandleResult, @@ -268,10 +632,17 @@ impl FallbackAsyncFuncState { fn enqueue_future(&mut self, conn_id: u64, request_id: u64, future: AsyncFuncFuture) { let task_id = self.next_task_id; self.next_task_id += 1; + let trace_task_id = new_task_id(); + let _ = TaskContext::new_context( + trace_task_id, + format!("tokio_async_func conn={conn_id} req={request_id}"), + false, + ); self.tasks.insert( task_id, AsyncFuncTask::new( conn_id, + trace_task_id, request_id, future, Arc::new(AtomicBool::new(false)), @@ -289,6 +660,10 @@ impl FallbackAsyncFuncState { let Some(task) = self.tasks.get(&task_id) else { continue; }; + if let Some(ctx) = TaskContext::get(task.trace_task_id()) { + ctx.watch("state", "ready"); + ctx.watch("wake_op_id", &op_id.to_string()); + } if !task.queued().swap(true, Ordering::AcqRel) { self.ready_queue.push(task_id); progressed = true; @@ -299,7 +674,7 @@ impl FallbackAsyncFuncState { fn poll_ready( &mut self, - connections: &mut HashMap, + connections: &mut HashMap, inboxes: &[Arc>], ) -> RS { let mut progressed = false; @@ -307,6 +682,13 @@ impl FallbackAsyncFuncState { let Some(mut task) = self.tasks.remove(&task_id) else { continue; }; + let trace_task_id = task.trace_task_id(); + trace!( + task_id, + conn_id = task.conn_id(), + request_id = task.request_id(), + "tokio async task poll begin" + ); progressed = true; task.clear_queued(); if let Some(waiting_on) = task.take_waiting_on() { @@ -321,18 +703,49 @@ impl FallbackAsyncFuncState { task.completed().clone(), ))); let mut cx = Context::from_waker(&waker); + let _guard = PollTaskIdGuard::enter(trace_task_id); + if let Some(ctx) = TaskContext::get(trace_task_id) { + ctx.watch("state", "polling"); + ctx.watch("poll_task_id", &task_id.to_string()); + } match task.future_mut().poll(&mut cx) { Poll::Ready(Ok(result)) => { + trace!( + task_id, + conn_id = task.conn_id(), + request_id = task.request_id(), + "tokio async task poll ready ok" + ); + TaskContext::remove_context(trace_task_id); apply_handle_result(connections, inboxes, task.conn_id(), result)?; } Poll::Ready(Err(err)) => { + trace!( + task_id, + conn_id = task.conn_id(), + request_id = task.request_id(), + err = %err, + "tokio async task poll ready err" + ); + TaskContext::remove_context(trace_task_id); if let Some(connection) = connections.get_mut(&task.conn_id()) { let response = encode_merror_response(task.request_id(), &err)?; - connection.write_buf.extend_from_slice(&response); + connection.core_mut().write_buf.extend_from_slice(&response); } } Poll::Pending => { + trace!( + task_id, + conn_id = task.conn_id(), + request_id = task.request_id(), + op_id, + "tokio async task poll pending" + ); task.set_waiting_on(op_id); + if let Some(ctx) = TaskContext::get(trace_task_id) { + ctx.watch("state", "pending"); + ctx.watch("waiting_waker_op_id", &op_id.to_string()); + } self.op_registry.insert(op_id, task_id); self.tasks.insert(task_id, task); } @@ -342,72 +755,83 @@ impl FallbackAsyncFuncState { } } -impl IoUringTcpBackend { +impl WorkerTcpBackend { /// Starts the backend until shutdown. /// /// This method keeps the old public entry point stable. It dispatches to - /// the Linux `io_uring` implementation when available and otherwise uses - /// the portable fallback path. - pub fn sync_serve(cfg: IoUringTcpServerConfig) -> RS<()> { + /// the io_uring implementation on Linux. Select `TokioTcpBackend` + /// explicitly when the Tokio worker loop is desired on any target. + pub fn sync_serve(cfg: WorkerTcpServerConfig) -> RS<()> { let (_stop_notifier, stop_waiter) = notify_wait(); Self::sync_serve_with_stop(cfg, stop_waiter) } /// Internal serve entry that accepts an explicit stop waiter. /// - /// Linux uses `server_iouring`; non-Linux bridges the async stop signal - /// into an atomic flag and then runs the fallback worker loop. - pub fn sync_serve_with_stop(cfg: IoUringTcpServerConfig, stop: Waiter) -> RS<()> { + /// The io_uring backend is Linux-only. The Tokio backend is available as a + /// separate implementation and bridges the async stop signal into its + /// worker loop. + pub fn sync_serve_with_stop(cfg: WorkerTcpServerConfig, stop: Waiter) -> RS<()> { + Self::sync_serve_with_stop_and_ready(cfg, stop, None) + } + + pub fn sync_serve_with_stop_and_ready( + cfg: WorkerTcpServerConfig, + stop: Waiter, + ready: Option, + ) -> RS<()> { #[cfg(target_os = "linux")] { - return crate::server::server_iouring::sync_serve_iouring(cfg, stop); + return crate::server::server_iouring::sync_serve_iouring(cfg, stop, ready); } #[cfg(not(target_os = "linux"))] - { - let stop_flag = Arc::new(AtomicBool::new(false)); - let stop_for_fallback = stop_flag.clone(); - let notifier = thread::Builder::new() - .name("iouring-stop-bridge".to_string()) - .spawn(move || { - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .map_err(|e| { - m_error!( - EC::TokioErr, - "create runtime for io_uring fallback stop bridge error", - e - ) - })?; - runtime.block_on(stop.wait()); - stop_for_fallback.store(true, Ordering::Relaxed); - Ok(()) - }) - .map_err(|e| m_error!(EC::ThreadErr, "spawn io_uring stop bridge error", e))?; - let result = sync_serve_fallback(cfg, stop_flag); - let notify_result = notifier - .join() - .map_err(|_| m_error!(EC::ThreadErr, "join io_uring stop bridge error"))?; - notify_result?; - return result; - } + TokioTcpBackend::sync_serve_with_stop_and_ready(cfg, stop, ready) + } +} + +impl TokioTcpBackend { + pub fn sync_serve(cfg: WorkerTcpServerConfig) -> RS<()> { + let (_stop_notifier, stop_waiter) = notify_wait(); + Self::sync_serve_with_stop(cfg, stop_waiter) + } + + pub fn sync_serve_with_stop(cfg: WorkerTcpServerConfig, stop: Waiter) -> RS<()> { + Self::sync_serve_with_stop_and_ready(cfg, stop, None) + } + + pub fn sync_serve_with_stop_and_ready( + cfg: WorkerTcpServerConfig, + stop: Waiter, + ready: Option, + ) -> RS<()> { + let stop_flag = Arc::new(AtomicBool::new(false)); + let notifier = spawn_stop_bridge("tokio-stop-bridge", stop, stop_flag.clone())?; + let result = sync_serve_tokio(cfg, stop_flag, ready); + wait_stop_bridge("tokio-stop-bridge", notifier)?; + result } } -// Non-Linux compatibility path for the historical `IoUringTcpBackend` API. -fn sync_serve_fallback(mut cfg: IoUringTcpServerConfig, stop: Arc) -> RS<()> { +fn sync_serve_tokio( + mut cfg: WorkerTcpServerConfig, + stop: Arc, + ready: Option, +) -> RS<()> { if cfg.worker_count() == 0 { - return Err(m_error!(EC::ParseErr, "invalid io_uring worker count")); + return Err(m_error!(EC::ParseErr, "invalid tokio worker count")); } let listen_addr: SocketAddr = format!("{}:{}", cfg.listen_ip(), cfg.listen_port()) .parse() - .map_err(|e| m_error!(EC::ParseErr, "parse io_uring tcp listen address error", e))?; + .map_err(|e| m_error!(EC::ParseErr, "parse tokio tcp listen address error", e))?; let conn_id_alloc = Arc::new(AtomicU64::new(1)); let inboxes: Vec<_> = (0..cfg.worker_count()) .map(|_| Arc::new(SegQueue::::new())) .collect(); + let bus_mailboxes: Vec<_> = (0..cfg.worker_count()) + .map(|_| Arc::new(SegQueue::::new())) + .collect(); let listener = match cfg.take_prebound_listener() { Some(listener) => listener, None => create_listener(listen_addr)?, @@ -415,157 +839,321 @@ fn sync_serve_fallback(mut cfg: IoUringTcpServerConfig, stop: Arc) - let mut handles = Vec::with_capacity(cfg.worker_count()); for worker_id in 0..cfg.worker_count() { - let worker_count = cfg.worker_count(); - let log_dir = cfg.log_dir().to_string(); - let log_chunk_size = cfg.log_chunk_size(); - let log_batching = cfg.log_batching(); - let routing_mode = cfg.routing_mode(); - let procedure_runtime = cfg.procedure_runtime_for_worker(worker_id); - let worker_identity = cfg - .worker_registry() - .worker(worker_id) - .cloned() - .ok_or_else(|| { - m_error!( - EC::NoSuchElement, - format!("missing worker identity {}", worker_id) - ) - })?; - let worker_registry = cfg.worker_registry(); - let data_dir = cfg.data_dir().to_string(); + let worker_cfg = WorkerBuildConfig::from_server_config(&cfg, worker_id)?; let inbox = inboxes[worker_id].clone(); let all_inboxes = inboxes.clone(); + let bus_inbox = bus_mailboxes[worker_id].clone(); + let all_bus_mailboxes = bus_mailboxes.clone(); let conn_id_alloc = conn_id_alloc.clone(); let stop = stop.clone(); let listener = listener .try_clone() - .map_err(|e| m_error!(EC::NetErr, "clone tcp listener error", e))?; + .map_err(|e| m_error!(EC::NetErr, "clone tokio tcp listener error", e))?; let handle = thread::Builder::new() - .name(format!("iouring-tcp-worker-{worker_id}")) + .name(format!("tokio-tcp-worker-{worker_id}")) .spawn(move || { - let worker = IoUringWorker::new_with_log_batching( - worker_identity, - worker_count, - routing_mode, - log_dir, - data_dir, - log_chunk_size, - log_batching, - procedure_runtime, - worker_registry, + trace!(worker_id, "tokio worker thread starting"); + listener + .set_nonblocking(true) + .map_err(|e| m_error!(EC::NetErr, "set tokio listener nonblocking error", e))?; + let worker = worker_cfg.build_worker()?; + let message_bus = TokioWorkerMessageBus::new( + worker.worker_id(), + worker.registry().clone(), + all_bus_mailboxes, + ); + let worker_id = worker.worker_id(); + let server_instance_id = worker.server_instance_id(); + let runtime = CurrentThreadTaskRuntime::new() + .map_err(|e| m_error!(EC::TokioErr, "build tokio worker runtime error", e))?; + set_current_worker_local(as_worker_local_ref(new_session_bound_worker_runtime( + worker.clone(), + 0, + ))); + let message_bus_ref = message_bus.bus_ref(); + set_current_message_bus(message_bus_ref.clone()); + register_worker_message_bus( + server_instance_id, + worker.worker_id(), + &message_bus_ref, )?; - run_worker_loop(worker, listener, inbox, all_inboxes, conn_id_alloc, stop) + let result = runtime.block_on(async move { + trace!(worker_id, "tokio worker loop entering"); + let listener = TokioTcpListener::from_std(listener) + .map_err(|e| m_error!(EC::NetErr, "convert tokio tcp listener error", e))?; + worker.ensure_partition_rpc_handler()?; + let (_task_notifier, task_waiter) = notify_wait(); + let join = spawn_local_task( + task_waiter.into(), + &format!("tokio_worker_loop_{worker_id}"), + run_worker_loop_tokio( + worker, + listener, + inbox, + all_inboxes, + bus_inbox, + message_bus, + conn_id_alloc, + stop, + ), + )?; + match join.await.map_err(|e| { + m_error!(EC::TokioErr, "join tokio worker loop task error", e) + })? { + Some(result) => result, + None => Ok(()), + } + }); + trace!(worker_id, ok = result.is_ok(), "tokio worker loop returned"); + let _ = unregister_worker_message_bus(server_instance_id, worker_id); + unset_current_message_bus(); + unset_current_worker_local(); + trace!(worker_id, "tokio worker thread exiting"); + result }) - .map_err(|e| m_error!(EC::ThreadErr, "spawn io_uring worker error", e))?; + .map_err(|e| m_error!(EC::ThreadErr, "spawn tokio worker error", e))?; handles.push(handle); } - for handle in handles { + // Tokio mode has no separate recovery barrier after the listener is bound + // and the worker threads are spawned, so this is the earliest point where + // callers can treat the backend as logically ready to serve requests. + if let Some(ready) = ready { + ready.notify_all(); + } + + for (worker_id, handle) in handles.into_iter().enumerate() { + trace!(worker_id, "joining tokio worker"); let result = handle .join() - .map_err(|_| m_error!(EC::ThreadErr, "join io_uring worker error"))?; + .map_err(|_| m_error!(EC::ThreadErr, "join tokio worker error"))?; + trace!(worker_id, ok = result.is_ok(), "joined tokio worker"); result?; } Ok(()) } -fn create_listener(listen_addr: SocketAddr) -> RS { - let domain = if listen_addr.is_ipv4() { - Domain::IPV4 - } else { - Domain::IPV6 - }; - let socket = Socket::new(domain, Type::STREAM, Some(Protocol::TCP)) - .map_err(|e| m_error!(EC::NetErr, "create tcp listener socket error", e))?; - socket - .set_reuse_address(true) - .map_err(|e| m_error!(EC::NetErr, "enable SO_REUSEADDR error", e))?; - socket - .set_nonblocking(true) - .map_err(|e| m_error!(EC::NetErr, "set listener nonblocking error", e))?; - socket - .bind(&listen_addr.into()) - .map_err(|e| m_error!(EC::NetErr, "bind io_uring tcp listener error", e))?; - socket - .listen(1024) - .map_err(|e| m_error!(EC::NetErr, "listen io_uring tcp listener error", e))?; - Ok(socket.into()) -} - -fn run_worker_loop( - worker: IoUringWorker, - listener: TcpListener, +async fn run_worker_loop_tokio( + worker: WorkerRuntime, + listener: TokioTcpListener, inbox: Arc>, inboxes: Vec>>, + bus_inbox: Arc>, + message_bus: Arc, conn_id_alloc: Arc, stop: Arc, ) -> RS<()> { - let mut connections = HashMap::::new(); + let mut connections = HashMap::::new(); let mut async_funcs = FallbackAsyncFuncState::new(); let idle_sleep = Duration::from_millis(1); while !stop.load(Ordering::Relaxed) { let mut progressed = false; - progressed |= drain_accepted_connections( + trace!( + worker_id = worker.worker_id(), + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop iteration begin" + ); + progressed |= drain_accepted_connections_tokio( &listener, &worker, &inboxes, &mut connections, &conn_id_alloc, - )?; - progressed |= drain_transferred_connections(&worker, inbox.as_ref(), &mut connections)?; + ) + .await?; + trace!( + worker_id = worker.worker_id(), + progressed, + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop after accept" + ); + progressed |= + drain_transferred_connections_tokio(&worker, inbox.as_ref(), &mut connections)?; + trace!( + worker_id = worker.worker_id(), + progressed, + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop after transfer" + ); + progressed |= drain_message_bus_tokio(bus_inbox.as_ref(), message_bus.as_ref())?; + trace!( + worker_id = worker.worker_id(), + progressed, + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop after message bus" + ); progressed |= async_funcs.drain_completions(); + trace!( + worker_id = worker.worker_id(), + progressed, + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop after drain completions" + ); progressed |= async_funcs.poll_ready(&mut connections, &inboxes)?; + trace!( + worker_id = worker.worker_id(), + progressed, + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop after poll_ready" + ); progressed |= drive_connections(&worker, &mut async_funcs, &mut connections, &inboxes)?; + trace!( + worker_id = worker.worker_id(), + progressed, + connection_count = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop after drive_connections" + ); if !progressed { - thread::sleep(idle_sleep); + mudu_sys::task_async::sleep(idle_sleep).await?; } } + trace!( + worker_id = worker.worker_id(), + remaining_connections = connections.len(), + pending_async_tasks = async_funcs.tasks.len(), + "tokio worker loop observed stop" + ); Ok(()) } -fn drain_accepted_connections( - listener: &TcpListener, - worker: &IoUringWorker, +fn drain_message_bus_tokio( + inbox: &SegQueue, + message_bus: &TokioWorkerMessageBus, +) -> RS { + let mut progressed = false; + while let Some(envelope) = inbox.pop() { + progressed = true; + message_bus.handle_incoming(envelope)?; + } + Ok(progressed) +} + +async fn drain_accepted_connections_tokio( + listener: &TokioTcpListener, + worker: &WorkerRuntime, inboxes: &[Arc>], - connections: &mut HashMap, + connections: &mut HashMap, conn_id_alloc: &AtomicU64, ) -> RS { let mut progressed = false; loop { - match listener.accept() { - Ok((stream, remote_addr)) => { + match poll_accept_once(listener).await? { + Some((stream, remote_addr)) => { progressed = true; - let conn_id = conn_id_alloc.fetch_add(1, Ordering::Relaxed); - let target_worker = worker.route_connection(conn_id, remote_addr); - if target_worker == worker.worker_index() { - register_connection(connections, conn_id, remote_addr, stream)?; - } else { - enqueue_transfer( - inboxes, - conn_id, - target_worker, - remote_addr, - stream, - Vec::new(), - None, - )?; - } - } - Err(err) if err.kind() == ErrorKind::WouldBlock => break, - Err(err) => { - return Err(m_error!( - EC::NetErr, - "accept io_uring tcp connection error", - err - )); + route_accepted_connection( + worker, + inboxes, + connections, + conn_id_alloc, + stream, + remote_addr, + register_connection_tokio, + |stream| { + stream.into_std().map_err(|e| { + m_error!(EC::NetErr, "convert accepted tokio stream to std error", e) + }) + }, + )?; } + None => break, } } Ok(progressed) } +fn drain_transferred_connections_tokio( + worker: &WorkerRuntime, + inbox: &SegQueue, + connections: &mut HashMap, +) -> RS { + drain_transferred_connections_common(worker, inbox, connections, |connections, connection| { + connection.stream.set_nonblocking(true).map_err(|e| { + m_error!( + EC::NetErr, + "set transferred tokio stream nonblocking error", + e + ) + })?; + let stream = TokioTcpStream::from_std(connection.stream).map_err(|e| { + m_error!( + EC::NetErr, + "convert transferred std stream to tokio error", + e + ) + })?; + register_connection_tokio( + connections, + connection.transfer.conn_id(), + connection.transfer.remote_addr(), + stream, + ) + }) +} + +fn register_connection_tokio( + connections: &mut HashMap, + conn_id: u64, + remote_addr: SocketAddr, + stream: TokioTcpStream, +) -> RS<()> { + stream + .set_nodelay(true) + .map_err(|e| m_error!(EC::NetErr, "set tokio connection nodelay error", e))?; + connections.insert( + conn_id, + TokioWorkerConnection { + core: ConnectionCore::new(conn_id, remote_addr), + stream: Some(stream), + }, + ); + Ok(()) +} + +async fn poll_accept_once(listener: &TokioTcpListener) -> RS> { + poll_fn(|cx| match listener.poll_accept(cx) { + Poll::Ready(Ok(pair)) => Poll::Ready(Ok(Some(pair))), + Poll::Ready(Err(err)) => Poll::Ready(Err(m_error!( + EC::NetErr, + "accept tokio tcp connection error", + err + ))), + Poll::Pending => Poll::Ready(Ok(None)), + }) + .await +} + +fn create_listener(listen_addr: SocketAddr) -> RS { + let domain = if listen_addr.is_ipv4() { + Domain::IPV4 + } else { + Domain::IPV6 + }; + let socket = Socket::new(domain, Type::STREAM, Some(Protocol::TCP)) + .map_err(|e| m_error!(EC::NetErr, "create tcp listener socket error", e))?; + socket + .set_reuse_address(true) + .map_err(|e| m_error!(EC::NetErr, "enable SO_REUSEADDR error", e))?; + socket + .set_nonblocking(true) + .map_err(|e| m_error!(EC::NetErr, "set listener nonblocking error", e))?; + socket + .bind(&listen_addr.into()) + .map_err(|e| m_error!(EC::NetErr, "bind io_uring tcp listener error", e))?; + socket + .listen(1024) + .map_err(|e| m_error!(EC::NetErr, "listen io_uring tcp listener error", e))?; + Ok(socket.into()) +} + fn enqueue_transfer( inboxes: &[Arc>], conn_id: u64, @@ -595,70 +1183,74 @@ fn enqueue_transfer( Ok(()) } -fn drain_transferred_connections( - worker: &IoUringWorker, +fn route_accepted_connection( + worker: &WorkerRuntime, + inboxes: &[Arc>], + connections: &mut HashMap, + conn_id_alloc: &AtomicU64, + stream: S, + remote_addr: SocketAddr, + register_local: RegisterLocal, + into_transfer: IntoTransfer, +) -> RS<()> +where + RegisterLocal: FnOnce(&mut HashMap, u64, SocketAddr, S) -> RS<()>, + IntoTransfer: FnOnce(S) -> RS, +{ + let conn_id = conn_id_alloc.fetch_add(1, Ordering::Relaxed); + let target_worker = worker.route_connection(conn_id, remote_addr); + if target_worker == worker.worker_index() { + register_local(connections, conn_id, remote_addr, stream) + } else { + enqueue_transfer( + inboxes, + conn_id, + target_worker, + remote_addr, + into_transfer(stream)?, + Vec::new(), + None, + ) + } +} + +fn drain_transferred_connections_common( + worker: &WorkerRuntime, inbox: &SegQueue, - connections: &mut HashMap, -) -> RS { + connections: &mut HashMap, + mut register: Register, +) -> RS +where + C: BackendConnection, + Register: FnMut(&mut HashMap, TransferredConnection) -> RS<()>, +{ let mut progressed = false; while let Some(connection) = inbox.pop() { progressed = true; worker.adopt_connection_sessions(connection.transfer.conn_id(), &connection.session_ids)?; - register_connection( - connections, - connection.transfer.conn_id(), - connection.transfer.remote_addr(), - connection.stream, - )?; - if let Some(action) = connection.session_open_action { - let payload = match worker - .open_session_with_config(connection.transfer.conn_id(), action.config()) - { + let conn_id = connection.transfer.conn_id(); + let action = connection.session_open_action; + register(connections, connection)?; + if let Some(action) = action { + let payload = match worker.open_session_with_config(conn_id, action.config()) { Ok(session_id) => encode_session_create_response( action.request_id(), &SessionCreateResponse::new(session_id), )?, Err(err) => encode_merror_response(action.request_id(), &err)?, }; - if let Some(registered) = connections.get_mut(&connection.transfer.conn_id()) { - registered.write_buf.extend_from_slice(&payload); + if let Some(registered) = connections.get_mut(&conn_id) { + registered.core_mut().write_buf.extend_from_slice(&payload); } } } Ok(progressed) } -fn register_connection( - connections: &mut HashMap, - conn_id: u64, - remote_addr: SocketAddr, - stream: TcpStream, -) -> RS<()> { - stream - .set_nonblocking(true) - .map_err(|e| m_error!(EC::NetErr, "set connection nonblocking error", e))?; - stream - .set_nodelay(true) - .map_err(|e| m_error!(EC::NetErr, "set connection nodelay error", e))?; - connections.insert( - conn_id, - WorkerConnection { - conn_id, - state: crate::server::connection_state::ConnectionState::Active, - stream, - remote_addr, - transferred: false, - read_buf: Vec::with_capacity(4096), - write_buf: Vec::with_capacity(4096), - }, - ); - Ok(()) -} - -fn drive_connections( - worker: &IoUringWorker, +fn drive_connections( + worker: &WorkerRuntime, async_funcs: &mut FallbackAsyncFuncState, - connections: &mut HashMap, + connections: &mut HashMap, inboxes: &[Arc>], ) -> RS { let mut progressed = false; @@ -666,16 +1258,32 @@ fn drive_connections( let mut closed = Vec::new(); for conn_id in conn_ids { + trace!(conn_id, "tokio drive connection begin"); let Some(connection) = connections.get_mut(&conn_id) else { continue; }; - progressed |= flush_pending_writes(connection)?; + progressed |= connection.write_pending()?; + trace!( + conn_id, + state = ?connection.core().state, + write_buf_len = connection.core().write_buf.len(), + read_buf_len = connection.core().read_buf.len(), + "tokio drive connection after write_pending" + ); let connection_progress = read_and_dispatch(worker, async_funcs, connection, inboxes)?; progressed |= connection_progress; - if connection.state == crate::server::connection_state::ConnectionState::Closing - && connection.write_buf.is_empty() + trace!( + conn_id, + connection_progress, + state = ?connection.core().state, + write_buf_len = connection.core().write_buf.len(), + read_buf_len = connection.core().read_buf.len(), + "tokio drive connection after read_and_dispatch" + ); + if connection.core().state == crate::server::connection_state::ConnectionState::Closing + && connection.core().write_buf.is_empty() { - closed.push((conn_id, connection.transferred)); + closed.push((conn_id, connection.core().transferred)); } } @@ -688,63 +1296,29 @@ fn drive_connections( Ok(progressed) } -fn flush_pending_writes(connection: &mut WorkerConnection) -> RS { - let mut progressed = false; - while !connection.write_buf.is_empty() { - match connection.stream.write(&connection.write_buf) { - Ok(0) => { - connection.state = crate::server::connection_state::ConnectionState::Closing; - break; - } - Ok(written) => { - progressed = true; - connection.write_buf.drain(0..written); - } - Err(err) if err.kind() == ErrorKind::WouldBlock => break, - Err(err) => return Err(m_error!(EC::NetErr, "write tcp response error", err)), - } - } - Ok(progressed) -} - -fn read_and_dispatch( - worker: &IoUringWorker, +fn read_and_dispatch( + worker: &WorkerRuntime, async_funcs: &mut FallbackAsyncFuncState, - connection: &mut WorkerConnection, + connection: &mut C, inboxes: &[Arc>], ) -> RS { - let mut progressed = false; - let mut buf = [0u8; 8192]; - loop { - match connection.stream.read(&mut buf) { - Ok(0) => { - connection.state = crate::server::connection_state::ConnectionState::Closing; - break; - } - Ok(read) => { - progressed = true; - connection.read_buf.extend_from_slice(&buf[..read]); - } - Err(err) if err.kind() == ErrorKind::WouldBlock => break, - Err(err) => return Err(m_error!(EC::NetErr, "read tcp request error", err)), - } - } + let mut progressed = connection.read_available()?; - while let Some((frame, consumed)) = try_decode_next_frame(&connection.read_buf)? { + while let Some((frame, consumed)) = try_decode_next_frame(&connection.core().read_buf)? { progressed = true; - let response = dispatch_frame(worker, connection.conn_id, async_funcs, &frame); - connection.read_buf.drain(0..consumed); + let response = dispatch_frame(worker, connection.core().conn_id, async_funcs, &frame); + connection.core_mut().read_buf.drain(0..consumed); match response { Ok(Some(result)) => { apply_handle_result_to_connection(connection, inboxes, result)?; - if connection.transferred { + if connection.core().transferred { return Ok(true); } } Ok(None) => {} Err(err) => { let payload = encode_merror_response(frame.header().request_id(), &err)?; - connection.write_buf.extend_from_slice(&payload); + connection.core_mut().write_buf.extend_from_slice(&payload); } } } @@ -752,15 +1326,19 @@ fn read_and_dispatch( } fn dispatch_frame( - worker: &IoUringWorker, + worker: &WorkerRuntime, conn_id: u64, async_funcs: &mut FallbackAsyncFuncState, frame: &Frame, ) -> RS> { let request_id = frame.header().request_id(); + trace!(conn_id, request_id, "tokio dispatch frame begin"); let worker = worker.clone(); let frame = frame.clone(); - let mut future = Box::pin(async move { dispatch_frame_async(&worker, conn_id, &frame).await }); + let mut future = Box::pin(async move { + mudu_utils::scoped_task_trace!(); + dispatch_frame_async(&worker, conn_id, &frame).await + }); let waker = waker(Arc::new(AsyncFuncTaskWaker::new( 0, Arc::new(SegQueue::new()), @@ -768,9 +1346,16 @@ fn dispatch_frame( ))); let mut cx = Context::from_waker(&waker); match future.as_mut().poll(&mut cx) { - Poll::Ready(Ok(result)) => Ok(Some(result)), - Poll::Ready(Err(err)) => Err(err), + Poll::Ready(Ok(result)) => { + trace!(conn_id, request_id, "tokio dispatch frame ready ok"); + Ok(Some(result)) + } + Poll::Ready(Err(err)) => { + trace!(conn_id, request_id, err = %err, "tokio dispatch frame ready err"); + Err(err) + } Poll::Pending => { + trace!(conn_id, request_id, "tokio dispatch frame pending"); async_funcs.enqueue_future(conn_id, request_id, future); Ok(None) } diff --git a/mudu_kernel/src/server/session_bound_worker_runtime.rs b/mudu_kernel/src/server/session_bound_worker_runtime.rs index 88f6bd1..fa76464 100644 --- a/mudu_kernel/src/server/session_bound_worker_runtime.rs +++ b/mudu_kernel/src/server/session_bound_worker_runtime.rs @@ -2,7 +2,7 @@ use crate::contract::meta_mgr::MetaMgr; use crate::server::message_bus_api::{message_bus_for_worker, MessageBusRef}; use crate::server::request_response_worker::{RequestResponseWorker, WorkerRuntimeRef}; use crate::server::routing::{SessionOpenConfig, SessionOpenTransferAction}; -use crate::server::worker::IoUringWorker; +use crate::server::worker::WorkerRuntime; use crate::server::worker_local::{WorkerExecute, WorkerLocal, WorkerLocalRef}; use crate::server::worker_registry::WorkerRegistry; use crate::server::worker_snapshot::KvItem; @@ -20,12 +20,12 @@ use std::sync::Arc; use crate::x_engine::api::XContract; struct SessionBoundWorkerRuntime { - worker: Arc, + worker: Arc, current_session_id: OID, } pub(crate) fn new_session_bound_worker_runtime( - worker: IoUringWorker, + worker: WorkerRuntime, current_session_id: OID, ) -> WorkerRuntimeRef { Arc::new(SessionBoundWorkerRuntime { @@ -49,7 +49,8 @@ impl WorkerLocal for SessionBoundWorkerRuntime { } fn message_bus(&self) -> MessageBusRef { - message_bus_for_worker(self.worker.worker_id()).expect("message bus is not registered") + message_bus_for_worker(self.worker.server_instance_id(), self.worker.worker_id()) + .expect("message bus is not registered") } async fn open_async(&self) -> RS { diff --git a/mudu_kernel/src/server/task.rs b/mudu_kernel/src/server/task.rs index 87f8ece..e31aeed 100644 --- a/mudu_kernel/src/server/task.rs +++ b/mudu_kernel/src/server/task.rs @@ -2,19 +2,57 @@ use crate::io::worker_ring::with_current_ring; #[cfg(target_os = "linux")] use crate::server::worker_task::WorkerTaskFuture; +#[cfg(target_os = "linux")] +use mudu_utils::task_context::TaskContext; +#[cfg(target_os = "linux")] +use mudu_utils::task_id::new_task_id; #[cfg(target_os = "linux")] #[allow(dead_code)] pub fn spawn(conn_id: Option, future: WorkerTaskFuture) { + if !crate::io::worker_ring::has_current_worker_ring() { + return; + } + let _ = with_current_ring(|ring| { + let trace_task_id = new_task_id(); + let task_name = match conn_id { + Some(conn_id) => format!("iouring-task-conn-{conn_id}"), + None => "iouring-task".to_string(), + }; + let _ = TaskContext::new_context(trace_task_id, task_name, false); + ring.worker_task_registry() + .spawn_with_trace_id(conn_id, trace_task_id, future); + Ok(()) + }); +} + +#[cfg(target_os = "linux")] +#[allow(dead_code)] +pub fn spawn_system(name: &str, future: WorkerTaskFuture) { + if !crate::io::worker_ring::has_current_worker_ring() { + return; + } let _ = with_current_ring(|ring| { - ring.worker_task_registry().spawn(conn_id, future); + let trace_task_id = new_task_id(); + let _ = TaskContext::new_context(trace_task_id, name.to_string(), false); + ring.worker_task_registry() + .spawn_with_trace_id(None, trace_task_id, future); Ok(()) }); } #[cfg(not(target_os = "linux"))] +#[allow(dead_code)] pub fn spawn(_conn_id: Option, _future: T) where T: Send + 'static, { } + +#[cfg(not(target_os = "linux"))] +#[allow(dead_code)] +pub fn spawn_system(_name: &str, _future: T) +where + T: Send + 'static, +{ +} diff --git a/mudu_kernel/src/server/test_meta_mgr.rs b/mudu_kernel/src/server/test_meta_mgr.rs new file mode 100644 index 0000000..1a08153 --- /dev/null +++ b/mudu_kernel/src/server/test_meta_mgr.rs @@ -0,0 +1,69 @@ +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +use async_trait::async_trait; +use mudu::common::id::OID; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; + +use crate::contract::meta_mgr::MetaMgr; +use crate::contract::schema_table::SchemaTable; +use crate::contract::table_desc::TableDesc; +use crate::contract::table_info::TableInfo; + +pub(crate) struct TestMetaMgr { + schemas: Mutex>, + tables: Mutex>>, +} + +impl TestMetaMgr { + pub(crate) fn new() -> Self { + Self { + schemas: Mutex::new(HashMap::new()), + tables: Mutex::new(HashMap::new()), + } + } +} + +#[async_trait] +impl MetaMgr for TestMetaMgr { + async fn get_table_by_id(&self, oid: OID) -> RS> { + self.tables + .lock() + .unwrap() + .get(&oid) + .cloned() + .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid))) + } + + async fn get_table_by_name(&self, name: &String) -> RS>> { + Ok(self + .tables + .lock() + .unwrap() + .values() + .find(|table| table.name() == name) + .cloned()) + } + + async fn create_table(&self, schema: &SchemaTable) -> RS<()> { + let table = TableInfo::new(schema.clone())?.table_desc()?; + self.schemas + .lock() + .unwrap() + .insert(schema.id(), schema.clone()); + self.tables.lock().unwrap().insert(schema.id(), table); + Ok(()) + } + + async fn drop_table(&self, table_id: OID) -> RS<()> { + self.schemas.lock().unwrap().remove(&table_id); + self.tables.lock().unwrap().remove(&table_id); + Ok(()) + } + + async fn list_schemas(&self) -> RS> { + Ok(self.schemas.lock().unwrap().values().cloned().collect()) + } +} diff --git a/mudu_kernel/src/server/worker.rs b/mudu_kernel/src/server/worker.rs index c7e0e69..82ff296 100644 --- a/mudu_kernel/src/server/worker.rs +++ b/mudu_kernel/src/server/worker.rs @@ -1,6 +1,8 @@ +use crate::async_rt::contract::AsyncRuntime; use crate::contract::meta_mgr::MetaMgr; use crate::mudu_conn::mudu_conn_core::MuduConnCore; use crate::server::async_func_runtime::AsyncFuncInvokerPtr; +use crate::server::message_bus_api::ServerInstanceId; use crate::server::routing::{ route_worker, RoutingContext, RoutingMode, SessionOpenConfig, SessionOpenTransferAction, }; @@ -14,7 +16,7 @@ use crate::server::worker_local::{ use crate::server::worker_registry::{WorkerIdentity, WorkerRegistry}; use crate::server::worker_session_manager::{SessionContext, WorkerSessionManager}; use crate::server::worker_snapshot::KvItem; -use crate::server::x_contract::IoUringXContract; +use crate::server::x_contract::WorkerXContract; use crate::wal::worker_log::{ChunkedWorkerLogBackend, WorkerLogBatching, WorkerLogLayout}; use crate::wal::xl_batch::XLBatch; use crate::x_engine::api::XContract; @@ -27,6 +29,7 @@ use mudu_contract::database::result_set::ResultSetAsync; use mudu_contract::database::sql_params::SQLParams; use mudu_contract::database::sql_stmt::SQLStmt; use mudu_contract::protocol::{ProcedureInvokeRequest, ProcedureInvokeResponse}; +use mudu_utils::task_trace; use std::collections::BTreeMap; use std::net::SocketAddr; use std::sync::atomic::AtomicUsize; @@ -35,29 +38,34 @@ use std::sync::Arc; #[derive(Clone)] /// Per-worker execution context used by the `client` backend. /// -/// The `IoUringWorker` name is also historical. The type is shared by both the -/// Linux native `io_uring` loop and the non-Linux fallback loop so upper -/// layers do not need target-specific worker abstractions. +/// The type is shared by both the io_uring worker-ring loop and the Tokio +/// worker loop so upper layers do not need transport-specific worker +/// abstractions. /// /// Workers are sized around execution resources such as CPU cores, while /// partitions are derived from user-defined data partitioning. The system does /// not require partitions to map one-to-one to workers, although the current /// runtime path still operates on a single active partition per worker. A /// worker may own multiple partitions in the future. -pub struct IoUringWorker { +pub struct WorkerRuntime { + server_instance_id: ServerInstanceId, worker_index: usize, worker_id: OID, partition_ids: Vec, worker_count: usize, routing_mode: RoutingMode, - contract: Arc, + contract: Arc, log_layout: WorkerLogLayout, procedure_runtime: Option, session_manager: Arc, registry: Arc, } -impl IoUringWorker { +/// Backward-compatible name for callers that still refer to the historical +/// io_uring-only worker runtime. +pub type IoUringWorker = WorkerRuntime; + +impl WorkerRuntime { pub fn new( identity: WorkerIdentity, worker_count: usize, @@ -67,6 +75,7 @@ impl IoUringWorker { log_chunk_size: u64, procedure_runtime: Option, registry: Arc, + server_instance_id: ServerInstanceId, ) -> RS { Self::new_with_log_batching( identity, @@ -78,6 +87,7 @@ impl IoUringWorker { WorkerLogBatching::default(), procedure_runtime, registry, + server_instance_id, ) } @@ -91,6 +101,35 @@ impl IoUringWorker { log_batching: WorkerLogBatching, procedure_runtime: Option, registry: Arc, + server_instance_id: ServerInstanceId, + ) -> RS { + Self::new_with_log_batching_and_runtime( + identity, + worker_count, + routing_mode, + log_dir, + data_dir, + log_chunk_size, + log_batching, + procedure_runtime, + registry, + None, + server_instance_id, + ) + } + + pub fn new_with_log_batching_and_runtime( + identity: WorkerIdentity, + worker_count: usize, + routing_mode: RoutingMode, + log_dir: String, + data_dir: String, + log_chunk_size: u64, + log_batching: WorkerLogBatching, + procedure_runtime: Option, + registry: Arc, + async_runtime: Option>, + server_instance_id: ServerInstanceId, ) -> RS { let active_sessions = Arc::new(AtomicUsize::new(0)); // The runtime currently activates only the first partition assigned to @@ -112,18 +151,21 @@ impl IoUringWorker { log_layout.clone(), active_sessions.clone(), )?; - let contract = Arc::new(IoUringXContract::with_worker_log_and_data_dir( + let contract = Arc::new(WorkerXContract::with_worker_log_and_data_dir_and_runtime( log, worker_id, default_unpartitioned_worker_id, partition_id, data_dir, + async_runtime, + server_instance_id, )?); let session_manager = Arc::new(WorkerSessionManager::new( active_sessions, contract.meta_mgr(), )); Ok(Self { + server_instance_id, worker_index: identity.worker_index, worker_id, partition_ids: identity.partition_ids, @@ -137,6 +179,10 @@ impl IoUringWorker { }) } + pub fn server_instance_id(&self) -> ServerInstanceId { + self.server_instance_id + } + pub fn route_connection(&self, conn_id: u64, remote_addr: SocketAddr) -> usize { let ctx = RoutingContext::new(conn_id, remote_addr, None); route_worker(&ctx, self.routing_mode, self.worker_count) @@ -157,18 +203,41 @@ impl IoUringWorker { procedure_parameters: Vec, worker_local: WorkerLocalRef, ) -> RS> { + let trace = task_trace!(); + trace.watch( + "procedure.kernel.worker_invoke.stage", + "runtime_lookup_start", + ); + trace.watch( + "procedure.kernel.worker_invoke.session_id", + &session_id.to_string(), + ); + trace.watch("procedure.kernel.worker_invoke.name", procedure_name); let procedure_runtime = self .procedure_runtime .as_ref() .ok_or_else(|| m_error!(EC::NotImplemented, "procedure runtime is not configured"))?; - procedure_runtime + trace.watch( + "procedure.kernel.worker_invoke.stage", + "runtime_lookup_done", + ); + let result = procedure_runtime .invoke( session_id, procedure_name, procedure_parameters, worker_local, ) - .await + .await; + trace.watch( + "procedure.kernel.worker_invoke.stage", + if result.is_ok() { + "invoke_done" + } else { + "invoke_error" + }, + ); + result } pub fn create_session(&self, conn_id: u64) -> RS { @@ -401,12 +470,24 @@ impl IoUringWorker { conn_id: u64, request: &ProcedureInvokeRequest, ) -> RS { + let trace = task_trace!(); + trace.watch("procedure.kernel.handle.stage", "enter"); + trace.watch("procedure.kernel.handle.conn_id", &conn_id.to_string()); let session_id = request.session_id() as OID; + trace.watch( + "procedure.kernel.handle.session_id", + &session_id.to_string(), + ); + trace.watch("procedure.kernel.handle.name", request.procedure_name()); + trace.watch("procedure.kernel.handle.stage", "ensure_session_owner"); self.ensure_session_owned_by_connection(conn_id, session_id)?; + trace.watch("procedure.kernel.handle.stage", "worker_local_create"); let worker_local = as_worker_local_ref(new_session_bound_worker_runtime(self.clone(), session_id)); let prev_worker_local = try_current_worker_local(); + trace.watch("procedure.kernel.handle.stage", "worker_local_set"); set_current_worker_local(worker_local.clone()); + trace.watch("procedure.kernel.handle.stage", "invoke_start"); let result = self .invoke_procedure( session_id, @@ -415,11 +496,22 @@ impl IoUringWorker { worker_local, ) .await; + trace.watch( + "procedure.kernel.handle.stage", + if result.is_ok() { + "invoke_done" + } else { + "invoke_error" + }, + ); if let Some(prev_worker_local) = prev_worker_local { + trace.watch("procedure.kernel.handle.stage", "restore_prev_worker_local"); set_current_worker_local(prev_worker_local); } else { + trace.watch("procedure.kernel.handle.stage", "unset_worker_local"); unset_current_worker_local(); } + trace.watch("procedure.kernel.handle.stage", "response_build"); Ok(ProcedureInvokeResponse::new(result?)) } @@ -485,8 +577,14 @@ impl IoUringWorker { param: Box, tx_mgr: Arc, ) -> RS> { + let trace = task_trace!(); + trace.watch("sql.kind", "query"); + trace.watch("sql.stage", "parse"); let stmt = core.parse_one(stmt.as_ref())?; - core.query(stmt, param, tx_mgr, self.contract.clone()).await + trace.watch("sql.stage", "query"); + let result = core.query(stmt, param, tx_mgr, self.contract.clone()).await; + trace.watch("sql.stage", if result.is_ok() { "done" } else { "error" }); + result } async fn run_sql_execute_with_tx( @@ -496,9 +594,22 @@ impl IoUringWorker { param: Box, tx_mgr: Arc, ) -> RS { + let trace = task_trace!(); + trace.watch("procedure.worker_sql_execute.stage", "parse_start"); let stmt = core.parse_one(stmt.as_ref())?; - core.execute(stmt, param, tx_mgr, self.contract.clone()) - .await + trace.watch("procedure.worker_sql_execute.stage", "execute_start"); + let result = core + .execute(stmt, param, tx_mgr, self.contract.clone()) + .await; + trace.watch( + "procedure.worker_sql_execute.stage", + if result.is_ok() { + "execute_done" + } else { + "execute_error" + }, + ); + result } pub(crate) async fn query( @@ -548,38 +659,58 @@ impl IoUringWorker { sql: Box, param: Box, ) -> RS { + let trace = task_trace!(); + trace.watch("procedure.worker_execute.stage", "enter"); + trace.watch("procedure.worker_execute.oid", &oid.to_string()); let core = self.sql_core(oid)?; if oid == 0 { + trace.watch("procedure.worker_execute.stage", "begin_tx_start"); let tx_mgr = self.contract.begin_tx().await?; + trace.watch("procedure.worker_execute.stage", "begin_tx_done"); let result = self .run_sql_execute_with_tx(core, sql, param, tx_mgr.clone()) .await; if result.is_ok() { + trace.watch("procedure.worker_execute.stage", "commit_start"); self.contract.commit_tx(tx_mgr).await?; + trace.watch("procedure.worker_execute.stage", "commit_done"); } else { + trace.watch("procedure.worker_execute.stage", "abort_start"); self.contract.abort_tx(tx_mgr).await?; + trace.watch("procedure.worker_execute.stage", "abort_done"); } return result; } let started_tx = if self.session_manager.has_session_tx(oid)? { false } else { + trace.watch("procedure.worker_execute.stage", "session_begin_tx_start"); self.session_manager .begin_session_tx(oid, self.contract.worker_begin_tx()?)?; + trace.watch("procedure.worker_execute.stage", "session_begin_tx_done"); true }; let tx_mgr = self .sql_tx_mgr(oid)? .ok_or_else(|| m_error!(EC::InternalErr, "session transaction is missing"))?; + trace.watch("procedure.worker_execute.stage", "run_sql_execute_start"); let result = self.run_sql_execute_with_tx(core, sql, param, tx_mgr).await; if started_tx { let tx_manager = self.session_manager.take_session_tx(oid)?; if result.is_ok() { + trace.watch("procedure.worker_execute.stage", "session_commit_start"); self.contract.worker_commit_tx_async(tx_manager).await?; + trace.watch("procedure.worker_execute.stage", "session_commit_done"); } else { + trace.watch("procedure.worker_execute.stage", "session_rollback_start"); self.contract.worker_rollback_tx(tx_manager)?; + trace.watch("procedure.worker_execute.stage", "session_rollback_done"); } } + trace.watch( + "procedure.worker_execute.stage", + if result.is_ok() { "done" } else { "error" }, + ); result } @@ -721,13 +852,11 @@ fn is_key_in_range(key: &[u8], start_key: &[u8], end_key: &[u8]) -> bool { #[cfg(test)] mod tests { use super::*; - use crate::contract::meta_mgr::MetaMgr; use crate::contract::schema_column::SchemaColumn; use crate::contract::schema_table::SchemaTable; - use crate::contract::table_desc::TableDesc; - use crate::contract::table_info::TableInfo; use crate::server::async_func_runtime::AsyncFuncInvoker; use crate::server::session_bound_worker_runtime::new_session_bound_worker_runtime; + use crate::server::test_meta_mgr::TestMetaMgr; use crate::server::worker_local::{WorkerExecute, WorkerLocal}; use crate::server::worker_registry::{load_or_create_worker_registry, WorkerRegistry}; use crate::storage::time_series::time_series_file::TimeSeriesFile; @@ -737,7 +866,6 @@ mod tests { use mudu::common::id::gen_oid; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dt_info::DTInfo; - use std::collections::HashMap; use std::env::temp_dir; use std::sync::{Arc, Mutex}; @@ -764,51 +892,6 @@ mod tests { } } - struct TestMetaMgr { - tables: Mutex>>, - } - - impl TestMetaMgr { - fn new() -> Self { - Self { - tables: Mutex::new(HashMap::new()), - } - } - } - - #[async_trait] - impl MetaMgr for TestMetaMgr { - async fn get_table_by_id(&self, oid: OID) -> RS> { - self.tables - .lock() - .unwrap() - .get(&oid) - .cloned() - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid))) - } - - async fn get_table_by_name(&self, name: &String) -> RS>> { - Ok(self - .tables - .lock() - .unwrap() - .values() - .find(|table| table.name() == name) - .cloned()) - } - - async fn create_table(&self, schema: &SchemaTable) -> RS<()> { - let table = TableInfo::new(schema.clone())?.table_desc()?; - self.tables.lock().unwrap().insert(schema.id(), table); - Ok(()) - } - - async fn drop_table(&self, table_id: OID) -> RS<()> { - self.tables.lock().unwrap().remove(&table_id); - Ok(()) - } - } - fn test_registry(worker_count: usize) -> (String, Arc) { let dir = temp_dir() .join(format!("worker_test_{}", gen_oid())) @@ -825,9 +908,9 @@ mod tests { data_dir: &str, registry: Arc, procedure_runtime: Option, - ) -> IoUringWorker { + ) -> WorkerRuntime { let identity = registry.worker(worker_index).cloned().unwrap(); - IoUringWorker::new( + WorkerRuntime::new( identity, worker_count, RoutingMode::ConnectionId, @@ -836,6 +919,7 @@ mod tests { 4096, procedure_runtime, registry, + 0, ) .unwrap() } @@ -1007,13 +1091,25 @@ mod tests { assert_eq!(worker.get(b"a").unwrap(), None); } - #[tokio::test(flavor = "current_thread")] - async fn worker_storage_uses_partition_zero_for_unpartitioned_relation_files() { + #[test] + fn worker_storage_uses_partition_zero_for_unpartitioned_relation_files() { + let runtime = mudu_sys::task_async::CurrentThreadTaskRuntime::new().unwrap(); + let join = runtime + .local() + .spawn_detached("worker_storage", async move { + _worker_storage_uses_partition_zero_for_unpartitioned_relation_files().await; + }) + .unwrap(); + runtime.block_on(async move { + let _ = join.await; + }); + } + async fn _worker_storage_uses_partition_zero_for_unpartitioned_relation_files() { let (log_dir, registry) = test_registry(1); let identity = registry.worker(0).cloned().unwrap(); let worker_id = identity.worker_id; let worker_partition_id = identity.partition_ids[0]; - let _worker = IoUringWorker::new( + let _worker = WorkerRuntime::new( identity, 1, RoutingMode::ConnectionId, @@ -1022,9 +1118,10 @@ mod tests { 4096, None, registry, + 0, ) .unwrap(); - let contract = IoUringXContract::with_log_and_data_dir( + let contract = WorkerXContract::with_log_and_data_dir( Arc::new(TestMetaMgr::new()), None, worker_id, diff --git a/mudu_kernel/src/server/worker_loop_stats.rs b/mudu_kernel/src/server/worker_loop_stats.rs index e5b2997..7bc39b6 100644 --- a/mudu_kernel/src/server/worker_loop_stats.rs +++ b/mudu_kernel/src/server/worker_loop_stats.rs @@ -1,4 +1,5 @@ #[derive(Debug, Default, Clone)] +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] pub(in crate::server) struct WorkerLoopStats { pub worker_id: usize, pub submit_calls: u64, diff --git a/mudu_kernel/src/server/worker_session_manager.rs b/mudu_kernel/src/server/worker_session_manager.rs index 2493ed2..3d2a0da 100644 --- a/mudu_kernel/src/server/worker_session_manager.rs +++ b/mudu_kernel/src/server/worker_session_manager.rs @@ -214,7 +214,10 @@ impl WorkerSessionManager { } pub(crate) fn has_session_tx(&self, session_id: OID) -> RS { - Ok(self.session_context(session_id)?.tx_manager_cloned().is_some()) + Ok(self + .session_context(session_id)? + .tx_manager_cloned() + .is_some()) } pub(crate) fn begin_session_tx(&self, session_id: OID, tx_mgr: Arc) -> RS<()> { diff --git a/mudu_kernel/src/server/worker_storage.rs b/mudu_kernel/src/server/worker_storage.rs index d01c07b..bc216cd 100644 --- a/mudu_kernel/src/server/worker_storage.rs +++ b/mudu_kernel/src/server/worker_storage.rs @@ -2,11 +2,13 @@ use std::collections::{BTreeMap, Bound}; use std::ops::Bound::{Excluded, Included, Unbounded}; use std::sync::{Arc, Mutex, OnceLock, Weak}; +use crate::async_rt::contract::AsyncRuntime; use futures::executor::block_on; use mudu::common::id::OID; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_utils::{scoped_task_trace, task_trace}; use scc::HashMap as SccHashMap; use crate::contract::data_row::DataRow; @@ -25,6 +27,7 @@ use crate::wal::xl_batch::XLBatch; use crate::wal::xl_data_op::{XLDelete, XLInsert}; use crate::wal::xl_entry::TxOp; use crate::x_engine::tx_mgr::{PhysicalRelationId, TxMgr}; +use tracing::{info, trace}; type WorkerStorageRegistry = std::collections::HashMap>>; @@ -45,7 +48,8 @@ pub struct WorkerStorage { mgr: Arc, default_partition_id: OID, relation_path: String, - relation_store: SccHashMap, + async_runtime: Option>, + relation_store: SccHashMap>, kv_store: SccHashMap, DataRow>, } @@ -57,11 +61,22 @@ impl WorkerStorage { } } + #[allow(dead_code)] pub fn new(mgr: Arc, partition_id: OID, relation_path: String) -> Self { + Self::new_with_async_runtime(mgr, partition_id, relation_path, None) + } + + pub fn new_with_async_runtime( + mgr: Arc, + partition_id: OID, + relation_path: String, + async_runtime: Option>, + ) -> Self { Self { mgr, default_partition_id: partition_id, relation_path, + async_runtime, relation_store: SccHashMap::new(), kv_store: SccHashMap::new(), } @@ -79,6 +94,10 @@ impl WorkerStorage { .push(Arc::downgrade(self)); } + pub fn uses_async_runtime(&self) -> bool { + self.async_runtime.is_some() + } + pub fn bootstrap_existing_tables_sync(&self) -> RS<()> { for schema in block_on(self.mgr.list_schemas())? { self.bootstrap_table_local(&schema)?; @@ -86,14 +105,25 @@ impl WorkerStorage { Ok(()) } + pub async fn bootstrap_existing_tables_async(&self) -> RS<()> { + for schema in self.mgr.list_schemas().await? { + self.bootstrap_table_local_async(&schema).await?; + } + Ok(()) + } + pub async fn create_table_async(&self, schema: &SchemaTable) -> RS<()> { + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage create_table_async start"); self.mgr.create_table(schema).await?; - self.broadcast_create_table(schema) + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage metadata create finished"); + let r = self.broadcast_create_table_async(schema).await; + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage broadcast_create_table_async finished"); + r } pub async fn drop_table_async(&self, oid: OID) -> RS<()> { self.mgr.drop_table(oid).await?; - self.broadcast_drop_table(oid) + self.broadcast_drop_table_async(oid).await } #[allow(dead_code)] @@ -128,11 +158,24 @@ impl WorkerStorage { key: &[u8], txm: &dyn TxMgr, ) -> RS>> { + let trace = task_trace!(); let relation_id = self.relation_id(oid, self.physical_partition_id(partition_id)); + trace.watch("storage.get.table_id", &oid.to_string()); + trace.watch("storage.get.relation_id", &format!("{relation_id:?}")); + trace.watch( + "storage.get.partition_id", + &partition_id + .map(|id| id.to_string()) + .unwrap_or_else(|| "none".to_string()), + ); + trace.watch("storage.get.stage", "tx_lookup_call"); if let Some(staged) = txm.get_relation(relation_id, key) { + trace.watch("storage.get.stage", "tx_lookup_hit"); return Ok(staged); } + trace.watch("storage.get.stage", "tx_lookup_miss"); let key = KeyTuple::from(key.to_vec()); + trace.watch("storage.get.stage", "visible_read"); self.read_visible_relation_value(oid, partition_id, &key, &txm.snapshot()) .await } @@ -469,22 +512,10 @@ impl WorkerStorage { relation_rows: &BTreeMap, Option>>>, ) -> RS<()> { for (relation_id, rows) in relation_rows { - let relation = self.relation_store.get_sync(relation_id).ok_or_else(|| { - m_error!( - EC::NoSuchElement, - format!( - "no such table {} partition {}", - relation_id.table_id, relation_id.partition_id - ) - ) - })?; + let relation = self.get_relation_by_id_async(relation_id).await?; for key in rows.keys() { let key_tuple = KeyTuple::from(key.clone()); - if relation - .get() - .has_write_conflict(&key_tuple, snapshot) - .await? - { + if relation.has_write_conflict(&key_tuple, snapshot).await? { return Err(m_error!( EC::TxErr, format!( @@ -547,18 +578,9 @@ impl WorkerStorage { async fn apply_relation_rows_async(&self, prepared: &PreparedWorkerCommit) -> RS<()> { for (relation_id, rows) in &prepared.relation_rows { - let relation = self.relation_store.get_sync(relation_id).ok_or_else(|| { - m_error!( - EC::NoSuchElement, - format!( - "no such table {} partition {}", - relation_id.table_id, relation_id.partition_id - ) - ) - })?; + let relation = self.get_relation_by_id_async(relation_id).await?; for (key, value) in rows { relation - .get() .write_row(key.clone(), value.clone(), prepared.xid) .await?; } @@ -628,11 +650,8 @@ impl WorkerStorage { key: &KeyTuple, snapshot: &WorkerSnapshot, ) -> RS { - let relation = self - .relation_store - .get_sync(&self.relation_id(oid, self.physical_partition_id(partition_id))) - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid)))?; - relation.get().has_visible_version(key, snapshot).await + let relation = self.get_relation_async(oid, partition_id).await?; + relation.has_visible_version(key, snapshot).await } async fn read_visible_relation_value( @@ -643,11 +662,8 @@ impl WorkerStorage { snapshot: &WorkerSnapshot, ) -> RS>> { self.ensure_relation_index(oid, partition_id).await?; - let relation = self - .relation_store - .get_sync(&self.relation_id(oid, self.physical_partition_id(partition_id))) - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid)))?; - relation.get().visible_value(key, snapshot).await + let relation = self.get_relation_async(oid, partition_id).await?; + relation.visible_value(key, snapshot).await } async fn range_visible_relation( @@ -658,11 +674,8 @@ impl WorkerStorage { snapshot: &WorkerSnapshot, ) -> RS, Vec)>> { self.ensure_relation_index(oid, partition_id).await?; - let relation = self - .relation_store - .get_sync(&self.relation_id(oid, self.physical_partition_id(partition_id))) - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid)))?; - relation.get().visible_range(bounds, snapshot).await + let relation = self.get_relation_async(oid, partition_id).await?; + relation.visible_range(bounds, snapshot).await } async fn ensure_no_relation_write_conflict( @@ -672,12 +685,10 @@ impl WorkerStorage { key: &KeyTuple, snapshot: &WorkerSnapshot, ) -> RS<()> { + scoped_task_trace!(); self.ensure_relation_index(oid, partition_id).await?; - let relation = self - .relation_store - .get_sync(&self.relation_id(oid, self.physical_partition_id(partition_id))) - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid)))?; - if relation.get().has_write_conflict(key, snapshot).await? { + let relation = self.get_relation_async(oid, partition_id).await?; + if relation.has_write_conflict(key, snapshot).await? { return Err(m_error!( EC::TxErr, format!( @@ -705,31 +716,89 @@ impl WorkerStorage { partition_id: OID, table_desc: &TableDesc, ) -> RS<()> { - let _ = self.relation_store.insert_sync( - self.relation_id(oid, partition_id), - Relation::new(oid, partition_id, self.relation_path.clone(), table_desc)?, + let relation_id = self.relation_id(oid, partition_id); + let _prev = self.relation_store.insert_sync( + relation_id, + Arc::new(Relation::new( + oid, + partition_id, + self.relation_path.clone(), + table_desc, + )?), ); Ok(()) } + async fn create_relation_index_for_partition_async( + &self, + oid: OID, + partition_id: OID, + table_desc: &TableDesc, + ) -> RS<()> { + scoped_task_trace!(); + let relation_id = self.relation_id(oid, partition_id); + + let relation = match &self.async_runtime { + Some(async_runtime) => Arc::new( + Relation::new_with_fs( + async_runtime.fs_arc(), + oid, + partition_id, + self.relation_path.clone(), + table_desc, + ) + .await?, + ), + None => Arc::new(Relation::new( + oid, + partition_id, + self.relation_path.clone(), + table_desc, + )?), + }; + + let _ = self + .relation_store + .insert_async(relation_id, relation) + .await; + Ok(()) + } + async fn ensure_relation_index(&self, oid: OID, partition_id: Option) -> RS<()> { + scoped_task_trace!(); let partition_id = self.physical_partition_id(partition_id); - if self - .relation_store - .contains_sync(&self.relation_id(oid, partition_id)) - { + let relation_id = self.relation_id(oid, partition_id); + if self.relation_store.contains_async(&relation_id).await { return Ok(()); } + let table_desc = self.mgr.get_table_by_id(oid).await?; - self.create_relation_index_for_partition(oid, partition_id, table_desc.as_ref()) + self.create_relation_index_for_partition_async(oid, partition_id, table_desc.as_ref()) + .await?; + Ok(()) } + #[allow(dead_code)] fn apply_create_table_local(&self, schema: &SchemaTable) -> RS<()> { let table_desc = crate::contract::table_info::TableInfo::new(schema.clone())?.table_desc()?; self.create_unpartitioned_relation_index(schema.id(), table_desc.as_ref()) } + async fn apply_create_table_local_async(&self, schema: &SchemaTable) -> RS<()> { + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage apply_create_table_local_async start"); + let table_desc = + crate::contract::table_info::TableInfo::new(schema.clone())?.table_desc()?; + self.create_relation_index_for_partition_async( + schema.id(), + DEFAULT_UNPARTITIONED_TABLE_PARTITION_ID, + table_desc.as_ref(), + ) + .await?; + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage apply_create_table_local_async done"); + Ok(()) + } + fn bootstrap_table_local(&self, schema: &SchemaTable) -> RS<()> { let table_desc = crate::contract::table_info::TableInfo::new(schema.clone())?.table_desc()?; @@ -742,6 +811,26 @@ impl WorkerStorage { } } + async fn bootstrap_table_local_async(&self, schema: &SchemaTable) -> RS<()> { + let table_desc = + crate::contract::table_info::TableInfo::new(schema.clone())?.table_desc()?; + let binding = self.mgr.get_table_partition_binding(schema.id()).await?; + match binding { + Some(binding) => { + self.create_partitioned_relations_async(schema.id(), &binding, table_desc.as_ref()) + .await + } + None => { + self.create_relation_index_for_partition_async( + schema.id(), + DEFAULT_UNPARTITIONED_TABLE_PARTITION_ID, + table_desc.as_ref(), + ) + .await + } + } + } + fn create_partitioned_relations( &self, oid: OID, @@ -755,12 +844,45 @@ impl WorkerStorage { Ok(()) } + async fn create_partitioned_relations_async( + &self, + oid: OID, + binding: &TablePartitionBinding, + table_desc: &TableDesc, + ) -> RS<()> { + let rule = self.mgr.get_partition_rule_by_id(binding.rule_id).await?; + for partition in &rule.partitions { + self.create_relation_index_for_partition_async(oid, partition.partition_id, table_desc) + .await?; + } + Ok(()) + } + fn apply_drop_table_local(&self, oid: OID) { - let _ = self - .relation_store - .remove_sync(&self.relation_id(oid, self.default_partition_id)); + scoped_task_trace!(); + let relation_id = self.relation_id(oid, self.default_partition_id); + let _removed = self.relation_store.remove_sync(&relation_id); + } + + async fn apply_drop_table_local_async(&self, oid: OID) { + let trace = task_trace!(); + let task_id = mudu_sys::task_async::try_this_task_id(); + let relation_id = self.relation_id(oid, self.default_partition_id); + trace.watch("relation_store.op", "remove_async"); + trace.watch("relation_store.phase", "before_remove"); + trace.watch("relation_store.relation_id", &format!("{relation_id:?}")); + trace.watch("relation_store.task_id", &format!("{task_id:?}")); + let removed = self.relation_store.remove_async(&relation_id).await; + trace.watch("relation_store.phase", "after_remove"); + info!( + task_id = ?task_id, + relation_id = ?relation_id, + existed = removed.is_some(), + "relation_store remove_async" + ); } + #[allow(dead_code)] fn broadcast_create_table(&self, schema: &SchemaTable) -> RS<()> { let peers = self.peer_instances(); if peers.is_empty() { @@ -772,6 +894,20 @@ impl WorkerStorage { Ok(()) } + async fn broadcast_create_table_async(&self, schema: &SchemaTable) -> RS<()> { + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage broadcast_create_table_async enter"); + let peers = self.peer_instances(); + if peers.is_empty() { + return self.apply_create_table_local_async(schema).await; + } + for storage in peers { + storage.apply_create_table_local_async(schema).await?; + } + trace!(table = %schema.table_name(), oid = schema.id(), "worker_storage broadcast_create_table_async done"); + Ok(()) + } + + #[allow(dead_code)] fn broadcast_drop_table(&self, oid: OID) -> RS<()> { let peers = self.peer_instances(); if peers.is_empty() { @@ -784,6 +920,42 @@ impl WorkerStorage { Ok(()) } + async fn get_relation_async(&self, oid: OID, partition_id: Option) -> RS> { + let relation_id = self.relation_id(oid, self.physical_partition_id(partition_id)); + self.get_relation_by_id_async(&relation_id).await + } + + async fn get_relation_by_id_async( + &self, + relation_id: &PhysicalRelationId, + ) -> RS> { + self.relation_store + .get_async(relation_id) + .await + .map(|relation| relation.get().clone()) + .ok_or_else(|| { + m_error!( + EC::NoSuchElement, + format!( + "no such table {} partition {}", + relation_id.table_id, relation_id.partition_id + ) + ) + }) + } + + async fn broadcast_drop_table_async(&self, oid: OID) -> RS<()> { + let peers = self.peer_instances(); + if peers.is_empty() { + self.apply_drop_table_local_async(oid).await; + return Ok(()); + } + for storage in peers { + storage.apply_drop_table_local_async(oid).await; + } + Ok(()) + } + fn peer_instances(&self) -> Vec> { let mut guard = storage_registry().lock().unwrap(); let peers = guard.entry(self.relation_path.clone()).or_default(); @@ -865,74 +1037,24 @@ fn bounds_to_scan(bounds: &(Bound<&[u8]>, Bound<&[u8]>)) -> (Vec, Vec) { #[cfg(test)] mod tests { - use std::collections::HashMap; - use std::ops::Bound; - use std::sync::Mutex; + use std::future::Future; + use crate::async_rt::tokio::runtime::TokioRuntime; + use crate::contract::schema_column::SchemaColumn; + use crate::server::test_meta_mgr::TestMetaMgr; use mudu::common::id::OID; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dt_info::DTInfo; - use crate::contract::meta_mgr::MetaMgr; - use crate::contract::schema_column::SchemaColumn; - use crate::contract::table_info::TableInfo; - use super::*; - struct TestMetaMgr { - schemas: Mutex>, - tables: Mutex>>, - } - - impl TestMetaMgr { - fn new() -> Self { - Self { - schemas: Mutex::new(HashMap::new()), - tables: Mutex::new(HashMap::new()), - } - } - } - - #[async_trait::async_trait] - impl MetaMgr for TestMetaMgr { - async fn get_table_by_id(&self, oid: OID) -> RS> { - self.tables - .lock() - .unwrap() - .get(&oid) - .cloned() - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid))) - } - - async fn get_table_by_name(&self, name: &String) -> RS>> { - Ok(self - .tables - .lock() - .unwrap() - .values() - .find(|table| table.name() == name) - .cloned()) - } - - async fn create_table(&self, schema: &SchemaTable) -> RS<()> { - let table = TableInfo::new(schema.clone())?.table_desc()?; - self.schemas - .lock() - .unwrap() - .insert(schema.id(), schema.clone()); - self.tables.lock().unwrap().insert(schema.id(), table); - Ok(()) - } - - async fn drop_table(&self, table_id: OID) -> RS<()> { - self.schemas.lock().unwrap().remove(&table_id); - self.tables.lock().unwrap().remove(&table_id); - Ok(()) - } - - async fn list_schemas(&self) -> RS> { - Ok(self.schemas.lock().unwrap().values().cloned().collect()) - } + fn block_on(fut: F) -> F::Output + where + F: Future, + { + mudu_sys::task_async::build_current_thread_runtime() + .unwrap() + .block_on(fut) } fn test_schema() -> SchemaTable { @@ -955,7 +1077,7 @@ mod tests { ) } - fn test_storage() -> (WorkerStorage, OID) { + async fn test_storage() -> RS<(WorkerStorage, OID)> { let mgr = Arc::new(TestMetaMgr::new()); let storage = WorkerStorage::new( mgr, @@ -970,16 +1092,16 @@ mod tests { ); let schema = test_schema(); let oid = schema.id(); - futures::executor::block_on(storage.create_table_async(&schema)).unwrap(); - (storage, oid) + storage.create_table_async(&schema).await?; + Ok((storage, oid)) } - fn test_shared_storage() -> ( + async fn test_shared_storage() -> RS<( Arc, Arc, Arc, OID, - ) { + )> { let mgr = Arc::new(TestMetaMgr::new()); let root = std::env::temp_dir() .join(format!( @@ -990,15 +1112,15 @@ mod tests { .to_string(); let storage1 = Arc::new(WorkerStorage::new(mgr.clone(), 1, root.clone())); storage1.register_global(); - storage1.bootstrap_existing_tables_sync().unwrap(); + storage1.bootstrap_existing_tables_sync()?; let storage2 = Arc::new(WorkerStorage::new(mgr.clone(), 2, root)); storage2.register_global(); - storage2.bootstrap_existing_tables_sync().unwrap(); + storage2.bootstrap_existing_tables_sync()?; let schema = test_schema(); let oid = schema.id(); - futures::executor::block_on(storage1.create_table_async(&schema)).unwrap(); - (mgr, storage1, storage2, oid) + storage1.create_table_async(&schema).await?; + Ok((mgr, storage1, storage2, oid)) } fn begin_tx(xid: u64, running: Vec) -> WorkerTxManager { @@ -1011,127 +1133,222 @@ mod tests { #[test] fn worker_storage_broadcasts_create_and_drop_to_peer_workers() { - let (mgr, _storage1, storage2, oid) = test_shared_storage(); + block_on(async move { + let r = _worker_storage_broadcasts_create_and_drop_to_peer_workers().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_broadcasts_create_and_drop_to_peer_workers() -> RS<()> { + let (mgr, _storage1, storage2, oid) = test_shared_storage().await?; let mut tx = begin_tx(1, vec![]); - block_on(storage2.put(oid, i32_bytes(7), i32_bytes(70), &mut tx)).unwrap(); - block_on(storage2.commit_tx(&mut tx)).unwrap(); - assert!(futures::executor::block_on(mgr.get_table_by_id(oid)).is_ok()); + storage2.put(oid, i32_bytes(7), i32_bytes(70), &mut tx).await?; + storage2.commit_tx(&mut tx).await?; + assert!(mgr.get_table_by_id(oid).await.is_ok()); - futures::executor::block_on(storage2.drop_table_async(oid)).unwrap(); - assert!(futures::executor::block_on(mgr.get_table_by_id(oid)).is_err()); + storage2.drop_table_async(oid).await?; + assert!(mgr.get_table_by_id(oid).await.is_err()); let mut tx = begin_tx(2, vec![]); - let err = block_on(storage2.put(oid, i32_bytes(8), i32_bytes(80), &mut tx)).unwrap_err(); + let err = storage2.put(oid, i32_bytes(8), i32_bytes(80), &mut tx).await.unwrap_err(); assert!(format!("{err}").contains("no such table")); + Ok(()) + } + + #[test] + fn worker_storage_bootstraps_existing_tables_with_async_runtime() { + block_on(async move { + let r = _worker_storage_bootstraps_existing_tables_with_async_runtime().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_bootstraps_existing_tables_with_async_runtime() -> RS<()> { + let mgr = Arc::new(TestMetaMgr::new()); + let schema = test_schema(); + let oid = schema.id(); + mgr.create_table(&schema).await?; + let storage = WorkerStorage::new_with_async_runtime( + mgr, + 0, + std::env::temp_dir() + .join(format!( + "worker_storage_async_bootstrap_test_{}", + mudu::common::id::gen_oid() + )) + .to_string_lossy() + .to_string(), + Some(Arc::new(TokioRuntime::new())), + ); + storage.bootstrap_existing_tables_async().await?; + + let mut tx = begin_tx(1, vec![]); + storage.put(oid, i32_bytes(1), i32_bytes(10), &mut tx).await?; + storage.commit_tx(&mut tx).await?; + let mut read_tx = begin_tx(2, vec![]); + assert_eq!( + storage.get(oid, &i32_bytes(1), &mut read_tx).await?, + Some(i32_bytes(10)) + ); + Ok(()) } #[test] fn worker_storage_reads_own_writes() { - let (storage, oid) = test_storage(); + block_on(async move { + let r = _worker_storage_reads_own_writes().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_reads_own_writes() -> RS<()> { + let (storage, oid) = test_storage().await?; let mut tx = begin_tx(10, vec![]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(11), &mut tx)).unwrap(); + storage.put(oid, i32_bytes(1), i32_bytes(11), &mut tx).await?; assert_eq!( - block_on(storage.get(oid, &i32_bytes(1), &mut tx)).unwrap(), + storage.get(oid, &i32_bytes(1), &mut tx).await?, Some(i32_bytes(11)) ); - assert!( - block_on(storage.contains_key(oid, &KeyTuple::from(i32_bytes(1)), &mut tx)).unwrap() - ); + + let contain_key = storage + .contains_key(oid, &KeyTuple::from(i32_bytes(1)), &mut tx) + .await?; + assert!(contain_key); + Ok(()) } #[test] fn worker_storage_snapshot_hides_later_commit() { - let (storage, oid) = test_storage(); + block_on(async move { + let r = _worker_storage_snapshot_hides_later_commit().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_snapshot_hides_later_commit() -> RS<()> { + let (storage, oid) = test_storage().await?; let mut tx1 = begin_tx(1, vec![]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(10), &mut tx1)).unwrap(); - block_on(storage.commit_tx(&mut tx1)).unwrap(); + storage.put(oid, i32_bytes(1), i32_bytes(10), &mut tx1).await?; + storage.commit_tx(&mut tx1).await?; let mut old_tx = begin_tx(2, vec![]); let mut new_tx = begin_tx(3, vec![2]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(20), &mut new_tx)).unwrap(); - block_on(storage.commit_tx(&mut new_tx)).unwrap(); + storage.put(oid, i32_bytes(1), i32_bytes(20), &mut new_tx).await?; + storage.commit_tx(&mut new_tx).await?; assert_eq!( - block_on(storage.get(oid, &i32_bytes(1), &mut old_tx)).unwrap(), + storage.get(oid, &i32_bytes(1), &mut old_tx).await?, Some(i32_bytes(10)) ); + Ok(()) } #[test] fn worker_storage_range_is_stable_with_snapshot() { - let (storage, oid) = test_storage(); + block_on(async move { + let r = _worker_storage_range_is_stable_with_snapshot().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_range_is_stable_with_snapshot() -> RS<()> { + let (storage, oid) = test_storage().await?; let mut seed = begin_tx(1, vec![]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(10), &mut seed)).unwrap(); - block_on(storage.commit_tx(&mut seed)).unwrap(); + storage.put(oid, i32_bytes(1), i32_bytes(10), &mut seed).await?; + storage.commit_tx(&mut seed).await?; let mut old_tx = begin_tx(2, vec![]); let mut new_tx = begin_tx(3, vec![2]); - block_on(storage.put(oid, i32_bytes(2), i32_bytes(20), &mut new_tx)).unwrap(); - block_on(storage.commit_tx(&mut new_tx)).unwrap(); + storage.put(oid, i32_bytes(2), i32_bytes(20), &mut new_tx).await?; + storage.commit_tx(&mut new_tx).await?; - let rows = block_on(storage.range( + let rows = storage + .range( oid, ( - Bound::Included(i32_bytes(1).as_slice()), - Bound::Included(i32_bytes(9).as_slice()), + Included(i32_bytes(1).as_slice()), + Included(i32_bytes(9).as_slice()), ), &mut old_tx, - )) - .unwrap(); + ) + .await?; assert_eq!(rows, vec![(i32_bytes(1), i32_bytes(10))]); + Ok(()) } #[test] fn worker_storage_first_committer_wins() { - let (storage, oid) = test_storage(); + block_on(async move { + let r = _worker_storage_first_committer_wins().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_first_committer_wins() -> RS<()> { + let (storage, oid) = test_storage().await?; let mut seed = begin_tx(1, vec![]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(10), &mut seed)).unwrap(); - block_on(storage.commit_tx(&mut seed)).unwrap(); + storage.put(oid, i32_bytes(1), i32_bytes(10), &mut seed).await?; + storage.commit_tx(&mut seed).await?; let mut tx1 = begin_tx(2, vec![]); let mut tx2 = begin_tx(3, vec![2]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(11), &mut tx1)).unwrap(); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(12), &mut tx2)).unwrap(); - block_on(storage.commit_tx(&mut tx1)).unwrap(); - let err = block_on(storage.commit_tx(&mut tx2)).unwrap_err(); + storage.put(oid, i32_bytes(1), i32_bytes(11), &mut tx1).await?; + storage.put(oid, i32_bytes(1), i32_bytes(12), &mut tx2).await?; + storage.commit_tx(&mut tx1).await?; + let err = storage.commit_tx(&mut tx2).await.unwrap_err(); assert!(err.to_string().contains("write-write conflict")); + Ok(()) } #[test] fn worker_storage_delete_respects_snapshot() { - let (storage, oid) = test_storage(); + block_on(async move { + let r = _worker_storage_delete_respects_snapshot().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_delete_respects_snapshot() -> RS<()> { + let (storage, oid) = test_storage().await?; let mut seed = begin_tx(1, vec![]); - block_on(storage.put(oid, i32_bytes(1), i32_bytes(10), &mut seed)).unwrap(); - block_on(storage.commit_tx(&mut seed)).unwrap(); + storage.put(oid, i32_bytes(1), i32_bytes(10), &mut seed).await?; + storage.commit_tx(&mut seed).await?; let mut old_tx = begin_tx(2, vec![]); let mut delete_tx = begin_tx(3, vec![2]); assert_eq!( - block_on(storage.remove(oid, &i32_bytes(1), &mut delete_tx)).unwrap(), + storage.remove(oid, &i32_bytes(1), &mut delete_tx).await?, Some(i32_bytes(10)) ); - block_on(storage.commit_tx(&mut delete_tx)).unwrap(); + storage.commit_tx(&mut delete_tx).await?; assert_eq!( - block_on(storage.get(oid, &i32_bytes(1), &mut old_tx)).unwrap(), + storage.get(oid, &i32_bytes(1), &mut old_tx).await?, Some(i32_bytes(10)) ); let mut fresh_tx = begin_tx(4, vec![]); assert_eq!( - block_on(storage.get(oid, &i32_bytes(1), &mut fresh_tx)).unwrap(), + storage.get(oid, &i32_bytes(1), &mut fresh_tx).await?, None ); + Ok(()) } #[test] fn worker_storage_kv_snapshot_hides_later_commit() { - let (storage, _oid) = test_storage(); + block_on(async move { + let r = _worker_storage_kv_snapshot_hides_later_commit().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_kv_snapshot_hides_later_commit() -> RS<()> { + let (storage, _oid) = test_storage().await?; storage - .worker_put_local(b"a".to_vec(), b"0".to_vec(), 1) - .unwrap(); + .worker_put_local(b"a".to_vec(), b"0".to_vec(), 1)?; let snapshot = WorkerSnapshot::new(2, vec![]); let prepared = storage.prepare_worker_kv_autocommit( @@ -1140,30 +1357,36 @@ mod tests { Some(b"1".to_vec()), XLBatch::new(vec![]), ); - storage.apply_prepared_commit(prepared).unwrap(); + storage.apply_prepared_commit(prepared)?; assert_eq!( - block_on(storage.kv_get(b"a", Some(&snapshot))).unwrap(), + storage.kv_get(b"a", Some(&snapshot)).await?, Some(b"0".to_vec()) ); assert_eq!( - block_on(storage.kv_get(b"a", None)).unwrap(), + storage.kv_get(b"a", None).await?, Some(b"1".to_vec()) ); + Ok(()) } #[test] fn worker_storage_kv_range_is_stable_with_snapshot() { - let (storage, _oid) = test_storage(); + block_on(async move { + let r = _worker_storage_kv_range_is_stable_with_snapshot().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_kv_range_is_stable_with_snapshot() -> RS<()> { + let (storage, _oid) = test_storage().await?; storage - .worker_put_local(b"a".to_vec(), b"1".to_vec(), 1) - .unwrap(); + .worker_put_local(b"a".to_vec(), b"1".to_vec(), 1)?; let snapshot = WorkerSnapshot::new(2, vec![]); storage - .worker_put_local(b"b".to_vec(), b"2".to_vec(), 3) - .unwrap(); + .worker_put_local(b"b".to_vec(), b"2".to_vec(), 3)?; - let rows = block_on(storage.kv_range(b"a", b"z", Some(&snapshot))).unwrap(); + let rows = storage.kv_range(b"a", b"z", Some(&snapshot)).await?; assert_eq!( rows, vec![KvItem { @@ -1171,11 +1394,19 @@ mod tests { value: b"1".to_vec() }] ); + Ok(()) } #[test] fn worker_storage_kv_allows_concurrent_commits_on_different_keys() { - let (storage, _oid) = test_storage(); + block_on(async move { + let r = _worker_storage_kv_allows_concurrent_commits_on_different_keys().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_kv_allows_concurrent_commits_on_different_keys() -> RS<()> { + let (storage, _oid) = test_storage().await?; let snapshot1 = WorkerSnapshot::new(1, vec![]); let snapshot2 = WorkerSnapshot::new(2, vec![1]); @@ -1185,33 +1416,39 @@ mod tests { snapshot1.xid(), BTreeMap::from([(b"a".to_vec(), Some(b"1".to_vec()))]), XLBatch::new(vec![]), - ) - .unwrap(); + )?; let prepared2 = storage .prepare_worker_kv_commit( &snapshot2, snapshot2.xid(), BTreeMap::from([(b"b".to_vec(), Some(b"2".to_vec()))]), XLBatch::new(vec![]), - ) - .unwrap(); + )?; - storage.apply_prepared_commit(prepared1).unwrap(); - storage.apply_prepared_commit(prepared2).unwrap(); + storage.apply_prepared_commit(prepared1)?; + storage.apply_prepared_commit(prepared2)?; assert_eq!( - block_on(storage.kv_get(b"a", None)).unwrap(), + storage.kv_get(b"a", None).await?, Some(b"1".to_vec()) ); assert_eq!( - block_on(storage.kv_get(b"b", None)).unwrap(), + storage.kv_get(b"b", None).await?, Some(b"2".to_vec()) ); + Ok(()) } #[test] fn worker_storage_replay_batch_restores_kv_and_relation_rows() { - let (storage, oid) = test_storage(); + block_on(async move { + let r = _worker_storage_replay_batch_restores_kv_and_relation_rows().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_replay_batch_restores_kv_and_relation_rows() -> RS<()> { + let (storage, oid) = test_storage().await?; let batch = XLBatch::new(vec![crate::wal::xl_entry::XLEntry { xid: 9, ops: vec![ @@ -1234,25 +1471,32 @@ mod tests { ], }]); - storage.replay_batch(batch).unwrap(); + storage.replay_batch(batch)?; assert_eq!( - block_on(storage.kv_get(b"k", None)).unwrap(), + storage.kv_get(b"k", None).await?, Some(b"v".to_vec()) ); let mut tx = begin_tx(10, vec![]); assert_eq!( - block_on(storage.get(oid, &i32_bytes(7), &mut tx)).unwrap(), + storage.get(oid, &i32_bytes(7), &mut tx).await?, Some(i32_bytes(70)) ); + Ok(()) } #[test] fn worker_storage_replay_batch_applies_kv_delete() { - let (storage, _oid) = test_storage(); + block_on(async move { + let r = _worker_storage_replay_batch_applies_kv_delete().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_replay_batch_applies_kv_delete() -> RS<()> { + let (storage, _oid) = test_storage().await?; storage - .worker_put_local(b"k".to_vec(), b"v".to_vec(), 1) - .unwrap(); + .worker_put_local(b"k".to_vec(), b"v".to_vec(), 1)?; let batch = XLBatch::new(vec![crate::wal::xl_entry::XLEntry { xid: 2, @@ -1268,17 +1512,25 @@ mod tests { ], }]); - storage.replay_batch(batch).unwrap(); + storage.replay_batch(batch)?; - assert_eq!(block_on(storage.kv_get(b"k", None)).unwrap(), None); + assert_eq!(storage.kv_get(b"k", None).await?, None); + Ok(()) } #[test] fn worker_storage_bootstrap_uses_partition_zero_for_unpartitioned_tables() { + block_on(async move { + let r = _worker_storage_bootstrap_uses_partition_zero_for_unpartitioned_tables().await; + assert!(r.is_ok()) + }) + } + + async fn _worker_storage_bootstrap_uses_partition_zero_for_unpartitioned_tables() -> RS<()> { let mgr = Arc::new(TestMetaMgr::new()); let schema = test_schema(); let oid = schema.id(); - futures::executor::block_on(mgr.create_table(&schema)).unwrap(); + mgr.create_table(&schema).await?; let storage = WorkerStorage::new( mgr, @@ -1291,7 +1543,7 @@ mod tests { .to_string_lossy() .to_string(), ); - storage.bootstrap_existing_tables_sync().unwrap(); + storage.bootstrap_existing_tables_sync()?; let batch = XLBatch::new(vec![crate::wal::xl_entry::XLEntry { xid: 11, @@ -1308,12 +1560,15 @@ mod tests { ], }]); - storage.replay_batch(batch).unwrap(); + storage.replay_batch(batch)?; let mut tx = begin_tx(12, vec![]); assert_eq!( - block_on(storage.get_on_partition(oid, Some(0), &i32_bytes(5), &mut tx)).unwrap(), + storage + .get_on_partition(oid, Some(0), &i32_bytes(5), &mut tx) + .await?, Some(i32_bytes(50)) ); + Ok(()) } } diff --git a/mudu_kernel/src/server/worker_tx_manager.rs b/mudu_kernel/src/server/worker_tx_manager.rs index ec76d58..fb7bec2 100644 --- a/mudu_kernel/src/server/worker_tx_manager.rs +++ b/mudu_kernel/src/server/worker_tx_manager.rs @@ -3,8 +3,10 @@ use crate::wal::xl_batch::XLBatch; use crate::wal::xl_data_op::{XLDelete, XLInsert}; use crate::wal::xl_entry::{TxOp, XLEntry}; use crate::x_engine::tx_mgr::{PhysicalRelationId, TxMgr}; +use mudu_utils::task_trace; +use std::cell::RefCell; use std::collections::BTreeMap; -use std::sync::Mutex; +use tracing::trace; struct WorkerTxState { staged_puts: BTreeMap, Option>>, @@ -15,14 +17,14 @@ struct WorkerTxState { pub struct WorkerTxManager { snapshot: WorkerSnapshot, - state: Mutex, + state: RefCell, } impl WorkerTxManager { pub fn new(snapshot: WorkerSnapshot) -> Self { Self { snapshot, - state: Mutex::new(WorkerTxState { + state: RefCell::new(WorkerTxState { staged_puts: BTreeMap::new(), staged_relation_ops: BTreeMap::new(), write_ops: Vec::new(), @@ -30,8 +32,27 @@ impl WorkerTxManager { }), } } + + fn with_state(&self, f: impl FnOnce(&WorkerTxState) -> R) -> R { + let state = self + .state + .try_borrow() + .expect("worker tx manager state reentrant immutable borrow"); + f(&state) + } + + fn with_state_mut(&self, f: impl FnOnce(&mut WorkerTxState) -> R) -> R { + let mut state = self + .state + .try_borrow_mut() + .expect("worker tx manager state reentrant mutable borrow"); + f(&mut state) + } } +unsafe impl Send for WorkerTxManager {} +unsafe impl Sync for WorkerTxManager {} + impl TxMgr for WorkerTxManager { fn xid(&self) -> u64 { self.snapshot.xid() @@ -42,70 +63,110 @@ impl TxMgr for WorkerTxManager { } fn put(&self, key: Vec, value: Vec) { - let mut state = self.state.lock().unwrap(); - state.staged_puts.insert(key.clone(), Some(value.clone())); - state.log_buffer.push(TxOp::Insert(XLInsert { - table_id: 0, - partition_id: 0, - tuple_id: 0, - key, - value, - })); + let trace = task_trace!(); + trace.watch("tx.state.op", "put:enter"); + trace.watch("tx.state.xid", &self.snapshot.xid().to_string()); + self.with_state_mut(|state| { + state.staged_puts.insert(key.clone(), Some(value.clone())); + state.log_buffer.push(TxOp::Insert(XLInsert { + table_id: 0, + partition_id: 0, + tuple_id: 0, + key, + value, + })); + }); + trace.watch("tx.state.op", "put:done"); } fn delete(&self, key: Vec) { - let mut state = self.state.lock().unwrap(); - state.staged_puts.insert(key.clone(), None); - state.log_buffer.push(TxOp::Delete(XLDelete { - table_id: 0, - partition_id: 0, - tuple_id: 0, - key, - })); + let trace = task_trace!(); + trace.watch("tx.state.op", "delete:enter"); + trace.watch("tx.state.xid", &self.snapshot.xid().to_string()); + self.with_state_mut(|state| { + state.staged_puts.insert(key.clone(), None); + state.log_buffer.push(TxOp::Delete(XLDelete { + table_id: 0, + partition_id: 0, + tuple_id: 0, + key, + })); + }); + trace.watch("tx.state.op", "delete:done"); } fn get(&self, key: &[u8]) -> Option>> { - let state = self.state.lock().unwrap(); - state.staged_puts.get(key).cloned() + let trace = task_trace!(); + trace.watch("tx.state.op", "get:enter"); + trace.watch("tx.state.xid", &self.snapshot.xid().to_string()); + let result = self.with_state(|state| state.staged_puts.get(key).cloned()); + trace.watch("tx.state.op", "get:done"); + result } fn put_relation(&self, relation_id: PhysicalRelationId, key: Vec, value: Vec) { - let mut state = self.state.lock().unwrap(); - state - .staged_relation_ops - .entry(relation_id) - .or_default() - .insert(key.clone(), Some(value.clone())); - state.log_buffer.push(TxOp::Insert(XLInsert { - table_id: relation_id.table_id, - partition_id: relation_id.partition_id, - tuple_id: 0, - key, - value, - })); + let trace = task_trace!(); + trace.watch("tx.state.op", "put_relation:enter"); + trace.watch("tx.state.xid", &self.snapshot.xid().to_string()); + trace.watch("tx.state.relation_id", &format!("{relation_id:?}")); + self.with_state_mut(|state| { + state + .staged_relation_ops + .entry(relation_id) + .or_default() + .insert(key.clone(), Some(value.clone())); + state.log_buffer.push(TxOp::Insert(XLInsert { + table_id: relation_id.table_id, + partition_id: relation_id.partition_id, + tuple_id: 0, + key, + value, + })); + }); + trace.watch("tx.state.op", "put_relation:done"); } fn delete_relation(&self, relation_id: PhysicalRelationId, key: Vec) { - let mut state = self.state.lock().unwrap(); - state - .staged_relation_ops - .entry(relation_id) - .or_default() - .insert(key.clone(), None); - state.log_buffer.push(TxOp::Delete(XLDelete { - table_id: relation_id.table_id, - partition_id: relation_id.partition_id, - tuple_id: 0, - key, - })); + let trace = task_trace!(); + trace.watch("tx.state.op", "delete_relation:enter"); + trace.watch("tx.state.xid", &self.snapshot.xid().to_string()); + trace.watch("tx.state.relation_id", &format!("{relation_id:?}")); + self.with_state_mut(|state| { + state + .staged_relation_ops + .entry(relation_id) + .or_default() + .insert(key.clone(), None); + state.log_buffer.push(TxOp::Delete(XLDelete { + table_id: relation_id.table_id, + partition_id: relation_id.partition_id, + tuple_id: 0, + key, + })); + }); + trace.watch("tx.state.op", "delete_relation:done"); } fn get_relation(&self, relation_id: PhysicalRelationId, key: &[u8]) -> Option>> { - let state = self.state.lock().unwrap(); - state - .staged_relation_ops - .get(&relation_id) - .and_then(|rows| rows.get(key).cloned()) + trace!( + xid = self.snapshot.xid(), + relation_id = ?relation_id, + key_len = key.len(), + "worker_tx_manager get_relation enter" + ); + let result = self.with_state(|state| { + state + .staged_relation_ops + .get(&relation_id) + .and_then(|rows| rows.get(key).cloned()) + }); + trace!( + xid = self.snapshot.xid(), + relation_id = ?relation_id, + found = result.is_some(), + "worker_tx_manager get_relation exit" + ); + result } fn staged_relation_items_in_range( @@ -114,24 +175,24 @@ impl TxMgr for WorkerTxManager { start_key: &[u8], end_key: &[u8], ) -> Vec<(Vec, Option>)> { - let state = self.state.lock().unwrap(); - state - .staged_relation_ops - .get(&relation_id) - .map(|rows| { - rows.iter() - .filter(|(key, _)| is_key_in_range(key, start_key, end_key)) - .map(|(key, value)| (key.clone(), value.clone())) - .collect() - }) - .unwrap_or_default() + self.with_state(|state| { + state + .staged_relation_ops + .get(&relation_id) + .map(|rows| { + rows.iter() + .filter(|(key, _)| is_key_in_range(key, start_key, end_key)) + .map(|(key, value)| (key.clone(), value.clone())) + .collect() + }) + .unwrap_or_default() + }) } fn staged_relation_ops( &self, ) -> BTreeMap, Option>>> { - let state = self.state.lock().unwrap(); - state.staged_relation_ops.clone() + self.with_state(|state| state.staged_relation_ops.clone()) } fn staged_items_in_range( @@ -139,60 +200,62 @@ impl TxMgr for WorkerTxManager { start_key: &[u8], end_key: &[u8], ) -> Vec<(Vec, Option>)> { - let state = self.state.lock().unwrap(); - state - .staged_puts - .iter() - .filter(|(key, _)| is_key_in_range(key, start_key, end_key)) - .map(|(key, value)| (key.clone(), value.clone())) - .collect() + self.with_state(|state| { + state + .staged_puts + .iter() + .filter(|(key, _)| is_key_in_range(key, start_key, end_key)) + .map(|(key, value)| (key.clone(), value.clone())) + .collect() + }) } fn staged_put_items(&self) -> BTreeMap, Option>> { - let state = self.state.lock().unwrap(); - state.staged_puts.clone() + self.with_state(|state| state.staged_puts.clone()) } fn is_empty(&self) -> bool { - let state = self.state.lock().unwrap(); - state.staged_puts.is_empty() && state.staged_relation_ops.is_empty() + self.with_state(|state| { + state.staged_puts.is_empty() && state.staged_relation_ops.is_empty() + }) } fn write_ops(&self) -> Vec<(PhysicalRelationId, Vec)> { - let state = self.state.lock().unwrap(); - state.write_ops.clone() + self.with_state(|state| state.write_ops.clone()) } fn build_write_ops(&self) { - let mut state = self.state.lock().unwrap(); - state.write_ops.clear(); - let mut write_ops = Vec::new(); - for key in state.staged_puts.keys() { - write_ops.push(( - PhysicalRelationId { - table_id: 0, - partition_id: 0, - }, - key.clone(), - )); - } - for (relation_id, ops) in &state.staged_relation_ops { - for key in ops.keys() { - write_ops.push((*relation_id, key.clone())); + self.with_state_mut(|state| { + state.write_ops.clear(); + let mut write_ops = Vec::new(); + for key in state.staged_puts.keys() { + write_ops.push(( + PhysicalRelationId { + table_id: 0, + partition_id: 0, + }, + key.clone(), + )); } - } - state.write_ops = write_ops; - state.write_ops.sort(); + for (relation_id, ops) in &state.staged_relation_ops { + for key in ops.keys() { + write_ops.push((*relation_id, key.clone())); + } + } + state.write_ops = write_ops; + state.write_ops.sort(); + }); } fn xl_batch(&self) -> XLBatch { - let state = self.state.lock().unwrap(); - let xid = self.snapshot.xid(); - let mut ops = Vec::with_capacity(state.log_buffer.len() + 2); - ops.push(TxOp::Begin); - ops.extend(state.log_buffer.clone()); - ops.push(TxOp::Commit); - XLBatch::new(vec![XLEntry { xid, ops }]) + self.with_state(|state| { + let xid = self.snapshot.xid(); + let mut ops = Vec::with_capacity(state.log_buffer.len() + 2); + ops.push(TxOp::Begin); + ops.extend(state.log_buffer.clone()); + ops.push(TxOp::Commit); + XLBatch::new(vec![XLEntry { xid, ops }]) + }) } } diff --git a/mudu_kernel/src/server/x_contract.rs b/mudu_kernel/src/server/x_contract.rs index 2cdf45c..bd23560 100644 --- a/mudu_kernel/src/server/x_contract.rs +++ b/mudu_kernel/src/server/x_contract.rs @@ -9,18 +9,21 @@ use mudu_contract::tuple::build_tuple::build_tuple; use mudu_contract::tuple::tuple_binary::TupleBinary as TupleRaw; use mudu_contract::tuple::update_tuple::update_tuple; use mudu_type::dt_function::send_binary; +use mudu_utils::task_trace; use std::ops::Bound; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; -use tracing::debug; +use std::time::Duration; +use tracing::{debug, trace}; +use crate::async_rt::contract::AsyncRuntime; use crate::contract::meta_mgr::MetaMgr; use crate::contract::schema_table::SchemaTable; use crate::contract::table_desc::TableDesc; use crate::meta::meta_mgr_factory::MetaMgrFactory; use crate::server::message_bus_api::{ current_message_bus, DeliveryMode, EndpointId, Envelope, MessageKind, OutgoingMessage, - RecvFilter, + RecvFilter, ServerInstanceId, }; use crate::server::partition_router::{PartitionRouter, DEFAULT_UNPARTITIONED_TABLE_PARTITION_ID}; use crate::server::partition_rpc::{PartitionRpcRequest, PartitionRpcResponse, RpcBound}; @@ -39,7 +42,8 @@ type DatBin = Buf; const PARTITION_RPC_REQUEST_KIND: MessageKind = MessageKind::User(0x7101); const PARTITION_RPC_RESPONSE_KIND: MessageKind = MessageKind::User(0x7102); -pub struct IoUringXContract { +pub struct WorkerXContract { + server_instance_id: ServerInstanceId, worker_id: OID, default_unpartitioned_worker_id: OID, meta_mgr: Arc, @@ -52,6 +56,10 @@ pub struct IoUringXContract { // commit_gate: AsyncMutex<()>, } +/// Backward-compatible name for callers that still refer to the historical +/// io_uring-only contract. +pub type IoUringXContract = WorkerXContract; + struct VecCursor { inner: Mutex, } @@ -61,7 +69,7 @@ struct VecCursorInner { index: usize, } -impl IoUringXContract { +impl WorkerXContract { pub fn new(meta_mgr: Arc) -> RS { Self::with_log_and_data_dir(meta_mgr, None, 0, 0, 0, default_worker_storage_data_dir()) } @@ -78,16 +86,38 @@ impl IoUringXContract { partition_id: OID, data_dir: String, ) -> RS { - let storage = Arc::new(WorkerStorage::new(meta_mgr.clone(), partition_id, data_dir)); + Self::with_log_and_data_dir_and_runtime( + meta_mgr, + log, + worker_id, + default_unpartitioned_worker_id, + partition_id, + data_dir, + None, + 0, + ) + } + + pub fn with_log_and_data_dir_and_runtime( + meta_mgr: Arc, + log: Option, + worker_id: OID, + default_unpartitioned_worker_id: OID, + partition_id: OID, + data_dir: String, + async_runtime: Option>, + server_instance_id: ServerInstanceId, + ) -> RS { + let storage = Arc::new(WorkerStorage::new_with_async_runtime( + meta_mgr.clone(), + partition_id, + data_dir, + async_runtime, + )); storage.register_global(); - storage.bootstrap_existing_tables_sync().map_err(|e| { - m_error!( - EC::StorageErr, - "bootstrap worker storage from meta failed", - e - ) - })?; + bootstrap_storage(&storage)?; Ok(Self { + server_instance_id, worker_id, default_unpartitioned_worker_id, meta_mgr: meta_mgr.clone(), @@ -123,6 +153,33 @@ impl IoUringXContract { ) } + pub fn with_worker_log_and_data_dir_and_runtime( + log: ChunkedWorkerLogBackend, + worker_id: OID, + default_unpartitioned_worker_id: OID, + partition_id: OID, + data_dir: String, + async_runtime: Option>, + server_instance_id: ServerInstanceId, + ) -> RS { + let meta_mgr = MetaMgrFactory::create(data_dir.clone()) + .map_err(|e| m_error!(EC::DBInternalError, "create worker meta manager failed", e))?; + Self::with_log_and_data_dir_and_runtime( + meta_mgr, + Some(log.clone()), + worker_id, + default_unpartitioned_worker_id, + partition_id, + data_dir, + async_runtime, + server_instance_id, + ) + } + + pub fn server_instance_id(&self) -> ServerInstanceId { + self.server_instance_id + } + pub fn worker_log(&self) -> Option { self.log.clone() } @@ -297,6 +354,7 @@ impl IoUringXContract { items: std::collections::BTreeMap, Option>>, batch: XLBatch, ) -> RS<()> { + mudu_utils::scoped_task_trace!(); if items.is_empty() { return self.snapshot_mgr.end_tx(xid); } @@ -373,7 +431,11 @@ impl IoUringXContract { } pub async fn worker_commit_tx_async(&self, tx: Arc) -> RS<()> { + mudu_utils::scoped_task_trace!(); + let xid = tx.xid(); + + trace!("worker_commit_tx_async {}", xid); if tx.is_empty() { return self.worker_rollback_tx(tx); } @@ -390,20 +452,29 @@ impl IoUringXContract { let prepared = self.storage.prepare_commit_async(tx.as_ref()).await?; (self.storage.clone(), self.log.clone(), prepared) }; + trace!("log flush {}", xid); let result = async { if let Some(log) = log { + task_trace!().watch("procedure.worker_execute.stage", "wal_append_start"); new_xl_batch_writer(log.clone()) .append(prepared.batch()) .await?; + task_trace!().watch("procedure.worker_execute.stage", "wal_append_done"); + task_trace!().watch("procedure.worker_execute.stage", "wal_flush_start"); log.flush_async().await?; + task_trace!().watch("procedure.worker_execute.stage", "wal_flush_done"); } + task_trace!().watch("procedure.worker_execute.stage", "storage_apply_start"); storage.apply_prepared_commit_async(prepared).await?; + task_trace!().watch("procedure.worker_execute.stage", "storage_apply_done"); Ok(()) } .await; + trace!("log flush done {}", xid); let write_ops = tx.write_ops(); self.tx_lock.release(xid as OID, &write_ops); self.worker_rollback_tx(tx)?; + trace!("worker_commit_tx_async finish {}", xid); result } @@ -440,6 +511,37 @@ impl IoUringXContract { } } +fn bootstrap_storage(storage: &Arc) -> RS<()> { + if storage.uses_async_runtime() { + let storage = storage.clone(); + mudu_sys::task_async::block_on_tokio_current_thread(async move { + storage.bootstrap_existing_tables_async().await + }) + .map_err(|e| { + m_error!( + EC::TokioErr, + "create tokio runtime for storage bootstrap failed", + e + ) + })? + .map_err(|e| { + m_error!( + EC::StorageErr, + "bootstrap worker storage from meta failed", + e + ) + }) + } else { + storage.bootstrap_existing_tables_sync().map_err(|e| { + m_error!( + EC::StorageErr, + "bootstrap worker storage from meta failed", + e + ) + }) + } +} + fn default_worker_storage_data_dir() -> String { std::env::temp_dir() .join(format!( @@ -450,7 +552,7 @@ fn default_worker_storage_data_dir() -> String { .to_string() } -impl IoUringXContract { +impl WorkerXContract { async fn handle_partition_rpc(&self, envelope: Envelope) -> RS<()> { debug!( worker_id = self.worker_id, @@ -663,14 +765,25 @@ impl IoUringXContract { worker_id = self.worker_id, target_worker_id, msg_id, "waiting partition rpc response" ); - let envelope = bus - .recv(RecvFilter { + let envelope = mudu_sys::task_async::timeout( + Duration::from_secs(10), + bus.recv(RecvFilter { src: Some(EndpointId::Worker(target_worker_id)), dst: Some(EndpointId::Worker(self.worker_id)), kind: Some(PARTITION_RPC_RESPONSE_KIND), correlation_id: Some(msg_id), - }) - .await?; + }), + ) + .await + .ok_or_else(|| { + m_error!( + EC::TokioErr, + format!( + "partition rpc response timeout: server={}, worker={}, target_worker={}, msg_id={}", + self.server_instance_id, self.worker_id, target_worker_id, msg_id + ) + ) + })??; debug!( worker_id = self.worker_id, target_worker_id, @@ -919,19 +1032,25 @@ impl IoUringXContract { ) .await? } - _ => self + _ => { + let result = self + .storage + .get_on_partition(table_id, Some(partition_id), &key, tx_mgr.as_ref()) + .await?; + result + .map(|value| project_selected_fields(&desc, &key, &value, select)) + .transpose()? + } + }, + None => { + let result = self .storage - .get_on_partition(table_id, Some(partition_id), &key, tx_mgr.as_ref()) - .await? + .get_on_partition(table_id, None, &key, tx_mgr.as_ref()) + .await?; + result .map(|value| project_selected_fields(&desc, &key, &value, select)) - .transpose()?, - }, - None => self - .storage - .get_on_partition(table_id, None, &key, tx_mgr.as_ref()) - .await? - .map(|value| project_selected_fields(&desc, &key, &value, select)) - .transpose()?, + .transpose()? + } }; match opt_value { Some(value) => Ok(Some(value)), @@ -962,6 +1081,12 @@ impl IoUringXContract { for partition_id in partitions { match self.resolve_partition_worker(partition_id).await? { Some(worker_id) if self.worker_id != 0 && worker_id != self.worker_id => { + if matches!(pred_non_key, Predicate::KeyPrefixEq(_)) { + return Err(m_error!( + EC::NotImplemented, + "key-prefix range filtering is not implemented for remote partitions" + )); + } let rows = self .remote_read_range( worker_id, @@ -987,6 +1112,9 @@ impl IoUringXContract { ) .await?; for (key, value) in rows { + if !matches_predicate(&desc, &key, &value, pred_non_key)? { + continue; + } projected.push(TupleRow::new(project_selected_fields( &desc, &key, &value, select, )?)); @@ -1001,6 +1129,9 @@ impl IoUringXContract { .range(table_id, (start, end), tx_mgr.as_ref()) .await?; for (key, value) in rows { + if !matches_predicate(&desc, &key, &value, pred_non_key)? { + continue; + } projected.push(TupleRow::new(project_selected_fields( &desc, &key, &value, select, )?)); @@ -1095,7 +1226,7 @@ impl IoUringXContract { } #[async_trait] -impl XContract for IoUringXContract { +impl XContract for WorkerXContract { async fn create_table(&self, _tx_mgr: Arc, schema: &SchemaTable) -> RS<()> { self.storage.create_table_async(schema).await } @@ -1212,7 +1343,7 @@ impl XContract for IoUringXContract { } } -impl IoUringXContract { +impl WorkerXContract { pub fn meta_mgr(&self) -> Arc { self.meta_mgr.clone() } @@ -1237,6 +1368,7 @@ impl RSCursor for VecCursor { fn ensure_supported_predicate(predicate: &Predicate) -> RS<()> { match predicate { Predicate::CNF(items) | Predicate::DNF(items) if items.is_empty() => Ok(()), + Predicate::KeyPrefixEq(_) => Ok(()), Predicate::CNF(items) | Predicate::DNF(items) => { let _ = items .iter() @@ -1251,6 +1383,35 @@ fn ensure_supported_predicate(predicate: &Predicate) -> RS<()> { } } +fn matches_predicate( + desc: &TableDesc, + key: &[u8], + _value: &[u8], + predicate: &Predicate, +) -> RS { + match predicate { + Predicate::CNF(items) | Predicate::DNF(items) if items.is_empty() => Ok(true), + Predicate::KeyPrefixEq(prefix) => { + for (attr, expected) in prefix { + let field = desc.get_attr(*attr); + let Some(primary_index) = field.primary_index() else { + return Ok(false); + }; + let field_desc = desc.key_desc().get_field_desc(primary_index); + let actual = field_desc.get(key)?; + if actual != expected.as_slice() { + return Ok(false); + } + } + Ok(true) + } + Predicate::CNF(_) | Predicate::DNF(_) => Err(m_error!( + EC::NotImplemented, + "non-key predicates are not implemented in io_uring xcontract" + )), + } +} + fn build_key_tuple(data: &VecDatum, desc: &TableDesc) -> RS> { build_tuple_for::(data.data(), desc) } @@ -1282,7 +1443,35 @@ fn build_tuple_for( }; let values: Vec<_> = vec_data.into_iter().map(|(_, v)| v).collect(); if IS_KEY && tuple_desc.field_count() != values.len() { - return Err(m_error!(EC::TupleErr)); + let expected_key_fields = desc + .key_indices() + .iter() + .map(|index| desc.get_attr(*index).name().clone()) + .collect::>(); + let provided_fields = data + .iter() + .map(|(attr, _)| { + let field = desc.get_attr(*attr); + format!( + "{}(column_index={}, datum_index={}, primary_index={:?})", + field.name(), + field.column_index(), + field.datum_index(), + field.primary_index() + ) + }) + .collect::>(); + return Err(m_error!( + EC::TupleErr, + format!( + "build key tuple width mismatch for table {}: expected {} key fields {:?}, got {} provided fields {:?}", + desc.name(), + tuple_desc.field_count(), + expected_key_fields, + values.len(), + provided_fields, + ) + )); } if IS_KEY { return build_tuple(&values, tuple_desc); @@ -1315,7 +1504,9 @@ fn build_tuple_for( let completed = completed .into_iter() .collect::>>() - .ok_or_else(|| m_error!(EC::TupleErr))?; + .ok_or_else(|| { + m_error!(EC::TupleErr) + })?; build_tuple(&completed, tuple_desc) } @@ -1446,60 +1637,24 @@ mod tests { use super::*; use crate::contract::schema_column::SchemaColumn; use crate::contract::table_info::TableInfo; + use crate::server::test_meta_mgr::TestMetaMgr; use crate::wal::worker_log::{decode_frames, ChunkedWorkerLogBackend, WorkerLogLayout}; use crate::wal::xl_data_op::XLInsert; use crate::wal::xl_entry::TxOp; - use futures::executor::block_on; use mudu::common::id::gen_oid; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dt_fn_param::DatType; use mudu_type::dt_info::DTInfo; - use std::collections::HashMap; use std::env::temp_dir; + use std::future::Future; - struct TestMetaMgr { - tables: Mutex>>, - } - - impl TestMetaMgr { - fn new() -> Self { - Self { - tables: Mutex::new(HashMap::new()), - } - } - } - - #[async_trait] - impl MetaMgr for TestMetaMgr { - async fn get_table_by_id(&self, oid: OID) -> RS> { - self.tables - .lock() - .unwrap() - .get(&oid) - .cloned() - .ok_or_else(|| m_error!(EC::NoSuchElement, format!("no such table {}", oid))) - } - - async fn get_table_by_name(&self, name: &String) -> RS>> { - Ok(self - .tables - .lock() - .unwrap() - .values() - .find(|table| table.name() == name) - .cloned()) - } - - async fn create_table(&self, schema: &SchemaTable) -> RS<()> { - let table = TableInfo::new(schema.clone())?.table_desc()?; - self.tables.lock().unwrap().insert(schema.id(), table); - Ok(()) - } - - async fn drop_table(&self, table_id: OID) -> RS<()> { - self.tables.lock().unwrap().remove(&table_id); - Ok(()) - } + fn block_on(fut: F) -> F::Output + where + F: Future, + { + mudu_sys::task_async::build_current_thread_runtime() + .unwrap() + .block_on(fut) } fn test_schema() -> SchemaTable { @@ -1592,6 +1747,13 @@ mod tests { #[test] fn relation_commit_log_round_trips() { + block_on(async move { + let r = _relation_commit_log_round_trips().await; + assert!(r.is_ok()) + }) + } + + async fn _relation_commit_log_round_trips() -> RS<()> { let mgr = Arc::new(TestMetaMgr::new()); let storage = WorkerStorage::new( mgr.clone(), @@ -1606,43 +1768,57 @@ mod tests { ); let schema = test_schema(); let table_id = schema.id(); - block_on(storage.create_table_async(&schema)).unwrap(); + storage.create_table_async(&schema).await?; let mut txm = WorkerTxManager::new(crate::server::worker_snapshot::WorkerSnapshot::new( 9, vec![], )); - block_on(storage.put(table_id, b"k1".to_vec(), b"v1".to_vec(), &mut txm)).unwrap(); - block_on(storage.remove(table_id, b"k1", &mut txm)).unwrap(); + storage + .put(table_id, b"k1".to_vec(), b"v1".to_vec(), &mut txm) + .await?; + storage.remove(table_id, b"k1", &mut txm).await?; let prepared = storage.prepare_commit(&txm).unwrap(); assert_eq!(prepared.batch().entries.len(), 1); assert_eq!(prepared.batch().entries[0].xid, 9); assert!(matches!(prepared.batch().entries[0].ops[0], TxOp::Begin)); + Ok(()) } #[test] fn iouring_xcontract_commit_persists_relation_log() { + block_on(async move { + let r = _iouring_xcontract_commit_persists_relation_log().await; + assert!(r.is_ok()) + }) + } + + async fn _iouring_xcontract_commit_persists_relation_log() -> RS<()> { let dir = temp_dir().join(format!("iouring_xcontract_log_{}", gen_oid())); let layout = WorkerLogLayout::new(dir, gen_oid(), 4096).unwrap(); let log = ChunkedWorkerLogBackend::new(layout.clone()).unwrap(); let meta_mgr = Arc::new(TestMetaMgr::new()); let schema = test_schema(); let table_id = schema.id(); - let contract = IoUringXContract::with_log(meta_mgr, Some(log)).unwrap(); - - let ddl_tx = block_on(contract.begin_tx()).unwrap(); - block_on(contract.create_table(ddl_tx.clone(), &schema)).unwrap(); - block_on(contract.commit_tx(ddl_tx)).unwrap(); - let tx_mgr = block_on(contract.begin_tx()).unwrap(); - block_on(contract.insert( + let contract = WorkerXContract::with_log(meta_mgr, Some(log)).unwrap(); + + let ddl_tx = contract.begin_tx().await?; + contract.create_table(ddl_tx.clone(), &schema).await?; + contract.commit_tx(ddl_tx).await?; + let tx_mgr = contract.begin_tx().await?; + let keys = key_row(1); + let values = value_row(10); + let opt_insert = OptInsert::default(); + contract + .insert( tx_mgr.clone(), table_id, - &key_row(1), - &value_row(10), - &OptInsert::default(), - )) - .unwrap(); - block_on(contract.commit_tx(tx_mgr)).unwrap(); + &keys, + &values, + &opt_insert, + ) + .await?; + contract.commit_tx(tx_mgr).await?; let bytes = std::fs::read(layout.chunk_path(0)).unwrap(); let frames = decode_frames(&bytes).unwrap(); @@ -1665,18 +1841,26 @@ mod tests { insert.value, build_value_tuple(&value_row(10), &meta_table(&schema).unwrap()).unwrap() ); + Ok(()) } #[test] fn iouring_xcontract_replay_restores_worker_kv_and_relation_rows() { + block_on(async move { + let r = _iouring_xcontract_replay_restores_worker_kv_and_relation_rows().await; + assert!(r.is_ok()) + }) + } + + async fn _iouring_xcontract_replay_restores_worker_kv_and_relation_rows() -> RS<()> { let meta_mgr = Arc::new(TestMetaMgr::new()); let schema = test_schema(); let table_id = schema.id(); - let contract = IoUringXContract::with_log(meta_mgr, None).unwrap(); + let contract = WorkerXContract::with_log(meta_mgr, None).unwrap(); - let tx_mgr = block_on(contract.begin_tx()).unwrap(); - block_on(contract.create_table(tx_mgr.clone(), &schema)).unwrap(); - block_on(contract.commit_tx(tx_mgr)).unwrap(); + let tx_mgr = contract.begin_tx().await?; + contract.create_table(tx_mgr.clone(), &schema).await?; + contract.commit_tx(tx_mgr).await?; let batch = XLBatch::new(vec![crate::wal::xl_entry::XLEntry { xid: 11, ops: vec![ @@ -1704,16 +1888,21 @@ mod tests { assert_eq!(contract.worker_get(b"wk").unwrap(), Some(b"wv".to_vec())); - let xid = block_on(contract.begin_tx()).unwrap(); - let relation = block_on(contract.read_key( + let xid = contract.begin_tx().await?; + let pred_key = key_row(3); + let select = VecSelTerm::new(vec![1]); + let opt_read = OptRead::default(); + let relation = contract + .read_key( xid, table_id, - &key_row(3), - &VecSelTerm::new(vec![1]), - &OptRead::default(), - )) - .unwrap(); + &pred_key, + &select, + &opt_read, + ) + .await?; assert_eq!(relation, Some(vec![datum(30)])); + Ok(()) } #[test] @@ -1733,7 +1922,7 @@ mod tests { #[test] fn iouring_xcontract_replay_applies_worker_kv_delete() { - let contract = IoUringXContract::with_worker_log( + let contract = WorkerXContract::with_worker_log( ChunkedWorkerLogBackend::new( WorkerLogLayout::new( temp_dir().join(format!("iouring_xcontract_worker_log_{}", gen_oid())), @@ -1768,49 +1957,69 @@ mod tests { #[test] fn iouring_xcontract_update_maps_table_attr_to_value_tuple_index() { + block_on(async move { + let r = _iouring_xcontract_update_maps_table_attr_to_value_tuple_index().await; + assert!(r.is_ok()) + }) + } + + async fn _iouring_xcontract_update_maps_table_attr_to_value_tuple_index() -> RS<()> { let meta_mgr = Arc::new(TestMetaMgr::new()); let schema = test_schema(); let table_id = schema.id(); - let contract = IoUringXContract::with_log(meta_mgr, None).unwrap(); - - let ddl_tx = block_on(contract.begin_tx()).unwrap(); - block_on(contract.create_table(ddl_tx.clone(), &schema)).unwrap(); - block_on(contract.commit_tx(ddl_tx)).unwrap(); - - let insert_tx = block_on(contract.begin_tx()).unwrap(); - block_on(contract.insert( + let contract = WorkerXContract::with_log(meta_mgr, None).unwrap(); + + let ddl_tx = contract.begin_tx().await?; + contract.create_table(ddl_tx.clone(), &schema).await?; + contract.commit_tx(ddl_tx).await?; + + let insert_tx = contract.begin_tx().await?; + let insert_key = key_row(1); + let insert_value = value_row(10); + let opt_insert = OptInsert::default(); + contract + .insert( insert_tx.clone(), table_id, - &key_row(1), - &value_row(10), - &OptInsert::default(), - )) - .unwrap(); - block_on(contract.commit_tx(insert_tx)).unwrap(); - - let update_tx = block_on(contract.begin_tx()).unwrap(); - let updated = block_on(contract.update( + &insert_key, + &insert_value, + &opt_insert, + ) + .await?; + contract.commit_tx(insert_tx).await?; + + let update_tx = contract.begin_tx().await?; + let update_key = key_row(1); + let pred_non_key = Predicate::CNF(vec![]); + let update_value = value_row(20); + let updated = contract + .update( update_tx.clone(), table_id, - &key_row(1), - &Predicate::CNF(vec![]), - &value_row(20), + &update_key, + &pred_non_key, + &update_value, &OptUpdate {}, - )) - .unwrap(); + ) + .await?; assert_eq!(updated, 1); - block_on(contract.commit_tx(update_tx)).unwrap(); - - let read_tx = block_on(contract.begin_tx()).unwrap(); - let relation = block_on(contract.read_key( + contract.commit_tx(update_tx).await?; + + let read_tx = contract.begin_tx().await?; + let read_key = key_row(1); + let select = VecSelTerm::new(vec![1]); + let opt_read = OptRead::default(); + let relation = contract + .read_key( read_tx, table_id, - &key_row(1), - &VecSelTerm::new(vec![1]), - &OptRead::default(), - )) - .unwrap(); + &read_key, + &select, + &opt_read, + ) + .await?; assert_eq!(relation, Some(vec![datum(20)])); + Ok(()) } fn meta_table(schema: &SchemaTable) -> RS> { diff --git a/mudu_kernel/src/server/x_lock_mgr.rs b/mudu_kernel/src/server/x_lock_mgr.rs index 8fb3d42..7057d13 100644 --- a/mudu_kernel/src/server/x_lock_mgr.rs +++ b/mudu_kernel/src/server/x_lock_mgr.rs @@ -15,6 +15,7 @@ impl XLockMgr { } pub fn try_lock_some(&self, oid: OID, table_keys: &Vec<(PhysicalRelationId, Vec)>) -> bool { + mudu_utils::scoped_task_trace!(); let mut lock = self.lock.lock().unwrap(); let mut acquired: Vec<(PhysicalRelationId, Vec)> = Vec::new(); for (relation_id, key) in table_keys.iter() { diff --git a/mudu_kernel/src/sql/binder.rs b/mudu_kernel/src/sql/binder.rs index 35597c7..fde3754 100644 --- a/mudu_kernel/src/sql/binder.rs +++ b/mudu_kernel/src/sql/binder.rs @@ -495,7 +495,19 @@ impl Binder { && matches!(start, Bound::Unbounded) && matches!(end, Bound::Unbounded) { - return Ok(BoundPredicate::KeyEq { key: eq_items }); + eq_items.sort_by_key(|(attr, _)| table_desc.get_attr(*attr).primary_index().unwrap()); + for (index, (attr, _)) in eq_items.iter().enumerate() { + if table_desc.get_attr(*attr).primary_index() != Some(index) { + return Err(m_error!( + ER::NotImplemented, + "select equality predicates on primary keys must cover a left prefix of the primary key" + )); + } + } + if eq_items.len() == table_desc.key_indices().len() { + return Ok(BoundPredicate::KeyEq { key: eq_items }); + } + return Ok(BoundPredicate::KeyPrefixEq { prefix: eq_items }); } if !eq_items.is_empty() { @@ -544,6 +556,10 @@ impl Binder { } Ok(key) } + BoundPredicate::KeyPrefixEq { .. } => Err(m_error!( + ER::NotImplemented, + "update/delete require a complete primary key predicate" + )), BoundPredicate::True => Err(m_error!( ER::NotImplemented, "full-table update/delete is not implemented" @@ -577,7 +593,10 @@ impl Binder { } fn schema_column_from_ast(column: &sql_parser::ast::column_def::ColumnDef) -> RS { - let ty = column.data_type().clone().uni_to()?; + let ty = column + .data_type() + .clone() + .uni_to_with_params(column.data_type_param().clone())?; let mut schema_column = SchemaColumn::new( column.column_name().clone(), ty.dat_type_id(), diff --git a/mudu_kernel/src/sql/binder_test.rs b/mudu_kernel/src/sql/binder_test.rs index c57c3b9..c7b5017 100644 --- a/mudu_kernel/src/sql/binder_test.rs +++ b/mudu_kernel/src/sql/binder_test.rs @@ -10,11 +10,14 @@ mod tests { use async_trait::async_trait; use mudu::common::id::OID; use mudu::common::result::RS; + use mudu::data_type::numeric::Numeric; use mudu::error::ec::EC; use mudu::m_error; use mudu_type::dat_type::DatType; use mudu_type::dat_type_id::DatTypeID; + use mudu_type::datum::DatumDyn; use mudu_type::dt_info::DTInfo; + use mudu_type::dtp_numeric::DTPNumeric; use sql_parser::ast::parser::SQLParser; use sql_parser::ast::stmt_type::StmtType; use std::collections::HashMap; @@ -113,6 +116,28 @@ mod tests { ) } + fn numeric_schema() -> SchemaTable { + let amount_type = DatType::from_numeric(DTPNumeric::new(9, 2)); + let note_type = DatType::default_for(DatTypeID::String); + SchemaTable::new( + "ledger".to_string(), + vec![ + SchemaColumn::new( + "amount".to_string(), + DatTypeID::Numeric, + DTInfo::from_opt_object(&amount_type), + ), + SchemaColumn::new( + "note".to_string(), + DatTypeID::String, + DTInfo::from_opt_object(¬e_type), + ), + ], + vec![0], + vec![1], + ) + } + fn parse_stmt(sql: &str) -> StmtType { SQLParser::new().parse(sql).unwrap().stmts()[0].clone() } @@ -125,6 +150,10 @@ mod tests { Binder::new(Arc::new(TestMetaMgr::new(composite_schema()))) } + fn numeric_binder() -> Binder { + Binder::new(Arc::new(TestMetaMgr::new(numeric_schema()))) + } + #[tokio::test] async fn bind_select_builds_key_eq_predicate() { let bound = binder() @@ -142,6 +171,40 @@ mod tests { } } + #[tokio::test] + async fn bind_select_uses_key_prefix_eq_for_left_prefix_of_composite_primary_key() { + let bound = composite_binder() + .bind( + parse_stmt("select tenant_id from accounts where tenant_id = 1;"), + &(), + ) + .await + .unwrap(); + + let BoundStmt::Query(BoundQuery::Select(select)) = bound else { + panic!("expected bound select"); + }; + match select.predicate { + BoundPredicate::KeyPrefixEq { prefix } => assert_eq!(prefix.len(), 1), + other => panic!("expected key prefix equality predicate, got {other:?}"), + } + } + + #[tokio::test] + async fn bind_select_rejects_non_leftmost_composite_primary_key_equality() { + let err = composite_binder() + .bind( + parse_stmt("select tenant_id from accounts where user_id = 2;"), + &(), + ) + .await + .unwrap_err(); + + assert!(err + .to_string() + .contains("must cover a left prefix of the primary key")); + } + #[tokio::test] async fn bind_select_reverses_value_column_comparison() { let bound = binder() @@ -257,6 +320,70 @@ mod tests { assert_eq!(insert.rows[1].key.len(), 1); } + #[tokio::test] + async fn bind_insert_encodes_numeric_literal_into_declared_column_type() { + let bound = numeric_binder() + .bind( + parse_stmt("insert into ledger (amount, note) values (12.3400, 'coffee');"), + &(), + ) + .await + .unwrap(); + + let BoundStmt::Command(BoundCommand::Insert(insert)) = bound else { + panic!("expected bound insert"); + }; + let amount_type = DatType::from_numeric(DTPNumeric::new(9, 2)); + let note_type = DatType::default_for(DatTypeID::String); + + assert_eq!(insert.rows.len(), 1); + assert_eq!(insert.rows[0].key.len(), 1); + assert_eq!(insert.rows[0].value.len(), 1); + assert_eq!( + insert.rows[0].key[0].1, + Numeric::parse("12.3400") + .unwrap() + .to_binary(&amount_type) + .unwrap() + .as_ref() + ); + assert_eq!( + insert.rows[0].value[0].1, + "'coffee'" + .to_string() + .to_binary(¬e_type) + .unwrap() + .as_ref() + ); + } + + #[tokio::test] + async fn bind_select_numeric_placeholder_uses_numeric_key_encoding() { + let bound = numeric_binder() + .bind( + parse_stmt("select amount from ledger where amount = ?;"), + &(Numeric::parse("12.3400").unwrap(),), + ) + .await + .unwrap(); + + let BoundStmt::Query(BoundQuery::Select(select)) = bound else { + panic!("expected bound select"); + }; + let amount_type = DatType::from_numeric(DTPNumeric::new(9, 2)); + let expected = Numeric::parse("12.3400") + .unwrap() + .to_binary(&amount_type) + .unwrap(); + match select.predicate { + BoundPredicate::KeyEq { key } => { + assert_eq!(key.len(), 1); + assert_eq!(key[0].1, expected.as_ref()); + } + other => panic!("expected key equality predicate, got {other:?}"), + } + } + #[tokio::test] async fn bind_insert_rejects_column_size_mismatch() { let err = binder() diff --git a/mudu_kernel/src/sql/bound_stmt.rs b/mudu_kernel/src/sql/bound_stmt.rs index 38f60cf..5cb60a8 100644 --- a/mudu_kernel/src/sql/bound_stmt.rs +++ b/mudu_kernel/src/sql/bound_stmt.rs @@ -105,6 +105,9 @@ pub enum BoundPredicate { KeyEq { key: Vec<(AttrIndex, Vec)>, }, + KeyPrefixEq { + prefix: Vec<(AttrIndex, Vec)>, + }, KeyRange { start: Bound)>>, end: Bound)>>, diff --git a/mudu_kernel/src/sql/planner.rs b/mudu_kernel/src/sql/planner.rs index ecf5bae..5fbf27d 100644 --- a/mudu_kernel/src/sql/planner.rs +++ b/mudu_kernel/src/sql/planner.rs @@ -93,6 +93,25 @@ impl Planner { .await?; Ok(Arc::new(exec)) } + BoundPredicate::KeyPrefixEq { prefix } => { + let exec = crate::executor::index_access_range::IndexAccessRange::new( + PAccessRange { + tx_mgr: self.ctx.tx_mgr.clone(), + table_id: stmt.table_id, + pred_key: RangeData::new( + std::ops::Bound::Unbounded, + std::ops::Bound::Unbounded, + ), + pred_non_key: Predicate::KeyPrefixEq(prefix), + select, + opt_read: OptRead::default(), + }, + self.ctx.x_contract.clone(), + self.ctx.meta_mgr.clone(), + ) + .await?; + Ok(Arc::new(exec)) + } BoundPredicate::KeyRange { start, end } => { let exec = crate::executor::index_access_range::IndexAccessRange::new( PAccessRange { @@ -223,3 +242,333 @@ impl Planner { ) } } + +#[cfg(test)] +mod tests { + use super::Planner; + use crate::contract::meta_mgr::MetaMgr; + use crate::contract::schema_column::SchemaColumn; + use crate::contract::schema_table::SchemaTable; + use crate::contract::table_desc::TableDesc; + use crate::contract::table_info::TableInfo; + use crate::server::worker_snapshot::WorkerSnapshot; + use crate::sql::bound_stmt::{BoundPredicate, BoundQuery, BoundSelect}; + use crate::sql::plan_ctx::PlanCtx; + use crate::x_engine::api::{ + AlterTable, OptDelete, OptInsert, OptRead, OptUpdate, Predicate, RSCursor, RangeData, + TupleRow, VecDatum, VecSelTerm, XContract, + }; + use crate::x_engine::tx_mgr::{PhysicalRelationId, TxMgr}; + use async_trait::async_trait; + use mudu::common::id::OID; + use mudu::common::result::RS; + use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; + use mudu_type::dat_type::DatType; + use mudu_type::dat_type_id::DatTypeID; + use mudu_type::dt_info::DTInfo; + use std::collections::{BTreeMap, HashMap}; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::{Arc, Mutex}; + + struct TestMetaMgr { + tables: Mutex>>, + } + + impl TestMetaMgr { + fn new(schema: SchemaTable) -> Self { + let table = TableInfo::new(schema).unwrap().table_desc().unwrap(); + let mut tables = HashMap::new(); + tables.insert(table.id(), table); + Self { + tables: Mutex::new(tables), + } + } + + fn table_id(&self) -> OID { + *self.tables.lock().unwrap().keys().next().unwrap() + } + } + + #[async_trait] + impl MetaMgr for TestMetaMgr { + async fn get_table_by_id(&self, oid: OID) -> RS> { + self.tables + .lock() + .unwrap() + .get(&oid) + .cloned() + .ok_or_else(|| mudu::m_error!(mudu::error::ec::EC::NoSuchElement, oid.to_string())) + } + + async fn get_table_by_name(&self, name: &String) -> RS>> { + Ok(self + .tables + .lock() + .unwrap() + .values() + .find(|table| table.name() == name) + .cloned()) + } + + async fn create_table(&self, schema: &SchemaTable) -> RS<()> { + let table = TableInfo::new(schema.clone())?.table_desc()?; + self.tables.lock().unwrap().insert(table.id(), table); + Ok(()) + } + + async fn drop_table(&self, table_id: OID) -> RS<()> { + self.tables.lock().unwrap().remove(&table_id); + Ok(()) + } + } + + struct TestTxMgr; + + impl TxMgr for TestTxMgr { + fn xid(&self) -> u64 { + 1 + } + + fn snapshot(&self) -> WorkerSnapshot { + WorkerSnapshot::new(1, Vec::new()) + } + + fn put(&self, _key: Vec, _value: Vec) {} + fn delete(&self, _key: Vec) {} + fn get(&self, _key: &[u8]) -> Option>> { + None + } + fn put_relation( + &self, + _relation_id: PhysicalRelationId, + _key: Vec, + _value: Vec, + ) { + } + fn delete_relation(&self, _relation_id: PhysicalRelationId, _key: Vec) {} + fn get_relation( + &self, + _relation_id: PhysicalRelationId, + _key: &[u8], + ) -> Option>> { + None + } + fn staged_relation_items_in_range( + &self, + _relation_id: PhysicalRelationId, + _start_key: &[u8], + _end_key: &[u8], + ) -> Vec<(Vec, Option>)> { + Vec::new() + } + fn staged_relation_ops( + &self, + ) -> BTreeMap, Option>>> { + BTreeMap::new() + } + fn staged_items_in_range( + &self, + _start_key: &[u8], + _end_key: &[u8], + ) -> Vec<(Vec, Option>)> { + Vec::new() + } + fn staged_put_items(&self) -> BTreeMap, Option>> { + BTreeMap::new() + } + fn is_empty(&self) -> bool { + true + } + fn write_ops(&self) -> Vec<(PhysicalRelationId, Vec)> { + Vec::new() + } + fn build_write_ops(&self) {} + fn xl_batch(&self) -> crate::wal::xl_batch::XLBatch { + crate::wal::xl_batch::XLBatch::new(Vec::new()) + } + } + + struct TestCursor; + + #[async_trait] + impl RSCursor for TestCursor { + async fn next(&self) -> RS> { + Ok(None) + } + } + + struct TestXContract { + read_key_calls: AtomicUsize, + read_range_calls: AtomicUsize, + } + + impl TestXContract { + fn new() -> Self { + Self { + read_key_calls: AtomicUsize::new(0), + read_range_calls: AtomicUsize::new(0), + } + } + } + + #[async_trait] + impl XContract for TestXContract { + async fn create_table(&self, _tx_mgr: Arc, _schema: &SchemaTable) -> RS<()> { + unimplemented!() + } + async fn drop_table(&self, _tx_mgr: Arc, _oid: OID) -> RS<()> { + unimplemented!() + } + async fn alter_table( + &self, + _tx_mgr: Arc, + _oid: OID, + _alter_table: &AlterTable, + ) -> RS<()> { + unimplemented!() + } + async fn begin_tx(&self) -> RS> { + unimplemented!() + } + async fn commit_tx(&self, _tx_mgr: Arc) -> RS<()> { + unimplemented!() + } + async fn abort_tx(&self, _tx_mgr: Arc) -> RS<()> { + unimplemented!() + } + async fn update( + &self, + _tx_mgr: Arc, + _table_id: OID, + _pred_key: &VecDatum, + _pred_non_key: &Predicate, + _values: &VecDatum, + _opt_update: &OptUpdate, + ) -> RS { + unimplemented!() + } + async fn read_key( + &self, + _tx_mgr: Arc, + _table_id: OID, + _pred_key: &VecDatum, + _select: &VecSelTerm, + _opt_read: &OptRead, + ) -> RS>>> { + self.read_key_calls.fetch_add(1, Ordering::Relaxed); + Ok(None) + } + async fn read_range( + &self, + _tx_mgr: Arc, + _table_id: OID, + _pred_key: &RangeData, + _pred_non_key: &Predicate, + _select: &VecSelTerm, + _opt_read: &OptRead, + ) -> RS> { + self.read_range_calls.fetch_add(1, Ordering::Relaxed); + Ok(Arc::new(TestCursor)) + } + async fn delete( + &self, + _tx_mgr: Arc, + _table_id: OID, + _pred_key: &VecDatum, + _pred_non_key: &Predicate, + _opt_delete: &OptDelete, + ) -> RS { + unimplemented!() + } + async fn insert( + &self, + _tx_mgr: Arc, + _table_id: OID, + _keys: &VecDatum, + _values: &VecDatum, + _opt_insert: &OptInsert, + ) -> RS<()> { + unimplemented!() + } + } + + fn composite_schema() -> SchemaTable { + SchemaTable::new( + "accounts".to_string(), + vec![ + SchemaColumn::new( + "tenant_id".to_string(), + DatTypeID::I32, + DTInfo::from_opt_object(&DatType::default_for(DatTypeID::I32)), + ), + SchemaColumn::new( + "user_id".to_string(), + DatTypeID::I32, + DTInfo::from_opt_object(&DatType::default_for(DatTypeID::I32)), + ), + SchemaColumn::new( + "name".to_string(), + DatTypeID::String, + DTInfo::from_opt_object(&DatType::default_for(DatTypeID::String)), + ), + ], + vec![0, 1], + vec![2], + ) + } + + #[tokio::test] + async fn planner_uses_read_key_for_complete_primary_key_equality() { + let meta_mgr = Arc::new(TestMetaMgr::new(composite_schema())); + let x_contract = Arc::new(TestXContract::new()); + let planner = Planner::new(PlanCtx { + tx_mgr: Arc::new(TestTxMgr), + meta_mgr: meta_mgr.clone(), + x_contract: x_contract.clone(), + }); + + let exec = planner + .plan_query(BoundQuery::Select(BoundSelect { + table_id: meta_mgr.table_id(), + select_attrs: vec![0], + tuple_desc: TupleFieldDesc::new(Vec::new()), + predicate: BoundPredicate::KeyEq { + key: vec![(0, vec![1]), (1, vec![2])], + }, + })) + .await + .unwrap(); + + exec.open().await.unwrap(); + let _ = exec.next().await.unwrap(); + assert_eq!(x_contract.read_key_calls.load(Ordering::Relaxed), 1); + assert_eq!(x_contract.read_range_calls.load(Ordering::Relaxed), 0); + } + + #[tokio::test] + async fn planner_uses_read_range_for_primary_key_prefix_equality() { + let meta_mgr = Arc::new(TestMetaMgr::new(composite_schema())); + let x_contract = Arc::new(TestXContract::new()); + let planner = Planner::new(PlanCtx { + tx_mgr: Arc::new(TestTxMgr), + meta_mgr: meta_mgr.clone(), + x_contract: x_contract.clone(), + }); + + let exec = planner + .plan_query(BoundQuery::Select(BoundSelect { + table_id: meta_mgr.table_id(), + select_attrs: vec![0], + tuple_desc: TupleFieldDesc::new(Vec::new()), + predicate: BoundPredicate::KeyPrefixEq { + prefix: vec![(0, vec![1])], + }, + })) + .await + .unwrap(); + + exec.open().await.unwrap(); + assert_eq!(x_contract.read_key_calls.load(Ordering::Relaxed), 0); + assert_eq!(x_contract.read_range_calls.load(Ordering::Relaxed), 1); + } +} diff --git a/mudu_kernel/src/sql/stmt_cmd_run.rs b/mudu_kernel/src/sql/stmt_cmd_run.rs index 594703f..40cfb6c 100644 --- a/mudu_kernel/src/sql/stmt_cmd_run.rs +++ b/mudu_kernel/src/sql/stmt_cmd_run.rs @@ -2,13 +2,17 @@ use crate::contract::ssn_ctx::SsnCtx; use crate::sql::current_tx::get_tx; use crate::sql::stmt_cmd::StmtCmd; use mudu::common::result::RS; +use mudu_utils::task_trace; use tracing::error; // Run a command statement // DDL includes: Create/Alter Table // DML includes: Insert/Update/Delete pub async fn run_cmd_stmt(stmt: &dyn StmtCmd, ctx: &dyn SsnCtx) -> RS { + let trace = task_trace!(); + trace.watch("procedure.run_cmd.stage", "get_tx_start"); let _xid = get_tx(ctx).await?; + trace.watch("procedure.run_cmd.stage", "get_tx_done"); let r = run_cmd_stmt_gut(stmt, ctx).await; match r { Ok(r) => Ok(r), @@ -22,10 +26,21 @@ pub async fn run_cmd_stmt(stmt: &dyn StmtCmd, ctx: &dyn SsnCtx) -> RS { } async fn run_cmd_stmt_gut(stmt: &dyn StmtCmd, ctx: &dyn SsnCtx) -> RS { + let trace = task_trace!(); + trace.watch("procedure.run_cmd_gut.stage", "realize_start"); stmt.realize(ctx).await?; + trace.watch("procedure.run_cmd_gut.stage", "realize_done"); + trace.watch("procedure.run_cmd_gut.stage", "build_start"); let cmd = stmt.build(ctx).await?; + trace.watch("procedure.run_cmd_gut.stage", "build_done"); + trace.watch("procedure.run_cmd_gut.stage", "prepare_start"); cmd.prepare().await?; + trace.watch("procedure.run_cmd_gut.stage", "prepare_done"); + trace.watch("procedure.run_cmd_gut.stage", "run_start"); cmd.run().await?; + trace.watch("procedure.run_cmd_gut.stage", "run_done"); + trace.watch("procedure.run_cmd_gut.stage", "affected_rows_start"); let rows = cmd.affected_rows().await?; + trace.watch("procedure.run_cmd_gut.stage", "affected_rows_done"); Ok(rows) } diff --git a/mudu_kernel/src/sql/value_codec.rs b/mudu_kernel/src/sql/value_codec.rs index c0f552a..0df8025 100644 --- a/mudu_kernel/src/sql/value_codec.rs +++ b/mudu_kernel/src/sql/value_codec.rs @@ -1,5 +1,6 @@ use mudu::common::buf::Buf; use mudu::common::result::RS; +use mudu::data_type::numeric::Numeric; use mudu::error::ec::EC as ER; use mudu::m_error; use mudu_contract::database::sql_params::SQLParams; @@ -65,6 +66,31 @@ impl ValueCodec { (DatTypeID::F64, DatTypeID::F32) => { DatTyped::from_f32(literal.dat_internal().to_f64() as f32) } + (DatTypeID::I32, DatTypeID::Numeric) => { + DatTyped::from_numeric(Numeric::from(literal.dat_internal().to_i32())) + } + (DatTypeID::I64, DatTypeID::Numeric) => { + DatTyped::from_numeric(Numeric::from(literal.dat_internal().to_i64())) + } + (DatTypeID::I128, DatTypeID::Numeric) => { + DatTyped::from_numeric(Numeric::from(literal.dat_internal().to_i128())) + } + (DatTypeID::Numeric, DatTypeID::F64) => DatTyped::from_f64( + literal + .dat_internal() + .expect_numeric() + .to_plain_string() + .parse::() + .map_err(|e| m_error!(ER::TypeBaseErr, "numeric to f64 literal cast", e))?, + ), + (DatTypeID::Numeric, DatTypeID::F32) => DatTyped::from_f32( + literal + .dat_internal() + .expect_numeric() + .to_plain_string() + .parse::() + .map_err(|e| m_error!(ER::TypeBaseErr, "numeric to f32 literal cast", e))?, + ), _ => return Ok(literal.clone()), }; Ok(coerced) diff --git a/mudu_kernel/src/sql/value_codec_test.rs b/mudu_kernel/src/sql/value_codec_test.rs index 9a6d920..699862d 100644 --- a/mudu_kernel/src/sql/value_codec_test.rs +++ b/mudu_kernel/src/sql/value_codec_test.rs @@ -1,10 +1,12 @@ #[cfg(test)] mod tests { use crate::sql::value_codec::ValueCodec; + use mudu::data_type::numeric::Numeric; use mudu_type::dat_type::DatType; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dat_typed::DatTyped; use mudu_type::datum::DatumDyn; + use mudu_type::dtp_numeric::DTPNumeric; use sql_parser::ast::expr_item::ExprValue; use sql_parser::ast::expr_literal::ExprLiteral; @@ -96,4 +98,50 @@ mod tests { .as_ref() ); } + + #[test] + fn integer_literal_is_coerced_into_numeric_column_encoding() { + let ty = DatType::from_numeric(DTPNumeric::new(9, 2)); + let mut param_index = 0; + let binary = ValueCodec::binary_from_expr( + &ExprValue::ValueLiteral(ExprLiteral::DatumLiteral(DatTyped::from_i64(42))), + &ty, + &(), + &mut param_index, + ) + .unwrap(); + + assert_eq!(param_index, 0); + assert_eq!( + binary.as_slice(), + DatTyped::from_numeric(Numeric::parse("42").unwrap()) + .dat_internal() + .to_binary(&ty) + .unwrap() + .as_ref() + ); + } + + #[test] + fn numeric_literal_is_coerced_into_f64_column_encoding() { + let mut param_index = 0; + let binary = ValueCodec::binary_from_expr( + &ExprValue::ValueLiteral(ExprLiteral::DatumLiteral(DatTyped::from_numeric( + Numeric::parse("12.3400").unwrap(), + ))), + &DatType::default_for(DatTypeID::F64), + &(), + &mut param_index, + ) + .unwrap(); + + assert_eq!(param_index, 0); + assert_eq!( + binary.as_slice(), + 12.34f64 + .to_binary(&DatType::default_for(DatTypeID::F64)) + .unwrap() + .as_ref() + ); + } } diff --git a/mudu_kernel/src/storage/relation/relation.rs b/mudu_kernel/src/storage/relation/relation.rs index e3fd9e0..7553676 100644 --- a/mudu_kernel/src/storage/relation/relation.rs +++ b/mudu_kernel/src/storage/relation/relation.rs @@ -1,7 +1,11 @@ use futures::executor::block_on; +use mudu_utils::sync::f_mutex::FMutex; use std::cell::{Cell, UnsafeCell}; +use std::future::Future; use std::ops::Bound; +use std::sync::Arc; +use crate::async_rt::contract::AsyncFs; use mudu::common::id::{TupleID, OID}; use mudu::common::result::RS; use mudu::error::ec::EC; @@ -18,6 +22,8 @@ use crate::index::index_key::compare_context::CompareContext; use crate::index::index_key::key_tuple::KeyTuple; use crate::server::worker_snapshot::WorkerSnapshot; use crate::storage::time_series::time_series_file::{TimeSeriesFile, TimeSeriesFileIdentity}; +use mudu_utils::scoped_task_trace; +use tracing::trace; // Relation WAL does not use string file kinds. The relation layer alone owns // the mapping from logical role to numeric file index. @@ -25,6 +31,12 @@ const KEY_FILE_INDEX: u32 = 0; const VALUE_FILE_INDEX: u32 = 1; pub struct Relation { + // This lock is used on the io_uring worker path. We intentionally avoid + // Tokio's mutex here because we observed `tokio::sync::Mutex::lock().await` + // stall under the custom io_uring/task-runtime integration even when the + // lock was not contended. `futures::lock::Mutex` does not depend on Tokio's + // waiter/waker machinery and is stable in this path. + access_lock: FMutex<()>, inner: RelationInner, } @@ -46,12 +58,30 @@ unsafe impl Sync for RelationInner {} impl Relation { pub fn new(table_id: OID, partition_id: OID, path: String, table_desc: &TableDesc) -> RS { Ok(Self { + access_lock: FMutex::new(()), inner: RelationInner::new(table_id, partition_id, path, table_desc)?, }) } + pub async fn new_with_fs( + fs: Arc, + table_id: OID, + partition_id: OID, + path: String, + table_desc: &TableDesc, + ) -> RS { + scoped_task_trace!(); + Ok(Self { + access_lock: FMutex::new(()), + inner: RelationInner::new_with_fs(fs, table_id, partition_id, path, table_desc).await?, + }) + } + pub async fn has_visible_version(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS { - Ok(self.inner.visible_meta(key, snapshot).await?.is_some()) + let guard = self.access_lock.lock().await; + let result = self.inner.visible_meta(key, snapshot).await; + drop(guard); + Ok(result?.is_some()) } pub fn has_visible_version_sync(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS { @@ -63,7 +93,11 @@ impl Relation { key: &KeyTuple, snapshot: &WorkerSnapshot, ) -> RS>> { - self.inner.visible_value(key, snapshot).await + mudu_utils::scoped_task_trace!(); + let guard = self.access_lock.lock().await; + let result = self.inner.visible_value(key, snapshot).await; + drop(guard); + result } pub fn visible_value_sync( @@ -79,7 +113,10 @@ impl Relation { bounds: (Bound<&[u8]>, Bound<&[u8]>), snapshot: &WorkerSnapshot, ) -> RS, Vec)>> { - self.inner.visible_range(bounds, snapshot).await + let guard = self.access_lock.lock().await; + let result = self.inner.visible_range(bounds, snapshot).await; + drop(guard); + result } pub fn visible_range_sync( @@ -91,7 +128,10 @@ impl Relation { } pub async fn has_write_conflict(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS { - self.inner.has_write_conflict(key, snapshot).await + let guard = self.access_lock.lock().await; + let result = self.inner.has_write_conflict(key, snapshot).await; + drop(guard); + result } pub fn has_write_conflict_sync(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS { @@ -99,7 +139,10 @@ impl Relation { } pub async fn write_value(&self, key: Vec, value: Vec, xid: u64) -> RS<()> { - self.inner.write_row(key, Some(value), xid).await + let guard = self.access_lock.lock().await; + let result = self.inner.write_row(key, Some(value), xid).await; + drop(guard); + result } pub fn write_value_sync(&self, key: Vec, value: Vec, xid: u64) -> RS<()> { @@ -107,7 +150,10 @@ impl Relation { } pub async fn write_delete(&self, key: Vec, xid: u64) -> RS<()> { - self.inner.write_row(key, None, xid).await + let guard = self.access_lock.lock().await; + let result = self.inner.write_row(key, None, xid).await; + drop(guard); + result } pub fn write_delete_sync(&self, key: Vec, xid: u64) -> RS<()> { @@ -115,7 +161,10 @@ impl Relation { } pub async fn write_row(&self, key: Vec, value: Option>, xid: u64) -> RS<()> { - self.inner.write_row(key, value, xid).await + let guard = self.access_lock.lock().await; + let result = self.inner.write_row(key, value, xid).await; + drop(guard); + result } pub fn write_row_sync(&self, key: Vec, value: Option>, xid: u64) -> RS<()> { @@ -167,6 +216,85 @@ impl RelationInner { Ok(relation) } + async fn new_with_fs( + fs: Arc, + table_id: OID, + partition_id: OID, + path: String, + table_desc: &TableDesc, + ) -> RS { + mudu_utils::scoped_task_trace!(); + trace!(table_id, partition_id, path = %path, "relation new_with_fs start"); + let key_identity = TimeSeriesFileIdentity { + partition_id, + table_id, + file_index: KEY_FILE_INDEX, + }; + let value_identity = TimeSeriesFileIdentity { + partition_id, + table_id, + file_index: VALUE_FILE_INDEX, + }; + let key_schema_hash = tuple_schema_hash(b'K', table_desc.key_desc()); + let value_schema_hash = tuple_schema_hash(b'V', table_desc.value_desc()); + + let relation = Self { + _table_id: table_id, + _partition_id: partition_id, + index: UnsafeCell::new(BTreeIndex::new(CompareContext { + result: Ok(()), + comparator: TupleComparator::new(), + desc: table_desc.key_desc().clone(), + })), + key_file: UnsafeCell::new({ + trace!( + table_id, + partition_id, + file_index = KEY_FILE_INDEX, + "relation opening key file" + ); + TimeSeriesFile::open_relation_file_with_fs( + fs.clone(), + &path, + key_identity, + key_schema_hash, + true, + ) + .await + .map_err(|e| m_error!(EC::IOErr, "open relation key file failed", e))? + }), + value_file: UnsafeCell::new({ + trace!( + table_id, + partition_id, + file_index = VALUE_FILE_INDEX, + "relation opening value file" + ); + TimeSeriesFile::open_relation_file_with_fs( + fs.clone(), + &path, + value_identity, + value_schema_hash, + true, + ) + .await + .map_err(|e| m_error!(EC::IOErr, "open relation value file failed", e))? + }), + next_tuple_id: Cell::new(1), + }; + trace!( + table_id, + partition_id, + "relation files opened, rebuilding from files" + ); + relation + .rebuild_from_files_async() + .await + .map_err(|e| m_error!(EC::StorageErr, "rebuild relation from files failed", e))?; + trace!(table_id, partition_id, "relation new_with_fs done"); + Ok(relation) + } + fn rebuild_from_files(&self) -> RS<()> { let rows = self.key_file().scan_range_sync(0, u64::MAX)?; let mut max_tuple_id = 0; @@ -214,11 +342,61 @@ impl RelationInner { Ok(()) } + async fn rebuild_from_files_async(&self) -> RS<()> { + let rows = self.key_file().scan_range(0, u64::MAX).await?; + let mut max_tuple_id = 0; + + for key_row in rows { + let tuple_id = key_row.tuple_id as TupleID; + max_tuple_id = max_tuple_id.max(tuple_id); + + let key_tuple = KeyTuple::from(key_row.payload.clone()); + let row = match self.index().get(&key_tuple)?.cloned() { + Some(row) => { + let existing_tuple_id = row + .tuple_id() + .await? + .ok_or_else(|| m_error!(EC::InternalErr, "missing tuple id"))?; + if existing_tuple_id as u64 != key_row.tuple_id { + return Err(m_error!( + EC::DecodeErr, + format!( + "tuple id mismatch for key rebuild: key={:?} existing={} file={}", + key_tuple.as_slice(), + existing_tuple_id, + key_row.tuple_id + ) + )); + } + row + } + None => DataRow::new(tuple_id), + }; + + let timestamp = Timestamp::new(key_row.timestamp, u64::MAX); + let version = match self + .value_file() + .get(key_row.timestamp, key_row.tuple_id) + .await? + { + Some(_) => VersionTuple::new(timestamp, Vec::new()), + None => VersionTuple::new_delete(timestamp), + }; + row.write(version, None).await?; + let _ = self.index_mut().insert(key_tuple, row)?; + } + + self.next_tuple_id + .set(max_tuple_id.saturating_add(1).max(1)); + Ok(()) + } + async fn visible_meta( &self, key: &KeyTuple, snapshot: &WorkerSnapshot, ) -> RS> { + mudu_utils::scoped_task_trace!(); let row = match self.index().get(key)? { Some(row) => row, None => return Ok(None), @@ -228,8 +406,8 @@ impl RelationInner { .await? .ok_or_else(|| m_error!(EC::InternalErr, "missing tuple id"))?; let snapshot = snapshot.to_snapshot(); - Ok(read_visible_version_async(row, &snapshot) - .await + let visible = read_visible_version_async(row, &snapshot).await; + Ok(visible .filter(|version| !version.is_deleted()) .map(|version| (tuple_id, version))) } @@ -239,7 +417,12 @@ impl RelationInner { key: &KeyTuple, snapshot: &WorkerSnapshot, ) -> RS> { - block_on(self.visible_meta(key, snapshot)) + let relation = self as *const RelationInner; + let key = key.clone(); + let snapshot = snapshot.clone(); + block_on_relation( + async move { unsafe { (&*relation).visible_meta(&key, &snapshot).await } }, + ) } async fn visible_value( @@ -247,6 +430,7 @@ impl RelationInner { key: &KeyTuple, snapshot: &WorkerSnapshot, ) -> RS>> { + mudu_utils::scoped_task_trace!(); let Some((tuple_id, version)) = self.visible_meta(key, snapshot).await? else { return Ok(None); }; @@ -256,7 +440,12 @@ impl RelationInner { } fn visible_value_sync(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS>> { - block_on(self.visible_value(key, snapshot)) + let relation = self as *const RelationInner; + let key = key.clone(); + let snapshot = snapshot.clone(); + block_on_relation( + async move { unsafe { (&*relation).visible_value(&key, &snapshot).await } }, + ) } async fn visible_range( @@ -287,7 +476,33 @@ impl RelationInner { bounds: (Bound<&[u8]>, Bound<&[u8]>), snapshot: &WorkerSnapshot, ) -> RS, Vec)>> { - block_on(self.visible_range(bounds, snapshot)) + let relation = self as *const RelationInner; + let begin_key = match bounds.0 { + Bound::Included(key) => Bound::Included(key.to_vec()), + Bound::Excluded(key) => Bound::Excluded(key.to_vec()), + Bound::Unbounded => Bound::Unbounded, + }; + let end_key = match bounds.1 { + Bound::Included(key) => Bound::Included(key.to_vec()), + Bound::Excluded(key) => Bound::Excluded(key.to_vec()), + Bound::Unbounded => Bound::Unbounded, + }; + let snapshot = snapshot.clone(); + block_on_relation(async move { + unsafe { + let begin = match &begin_key { + Bound::Included(key) => Bound::Included(key.as_slice()), + Bound::Excluded(key) => Bound::Excluded(key.as_slice()), + Bound::Unbounded => Bound::Unbounded, + }; + let end = match &end_key { + Bound::Included(key) => Bound::Included(key.as_slice()), + Bound::Excluded(key) => Bound::Excluded(key.as_slice()), + Bound::Unbounded => Bound::Unbounded, + }; + (&*relation).visible_range((begin, end), &snapshot).await + } + }) } async fn has_write_conflict(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS { @@ -301,7 +516,12 @@ impl RelationInner { } fn has_write_conflict_sync(&self, key: &KeyTuple, snapshot: &WorkerSnapshot) -> RS { - block_on(self.has_write_conflict(key, snapshot)) + let relation = self as *const RelationInner; + let key = key.clone(); + let snapshot = snapshot.clone(); + block_on_relation(async move { + unsafe { (&*relation).has_write_conflict(&key, &snapshot).await } + }) } async fn write_row(&self, key: Vec, value: Option>, xid: u64) -> RS<()> { @@ -338,7 +558,39 @@ impl RelationInner { } fn write_row_sync(&self, key: Vec, value: Option>, xid: u64) -> RS<()> { - block_on(self.write_row(key, value, xid)) + let key_tuple = KeyTuple::from(key.clone()); + let row = match self.index().get(&key_tuple)?.cloned() { + Some(row) => row, + None => { + let tuple_id = self.alloc_tuple_id(); + DataRow::new(tuple_id as u64) + } + }; + + let tuple_id = row + .tuple_id_sync()? + .ok_or_else(|| m_error!(EC::InternalErr, "missing tuple id"))?; + let timestamp = Timestamp::new(xid, u64::MAX); + + // Recovery replays worker logs before the io_uring service loop starts + // driving completions. This path must therefore stay fully synchronous + // instead of wrapping the async relation writer in a local block_on, + // which can deadlock while waiting for worker-ring I/O that is not yet + // being pumped. + self.key_file_mut() + .insert_sync(timestamp.c_min(), tuple_id as u64, &key)?; + if let Some(value) = value.as_ref() { + self.value_file_mut() + .insert_sync(timestamp.c_min(), tuple_id as u64, value)?; + } + + let version = match value { + Some(_) => VersionTuple::new(timestamp, Vec::new()), + None => VersionTuple::new_delete(timestamp), + }; + row.write_sync(version, None)?; + let _ = self.index_mut().insert(key_tuple, row)?; + Ok(()) } fn alloc_tuple_id(&self) -> TupleID { @@ -348,16 +600,13 @@ impl RelationInner { } async fn read_value_payload(&self, timestamp: u64, tuple_id: OID) -> RS> { - self.value_file() - .get(timestamp, tuple_id as u64) - .await? - .map(|record| record.payload) - .ok_or_else(|| { - m_error!( - EC::NoSuchElement, - format!("missing value payload ts={timestamp} tuple_id={tuple_id}") - ) - }) + let record = self.value_file().get(timestamp, tuple_id as u64).await?; + record.map(|record| record.payload).ok_or_else(|| { + m_error!( + EC::NoSuchElement, + format!("missing value payload ts={timestamp} tuple_id={tuple_id}") + ) + }) } fn index(&self) -> &BTreeIndex { @@ -391,6 +640,18 @@ impl RelationInner { } } +fn block_on_relation(fut: F) -> F::Output +where + F: Future + 'static, + F::Output: 'static, +{ + if mudu_sys::task_async::has_tokio_runtime() { + block_on(fut) + } else { + mudu_sys::task_async::block_on_tokio_current_thread(fut).unwrap() + } +} + fn tuple_schema_hash( role: u8, desc: &mudu_contract::tuple::tuple_binary_desc::TupleBinaryDesc, diff --git a/mudu_kernel/src/storage/time_series/time_series_file.rs b/mudu_kernel/src/storage/time_series/time_series_file.rs index b886d2d..368b393 100644 --- a/mudu_kernel/src/storage/time_series/time_series_file.rs +++ b/mudu_kernel/src/storage/time_series/time_series_file.rs @@ -1,13 +1,19 @@ +use crate::async_rt::contract::{AsyncFs, FileOpenOptions}; +use crate::async_rt::tokio::fs::TokioFs; use crate::io::file; use crate::io::file::IoFile; -use crate::io::worker_ring; use crate::storage::page::page_block_ref::{PageBlockRef, PAGE_SIZE}; use crate::storage::page::page_block_ref_mut::PageBlockRefMut; use crate::storage::page::page_header::NONE_PAGE_ID; use crate::storage::page::PageId; -use crate::wal::pl_batch::{new_pl_batch_writer, PLBatch}; +use crate::wal::pl_batch::{ + new_pl_batch_worker_log, new_pl_batch_writer, NoopPLBatchRecoveryHandler, PLBatch, +}; use crate::wal::pl_entry::{PLEntry, PLFileId, PLOp, PageUpdate}; +use crate::wal::typed_worker_log::AsyncWorkerLogRecoveryHandler; +use crate::wal::worker_log::AsyncWorkerLogRecoverySource; use crate::wal::worker_log::{ChunkedWorkerLogBackend, WorkerLogBackend, WorkerLogLayout}; +use async_trait::async_trait; use mudu::common::id::OID; use mudu::common::result::RS; use mudu::error::ec::EC; @@ -15,6 +21,8 @@ use mudu::m_error; use scc::HashMap; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; +use std::sync::Arc; +use tracing::trace; const FILE_MODE_644: u32 = 0o644; const RELATION_WAL_CHUNK_SIZE: u64 = 256 * 1024; @@ -50,6 +58,7 @@ enum PageInsertLocation { pub struct TimeSeriesFile { // Relation-owned files carry a stable identity and a dedicated PL backend. // Standalone test files leave both fields as `None`. + fs: Option>, identity: Option, path: PathBuf, file: IoFile, @@ -102,6 +111,31 @@ impl TimeSeriesFile { tuple_schema_hash: u64, create_if_missing: bool, ) -> RS { + Self::open_relation_file_with_fs( + Arc::new(TokioFs::new()), + base_path, + identity, + tuple_schema_hash, + create_if_missing, + ) + .await + } + + /// Async relation-file open path with explicit file-system backend. + pub async fn open_relation_file_with_fs>( + fs: Arc, + base_path: P, + identity: TimeSeriesFileIdentity, + tuple_schema_hash: u64, + create_if_missing: bool, + ) -> RS { + trace!( + table_id = identity.table_id, + partition_id = identity.partition_id, + file_index = identity.file_index, + create_if_missing, + "time_series open_relation_file_with_fs start" + ); let base_path = base_path.as_ref().to_path_buf(); let path = Self::relation_file_path( &base_path, @@ -110,11 +144,15 @@ impl TimeSeriesFile { identity.file_index, ); let wal_backend = new_relation_wal_backend(&base_path, &identity)?; - recover_relation_file(&base_path, &identity, &wal_backend)?; - if create_if_missing && !path.exists() { + trace!(path = %path.display(), "time_series recovering relation file"); + recover_relation_file_async(fs.clone(), &base_path, &identity, &wal_backend).await?; + if create_if_missing && !fs.path_exists(&path).await? { + trace!(path = %path.display(), "time_series appending create-file wal record"); append_file_create_async(&wal_backend, &identity).await?; } - Self::open_inner( + trace!(path = %path.display(), "time_series opening relation file inner"); + Self::open_inner_with_fs( + fs, path, Some(identity), Some(wal_backend), @@ -153,7 +191,16 @@ impl TimeSeriesFile { } pub async fn open_ts_file>(path: P, create_if_missing: bool) -> RS { - Self::open_inner( + Self::open_ts_file_with_fs(Arc::new(TokioFs::new()), path, create_if_missing).await + } + + pub async fn open_ts_file_with_fs>( + fs: Arc, + path: P, + create_if_missing: bool, + ) -> RS { + Self::open_inner_with_fs( + fs, path.as_ref().to_path_buf(), None, None, @@ -173,7 +220,8 @@ impl TimeSeriesFile { ) } - async fn open_inner( + async fn open_inner_with_fs( + fs: Arc, path: PathBuf, identity: Option, wal_backend: Option, @@ -182,8 +230,8 @@ impl TimeSeriesFile { ) -> RS { let path = path.to_path_buf(); if let Some(parent) = path.parent() { - mudu_sys::fs::create_dir_all(parent) - .map_err(|e| m_error!(EC::IOErr, "create time series dir error", e))?; + trace!(path = %path.display(), parent = %parent.display(), "time_series ensuring parent dir"); + fs.create_dir_all(parent).await?; } let flags = if create_if_missing { @@ -191,9 +239,10 @@ impl TimeSeriesFile { } else { libc::O_RDWR | file::cloexec_flag() }; + trace!(path = %path.display(), flags, "time_series opening rw file"); let file = open_rw(&path, flags).await?; - let len = mudu_sys::fs::metadata_len(&path) - .map_err(|e| m_error!(EC::IOErr, "read time series file metadata error", e))?; + trace!(path = %path.display(), "time_series opened rw file, reading metadata len by fd"); + let len = file::metadata_len_by_file(&file)?; if len % PAGE_SIZE as u64 != 0 { return Err(m_error!( EC::DecodeErr, @@ -208,6 +257,7 @@ impl TimeSeriesFile { let (head_page_id, tail_page_id) = load_chain_metadata(&file, page_count, tuple_schema_hash).await?; Ok(Self { + fs: Some(fs), identity, path, file, @@ -257,6 +307,7 @@ impl TimeSeriesFile { let (head_page_id, tail_page_id) = load_chain_metadata_sync(&file, page_count, tuple_schema_hash)?; Ok(Self { + fs: None, identity, path, file, @@ -322,7 +373,10 @@ impl TimeSeriesFile { .await?; } close_file(std::mem::take(&mut self.file)).await?; - remove_file_if_exists(&self.path) + match self.fs.as_ref() { + Some(fs) => fs.remove_file_if_exists(&self.path).await, + None => remove_file_if_exists(&self.path), + } } pub fn delete_file_sync(mut self) -> RS<()> { @@ -488,7 +542,173 @@ impl TimeSeriesFile { } pub async fn insert(&mut self, timestamp: u64, tuple_id: u64, payload: &[u8]) -> RS<()> { - self.insert_sync(timestamp, tuple_id, payload) + match self.find_insert_location(timestamp).await? { + PageInsertLocation::EmptyFile => { + let page_id = self.page_count; + let mut page_buf = empty_page_image( + page_id, + self.tuple_format_version, + self.tuple_schema_hash, + self.tuple_flags, + )?; + { + let mut page = PageBlockRefMut::new(&mut page_buf); + page.insert_record(timestamp, tuple_id, payload)?; + } + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: page_buf, + }); + plan.next_page_count = Some(page_id + 1); + plan.next_head_page_id = Some(Some(page_id)); + plan.next_tail_page_id = Some(Some(page_id)); + self.persist_plan(plan).await?; + } + PageInsertLocation::Existing(page_id) => { + let page_buf = self.read_page(page_id).await?; + let page = PageBlockRef::new(&page_buf); + if self.tuple_schema_hash != 0 { + let header = page.header()?; + if header.tuple_schema_hash() != self.tuple_schema_hash { + return Err(m_error!( + EC::DecodeErr, + format!( + "tuple schema hash mismatch on page {}: expected {} got {}", + page_id, + self.tuple_schema_hash, + header.tuple_schema_hash() + ) + )); + } + } + if let Some(slot_index) = page.find_slot_index(timestamp, tuple_id)? { + self.update_in_page(page_id, slot_index, timestamp, tuple_id, payload) + .await?; + return Ok(()); + } + + let mut page_buf = page_buf; + let insert_result = { + let mut page_mut = PageBlockRefMut::new(&mut page_buf); + page_mut.insert_record(timestamp, tuple_id, payload) + }; + match insert_result { + Ok(_) => self.write_page(page_id, &page_buf).await?, + Err(err) if err.ec() == EC::InsufficientBufferSpace => { + self.split_insert_full_page(page_id, timestamp, tuple_id, payload) + .await?; + } + Err(err) => return Err(err), + } + } + PageInsertLocation::Before(next_page_id) => { + let page_id = self.page_count; + let next_page_buf = self.read_page(next_page_id).await?; + let next_page = PageBlockRef::new(&next_page_buf); + let prev_page_id = next_page.active_prev_page()?; + let mut new_page_buf = empty_page_image( + page_id, + self.tuple_format_version, + self.tuple_schema_hash, + self.tuple_flags, + )?; + { + let mut page = PageBlockRefMut::new(&mut new_page_buf); + page.set_page_links(prev_page_id.unwrap_or(NONE_PAGE_ID), next_page_id)?; + page.insert_record(timestamp, tuple_id, payload)?; + } + + let mut updated_next_buf = next_page_buf.clone(); + { + let header = PageBlockRef::new(&updated_next_buf).header()?; + let mut page = PageBlockRefMut::new(&mut updated_next_buf); + page.set_page_links(page_id, header.next_page())?; + } + + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: new_page_buf, + }); + plan.page_writes.push(PlannedPageWrite { + page_id: next_page_id, + image: updated_next_buf, + }); + if let Some(prev_page_id) = prev_page_id { + let prev_page_buf = self.read_page(prev_page_id).await?; + let mut updated_prev_buf = prev_page_buf.clone(); + let header = PageBlockRef::new(&updated_prev_buf).header()?; + { + let mut page = PageBlockRefMut::new(&mut updated_prev_buf); + page.set_page_links(header.prev_page(), page_id)?; + } + plan.page_writes.push(PlannedPageWrite { + page_id: prev_page_id, + image: updated_prev_buf, + }); + } else { + plan.next_head_page_id = Some(Some(page_id)); + } + plan.next_page_count = Some(page_id + 1); + self.persist_plan(plan).await?; + } + PageInsertLocation::After(prev_page_id) => { + let page_id = self.page_count; + let prev_page_buf = self.read_page(prev_page_id).await?; + let prev_page = PageBlockRef::new(&prev_page_buf); + let next_page_id = prev_page.active_next_page()?; + let mut new_page_buf = empty_page_image( + page_id, + self.tuple_format_version, + self.tuple_schema_hash, + self.tuple_flags, + )?; + { + let mut page = PageBlockRefMut::new(&mut new_page_buf); + page.set_page_links(prev_page_id, next_page_id.unwrap_or(NONE_PAGE_ID))?; + page.insert_record(timestamp, tuple_id, payload)?; + } + + let mut updated_prev_buf = prev_page_buf.clone(); + { + let header = PageBlockRef::new(&updated_prev_buf).header()?; + let mut page = PageBlockRefMut::new(&mut updated_prev_buf); + page.set_page_links(header.prev_page(), page_id)?; + } + + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: new_page_buf, + }); + plan.page_writes.push(PlannedPageWrite { + page_id: prev_page_id, + image: updated_prev_buf, + }); + if let Some(next_page_id) = next_page_id { + let next_page_buf = self.read_page(next_page_id).await?; + let mut updated_next_buf = next_page_buf.clone(); + let header = PageBlockRef::new(&updated_next_buf).header()?; + { + let mut page = PageBlockRefMut::new(&mut updated_next_buf); + page.set_page_links(page_id, header.next_page())?; + } + plan.page_writes.push(PlannedPageWrite { + page_id: next_page_id, + image: updated_next_buf, + }); + } else { + plan.next_tail_page_id = Some(Some(page_id)); + } + if self.head_page_id.is_none() { + plan.next_head_page_id = Some(Some(page_id)); + } + plan.next_page_count = Some(page_id + 1); + self.persist_plan(plan).await?; + } + } + Ok(()) } pub fn insert_sync(&mut self, timestamp: u64, tuple_id: u64, payload: &[u8]) -> RS<()> { @@ -660,7 +880,36 @@ impl TimeSeriesFile { } pub async fn delete(&mut self, timestamp: u64, tuple_id: u64) -> RS { - self.delete_sync(timestamp, tuple_id) + let mut current = self.head_page_id; + while let Some(page_id) = current { + let page_buf = self.read_page(page_id).await?; + let page = PageBlockRef::new(&page_buf); + if let Some((min_ts, max_ts)) = page.timestamp_bounds()? { + if timestamp > max_ts { + return Ok(false); + } + if timestamp < min_ts { + current = page.active_next_page()?; + continue; + } + if let Some(slot_index) = page.find_slot_index(timestamp, tuple_id)? { + let mut page_buf = page_buf; + { + let mut page_mut = PageBlockRefMut::new(&mut page_buf); + page_mut.delete_record(slot_index)?; + } + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: page_buf, + }); + self.persist_plan(plan).await?; + return Ok(true); + } + } + current = page.active_next_page()?; + } + Ok(false) } pub fn delete_sync(&mut self, timestamp: u64, tuple_id: u64) -> RS { @@ -741,6 +990,221 @@ impl TimeSeriesFile { Ok(page) } + async fn update_in_page( + &mut self, + page_id: PageId, + slot_index: usize, + timestamp: u64, + tuple_id: u64, + payload: &[u8], + ) -> RS<()> { + let mut page_buf = self.read_page(page_id).await?; + { + let mut page_mut = PageBlockRefMut::new(&mut page_buf); + page_mut.update_record(slot_index, timestamp, tuple_id, payload)?; + } + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: page_buf, + }); + self.persist_plan(plan).await + } + + async fn split_insert_full_page( + &mut self, + page_id: PageId, + timestamp: u64, + tuple_id: u64, + payload: &[u8], + ) -> RS<()> { + let page_buf = self.read_page(page_id).await?; + let page = PageBlockRef::new(&page_buf); + let mut entries = self.page_entries(&page, page_id)?; + entries.push(TimeSeriesRecord { + timestamp, + tuple_id, + payload: payload.to_vec(), + page_id, + slot_index: 0, + }); + entries.sort_by(|left, right| { + left.timestamp + .cmp(&right.timestamp) + .then_with(|| left.tuple_id.cmp(&right.tuple_id)) + }); + + let split_at = self.find_split_index(&entries)?; + let lower_entries = entries[..split_at].to_vec(); + let upper_entries = entries[split_at..].to_vec(); + + let header = page.header()?; + let old_next_page_id = page.active_next_page()?; + let new_page_id = self.page_count; + let current_page_buf = build_entries_page_image( + page_id, + header.prev_page(), + new_page_id, + &upper_entries, + self.tuple_format_version, + self.tuple_schema_hash, + self.tuple_flags, + )?; + let new_page_buf = build_entries_page_image( + new_page_id, + page_id, + old_next_page_id.unwrap_or(NONE_PAGE_ID), + &lower_entries, + self.tuple_format_version, + self.tuple_schema_hash, + self.tuple_flags, + )?; + + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: current_page_buf, + }); + plan.page_writes.push(PlannedPageWrite { + page_id: new_page_id, + image: new_page_buf, + }); + if let Some(next_page_id) = old_next_page_id { + let next_page_buf = self.read_page(next_page_id).await?; + let mut updated_next_buf = next_page_buf.clone(); + let next_header = PageBlockRef::new(&updated_next_buf).header()?; + { + let mut page = PageBlockRefMut::new(&mut updated_next_buf); + page.set_page_links(new_page_id, next_header.next_page())?; + } + plan.page_writes.push(PlannedPageWrite { + page_id: next_page_id, + image: updated_next_buf, + }); + } else { + plan.next_tail_page_id = Some(Some(new_page_id)); + } + plan.next_page_count = Some(new_page_id + 1); + self.persist_plan(plan).await + } + + async fn find_insert_location(&self, timestamp: u64) -> RS { + let Some(mut current) = self.head_page_id else { + return Ok(PageInsertLocation::EmptyFile); + }; + + let mut last_non_empty = None; + loop { + let page_buf = self.read_page(current).await?; + let page = PageBlockRef::new(&page_buf); + match page.timestamp_bounds()? { + Some((min_ts, max_ts)) => { + last_non_empty = Some(current); + if timestamp > max_ts { + return Ok(PageInsertLocation::Before(current)); + } + if timestamp >= min_ts { + return Ok(PageInsertLocation::Existing(current)); + } + } + None => {} + } + + match page.active_next_page()? { + Some(next) => current = next, + None => return Ok(PageInsertLocation::After(last_non_empty.unwrap_or(current))), + } + } + } + + async fn write_page(&mut self, page_id: PageId, page: &[u8]) -> RS<()> { + if page.len() != PAGE_SIZE { + return Err(m_error!( + EC::EncodeErr, + format!( + "page write requires {} bytes, got {}", + PAGE_SIZE, + page.len() + ) + )); + } + let mut plan = TimeSeriesFileMutationPlan::default(); + plan.page_writes.push(PlannedPageWrite { + page_id, + image: page.to_vec(), + }); + self.persist_plan(plan).await + } + + async fn persist_plan(&mut self, plan: TimeSeriesFileMutationPlan) -> RS<()> { + // Physical WAL must reach durable storage before any data-page update. + if let Some(batch) = self.build_pl_batch(&plan)? { + trace!( + path = %self.path.display(), + create_file = plan.create_file, + delete_file = plan.delete_file, + page_writes = plan.page_writes.len(), + "time_series persist_plan append wal" + ); + let backend = self + .wal_backend + .clone() + .ok_or_else(|| m_error!(EC::InternalErr, "missing time series wal backend"))?; + let writer = new_pl_batch_writer(backend); + writer.append(&batch).await?; + } + trace!( + path = %self.path.display(), + create_file = plan.create_file, + delete_file = plan.delete_file, + page_writes = plan.page_writes.len(), + "time_series persist_plan apply plan" + ); + self.apply_plan(&plan).await + } + + async fn apply_plan(&mut self, plan: &TimeSeriesFileMutationPlan) -> RS<()> { + if plan.create_file { + trace!(path = %self.path.display(), "time_series apply_plan create file start"); + match self.fs.as_ref() { + Some(fs) => ensure_time_series_file_exists_async(fs.as_ref(), &self.path).await?, + None => ensure_time_series_file_exists_sync(&self.path)?, + } + trace!(path = %self.path.display(), "time_series apply_plan create file done"); + } + for write in &plan.page_writes { + trace!(path = %self.path.display(), page_id = write.page_id, "time_series apply_plan write page"); + self.apply_page_write(write.page_id, &write.image).await?; + } + if plan.delete_file { + close_file(std::mem::take(&mut self.file)).await?; + match self.fs.as_ref() { + Some(fs) => fs.remove_file_if_exists(&self.path).await?, + None => remove_file_if_exists(&self.path)?, + } + self.page_cache = HashMap::new(); + } + if let Some(page_count) = plan.next_page_count { + self.page_count = page_count; + } + if let Some(head_page_id) = plan.next_head_page_id { + self.head_page_id = head_page_id; + } + if let Some(tail_page_id) = plan.next_tail_page_id { + self.tail_page_id = tail_page_id; + } + Ok(()) + } + + async fn apply_page_write(&self, page_id: PageId, page: &[u8]) -> RS<()> { + let _ = self.page_cache.remove_sync(&page_id); + file::write(&self.file, page.to_vec(), page_offset(page_id)?) + .await + .map(|_| ())?; + let _ = self.page_cache.insert_sync(page_id, page.to_vec()); + Ok(()) + } + fn update_in_page_sync( &mut self, page_id: PageId, @@ -1291,11 +1755,7 @@ fn page_offset(page_id: PageId) -> RS { } async fn open_rw(path: &Path, flags: i32) -> RS { - if worker_ring::has_current_worker_ring() { - file::open(path, flags, FILE_MODE_644).await - } else { - file::open_sync(path, flags, FILE_MODE_644) - } + file::open(path, flags, FILE_MODE_644).await } fn open_rw_sync(path: &Path, flags: i32) -> RS { @@ -1303,11 +1763,7 @@ fn open_rw_sync(path: &Path, flags: i32) -> RS { } async fn read_file_exact(file: &IoFile, len: usize, offset: u64) -> RS> { - if worker_ring::has_current_worker_ring() { - file::read(file, len, offset).await - } else { - file::read_sync(file, len, offset) - } + file::read(file, len, offset).await } fn read_file_exact_sync(file: &IoFile, len: usize, offset: u64) -> RS> { @@ -1319,19 +1775,11 @@ fn write_file_all_sync(file: &IoFile, payload: &[u8], offset: u64) -> RS<()> { } async fn flush_file(file: &IoFile) -> RS<()> { - if worker_ring::has_current_worker_ring() { - file::flush(file).await - } else { - file::flush_sync(file) - } + file::flush(file).await } async fn close_file(file: IoFile) -> RS<()> { - if worker_ring::has_current_worker_ring() { - file::close(file).await - } else { - file::close_sync(file) - } + file::close(file).await } fn new_relation_wal_backend( @@ -1346,7 +1794,7 @@ fn new_relation_wal_backend( time_series_log_oid(identity), RELATION_WAL_CHUNK_SIZE, )?; - ChunkedWorkerLogBackend::new(layout) + ChunkedWorkerLogBackend::new_direct(layout) } fn time_series_log_oid(identity: &TimeSeriesFileIdentity) -> OID { @@ -1395,6 +1843,34 @@ fn recover_relation_file( Ok(()) } +async fn recover_relation_file_async( + fs: Arc, + base_path: &Path, + identity: &TimeSeriesFileIdentity, + backend: &ChunkedWorkerLogBackend, +) -> RS<()> { + let mut source = RelationWalRecoverySource { + fs: fs.clone(), + backend: backend.clone(), + }; + let handler = Arc::new(RelationWalRecoveryHandler { + fs, + path: TimeSeriesFile::relation_file_path( + base_path, + identity.partition_id, + identity.table_id, + identity.file_index, + ), + file_id: PLFileId { + partition_id: identity.partition_id, + table_id: identity.table_id, + file_index: identity.file_index, + }, + }); + let log = new_pl_batch_worker_log(backend.clone(), NoopPLBatchRecoveryHandler); + log.recover_async_with_handler(&mut source, &handler).await +} + fn apply_recovered_entry(path: &Path, entry: &PLEntry) -> RS<()> { for op in &entry.ops { match op { @@ -1417,6 +1893,60 @@ fn apply_recovered_entry(path: &Path, entry: &PLEntry) -> RS<()> { Ok(()) } +async fn apply_recovered_entry_async(fs: &dyn AsyncFs, path: &Path, entry: &PLEntry) -> RS<()> { + for op in &entry.ops { + match op { + PLOp::Create => ensure_time_series_file_exists_async(fs, path).await?, + PLOp::Delete => fs.remove_file_if_exists(path).await?, + PLOp::PageUpdate(update) => { + ensure_time_series_file_exists_async(fs, path).await?; + let file = fs.open(path, FileOpenOptions::read_write_create()).await?; + file.write_all_at( + page_offset(update.page_id)? + update.offset as u64, + &update.data, + ) + .await?; + } + } + } + Ok(()) +} + +struct RelationWalRecoverySource { + fs: Arc, + backend: ChunkedWorkerLogBackend, +} + +#[async_trait] +impl AsyncWorkerLogRecoverySource for RelationWalRecoverySource { + async fn chunk_paths_sorted(&mut self) -> RS> { + self.backend.chunk_paths_sorted() + } + + async fn read_chunk(&mut self, path: &Path) -> RS> { + self.fs.as_ref().read_all(path).await + } +} + +struct RelationWalRecoveryHandler { + fs: Arc, + path: PathBuf, + file_id: PLFileId, +} + +#[async_trait] +impl AsyncWorkerLogRecoveryHandler for Arc { + async fn handle_entry(&self, entry: PLBatch, _start_lsn: crate::wal::lsn::LSN) -> RS<()> { + for item in &entry.entries { + if item.file != self.file_id { + continue; + } + apply_recovered_entry_async(self.fs.as_ref(), &self.path, item).await?; + } + Ok(()) + } +} + async fn append_file_create_async( backend: &ChunkedWorkerLogBackend, identity: &TimeSeriesFileIdentity, @@ -1462,6 +1992,17 @@ fn ensure_time_series_file_exists_sync(path: &Path) -> RS<()> { file::close_sync(file) } +async fn ensure_time_series_file_exists_async(fs: &dyn AsyncFs, path: &Path) -> RS<()> { + if let Some(parent) = path.parent() { + trace!(path = %path.display(), parent = %parent.display(), "time_series ensure file create_dir_all"); + fs.create_dir_all(parent).await?; + } + trace!(path = %path.display(), "time_series ensure file open create"); + let _ = fs.open(path, FileOpenOptions::read_write_create()).await?; + trace!(path = %path.display(), "time_series ensure file open create done"); + Ok(()) +} + fn remove_file_if_exists(path: &Path) -> RS<()> { mudu_sys::fs::remove_file_if_exists(path) } @@ -1469,8 +2010,10 @@ fn remove_file_if_exists(path: &Path) -> RS<()> { #[cfg(test)] mod tests { use super::{TimeSeriesFile, TimeSeriesFileIdentity, PAGE_SIZE}; + use crate::async_rt::tokio::fs::TokioFs; use crate::storage::page::PageId; use project_root::get_project_root; + use std::sync::Arc; fn temp_ts_path(name: &str) -> std::path::PathBuf { let root = get_project_root().unwrap(); @@ -1801,6 +2344,89 @@ mod tests { std::fs::remove_dir_all(base).unwrap(); } + #[tokio::test(flavor = "current_thread")] + async fn wal_recovers_relation_file_after_data_loss_async() { + let base = temp_relation_base("recover-async"); + let identity = TimeSeriesFileIdentity { + partition_id: 27, + table_id: 31, + file_index: 2, + }; + let path = TimeSeriesFile::relation_file_path( + &base, + identity.partition_id, + identity.table_id, + identity.file_index, + ); + + let mut file = + TimeSeriesFile::open_relation_file(&base, identity.clone(), 0x1234_5678, true) + .await + .unwrap(); + file.insert(100, 1, b"alpha").await.unwrap(); + file.insert(90, 2, b"beta").await.unwrap(); + file.delete(90, 2).await.unwrap(); + file.close().await.unwrap(); + std::fs::remove_file(&path).unwrap(); + + let reopened = TimeSeriesFile::open_relation_file(&base, identity, 0x1234_5678, false) + .await + .unwrap(); + assert_eq!( + reopened.get_sync(100, 1).unwrap().unwrap().payload, + b"alpha".to_vec() + ); + assert_eq!(reopened.get_sync(90, 2).unwrap(), None); + reopened.close_sync().unwrap(); + std::fs::remove_dir_all(base).unwrap(); + } + + #[tokio::test(flavor = "current_thread")] + async fn wal_recovers_relation_file_with_injected_async_fs() { + let base = temp_relation_base("recover-async-fs"); + let identity = TimeSeriesFileIdentity { + partition_id: 37, + table_id: 41, + file_index: 3, + }; + let path = TimeSeriesFile::relation_file_path( + &base, + identity.partition_id, + identity.table_id, + identity.file_index, + ); + let fs = Arc::new(TokioFs::new()); + + let mut file = TimeSeriesFile::open_relation_file_with_fs( + fs.clone(), + &base, + identity.clone(), + 0x55aa_aa55, + true, + ) + .await + .unwrap(); + file.insert(100, 1, b"alpha").await.unwrap(); + file.insert(90, 2, b"beta").await.unwrap(); + file.close().await.unwrap(); + std::fs::remove_file(&path).unwrap(); + + let reopened = + TimeSeriesFile::open_relation_file_with_fs(fs, &base, identity, 0x55aa_aa55, false) + .await + .unwrap(); + assert_eq!( + reopened.get_sync(100, 1).unwrap().unwrap().payload, + b"alpha".to_vec() + ); + assert_eq!( + reopened.get_sync(90, 2).unwrap().unwrap().payload, + b"beta".to_vec() + ); + reopened.close_sync().unwrap(); + std::fs::remove_dir_all(base).unwrap(); + } + #[test] fn wal_replays_terminal_delete_before_open() { let base = temp_relation_base("delete"); diff --git a/mudu_kernel/src/tx/mod.rs b/mudu_kernel/src/tx/mod.rs index fe1461d..8b13789 100644 --- a/mudu_kernel/src/tx/mod.rs +++ b/mudu_kernel/src/tx/mod.rs @@ -1,4 +1 @@ -#![allow(dead_code)] -mod test_x_snap_mgr; -pub mod x_snap_mgr; diff --git a/mudu_kernel/src/tx/test_x_snap_mgr.rs b/mudu_kernel/src/tx/test_x_snap_mgr.rs deleted file mode 100644 index 5c7f6a9..0000000 --- a/mudu_kernel/src/tx/test_x_snap_mgr.rs +++ /dev/null @@ -1,134 +0,0 @@ -#[cfg(test)] -mod _test { - use crate::tx::x_snap_mgr::{SnapshotRequester, XSnapMgr}; - use mudu_utils::notifier::NotifyWait; - - use mudu_utils::log::log_setup; - use mudu_utils::task::spawn_local_task; - use std::sync::{Arc, Mutex}; - use std::time::Duration; - use tokio::runtime::Builder; - use tokio::task::LocalSet; - use tracing::info; - - #[test] - fn _test_x_snap_mgr() { - log_setup("info"); - let canceller = NotifyWait::new(); - let x_snap_mgr = XSnapMgr::new(canceller.clone(), 100, 10); - let handler = x_snap_mgr.snap_assign_task(); - let thread = std::thread::spawn(move || { - let ls = LocalSet::new(); - ls.spawn_local(async move { - let r = handler.run_once().await; - assert!(r.is_ok()) - }); - let runtime = Builder::new_current_thread().enable_all().build().unwrap(); - runtime.block_on(ls); - }); - - let requester = x_snap_mgr.snapshot_requester(); - run_request(requester, 1000, 10, 4); - let _ = canceller.notify_all(); - thread.join().unwrap(); - } - - fn run_request(request: SnapshotRequester, num_x: usize, num_task: usize, num_threads: usize) { - let mut threads = vec![]; - let duration = Arc::new(Mutex::new(Duration::new(0, 0))); - for _i in 0..num_threads { - let r = request.clone(); - let d = duration.clone(); - let thd = std::thread::spawn(move || { - thd_task(r, num_x, num_task, d); - }); - threads.push(thd); - } - for t in threads { - t.join().unwrap(); - } - { - let duration = duration.lock().unwrap(); - let total_requests = num_x * num_task * num_threads; - let n = *duration / total_requests as u32; - info!( - "total_request {}, avg request latency: {} millis", - total_requests, - n.as_millis() - ) - } - } - - fn thd_task( - request: SnapshotRequester, - n: usize, - num_task: usize, - duration: Arc>, - ) { - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - let ls = LocalSet::new(); - ls.spawn_local(async move { - let d = async_task(request, n, num_task).await; - let mut g_d = duration.lock().unwrap(); - *g_d += d; - }); - runtime.block_on(async move { - ls.await; - }) - } - - async fn async_task(request: SnapshotRequester, n: usize, num_tasks: usize) -> Duration { - let mut task = vec![]; - for _i in 0..num_tasks { - let r = request.clone(); - let t = spawn_local_task(NotifyWait::new(), "", async move { - let duration = async_request(r, n).await; - duration - }); - task.push(t); - } - let mut duration = Duration::new(0, 0); - for t in task { - match t { - Ok(j) => { - let opt_d = j.await.unwrap(); - match opt_d { - Some(d) => duration += d, - None => { - panic!("") - } - } - } - _ => { - panic!() - } - } - } - duration - } - - async fn async_request(requester: SnapshotRequester, n: usize) -> Duration { - let mut xids = vec![]; - let mut duration = Duration::new(0, 0); - for _i in 0..n { - let start = mudu_sys::time::instant_now(); - let snapshot = requester.start_tx().await; - duration += start.elapsed(); - xids.push(snapshot.unwrap().xid()); - if xids.len() > 10 { - for x in xids.iter() { - requester.end_tx(*x).await.unwrap(); - } - xids.clear(); - } - } - for x in xids.iter() { - requester.end_tx(*x).await.unwrap(); - } - xids.clear(); - duration - } -} diff --git a/mudu_kernel/src/tx/x_snap_mgr.rs b/mudu_kernel/src/tx/x_snap_mgr.rs deleted file mode 100644 index 52bab1c..0000000 --- a/mudu_kernel/src/tx/x_snap_mgr.rs +++ /dev/null @@ -1,202 +0,0 @@ -use crate::contract::snapshot::{RunningXList, Snapshot}; -use async_trait::async_trait; -use mudu::common::result::RS; -use mudu::common::xid::XID; -use mudu::error::ec::EC as ER; -use mudu::m_error; -use mudu_utils::notifier::NotifyWait; -use mudu_utils::sync::a_task::{ATask, AsyncTask}; -use mudu_utils::sync::unique_inner::UniqueInner; -use std::fmt::Debug; -use std::sync::{Arc, Mutex}; -use tokio::sync::mpsc::{channel, Receiver, Sender}; -use tokio::sync::oneshot::channel as oneshot_channel; -use tokio::sync::oneshot::{Receiver as OneshotReceiver, Sender as OneshotSender}; - -pub struct XSnapMgr { - op_sender: OpSender, - handler: AsyncTask, -} - -#[derive(Clone)] -pub struct SnapshotRequester { - op_sender: OpSender, -} - -#[derive(Clone)] -pub struct XRunningHandler { - inner: Arc>, -} - -struct _HandlerInner { - canceller: NotifyWait, - name: String, - channel: Mutex>, - ts: u64, - running: Vec, -} - -type OpSender = Sender; -type OpReceiver = Receiver; -type XListSender = OneshotSender; -type XListReceiver = OneshotReceiver; - -enum XListOp { - Add(XListSender), - Remove(u64), -} - -impl Debug for XListOp { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Add(_s) => f.write_str("Add"), - Self::Remove(u) => f.write_fmt(format_args!("Remove:{:?}", u)), - } - } -} - -impl XSnapMgr { - pub fn new(canceller: NotifyWait, ts: u64, snap_request_queue_size: usize) -> Self { - let (s, r) = channel::(snap_request_queue_size); - - let handler = _HandlerInner::new(canceller, "snap_alloc".to_string(), ts, r); - Self { - op_sender: s, - handler: Arc::new(UniqueInner::new(handler)), - } - } - - pub fn snap_assign_task(&self) -> AsyncTask { - self.handler.clone() - } - - pub fn snapshot_requester(&self) -> SnapshotRequester { - SnapshotRequester::new(self.op_sender.clone()) - } -} - -impl SnapshotRequester { - fn new(op_sender: OpSender) -> Self { - Self { op_sender } - } - - pub async fn start_tx(&self) -> RS { - let (s, r) = oneshot_channel::(); - let op = XListOp::Add(s); - let res = self.op_sender.send(op).await; - res.map_err(|_e| m_error!(ER::MuduError, "", _e))?; - let x_list = r.await.unwrap(); - let snapshot = Snapshot::from(x_list); - Ok(snapshot) - } - - pub async fn end_tx(&self, xid: XID) -> RS<()> { - let xid = xid as u64; - let op = XListOp::Remove(xid); - let r = self.op_sender.send(op).await; - r.map_err(|_e| m_error!(ER::MuduError, "", _e))?; - Ok(()) - } -} - -impl XRunningHandler { - fn new(canceller: NotifyWait, ts: u64, channel: OpReceiver) -> Self { - Self { - inner: Arc::new(Mutex::new(_HandlerInner::new( - canceller, - "snap_mgr".to_string(), - ts, - channel, - ))), - } - } - - pub async fn handle(&self) -> RS<()> { - let mut inner = self.inner.lock().unwrap(); - inner.handle().await?; - Ok(()) - } -} - -impl _HandlerInner { - fn new(canceller: NotifyWait, name: String, ts: u64, channel: OpReceiver) -> _HandlerInner { - Self { - canceller, - name, - channel: Mutex::new(Some(channel)), - ts, - running: vec![], - } - } - - async fn handle(&mut self) -> RS<()> { - let mut channel = { - let mut g_ch = self.channel.lock().unwrap(); - let mut opt_ch = None; - std::mem::swap(&mut opt_ch, &mut g_ch); - match opt_ch { - Some(ch) => ch, - None => { - panic!("cannot invoke handle multiple times") - } - } - }; - loop { - let limit = 10; - let mut buf = Vec::with_capacity(limit); - let _n = channel.recv_many(&mut buf, limit).await; - for op in buf { - match op { - XListOp::Add(s) => { - self.add_x(s); - } - XListOp::Remove(x) => self.remove_x(x), - } - } - } - } - - pub fn add_x(&mut self, senders: XListSender) { - self.ts += 1; - let x_list = RunningXList::new(self.ts, self.running.clone()); - senders.send(x_list).unwrap(); - self.add(self.ts); - } - - pub fn remove_x(&mut self, ts: u64) { - self.remove(ts); - } - - pub fn add(&mut self, xid: u64) { - let r = self.running.binary_search(&xid); - match r { - Ok(_index) => {} - Err(index) => { - self.running.insert(index, xid); - } - } - } - - fn remove(&mut self, xid: u64) { - let r = self.running.binary_search(&xid); - if let Ok(index) = r { - self.running.remove(index); - } - } -} - -#[async_trait] -impl ATask for _HandlerInner { - fn notifier(&self) -> NotifyWait { - self.canceller.clone() - } - - fn name(&self) -> String { - self.name.clone() - } - - async fn run(self) -> RS<()> { - let mut s = self; - s.handle().await - } -} diff --git a/mudu_kernel/src/wal/typed_worker_log.rs b/mudu_kernel/src/wal/typed_worker_log.rs index 7ebfaf1..9fcbb91 100644 --- a/mudu_kernel/src/wal/typed_worker_log.rs +++ b/mudu_kernel/src/wal/typed_worker_log.rs @@ -1,6 +1,9 @@ use crate::wal::log_frame::decode_entries_with_pending; use crate::wal::lsn::LSN; -use crate::wal::worker_log::{decode_frames, WorkerLogBackend, WorkerLogRecoverySource}; +use crate::wal::worker_log::{ + decode_frames, AsyncWorkerLogRecoverySource, WorkerLogBackend, WorkerLogRecoverySource, +}; +use async_trait::async_trait; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; @@ -20,6 +23,18 @@ where } } +#[async_trait] +pub trait AsyncWorkerLogRecoveryHandler: Send + Sync + 'static +where + L: Serialize + DeserializeOwned + Send + Sync + 'static, +{ + async fn handle_entry(&self, entry: L, start_lsn: LSN) -> RS<()>; + + async fn finish(&self) -> RS<()> { + Ok(()) + } +} + pub struct TypedWorkerLog where L: Serialize + DeserializeOwned + Send + Sync + 'static, @@ -88,6 +103,7 @@ where } pub async fn flush_async(&self) -> RS<()> { + mudu_utils::scoped_task_trace!(); self.backend.flush_async().await } @@ -120,14 +136,77 @@ where self.handler.finish() } + + pub async fn recover_async(&self, source: &mut S) -> RS<()> + where + S: AsyncWorkerLogRecoverySource, + { + let chunk_paths = source.chunk_paths_sorted().await?; + let mut pending_frames = Vec::new(); + let mut pending_start_lsn = None; + for path in chunk_paths { + let bytes = source.read_chunk(path.as_path()).await?; + if bytes.is_empty() { + continue; + } + let frames = decode_frames(&bytes)?; + let entries = decode_entries_with_pending::( + &frames, + &mut pending_frames, + &mut pending_start_lsn, + )?; + for (start_lsn, entry) in entries { + self.handler.handle_entry(entry, start_lsn)?; + } + } + + if !pending_frames.is_empty() { + return Err(m_error!(EC::DecodeErr, "trailing partial log frames")); + } + + self.handler.finish() + } + + pub async fn recover_async_with_handler(&self, source: &mut S, handler: &AH) -> RS<()> + where + S: AsyncWorkerLogRecoverySource, + AH: AsyncWorkerLogRecoveryHandler, + { + let chunk_paths = source.chunk_paths_sorted().await?; + let mut pending_frames = Vec::new(); + let mut pending_start_lsn = None; + for path in chunk_paths { + let bytes = source.read_chunk(path.as_path()).await?; + if bytes.is_empty() { + continue; + } + let frames = decode_frames(&bytes)?; + let entries = decode_entries_with_pending::( + &frames, + &mut pending_frames, + &mut pending_start_lsn, + )?; + for (start_lsn, entry) in entries { + handler.handle_entry(entry, start_lsn).await?; + } + } + + if !pending_frames.is_empty() { + return Err(m_error!(EC::DecodeErr, "trailing partial log frames")); + } + + handler.finish().await + } } #[cfg(test)] mod tests { use super::*; use crate::wal::worker_log::{ - ChunkedWorkerLogBackend, WorkerLogBackend, WorkerLogLayout, WorkerLogRecoverySource, + AsyncWorkerLogRecoverySource, ChunkedWorkerLogBackend, WorkerLogBackend, WorkerLogLayout, + WorkerLogRecoverySource, }; + use async_trait::async_trait; use mudu::common::id::gen_oid; use serde::{Deserialize, Serialize}; use std::env::temp_dir; @@ -152,6 +231,14 @@ mod tests { } } + #[async_trait] + impl AsyncWorkerLogRecoveryHandler for Arc { + async fn handle_entry(&self, entry: TestEntry, start_lsn: LSN) -> RS<()> { + self.entries.lock().unwrap().push((start_lsn, entry)); + Ok(()) + } + } + struct FileRecoverySource { paths: Vec, } @@ -175,6 +262,19 @@ mod tests { } } + #[async_trait] + impl AsyncWorkerLogRecoverySource for FileRecoverySource { + async fn chunk_paths_sorted(&mut self) -> RS> { + Ok(self.paths.clone()) + } + + async fn read_chunk(&mut self, path: &Path) -> RS> { + mudu_sys::tokio::fs::read(path) + .await + .map_err(|e| m_error!(EC::IOErr, "read worker log chunk for recovery error", e)) + } + } + #[tokio::test] async fn typed_worker_log_appends_and_recovers_generic_entries() { let dir = temp_dir().join(format!("typed_worker_log_{}", gen_oid())); @@ -204,6 +304,68 @@ mod tests { assert_eq!(recovered, vec![(0, first), (1, second)]); } + #[tokio::test] + async fn typed_worker_log_appends_and_recovers_generic_entries_async() { + let dir = temp_dir().join(format!("typed_worker_log_async_{}", gen_oid())); + let raw = ChunkedWorkerLogBackend::new(WorkerLogLayout::new(dir, gen_oid(), 256).unwrap()) + .unwrap(); + let handler = Arc::new(CollectingHandler::default()); + let log = TypedWorkerLog::new(raw.clone(), handler.clone()); + + let first = TestEntry { + id: 1, + payload: vec![1; 32], + }; + let second = TestEntry { + id: 2, + payload: vec![2; 512], + }; + + let _first_last_lsn = log.append(&first).await.unwrap(); + let _second_last_lsn = log.append(&second).await.unwrap(); + raw.flush_async().await.unwrap(); + let mut source = FileRecoverySource { + paths: raw.chunk_paths_sorted().unwrap(), + }; + log.recover_async(&mut source).await.unwrap(); + + let recovered = handler.entries.lock().unwrap().clone(); + assert_eq!(recovered, vec![(0, first), (1, second)]); + } + + #[tokio::test] + async fn typed_worker_log_recovers_with_async_handler() { + let dir = temp_dir().join(format!("typed_worker_log_async_handler_{}", gen_oid())); + let raw = ChunkedWorkerLogBackend::new(WorkerLogLayout::new(dir, gen_oid(), 256).unwrap()) + .unwrap(); + let writer = TypedWorkerLog::new(raw.clone(), NoopHandler); + let handler = Arc::new(CollectingHandler::default()); + + let first = TestEntry { + id: 11, + payload: vec![3; 64], + }; + let second = TestEntry { + id: 12, + payload: vec![4; 128], + }; + + writer.append(&first).await.unwrap(); + writer.append(&second).await.unwrap(); + raw.flush_async().await.unwrap(); + + let mut source = FileRecoverySource { + paths: raw.chunk_paths_sorted().unwrap(), + }; + writer + .recover_async_with_handler(&mut source, &handler) + .await + .unwrap(); + + let recovered = handler.entries.lock().unwrap().clone(); + assert_eq!(recovered, vec![(0, first), (1, second)]); + } + #[tokio::test] async fn typed_worker_log_append_callback_runs_after_log_is_persisted() { let dir = temp_dir().join(format!("typed_worker_log_append_callback_{}", gen_oid())); @@ -252,7 +414,7 @@ mod tests { let written = written.clone(); async move { assert_eq!(written, expected); - let bytes = tokio::fs::read(&path).await.map_err(|e| { + let bytes = mudu_sys::tokio::fs::read(&path).await.map_err(|e| { m_error!(EC::IOErr, "read async callback-persisted worker log", e) })?; assert!(!bytes.is_empty()); diff --git a/mudu_kernel/src/wal/worker_log.rs b/mudu_kernel/src/wal/worker_log.rs index 41553a3..852a432 100644 --- a/mudu_kernel/src/wal/worker_log.rs +++ b/mudu_kernel/src/wal/worker_log.rs @@ -25,6 +25,12 @@ pub trait WorkerLogRecoverySource { fn read_chunk(&mut self, path: &Path) -> RS>; } +#[async_trait] +pub trait AsyncWorkerLogRecoverySource: Send { + async fn chunk_paths_sorted(&mut self) -> RS>; + async fn read_chunk(&mut self, path: &Path) -> RS>; +} + pub fn decode_frames(payload: &[u8]) -> RS>> { let mut offset = 0usize; let mut frames = Vec::new(); diff --git a/mudu_kernel/src/wal/worker_wal_backend.rs b/mudu_kernel/src/wal/worker_wal_backend.rs index d7b8785..fe3ea2b 100644 --- a/mudu_kernel/src/wal/worker_wal_backend.rs +++ b/mudu_kernel/src/wal/worker_wal_backend.rs @@ -1,3 +1,4 @@ +use crate::async_rt::contract::AsyncFs; use crate::io::file::{self, IoFile}; use crate::io::worker_ring; use crate::wal::log_frame::{frame_len, frame_lsns, last_frame_lsn, serialize_entry}; @@ -9,6 +10,7 @@ use mudu::common::id::OID; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_utils::sync::a_notify::ANotify; use serde::Serialize; use short_uuid::ShortUuid; use std::collections::{HashMap, HashSet}; @@ -17,7 +19,7 @@ use std::sync::atomic::{AtomicU32, AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; use std::task::{Context, Poll}; use std::time::{Duration, Instant}; -use tokio::sync::Notify; +use tracing::trace; use uuid::Uuid; #[derive(Clone)] @@ -25,11 +27,13 @@ pub struct WorkerWALBackend { inner: Arc, } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] struct WorkerLogInner { log_queue: Mutex>, - notify: Notify, + notify: ANotify, flush_task: Mutex> + Send>>>>, batching: WorkerLogBatching, + dispatch_mode: WorkerLogDispatchMode, active_sessions: Arc, // next log sequence next_lsn: AtomicU32, @@ -48,6 +52,10 @@ pub struct WorkerLogLayout { batching: WorkerLogBatching, } +// The adaptive flush batching path is driven by the io_uring worker-ring event +// loop. Tokio callers use the direct async path, so these private fields are +// intentionally quiet there while still being checked on io_uring builds. +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] #[derive(Clone, Copy, Debug)] pub struct WorkerLogBatching { trigger_bytes: usize, @@ -72,7 +80,7 @@ pub struct WorkerLogTail { struct WaitLsn { next_wait_lsn: AtomicU32, ready_lsns: Mutex>, - notify: Notify, + notify: ANotify, } struct ChunkedWorkerLog { @@ -96,6 +104,7 @@ struct MergedWrite { payload: Vec, } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] struct QueuedLogBatch { frames: Vec>, lsns: Vec, @@ -103,12 +112,14 @@ struct QueuedLogBatch { enqueued_at: Instant, } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] struct PreparedFlushBatch { writes: Vec, flush_paths: Vec, ready_lsns: Vec, } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] #[derive(Clone, Copy)] struct EffectiveBatching { trigger_bytes: usize, @@ -117,12 +128,18 @@ struct EffectiveBatching { max_batch_bytes: usize, } +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum WorkerLogDispatchMode { + Direct, + QueuedOnWorkerRing, +} + impl WaitLsn { pub fn new(next_wait_lsn: LSN, ready_lsns: Vec) -> Self { Self { next_wait_lsn: AtomicU32::new(next_wait_lsn), ready_lsns: Mutex::new(ready_lsns), - notify: Notify::new(), + notify: ANotify::new(), } } @@ -130,8 +147,18 @@ impl WaitLsn { loop { let notified = self.notify.notified(); if self.next_wait_lsn.load(Ordering::Acquire) > lsn { + trace!( + lsn, + next_wait_lsn = self.next_wait_lsn.load(Ordering::Acquire), + "worker_wal wait_lsn satisfied" + ); return; } + trace!( + lsn, + next_wait_lsn = self.next_wait_lsn.load(Ordering::Acquire), + "worker_wal wait_lsn pending" + ); notified.await; } } @@ -170,11 +197,17 @@ impl WaitLsn { self.next_wait_lsn .store(new_next_wait_lsn, Ordering::Release); + trace!(new_next_wait_lsn, "worker_wal ready advanced wait lsn"); self.notify.notify_waiters(); } } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] impl WorkerWALBackend { + fn backend_id(&self) -> usize { + Arc::as_ptr(&self.inner) as usize + } + fn current_chunk_path(&self) -> RS> { let guard = self .inner @@ -225,6 +258,10 @@ impl WorkerWALBackend { .map_err(|_| m_error!(EC::InternalErr, "worker log flush task lock poisoned"))? .is_some(); if flush_task_active { + trace!( + backend_id = self.backend_id(), + "worker_wal next_flush_deadline flush task already active" + ); return Ok(None); } @@ -233,6 +270,11 @@ impl WorkerWALBackend { .log_queue .lock() .map_err(|_| m_error!(EC::InternalErr, "worker log queue lock poisoned"))?; + trace!( + backend_id = self.backend_id(), + queue_len = queue.len(), + "worker_wal next_flush_deadline inspect queue" + ); if queue.is_empty() { return Ok(None); } @@ -259,12 +301,25 @@ impl WorkerWALBackend { let queue = self.inner.log_queue.lock().map_err(|_| { m_error!(EC::InternalErr, "worker log queue lock poisoned") })?; + trace!( + backend_id = self.backend_id(), + queue_len = queue.len(), + "worker_wal poll_flush_log inspect queue" + ); !queue.is_empty() && Self::should_start_flush(queue.as_slice(), self.effective_batching()) }; if !should_start { + trace!( + backend_id = self.backend_id(), + "worker_wal poll_flush_log not starting" + ); return Ok(false); } + trace!( + backend_id = self.backend_id(), + "worker_wal poll_flush_log starting flush task" + ); let log = self.clone(); *guard = Some(Box::pin(async move { log.run_flush_log().await })); } @@ -275,10 +330,18 @@ impl WorkerWALBackend { let mut cx = Context::from_waker(waker); match task.as_mut().poll(&mut cx) { Poll::Ready(result) => { + trace!( + backend_id = self.backend_id(), + "worker_wal poll_flush_log flush task ready" + ); result?; Ok(true) } Poll::Pending => { + trace!( + backend_id = self.backend_id(), + "worker_wal poll_flush_log flush task pending" + ); let mut guard = self.inner.flush_task.lock().map_err(|_| { m_error!(EC::InternalErr, "worker log flush task lock poisoned") })?; @@ -291,8 +354,21 @@ impl WorkerWALBackend { pub(crate) fn append_log(&self, logs: Vec<(Vec>, Vec)>) { let mut guard = self.inner.log_queue.lock().unwrap(); let now = mudu_sys::time::instant_now(); + trace!( + backend_id = self.backend_id(), + queue_len_before = guard.len(), + batches = logs.len(), + "worker_wal append_log start" + ); for (frames, lsns) in logs { let bytes = frames.iter().map(|frame| frame.len()).sum(); + trace!( + backend_id = self.backend_id(), + frames = frames.len(), + lsns = lsns.len(), + bytes, + "worker_wal append_log enqueue batch" + ); guard.push(QueuedLogBatch { frames, lsns, @@ -300,24 +376,54 @@ impl WorkerWALBackend { enqueued_at: now, }); } + trace!( + backend_id = self.backend_id(), + queue_len_after = guard.len(), + "worker_wal append_log done" + ); self.inner.notify.notify_waiters(); } pub fn new(layout: WorkerLogLayout) -> RS { - Self::new_with_active_sessions(layout, Arc::new(AtomicUsize::new(0))) + Self::new_with_dispatch_mode_and_active_sessions( + layout, + WorkerLogDispatchMode::QueuedOnWorkerRing, + Arc::new(AtomicUsize::new(0)), + ) } pub fn new_with_active_sessions( layout: WorkerLogLayout, active_sessions: Arc, + ) -> RS { + Self::new_with_dispatch_mode_and_active_sessions( + layout, + WorkerLogDispatchMode::QueuedOnWorkerRing, + active_sessions, + ) + } + + pub fn new_direct(layout: WorkerLogLayout) -> RS { + Self::new_with_dispatch_mode_and_active_sessions( + layout, + WorkerLogDispatchMode::Direct, + Arc::new(AtomicUsize::new(0)), + ) + } + + fn new_with_dispatch_mode_and_active_sessions( + layout: WorkerLogLayout, + dispatch_mode: WorkerLogDispatchMode, + active_sessions: Arc, ) -> RS { let tail = layout.scan_tail()?; Ok(Self { inner: Arc::new(WorkerLogInner { log_queue: Mutex::new(Default::default()), - notify: Notify::new(), + notify: ANotify::new(), flush_task: Mutex::new(None), batching: layout.batching(), + dispatch_mode, active_sessions, next_lsn: AtomicU32::new(tail.next_lsn), flush_waiter: WaitLsn::new(tail.next_lsn, vec![]), @@ -334,49 +440,69 @@ impl WorkerWALBackend { return Ok(()); } - if !worker_ring::has_current_worker_ring() { - for frame in &payload { - self.append_raw(frame)?; - } - self.flush()?; - self.complete_persisted_lsns(lsns)?; - return Ok(()); - } - let reservations = self.reserve_appends(&payload)?; let merged_writes = Self::merge_reserved_writes(&reservations, &payload); - let mut write_handles = Vec::with_capacity(merged_writes.len()); - for write in merged_writes { - let file = self.take_or_open_async_file(&write.path).await?; - let write_handle = file::write_submit(&file, write.payload, write.offset)?; - write_handles.push((write.path, file, write_handle)); - } - for (path, file, write_handle) in write_handles { - let write_result = write_handle.wait().await.map(|_| ()); - self.finish_async_file_use(path.as_path(), file, write_result) - .await?; + if worker_ring::has_current_worker_ring() { + let mut write_handles = Vec::with_capacity(merged_writes.len()); + for write in merged_writes { + let file = self.take_or_open_async_file(&write.path).await?; + let write_handle = file::write_submit(&file, write.payload, write.offset)?; + write_handles.push((write.path, file, write_handle)); + } + for (path, file, write_handle) in write_handles { + let write_result = write_handle.wait().await.map(|_| ()); + self.finish_async_file_use(path.as_path(), file, write_result) + .await?; + } + } else { + for write in merged_writes { + let file = self.take_or_open_async_file(&write.path).await?; + let write_result = file::write(&file, write.payload, write.offset) + .await + .map(|_| ()); + self.finish_async_file_use(write.path.as_path(), file, write_result) + .await?; + } } let flush_paths = Self::collect_flush_paths(&reservations); let last_index = flush_paths.len().saturating_sub(1); - let mut flush_handles = Vec::with_capacity(flush_paths.len()); - for (index, path) in flush_paths.into_iter().enumerate() { - let file = self.take_or_open_async_file(&path).await?; - let flush_handle = if index == last_index { - file::flush_submit_lsn(&file, lsns.clone())? - } else { - file::flush_submit_lsn(&file, Vec::::new())? - }; - flush_handles.push((path, file, flush_handle)); - } - for (path, file, flush_handle) in flush_handles { - let flushed_lsns = self - .finish_async_file_use_with_value(&path, file, flush_handle.wait().await) - .await?; - if !flushed_lsns.is_empty() { - self.complete_persisted_lsns(flushed_lsns)?; + if worker_ring::has_current_worker_ring() { + let mut flush_handles = Vec::with_capacity(flush_paths.len()); + for (index, path) in flush_paths.into_iter().enumerate() { + let file = self.take_or_open_async_file(&path).await?; + let flush_handle = if index == last_index { + file::flush_submit_lsn(&file, lsns.clone())? + } else { + file::flush_submit_lsn(&file, Vec::::new())? + }; + flush_handles.push((path, file, flush_handle)); + } + for (path, file, flush_handle) in flush_handles { + let flushed_lsns = self + .finish_async_file_use_with_value(&path, file, flush_handle.wait().await) + .await?; + if !flushed_lsns.is_empty() { + self.complete_persisted_lsns(flushed_lsns)?; + } + } + } else { + for (index, path) in flush_paths.into_iter().enumerate() { + let file = self.take_or_open_async_file(&path).await?; + let ready_lsns = if index == last_index { + lsns.clone() + } else { + Vec::::new() + }; + let flush_result = file::flush_lsn(&file, ready_lsns).await; + let flushed_lsns = self + .finish_async_file_use_with_value(&path, file, flush_result) + .await?; + if !flushed_lsns.is_empty() { + self.complete_persisted_lsns(flushed_lsns)?; + } } } Ok(()) @@ -405,15 +531,12 @@ impl WorkerWALBackend { } pub async fn flush_async(&self) -> RS<()> { + mudu_utils::scoped_task_trace!(); let path = self.current_chunk_path()?; let Some(path) = path else { return Ok(()); }; - if worker_ring::has_current_worker_ring() { - self.flush_path_async(&path).await - } else { - self.flush_path_sync(&path) - } + self.flush_path_async(&path).await } fn append_reserved_sync(&self, reservation: AppendReservation, payload: &[u8]) -> RS<()> { @@ -432,6 +555,7 @@ impl WorkerWALBackend { } async fn flush_path_async(&self, path: &Path) -> RS<()> { + mudu_utils::scoped_task_trace!(); let file = self.take_or_open_async_file(path).await?; let flush_result = file::flush(&file).await; self.finish_async_file_use(path, file, flush_result).await?; @@ -601,15 +725,28 @@ impl WorkerWALBackend { } async fn run_flush_log(&self) -> RS<()> { + trace!("worker_wal run_flush_log start"); let mut open_files = HashMap::new(); loop { let pending = self.drain_pending_batches(self.effective_batching())?; if pending.is_empty() { + trace!("worker_wal run_flush_log queue empty, releasing files"); self.release_flush_open_files(open_files).await?; return Ok(()); } + trace!( + batches = pending.len(), + "worker_wal run_flush_log drained batches" + ); let prepared = self.prepare_flush_batch(pending)?; + trace!( + writes = prepared.writes.len(), + flush_paths = prepared.flush_paths.len(), + ready_lsns = prepared.ready_lsns.len(), + "worker_wal run_flush_log prepared batch" + ); self.execute_flush_batch(prepared, &mut open_files).await?; + trace!("worker_wal run_flush_log executed batch"); } } @@ -663,35 +800,70 @@ impl WorkerWALBackend { if prepared.writes.is_empty() { return Ok(()); } + trace!( + writes = prepared.writes.len(), + flush_paths = prepared.flush_paths.len(), + "worker_wal execute_flush_batch start" + ); - let mut write_handles = Vec::with_capacity(prepared.writes.len()); - for write in prepared.writes { - let file = self.checkout_flush_file(&write.path, open_files).await?; - let write_handle = file::write_submit(&file, write.payload, write.offset)?; - write_handles.push((write.path, file, write_handle)); - } - for (path, file, write_handle) in write_handles { - write_handle.wait().await?; - open_files.insert(path, file); + if worker_ring::has_current_worker_ring() { + let mut write_handles = Vec::with_capacity(prepared.writes.len()); + for write in prepared.writes { + trace!(path = %write.path.display(), offset = write.offset, bytes = write.payload.len(), "worker_wal queue write_submit"); + let file = self.checkout_flush_file(&write.path, open_files).await?; + let write_handle = file::write_submit(&file, write.payload, write.offset)?; + write_handles.push((write.path, file, write_handle)); + } + for (path, file, write_handle) in write_handles { + trace!(path = %path.display(), "worker_wal waiting write_handle"); + write_handle.wait().await?; + trace!(path = %path.display(), "worker_wal write_handle done"); + open_files.insert(path, file); + } + } else { + for write in prepared.writes { + let file = self.checkout_flush_file(&write.path, open_files).await?; + file::write(&file, write.payload, write.offset).await?; + open_files.insert(write.path, file); + } } let last_index = prepared.flush_paths.len().saturating_sub(1); - let mut flush_handles = Vec::with_capacity(prepared.flush_paths.len()); - for (index, path) in prepared.flush_paths.into_iter().enumerate() { - let file = self.checkout_flush_file(&path, open_files).await?; - let flush_handle = if index == last_index { - file::flush_submit_lsn(&file, prepared.ready_lsns.clone())? - } else { - file::flush_submit_lsn(&file, Vec::::new())? - }; - flush_handles.push((path, file, flush_handle)); - } - for (path, file, flush_handle) in flush_handles { - let flushed_lsns = flush_handle.wait().await?; - if !flushed_lsns.is_empty() { - self.complete_persisted_lsns(flushed_lsns)?; + if worker_ring::has_current_worker_ring() { + let mut flush_handles = Vec::with_capacity(prepared.flush_paths.len()); + for (index, path) in prepared.flush_paths.into_iter().enumerate() { + trace!(path = %path.display(), last = index == last_index, "worker_wal queue flush_submit_lsn"); + let file = self.checkout_flush_file(&path, open_files).await?; + let flush_handle = if index == last_index { + file::flush_submit_lsn(&file, prepared.ready_lsns.clone())? + } else { + file::flush_submit_lsn(&file, Vec::::new())? + }; + flush_handles.push((path, file, flush_handle)); + } + for (path, file, flush_handle) in flush_handles { + trace!(path = %path.display(), "worker_wal waiting flush_handle"); + let flushed_lsns = flush_handle.wait().await?; + trace!(path = %path.display(), flushed_lsns = flushed_lsns.len(), "worker_wal flush_handle done"); + if !flushed_lsns.is_empty() { + self.complete_persisted_lsns(flushed_lsns)?; + } + open_files.insert(path, file); + } + } else { + for (index, path) in prepared.flush_paths.into_iter().enumerate() { + let file = self.checkout_flush_file(&path, open_files).await?; + let ready_lsns = if index == last_index { + prepared.ready_lsns.clone() + } else { + Vec::::new() + }; + let flushed_lsns = file::flush_lsn(&file, ready_lsns).await?; + if !flushed_lsns.is_empty() { + self.complete_persisted_lsns(flushed_lsns)?; + } + open_files.insert(path, file); } - open_files.insert(path, file); } Ok(()) } @@ -700,6 +872,12 @@ impl WorkerWALBackend { if lsns.is_empty() { return Ok(()); } + trace!( + count = lsns.len(), + first = lsns.first().copied().unwrap_or_default(), + last = lsns.last().copied().unwrap_or_default(), + "worker_wal complete_persisted_lsns" + ); self.inner.flush_waiter.ready(lsns); Ok(()) } @@ -849,6 +1027,79 @@ impl WorkerLogLayout { } Ok(max_lsn.map_or(0, |lsn| lsn.saturating_add(1))) } + + pub async fn scan_tail_async(&self, fs: &dyn AsyncFs) -> RS { + fs.create_dir_all(&self.log_dir).await?; + let sequences = self.chunk_sequences_async(fs).await?; + let max_sequence = sequences.last().copied(); + let Some(sequence) = max_sequence else { + return Ok(WorkerLogTail { + current_sequence: None, + current_size: 0, + next_sequence: 0, + next_lsn: 0, + }); + }; + let path = self.chunk_path(sequence); + let size = fs.metadata_len(&path).await?; + let next_lsn = self.scan_next_lsn_async(fs).await?; + if size < self.chunk_size { + Ok(WorkerLogTail { + current_sequence: Some(sequence), + current_size: size, + next_sequence: sequence + 1, + next_lsn, + }) + } else { + Ok(WorkerLogTail { + current_sequence: None, + current_size: 0, + next_sequence: sequence + 1, + next_lsn, + }) + } + } + + pub async fn chunk_paths_sorted_async(&self, fs: &dyn AsyncFs) -> RS> { + fs.create_dir_all(&self.log_dir).await?; + Ok(self + .chunk_sequences_async(fs) + .await? + .into_iter() + .map(|sequence| self.chunk_path(sequence)) + .collect()) + } + + async fn scan_next_lsn_async(&self, fs: &dyn AsyncFs) -> RS { + let mut max_lsn: Option = None; + for path in self.chunk_paths_sorted_async(fs).await? { + let bytes = fs.read_all(&path).await?; + let mut offset = 0usize; + while offset < bytes.len() { + let remaining = &bytes[offset..]; + let next_frame_len = frame_len(remaining)?; + let frame = &remaining[..next_frame_len]; + let lsn = crate::wal::log_frame::frame_lsn(frame)?; + max_lsn = Some(max_lsn.map_or(lsn, |current| current.max(lsn))); + offset += next_frame_len; + } + } + Ok(max_lsn.map_or(0, |lsn| lsn.saturating_add(1))) + } + + async fn chunk_sequences_async(&self, fs: &dyn AsyncFs) -> RS> { + let mut sequences = Vec::new(); + let mut sequence = 0u64; + loop { + let path = self.chunk_path(sequence); + if !fs.path_exists(&path).await? { + break; + } + sequences.push(sequence); + sequence = sequence.saturating_add(1); + } + Ok(sequences) + } } impl WorkerLogBatching { @@ -888,6 +1139,7 @@ impl WorkerLogBatching { } } +#[cfg_attr(not(target_os = "linux"), allow(dead_code))] impl EffectiveBatching { fn new( trigger_bytes: usize, @@ -945,14 +1197,28 @@ impl WorkerLogBackend for WorkerWALBackend { async fn append_frames_async(&self, frames: Vec>) -> RS { let lsns = frame_lsns(&frames)?; let last_lsn = last_frame_lsn(&frames)?; - if !worker_ring::has_current_worker_ring() { + if !worker_ring::has_current_worker_ring() + || self.inner.dispatch_mode == WorkerLogDispatchMode::Direct + { + trace!( + backend_id = self.backend_id(), + frames = frames.len(), + last_lsn, + "worker_wal append_frames_async direct path" + ); self.append_raw_async_vec(frames, lsns).await?; - self.inner.flush_waiter.wait_lsn(last_lsn).await; return Ok(last_lsn); } + trace!( + backend_id = self.backend_id(), + frames = frames.len(), + last_lsn, + "worker_wal append_frames_async queued path" + ); self.append_log(vec![(frames, lsns)]); self.inner.flush_waiter.wait_lsn(last_lsn).await; + trace!(last_lsn, "worker_wal append_frames_async wait_lsn done"); Ok(last_lsn) } @@ -1052,6 +1318,7 @@ impl ChunkedWorkerLog { #[cfg(test)] mod tests { use super::*; + use crate::async_rt::tokio::fs::TokioFs; use crate::wal::log_frame::split_frame; use crate::wal::worker_log::decode_frames; use crate::wal::xl_batch::{ @@ -1258,18 +1525,37 @@ mod tests { ); } + #[tokio::test] + async fn worker_log_layout_scans_tail_async() { + let dir = temp_dir().join(format!("worker_log_async_scan_{}", gen_oid())); + let layout = WorkerLogLayout::new(dir.clone(), gen_oid(), 64).unwrap(); + let prefix = layout.short_oid.clone(); + let fs = TokioFs::new(); + let log = WorkerWALBackend::new(layout.clone()).unwrap(); + append_xl_batch(&log, &sample_batch()).unwrap(); + append_xl_batch(&log, &sample_batch()).unwrap(); + + let paths = layout.chunk_paths_sorted_async(&fs).await.unwrap(); + assert!(!paths.is_empty()); + assert!(paths[0].ends_with(format!("{}.0.xl", prefix))); + + let tail = layout.scan_tail_async(&fs).await.unwrap(); + assert_eq!(tail.next_sequence, paths.len() as u64); + assert!(tail.next_lsn >= 2); + } + #[tokio::test] async fn wait_lsn_notifies_only_after_contiguous_flush() { let waiter = Arc::new(WaitLsn::new(0, vec![])); let wait_task = { let waiter = waiter.clone(); - tokio::spawn(async move { + mudu_sys::tokio::spawn(async move { waiter.wait_lsn(2).await; }) }; waiter.ready(vec![1, 2]); - tokio::task::yield_now().await; + mudu_sys::tokio::task::yield_now().await; assert!(!wait_task.is_finished()); waiter.ready(vec![0]); diff --git a/mudu_kernel/src/wal/xl_batch_worker_log.rs b/mudu_kernel/src/wal/xl_batch_worker_log.rs index f648500..e001eca 100644 --- a/mudu_kernel/src/wal/xl_batch_worker_log.rs +++ b/mudu_kernel/src/wal/xl_batch_worker_log.rs @@ -23,7 +23,7 @@ use std::sync::atomic::AtomicU32; /// /// ```ignore /// struct RecoveryHandler { -/// worker: IoUringWorker, +/// worker: WorkerRuntime, /// } /// /// impl WorkerLogRecoveryHandler for RecoveryHandler { diff --git a/mudu_kernel/src/x_engine/api.rs b/mudu_kernel/src/x_engine/api.rs index 497141b..6c4ebf4 100644 --- a/mudu_kernel/src/x_engine/api.rs +++ b/mudu_kernel/src/x_engine/api.rs @@ -53,6 +53,8 @@ pub enum Predicate { CNF(Vec>), /// disjunctive normal form, it is a disjunction of conjunctions of literals DNF(Vec>), + /// equality over a left prefix of the primary key, evaluated during range reads + KeyPrefixEq(Vec<(AttrIndex, DatBin)>), } /// alter table parameter diff --git a/mudu_runtime/Cargo.toml b/mudu_runtime/Cargo.toml index e4117d2..7cb82d5 100644 --- a/mudu_runtime/Cargo.toml +++ b/mudu_runtime/Cargo.toml @@ -31,7 +31,6 @@ uuid = { workspace = true } serde_json = { workspace = true } actix-web = "4.11.0" actix-cors = "0.7.1" -tokio = { workspace = true } mudu_utils = { workspace = true } tracing = { workspace = true } strum = { version = "0.27.2" } @@ -51,3 +50,6 @@ futures = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] scc = { workspace = true } + +[dev-dependencies] +tokio = { workspace = true } diff --git a/mudu_runtime/src/async_utils/blocking.rs b/mudu_runtime/src/async_utils/blocking.rs index 34c0161..9ad25af 100644 --- a/mudu_runtime/src/async_utils/blocking.rs +++ b/mudu_runtime/src/async_utils/blocking.rs @@ -1,17 +1,15 @@ use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_utils::task_async::build_multi_thread_runtime; use std::future::Future; pub fn run_async(future: F) -> RS where F: Future + Send + 'static, T: Send + 'static, { - let thread = mudu_sys::task::spawn_thread(move || { - let runtime = tokio::runtime::Builder::new_multi_thread() - .enable_all() - .build() - .unwrap(); + let thread = mudu_sys::task_sync::spawn_thread(move || { + let runtime = build_multi_thread_runtime().unwrap(); runtime.block_on(async move { future.await }) })?; let r = thread diff --git a/mudu_runtime/src/backend/accept_handle_task.rs b/mudu_runtime/src/backend/accept_handle_task.rs index cde21e1..19bde6f 100644 --- a/mudu_runtime/src/backend/accept_handle_task.rs +++ b/mudu_runtime/src/backend/accept_handle_task.rs @@ -3,10 +3,10 @@ use async_trait::async_trait; use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; +use mudu_sys::tokio::net::TcpListener; use mudu_utils::notifier::Waiter; use mudu_utils::sync::async_task::{AsyncLocalTask, Task}; use std::net::SocketAddr; -use tokio::net::TcpListener; use tracing::{debug, info}; impl AcceptHandleTask { diff --git a/mudu_runtime/src/backend/linux/app_mgr.rs b/mudu_runtime/src/backend/app_mgr.rs similarity index 100% rename from mudu_runtime/src/backend/linux/app_mgr.rs rename to mudu_runtime/src/backend/app_mgr.rs diff --git a/mudu_runtime/src/backend/backend.rs b/mudu_runtime/src/backend/backend.rs index 439be46..aee1217 100644 --- a/mudu_runtime/src/backend/backend.rs +++ b/mudu_runtime/src/backend/backend.rs @@ -2,17 +2,18 @@ use crate::backend::accept_handle_task::AcceptHandleTask; use crate::backend::mududb_cfg::MuduDBCfg; use crate::backend::mududb_cfg::ServerMode; use crate::backend::session_handle_task::SessionHandleTask; +use crate::backend::tokio_backend::TokioBackend; use crate::backend::web_handle_task::WebHandleTask; use crate::service::service::Service; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_sys::tokio::sync::mpsc; use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use mudu_utils::sync::async_task::TaskWrapper; +use mudu_utils::task_async::LocalTaskSet; use std::net::SocketAddr; use std::str::FromStr; -use tokio::sync::mpsc; -use tokio::task::LocalSet; use tracing::info; #[cfg(target_os = "linux")] @@ -25,6 +26,14 @@ impl Backend { } pub fn sync_serve_with_stop(cfg: MuduDBCfg, stop: Waiter) -> RS<()> { + Self::sync_serve_with_stop_and_ready(cfg, stop, None) + } + + pub fn sync_serve_with_stop_and_ready( + cfg: MuduDBCfg, + stop: Waiter, + ready: Option, + ) -> RS<()> { info!( server_mode = ?cfg.server_mode, component_target = ?cfg.component_target(), @@ -40,7 +49,7 @@ impl Backend { // The new backend is isolated behind a dedicated mode so the // legacy HTTP/PG paths keep their exact startup behavior. #[cfg(target_os = "linux")] - return IoUringBackend::sync_serve_with_stop(cfg, stop); + return IoUringBackend::sync_serve_with_stop_and_ready(cfg, stop, ready); #[cfg(not(target_os = "linux"))] { @@ -51,6 +60,11 @@ impl Backend { } } + if cfg.server_mode == ServerMode::Tokio { + info!("selected tokio backend"); + return TokioBackend::sync_serve_with_stop_and_ready(cfg, stop, ready); + } + info!("selected legacy backend"); let service = Service::new(); let (init_db_notifier, init_db_waiter) = notify_wait(); @@ -58,6 +72,12 @@ impl Backend { Self::register_web_service(&cfg, &service, stop.clone(), init_db_notifier.clone())?; Self::register_pg_service(&cfg, &service, stop.clone(), init_db_waiter.clone())?; + // The legacy backend starts serving as soon as its listeners and task + // graph are installed, so it can publish readiness before entering the + // blocking service loop. + if let Some(ready) = ready { + ready.notify_all(); + } service.serve()?; Ok(()) } @@ -68,7 +88,7 @@ impl Backend { canceller: Waiter, wait_init_db: Notifier, ) -> RS<()> { - let ls = LocalSet::new(); + let ls = LocalTaskSet::new(); let task = WebHandleTask::new( cfg.clone(), "web service task".to_string(), @@ -92,7 +112,7 @@ impl Backend { senders.push(s); receivers.push(r); } - let ls = LocalSet::new(); + let ls = LocalTaskSet::new(); let addr_str = format!("{}:{}", cfg.listen_ip, cfg.pg_listen_port); let socket_addr = SocketAddr::from_str(&addr_str) .map_err(|e| m_error!(EC::ParseErr, "parse socket address error", e))?; @@ -102,7 +122,7 @@ impl Backend { let session_task = SessionHandleTask::new(cfg.db_path.clone(), receivers, canceller.clone()); - let ls = LocalSet::new(); + let ls = LocalTaskSet::new(); service.register(TaskWrapper::new_async_local(ls, session_task))?; Ok(()) } diff --git a/mudu_runtime/src/backend/http_api/http_api_capabilities.rs b/mudu_runtime/src/backend/http_api/http_api_capabilities.rs index 77c50fb..c35368b 100644 --- a/mudu_runtime/src/backend/http_api/http_api_capabilities.rs +++ b/mudu_runtime/src/backend/http_api/http_api_capabilities.rs @@ -10,7 +10,6 @@ impl HttpApiCapabilities { enable_uninstall: false, }; - #[cfg(target_os = "linux")] pub const IOURING: Self = Self { enable_invoke: true, enable_uninstall: true, diff --git a/mudu_runtime/src/backend/http_api/linux/io_uring_http_api.rs b/mudu_runtime/src/backend/http_api/kernel_http_api.rs similarity index 94% rename from mudu_runtime/src/backend/http_api/linux/io_uring_http_api.rs rename to mudu_runtime/src/backend/http_api/kernel_http_api.rs index a4d1cb7..9957cdd 100644 --- a/mudu_runtime/src/backend/http_api/linux/io_uring_http_api.rs +++ b/mudu_runtime/src/backend/http_api/kernel_http_api.rs @@ -1,7 +1,7 @@ use super::{ - AsyncIoUringInvokeClientFactory, HttpApi, PartitionRouteEntry, PartitionRouteRequest, - PartitionRouteResponse, ServerTopology, TokioIoUringInvokeClientFactory, WorkerTopology, - find_app, parse_json_object_body, to_param, + AsyncKernelInvokeClientFactory, HttpApi, KernelInvokeClientFactory, PartitionRouteEntry, + PartitionRouteRequest, PartitionRouteResponse, ServerTopology, WorkerTopology, find_app, + parse_json_object_body, to_param, }; use crate::backend::app_mgr::AppMgr; use crate::backend::mududb_cfg::MuduDBCfg; @@ -25,16 +25,16 @@ use serde_json::Value; use std::ops::Bound; use std::sync::Arc; -pub struct IoUringHttpApi { +pub struct KernelHttpApi { app_mgr: Arc, tcp_addr: String, worker_registry: Arc, meta_mgr: Arc, partition_router: PartitionRouter, - client_factory: Arc, + client_factory: Arc, } -impl IoUringHttpApi { +impl KernelHttpApi { pub fn new( app_mgr: Arc, cfg: &MuduDBCfg, @@ -47,7 +47,7 @@ impl IoUringHttpApi { format!("{}:{}", cfg.listen_ip, cfg.tcp_listen_port), worker_registry, meta_mgr, - Arc::new(TokioIoUringInvokeClientFactory), + Arc::new(KernelInvokeClientFactory), )) } @@ -56,7 +56,7 @@ impl IoUringHttpApi { tcp_addr: String, worker_registry: Arc, meta_mgr: Arc, - client_factory: Arc, + client_factory: Arc, ) -> Self { set_default_remote_addr(Some(tcp_addr.clone())); set_default_remote_worker_id(worker_registry.default_global_worker_id()); @@ -96,7 +96,7 @@ impl IoUringHttpApi { } #[async_trait(?Send)] -impl HttpApi for IoUringHttpApi { +impl HttpApi for KernelHttpApi { async fn list_apps(&self) -> RS> { let list = self .app_mgr diff --git a/mudu_runtime/src/backend/http_api/linux/tokio_iouring_invoke_client.rs b/mudu_runtime/src/backend/http_api/kernel_invoke_client.rs similarity index 76% rename from mudu_runtime/src/backend/http_api/linux/tokio_iouring_invoke_client.rs rename to mudu_runtime/src/backend/http_api/kernel_invoke_client.rs index a9d75a9..2a785af 100644 --- a/mudu_runtime/src/backend/http_api/linux/tokio_iouring_invoke_client.rs +++ b/mudu_runtime/src/backend/http_api/kernel_invoke_client.rs @@ -1,25 +1,25 @@ -use super::AsyncIoUringInvokeClient; +use super::AsyncKernelInvokeClient; use async_trait::async_trait; use mudu::common::result::RS; use mudu_cli::client::async_client::{ - AsyncClient as KernelAsyncIoUringTcpClient, AsyncClientImpl as KernelTokioIoUringTcpClient, + AsyncClient as KernelAsyncTcpClient, AsyncClientImpl as KernelTcpClient, }; use mudu_contract::protocol::{ProcedureInvokeRequest, SessionCloseRequest, SessionCreateRequest}; -pub(super) struct TokioIoUringInvokeClient { - inner: KernelTokioIoUringTcpClient, +pub(super) struct KernelInvokeClient { + inner: KernelTcpClient, } -impl TokioIoUringInvokeClient { +impl KernelInvokeClient { pub(super) async fn connect(addr: &str) -> RS { Ok(Self { - inner: KernelTokioIoUringTcpClient::connect(addr).await?, + inner: KernelTcpClient::connect(addr).await?, }) } } #[async_trait(?Send)] -impl AsyncIoUringInvokeClient for TokioIoUringInvokeClient { +impl AsyncKernelInvokeClient for KernelInvokeClient { async fn create_session(&mut self, config_json: Option) -> RS { Ok(self .inner diff --git a/mudu_runtime/src/backend/http_api/kernel_invoke_client_factory.rs b/mudu_runtime/src/backend/http_api/kernel_invoke_client_factory.rs new file mode 100644 index 0000000..ff3d880 --- /dev/null +++ b/mudu_runtime/src/backend/http_api/kernel_invoke_client_factory.rs @@ -0,0 +1,13 @@ +use super::kernel_invoke_client::KernelInvokeClient; +use super::{AsyncKernelInvokeClient, AsyncKernelInvokeClientFactory}; +use async_trait::async_trait; +use mudu::common::result::RS; + +pub struct KernelInvokeClientFactory; + +#[async_trait(?Send)] +impl AsyncKernelInvokeClientFactory for KernelInvokeClientFactory { + async fn connect(&self, addr: &str) -> RS> { + Ok(Box::new(KernelInvokeClient::connect(addr).await?)) + } +} diff --git a/mudu_runtime/src/backend/http_api/linux/tokio_iouring_invoke_client_factory.rs b/mudu_runtime/src/backend/http_api/linux/tokio_iouring_invoke_client_factory.rs deleted file mode 100644 index f7ccde3..0000000 --- a/mudu_runtime/src/backend/http_api/linux/tokio_iouring_invoke_client_factory.rs +++ /dev/null @@ -1,13 +0,0 @@ -use super::tokio_iouring_invoke_client::TokioIoUringInvokeClient; -use super::{AsyncIoUringInvokeClient, AsyncIoUringInvokeClientFactory}; -use async_trait::async_trait; -use mudu::common::result::RS; - -pub struct TokioIoUringInvokeClientFactory; - -#[async_trait(?Send)] -impl AsyncIoUringInvokeClientFactory for TokioIoUringInvokeClientFactory { - async fn connect(&self, addr: &str) -> RS> { - Ok(Box::new(TokioIoUringInvokeClient::connect(addr).await?)) - } -} diff --git a/mudu_runtime/src/backend/http_api/mod.rs b/mudu_runtime/src/backend/http_api/mod.rs index 6e8ec75..8a9027f 100644 --- a/mudu_runtime/src/backend/http_api/mod.rs +++ b/mudu_runtime/src/backend/http_api/mod.rs @@ -10,21 +10,11 @@ use http_api_context::HttpApiContext; mod legacy_http_api; pub use legacy_http_api::LegacyHttpApi; -#[cfg(target_os = "linux")] -#[path = "linux/tokio_iouring_invoke_client_factory.rs"] -mod tokio_iouring_invoke_client_factory; -#[cfg(target_os = "linux")] -pub use tokio_iouring_invoke_client_factory::TokioIoUringInvokeClientFactory; - -#[cfg(target_os = "linux")] -#[path = "linux/tokio_iouring_invoke_client.rs"] -mod tokio_iouring_invoke_client; - -#[cfg(target_os = "linux")] -#[path = "linux/io_uring_http_api.rs"] -mod io_uring_http_api; -#[cfg(target_os = "linux")] -pub use io_uring_http_api::IoUringHttpApi; +mod kernel_http_api; +mod kernel_invoke_client; +mod kernel_invoke_client_factory; +pub use kernel_http_api::KernelHttpApi; +pub use kernel_invoke_client_factory::KernelInvokeClientFactory; use crate::backend::mududb_cfg::MuduDBCfg; use crate::service::app_inst::AppInst; @@ -52,6 +42,7 @@ use std::collections::HashMap; use std::net::TcpListener; use std::sync::Arc; use tracing::error; +use mudu_utils::scoped_task_trace; fn serialize_oid_as_unioid(oid: &OID, serializer: S) -> Result where @@ -136,11 +127,8 @@ pub struct PartitionRouteResponse { pub routes: Vec, } -#[cfg(target_os = "linux")] use crate::backend::app_mgr::AppMgr; -#[cfg(target_os = "linux")] use crate::backend::mudu_app_mgr::ListOption; -#[cfg(target_os = "linux")] use crate::service::app_list::AppListItem; #[async_trait(?Send)] @@ -184,9 +172,8 @@ pub trait HttpApi: Send + Sync { } } -#[cfg(target_os = "linux")] #[async_trait(?Send)] -pub trait AsyncIoUringInvokeClient: Send { +pub trait AsyncKernelInvokeClient: Send { async fn create_session(&mut self, config_json: Option) -> RS; async fn invoke_procedure( &mut self, @@ -197,10 +184,9 @@ pub trait AsyncIoUringInvokeClient: Send { async fn close_session(&mut self, session_id: u128) -> RS; } -#[cfg(target_os = "linux")] #[async_trait(?Send)] -pub trait AsyncIoUringInvokeClientFactory: Send + Sync { - async fn connect(&self, addr: &str) -> RS>; +pub trait AsyncKernelInvokeClientFactory: Send + Sync { + async fn connect(&self, addr: &str) -> RS>; } pub async fn serve_http_api( @@ -229,6 +215,7 @@ pub async fn serve_http_api_on_listener_with_stop( worker_threads: usize, stop: Option, ) -> std::io::Result<()> { + scoped_task_trace!(); let payload_limit = 500 * 1024 * 1024; let data = web::Data::new(HttpApiContext { api }); @@ -258,7 +245,8 @@ pub async fn serve_http_api_on_listener_with_stop( if let Some(stop) = stop { let handle = server.handle(); - mudu_sys::task::spawn_tokio(async move { + mudu_sys::task_async::spawn_tokio(async move { + scoped_task_trace!(); stop.wait().await; handle.stop(true).await; }); @@ -350,6 +338,7 @@ async fn app_proc_list( path: web::Path, context: web::Data, ) -> impl Responder { + scoped_task_trace!(); let app_name = path.into_inner(); match context.api.list_procedures(&app_name).await { Ok(procedures) => http_ok( @@ -371,6 +360,7 @@ async fn app_proc_detail( path: web::Path<(String, String, String)>, context: web::Data, ) -> impl Responder { + scoped_task_trace!(); let (app_name, mod_name, proc_name) = path.into_inner(); match context .api @@ -539,7 +529,6 @@ async fn legacy_invoke_async_proc( procedure_invoke::result_to_json(result) } -#[cfg(target_os = "linux")] async fn find_app(app_mgr: &dyn AppMgr, app_name: &str) -> RS { let listed_apps = app_mgr .list(&ListOption { @@ -557,28 +546,18 @@ async fn find_app(app_mgr: &dyn AppMgr, app_name: &str) -> RS { mod test { use super::*; use actix_web::{App, test}; - #[cfg(target_os = "linux")] use mudu::common::app_info::AppInfo; - #[cfg(target_os = "linux")] use mudu::common::id::gen_oid; - #[cfg(target_os = "linux")] use mudu_contract::procedure::mod_proc_desc::ModProcDesc; - #[cfg(target_os = "linux")] use mudu_contract::procedure::procedure_result::ProcedureResult; use mudu_contract::tuple::tuple_datum::TupleDatum; - #[cfg(target_os = "linux")] use mudu_kernel::contract::partition_rule::{ PartitionBound, PartitionRuleDesc, RangePartitionDef, }; - #[cfg(target_os = "linux")] use mudu_kernel::contract::partition_rule_binding::PartitionPlacement; - #[cfg(target_os = "linux")] use mudu_kernel::meta::meta_mgr_factory::MetaMgrFactory; - #[cfg(target_os = "linux")] use mudu_kernel::server::async_func_runtime::AsyncFuncInvoker; - #[cfg(target_os = "linux")] use mudu_type::dat_type_id::DatTypeID; - #[cfg(target_os = "linux")] use std::sync::Mutex; struct MockHttpApi; @@ -653,16 +632,14 @@ mod test { assert_eq!(uninstall_resp.status(), StatusCode::NOT_FOUND); } - #[cfg(target_os = "linux")] struct MockClient { session_id: u128, closed: bool, requests: Arc>>, } - #[cfg(target_os = "linux")] #[async_trait(?Send)] - impl AsyncIoUringInvokeClient for MockClient { + impl AsyncKernelInvokeClient for MockClient { async fn create_session(&mut self, _config_json: Option) -> RS { Ok(self.session_id) } @@ -691,16 +668,14 @@ mod test { } } - #[cfg(target_os = "linux")] struct MockClientFactory { requests: Arc>>, fail_close: bool, } - #[cfg(target_os = "linux")] #[async_trait(?Send)] - impl AsyncIoUringInvokeClientFactory for MockClientFactory { - async fn connect(&self, _addr: &str) -> RS> { + impl AsyncKernelInvokeClientFactory for MockClientFactory { + async fn connect(&self, _addr: &str) -> RS> { Ok(Box::new(MockClient { session_id: 9, closed: self.fail_close, @@ -709,10 +684,8 @@ mod test { } } - #[cfg(target_os = "linux")] struct MockAppMgr; - #[cfg(target_os = "linux")] #[async_trait(?Send)] impl AppMgr for MockAppMgr { async fn install(&self, _mpk_binary: Vec) -> RS<()> { @@ -752,16 +725,15 @@ mod test { } } - #[cfg(target_os = "linux")] #[actix_web::test] - async fn iouring_http_api_invokes_over_bridge() { + async fn kernel_http_api_invokes_over_bridge() { let log_dir = std::env::temp_dir().join(format!("http_api_test_{}", mudu::common::id::gen_oid())); let registry = mudu_kernel::server::worker_registry::load_or_create_worker_registry(&log_dir, 4) .unwrap(); let requests = Arc::new(Mutex::new(Vec::new())); - let api = IoUringHttpApi::with_client_factory( + let api = KernelHttpApi::with_client_factory( Arc::new(MockAppMgr), "127.0.0.1:9527".to_string(), registry, @@ -791,9 +763,8 @@ mod test { ); } - #[cfg(target_os = "linux")] #[actix_web::test] - async fn iouring_http_api_routes_point_and_range_by_rule_name() { + async fn kernel_http_api_routes_point_and_range_by_rule_name() { let log_dir = std::env::temp_dir().join(format!( "http_api_route_test_{}", mudu::common::id::gen_oid() @@ -839,7 +810,7 @@ mod test { .await .unwrap(); - let api = IoUringHttpApi::with_client_factory( + let api = KernelHttpApi::with_client_factory( Arc::new(MockAppMgr), "127.0.0.1:9527".to_string(), registry, @@ -879,9 +850,8 @@ mod test { assert_eq!(range.routes[1].worker_id, w1); } - #[cfg(target_os = "linux")] #[actix_web::test] - async fn iouring_http_api_lists_metadata_and_topology() { + async fn kernel_http_api_lists_metadata_and_topology() { let log_dir = std::env::temp_dir().join(format!( "http_api_meta_list_{}", mudu::common::id::gen_oid() @@ -896,7 +866,7 @@ mod test { .to_string(), ) .unwrap(); - let api = IoUringHttpApi::with_client_factory( + let api = KernelHttpApi::with_client_factory( Arc::new(MockAppMgr), "127.0.0.1:9527".to_string(), registry.clone(), @@ -923,9 +893,8 @@ mod test { assert_eq!(topology.workers.len(), registry.workers().len()); } - #[cfg(target_os = "linux")] #[actix_web::test] - async fn iouring_http_api_surfaces_close_session_failure() { + async fn kernel_http_api_surfaces_close_session_failure() { let log_dir = std::env::temp_dir().join(format!( "http_api_close_err_{}", mudu::common::id::gen_oid() @@ -940,7 +909,7 @@ mod test { .to_string(), ) .unwrap(); - let api = IoUringHttpApi::with_client_factory( + let api = KernelHttpApi::with_client_factory( Arc::new(MockAppMgr), "127.0.0.1:9527".to_string(), registry, @@ -958,9 +927,8 @@ mod test { assert!(err.to_string().contains("close session failed")); } - #[cfg(target_os = "linux")] #[actix_web::test] - async fn iouring_http_api_rejects_mixed_route_request_shapes() { + async fn kernel_http_api_rejects_mixed_route_request_shapes() { let log_dir = std::env::temp_dir().join(format!( "http_api_route_shape_{}", mudu::common::id::gen_oid() @@ -986,7 +954,7 @@ mod test { ); meta_mgr.create_partition_rule(&rule).await.unwrap(); - let api = IoUringHttpApi::with_client_factory( + let api = KernelHttpApi::with_client_factory( Arc::new(MockAppMgr), "127.0.0.1:9527".to_string(), registry, diff --git a/mudu_runtime/src/backend/incoming_session.rs b/mudu_runtime/src/backend/incoming_session.rs index 40cfe99..da00ab4 100644 --- a/mudu_runtime/src/backend/incoming_session.rs +++ b/mudu_runtime/src/backend/incoming_session.rs @@ -2,10 +2,10 @@ use crate::backend::session_ctx::SessionCtx; use mudu::common::result::RS; use mudu::error::ec::EC as ER; use mudu::m_error; +use mudu_sys::tokio::net::TcpStream; +use mudu_sys::tokio::sync::mpsc::Sender; use pgwire::tokio::process_socket; use std::net::SocketAddr; -use tokio::net::TcpStream; -use tokio::sync::mpsc::Sender; pub type SSPSender = Sender; diff --git a/mudu_runtime/src/backend/linux/server_ur/server.rs b/mudu_runtime/src/backend/linux/server_ur/server.rs index b01900f..58b67ad 100644 --- a/mudu_runtime/src/backend/linux/server_ur/server.rs +++ b/mudu_runtime/src/backend/linux/server_ur/server.rs @@ -1,13 +1,18 @@ use crate::backend::app_mgr::AppMgr; -use crate::backend::iouring_admin::spawn_management_thread; +use crate::backend::management_thread::spawn_management_thread; use crate::backend::mudu_app_mgr::MuduAppMgr; use crate::backend::mududb_cfg::MuduDBCfg; +use crate::service::runtime_opt::RuntimeOpt; use mudu::common::result::RS; +use mudu_kernel::mudu_conn::mudu_conn_async::{ + clear_default_remote_if_current, set_default_remote_addr, set_default_remote_async_runtime, + set_default_remote_worker_id, +}; use mudu_kernel::server::routing::RoutingMode; -use mudu_kernel::server::server::IoUringTcpBackend as KernelIoUringTcpBackend; -use mudu_kernel::server::server::IoUringTcpServerConfig; -use mudu_sys::task; -use mudu_utils::notifier::{Waiter, notify_wait}; +use mudu_kernel::server::server::WorkerTcpBackend as KernelWorkerTcpBackend; +use mudu_kernel::server::server::WorkerTcpServerConfig; +use mudu_sys::task_async; +use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use std::sync::Arc; pub struct IoUringBackend; @@ -19,21 +24,26 @@ impl IoUringBackend { } pub fn sync_serve_with_stop(cfg: MuduDBCfg, stop: Waiter) -> RS<()> { + Self::sync_serve_with_stop_and_ready(cfg, stop, None) + } + + pub fn sync_serve_with_stop_and_ready( + cfg: MuduDBCfg, + stop: Waiter, + ready: Option, + ) -> RS<()> { let worker_count = cfg.effective_worker_threads(); - let app_mgr = Arc::new(MuduAppMgr::new(cfg.clone())); - let procedure_runtimes = task::block_on_tokio_current_thread(async { - let mut runtimes = Vec::with_capacity(worker_count); - for _ in 0..worker_count { - runtimes.push(app_mgr.create_invoker(&cfg).await?); - } - Ok::<_, mudu::error::err::MError>(runtimes) - })??; + let async_runtime = RuntimeOpt::build_async_runtime(cfg.server_mode); + let app_mgr = Arc::new(MuduAppMgr::new_with_async_runtime( + cfg.clone(), + async_runtime.clone(), + )); let routing_mode = match cfg.routing_mode { crate::backend::mududb_cfg::RoutingMode::ConnectionId => RoutingMode::ConnectionId, crate::backend::mududb_cfg::RoutingMode::PlayerId => RoutingMode::PlayerId, crate::backend::mududb_cfg::RoutingMode::RemoteHash => RoutingMode::RemoteHash, }; - let server_cfg = IoUringTcpServerConfig::new( + let base_server_cfg = WorkerTcpServerConfig::new( worker_count, cfg.listen_ip.clone(), cfg.tcp_listen_port, @@ -42,14 +52,35 @@ impl IoUringBackend { routing_mode, None, )? - .with_log_chunk_size(cfg.io_uring_log_chunk_size) - .with_worker_procedure_runtimes(procedure_runtimes); + .with_log_chunk_size(cfg.io_uring_log_chunk_size); + let base_server_cfg = match async_runtime { + Some(async_runtime) => base_server_cfg.with_async_runtime(async_runtime), + None => base_server_cfg, + }; + let default_remote_addr = format!("{}:{}", cfg.listen_ip, cfg.tcp_listen_port); + let default_remote_worker_id = base_server_cfg.worker_registry().default_global_worker_id(); + set_default_remote_async_runtime(base_server_cfg.async_runtime()); + set_default_remote_addr(Some(default_remote_addr.clone())); + set_default_remote_worker_id(default_remote_worker_id); + let procedure_cfg = cfg.clone(); + let procedure_app_mgr = app_mgr.clone(); + let procedure_runtimes = task_async::block_on_tokio_current_thread(async move { + let mut runtimes = Vec::with_capacity(worker_count); + for _ in 0..worker_count { + runtimes.push(procedure_app_mgr.create_invoker(&procedure_cfg).await?); + } + Ok::<_, mudu::error::err::MError>(runtimes) + })??; + let server_cfg = base_server_cfg.with_worker_procedure_runtimes(procedure_runtimes); spawn_management_thread( cfg.clone(), app_mgr.clone(), server_cfg.worker_registry(), stop.clone(), )?; - KernelIoUringTcpBackend::sync_serve_with_stop(server_cfg, stop) + let result = + KernelWorkerTcpBackend::sync_serve_with_stop_and_ready(server_cfg, stop, ready); + clear_default_remote_if_current(&default_remote_addr, default_remote_worker_id); + result } } diff --git a/mudu_runtime/src/backend/linux/server_ur/test_mpk.rs b/mudu_runtime/src/backend/linux/server_ur/test_mpk.rs index 31a5ce2..31820d2 100644 --- a/mudu_runtime/src/backend/linux/server_ur/test_mpk.rs +++ b/mudu_runtime/src/backend/linux/server_ur/test_mpk.rs @@ -11,7 +11,7 @@ use mudu_contract::procedure::procedure_param::ProcedureParam; use mudu_contract::tuple::tuple_datum::TupleDatum; use mudu_kernel::server::async_func_runtime::AsyncFuncInvokerPtr; use mudu_kernel::server::routing::RoutingMode as KernelRoutingMode; -use mudu_kernel::server::server::{IoUringTcpBackend, IoUringTcpServerConfig}; +use mudu_kernel::server::server::{TokioTcpBackend, WorkerTcpBackend, WorkerTcpServerConfig}; use mudu_utils::log::log_setup; use mudu_utils::notifier::notify_wait; use std::env::temp_dir; @@ -36,7 +36,7 @@ fn wait_until_server_ready(port: u16) { if std::net::TcpStream::connect(("127.0.0.1", port)).is_ok() { return; } - mudu_sys::task::sleep_blocking(Duration::from_millis(25)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(25)); } panic!("io_uring backend did not become ready on port {}", port); } @@ -110,12 +110,12 @@ fn temp_dir_with_prefix(prefix: &str) -> PathBuf { temp_dir().join(format!("{}_{}", prefix, mudu_sys::random::uuid_v4())) } -fn build_cfg(port: u16, mpk_path: &Path, data_path: &Path) -> MuduDBCfg { +fn build_cfg(port: u16, mpk_path: &Path, data_path: &Path, server_mode: ServerMode) -> MuduDBCfg { let mut cfg = MuduDBCfg::default(); cfg.mpk_path = mpk_path.to_string_lossy().into_owned(); cfg.db_path = data_path.to_string_lossy().into_owned(); cfg.listen_ip = "127.0.0.1".to_string(); - cfg.server_mode = ServerMode::IOUring; + cfg.server_mode = server_mode; cfg.tcp_listen_port = port; cfg.io_uring_worker_threads = 2; cfg.component_target = Some(ComponentTarget::P2); @@ -127,7 +127,7 @@ fn build_cfg(port: u16, mpk_path: &Path, data_path: &Path) -> MuduDBCfg { fn install_kv_package(app_mgr: &MuduAppMgr, package_path: &Path) -> RS<()> { let pkg_binary = std::fs::read(package_path) .map_err(|e| m_error!(EC::IOErr, "read key-value mpk for test install error", e))?; - let runtime = tokio::runtime::Builder::new_current_thread() + let runtime = mudu_sys::tokio::runtime::Builder::new_current_thread() .enable_all() .build() .map_err(|e| { @@ -144,7 +144,7 @@ fn create_procedure_runtimes( app_mgr: &MuduAppMgr, cfg: &MuduDBCfg, ) -> RS> { - let runtime = tokio::runtime::Builder::new_current_thread() + let runtime = mudu_sys::tokio::runtime::Builder::new_current_thread() .enable_all() .build() .map_err(|e| { @@ -184,12 +184,22 @@ fn invoke_and_decode( #[ignore = "requires Linux io_uring, cargo make, wasm32-wasip2 target, and example/key-value package build"] fn kv_mpk_can_be_used_by_iouring_backend() -> RS<()> { log_setup("info"); - if !mudu_sys::io_uring_available() { + if !supports_server_mode(ServerMode::IOUring) { info!("skip key-value io_uring test: io_uring unavailable"); return Ok(()); } info!("enable key-value io_uring test: io_uring available"); + run_kv_mpk_can_be_used_by_kernel_backend(ServerMode::IOUring) +} + +#[test] +#[ignore = "requires Linux cargo make, wasm32-wasip2 target, and example/key-value package build"] +fn kv_mpk_can_be_used_by_tokio_backend() -> RS<()> { + log_setup("info"); + run_kv_mpk_can_be_used_by_kernel_backend(ServerMode::Tokio) +} +fn run_kv_mpk_can_be_used_by_kernel_backend(server_mode: ServerMode) -> RS<()> { let package_path = ensure_kv_package_built()?; let mpk_dir = temp_dir_with_prefix("mududb_kv_mpk"); let data_dir = temp_dir_with_prefix("mududb_kv_data"); @@ -204,13 +214,13 @@ fn kv_mpk_can_be_used_by_iouring_backend() -> RS<()> { ); return Ok(()); }; - let cfg = build_cfg(port, &mpk_dir, &data_dir); + let cfg = build_cfg(port, &mpk_dir, &data_dir, server_mode); let app_mgr = MuduAppMgr::new(cfg.clone()); install_kv_package(&app_mgr, &package_path)?; let procedure_runtimes = create_procedure_runtimes(&app_mgr, &cfg)?; let (stop_notifier, server_stop) = notify_wait(); - let server_cfg = IoUringTcpServerConfig::new( + let server_cfg = WorkerTcpServerConfig::new( cfg.effective_worker_threads(), cfg.listen_ip.clone(), cfg.tcp_listen_port, @@ -222,8 +232,11 @@ fn kv_mpk_can_be_used_by_iouring_backend() -> RS<()> { .with_log_chunk_size(cfg.io_uring_log_chunk_size) .with_worker_procedure_runtimes(procedure_runtimes); - let server_thread = - thread::spawn(move || IoUringTcpBackend::sync_serve_with_stop(server_cfg, server_stop)); + let server_thread = thread::spawn(move || match server_mode { + ServerMode::IOUring => WorkerTcpBackend::sync_serve_with_stop(server_cfg, server_stop), + ServerMode::Tokio => TokioTcpBackend::sync_serve_with_stop(server_cfg, server_stop), + ServerMode::Legacy => unreachable!("legacy mode is not a kernel backend"), + }); wait_until_server_ready(port); @@ -275,3 +288,10 @@ fn kv_mpk_can_be_used_by_iouring_backend() -> RS<()> { join_result?; Ok(()) } + +fn supports_server_mode(server_mode: ServerMode) -> bool { + match server_mode { + ServerMode::IOUring => mudu_sys::io_uring_available(), + ServerMode::Legacy | ServerMode::Tokio => true, + } +} diff --git a/mudu_runtime/src/backend/linux/iouring_admin.rs b/mudu_runtime/src/backend/management_thread.rs similarity index 79% rename from mudu_runtime/src/backend/linux/iouring_admin.rs rename to mudu_runtime/src/backend/management_thread.rs index 3dbedc6..6f964e5 100644 --- a/mudu_runtime/src/backend/linux/iouring_admin.rs +++ b/mudu_runtime/src/backend/management_thread.rs @@ -1,6 +1,6 @@ use crate::backend::app_mgr::AppMgr; use crate::backend::http_api::{ - HttpApiCapabilities, IoUringHttpApi, serve_http_api_on_listener_with_stop, + HttpApiCapabilities, KernelHttpApi, serve_http_api_on_listener_with_stop, }; use crate::backend::mududb_cfg::MuduDBCfg; use mudu::common::result::RS; @@ -8,6 +8,7 @@ use mudu::error::ec::EC; use mudu::m_error; use mudu_kernel::server::worker_registry::WorkerRegistry; use mudu_utils::notifier::Waiter; +use mudu_utils::task_async::build_current_thread_runtime; use std::sync::Arc; use std::sync::mpsc; use std::thread; @@ -31,28 +32,25 @@ pub fn spawn_management_thread( Err(e) => { let _ = startup_tx.send(Err(m_error!( EC::IOErr, - "bind io_uring management http server error", + "bind kernel management http server error", e ))); return; } }; - let runtime = match tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - { + let runtime = match build_current_thread_runtime() { Ok(runtime) => runtime, Err(e) => { let _ = startup_tx.send(Err(m_error!( EC::TokioErr, - "create runtime for io_uring management thread error", + "create runtime for kernel management thread error", e ))); return; } }; runtime.block_on(async move { - let api = match IoUringHttpApi::new(app_mgr, &cfg, worker_registry) { + let api = match KernelHttpApi::new(app_mgr, &cfg, worker_registry) { Ok(api) => Arc::new(api), Err(e) => { let _ = startup_tx.send(Err(e)); @@ -72,7 +70,7 @@ pub fn spawn_management_thread( io_uring_recv_multishot = cfg.io_uring_recv_multishot, io_uring_enable_fixed_buffers = cfg.io_uring_enable_fixed_buffers, io_uring_enable_fixed_files = cfg.io_uring_enable_fixed_files, - "io_uring management service listening" + "kernel management service listening" ); if let Err(e) = serve_http_api_on_listener_with_stop( api, @@ -83,15 +81,15 @@ pub fn spawn_management_thread( ) .await { - error!("io_uring app management service terminated: {}", e); + error!("kernel app management service terminated: {}", e); } }); }) - .map_err(|e| m_error!(EC::ThreadErr, "spawn io_uring management thread error", e))?; + .map_err(|e| m_error!(EC::ThreadErr, "spawn kernel management thread error", e))?; startup_rx.recv().map_err(|e| { m_error!( EC::ThreadErr, - "wait io_uring management thread startup error", + "wait kernel management thread startup error", e ) })? diff --git a/mudu_runtime/src/backend/mod.rs b/mudu_runtime/src/backend/mod.rs index 960eaad..69ed81a 100644 --- a/mudu_runtime/src/backend/mod.rs +++ b/mudu_runtime/src/backend/mod.rs @@ -1,7 +1,10 @@ mod accept_handle_task; +pub mod app_mgr; pub mod backend; pub mod http_api; mod incoming_session; +mod management_thread; +pub mod mudu_app_mgr; pub mod mududb_cfg; mod session; mod session_ctx; @@ -9,18 +12,10 @@ mod session_handle_task; #[cfg(all(test, target_os = "linux"))] mod sql_async_client_test; mod test_backend; +pub mod tokio_backend; pub mod web_handle_task; pub mod web_serve; -#[cfg(target_os = "linux")] -#[path = "linux/app_mgr.rs"] -mod app_mgr; -#[cfg(target_os = "linux")] -#[path = "linux/iouring_admin.rs"] -mod iouring_admin; -#[cfg(target_os = "linux")] -#[path = "linux/mudu_app_mgr.rs"] -pub mod mudu_app_mgr; #[cfg(target_os = "linux")] #[path = "linux/server_ur/mod.rs"] pub mod server_ur; diff --git a/mudu_runtime/src/backend/linux/mudu_app_mgr.rs b/mudu_runtime/src/backend/mudu_app_mgr.rs similarity index 88% rename from mudu_runtime/src/backend/linux/mudu_app_mgr.rs rename to mudu_runtime/src/backend/mudu_app_mgr.rs index c9d5084..8086d49 100644 --- a/mudu_runtime/src/backend/linux/mudu_app_mgr.rs +++ b/mudu_runtime/src/backend/mudu_app_mgr.rs @@ -12,6 +12,7 @@ use mudu::common::xid::INVALID_XID; use mudu::error::ec::EC; use mudu::m_error; use mudu_binding::procedure::procedure_invoke; +use mudu_kernel::async_rt::contract::AsyncRuntime; use mudu_kernel::server::async_func_runtime::AsyncFuncInvoker; use mudu_kernel::server::worker_local::WorkerLocalRef; use std::collections::HashSet; @@ -26,14 +27,21 @@ struct MuduProcInvoker { cfg: MuduDBCfg, runtime: RwLock>, enable_async: bool, + async_runtime: Option>, } impl MuduProcInvoker { - fn new(cfg: MuduDBCfg, runtime: Arc, enable_async: bool) -> Self { + fn new( + cfg: MuduDBCfg, + runtime: Arc, + enable_async: bool, + async_runtime: Option>, + ) -> Self { Self { cfg, runtime: RwLock::new(runtime), enable_async, + async_runtime, } } @@ -43,7 +51,7 @@ impl MuduProcInvoker { } async fn reload(&self) -> RS<()> { - let runtime = create_runtime_from_cfg(&self.cfg).await?; + let runtime = create_runtime_from_cfg(&self.cfg, self.async_runtime.clone()).await?; *self.runtime.write().unwrap() = runtime; Ok(()) } @@ -113,13 +121,22 @@ impl Default for ListOption { pub struct MuduAppMgr { cfg: MuduDBCfg, + async_runtime: Option>, created_invokers: Mutex>>, } impl MuduAppMgr { pub fn new(cfg: MuduDBCfg) -> Self { + Self::new_with_async_runtime(cfg, None) + } + + pub fn new_with_async_runtime( + cfg: MuduDBCfg, + async_runtime: Option>, + ) -> Self { Self { cfg, + async_runtime, created_invokers: Mutex::new(Vec::new()), } } @@ -198,13 +215,16 @@ impl AppMgr for MuduAppMgr { async fn create_invoker(&self, cfg: &MuduDBCfg) -> RS> { let cfg = cfg.clone(); - let invoker = build_owned_proc_invoker(&cfg).await?; + let invoker = build_owned_proc_invoker(&cfg, self.async_runtime.clone()).await?; self.register_invoker(&invoker); Ok(invoker as Arc) } } -async fn create_runtime_from_cfg(cfg: &MuduDBCfg) -> RS> { +async fn create_runtime_from_cfg( + cfg: &MuduDBCfg, + async_runtime: Option>, +) -> RS> { let component_target = cfg.component_target(); let enable_async = cfg.enable_async; create_runtime_service( @@ -215,18 +235,24 @@ async fn create_runtime_from_cfg(cfg: &MuduDBCfg) -> RS> { component_target, enable_async, sever_mode: cfg.server_mode, + async_runtime: async_runtime + .or_else(|| RuntimeOpt::build_async_runtime(cfg.server_mode)), }, ) .await } -async fn build_owned_proc_invoker(cfg: &MuduDBCfg) -> RS> { - let runtime = create_runtime_from_cfg(cfg).await?; +async fn build_owned_proc_invoker( + cfg: &MuduDBCfg, + async_runtime: Option>, +) -> RS> { + let runtime = create_runtime_from_cfg(cfg, async_runtime.clone()).await?; let enable_async = cfg.enable_async; Ok(Arc::new(MuduProcInvoker::new( cfg.clone(), runtime, enable_async, + async_runtime, ))) } diff --git a/mudu_runtime/src/backend/mududb_cfg.rs b/mudu_runtime/src/backend/mududb_cfg.rs index f9904e9..5796144 100644 --- a/mudu_runtime/src/backend/mududb_cfg.rs +++ b/mudu_runtime/src/backend/mududb_cfg.rs @@ -15,6 +15,7 @@ pub enum ServerMode { #[default] Legacy = 0, IOUring = 1, + Tokio = 2, } #[derive(Serialize_repr, Deserialize_repr, Eq, PartialEq, Debug, Clone, Copy, Default)] @@ -153,6 +154,10 @@ impl MuduDBCfg { self.component_target.unwrap_or(ComponentTarget::P2) } + pub fn uses_mududb_kernel(&self) -> bool { + matches!(self.server_mode, ServerMode::IOUring | ServerMode::Tokio) + } + pub fn effective_worker_threads(&self) -> usize { if self.io_uring_worker_threads > 0 { self.io_uring_worker_threads @@ -274,6 +279,7 @@ enable_async = true # 0 = Legacy # 1 = IOUring +# 2 = Tokio server_mode = 1 tcp_listen_port = 9527 io_uring_worker_threads = 0 diff --git a/mudu_runtime/src/backend/session_handle_task.rs b/mudu_runtime/src/backend/session_handle_task.rs index 68ac671..9e4c1c2 100644 --- a/mudu_runtime/src/backend/session_handle_task.rs +++ b/mudu_runtime/src/backend/session_handle_task.rs @@ -3,9 +3,9 @@ use crate::backend::session_ctx::SessionCtx; use mudu::common::result::RS; use mudu_utils::notifier::Waiter; +use mudu_sys::tokio::sync::mpsc::Receiver; use mudu_utils::sync::async_task::{AsyncLocalTask, Task}; -use mudu_utils::task::spawn_local_task; -use tokio::sync::mpsc::Receiver; +use mudu_utils::task_async::spawn_local_task; use tracing::error; pub struct SessionHandleTask { diff --git a/mudu_runtime/src/backend/sql_async_client_test.rs b/mudu_runtime/src/backend/sql_async_client_test.rs index b515bce..b99a7e8 100644 --- a/mudu_runtime/src/backend/sql_async_client_test.rs +++ b/mudu_runtime/src/backend/sql_async_client_test.rs @@ -6,22 +6,30 @@ mod tests { use mudu::common::result::RS; use mudu_cli::client::async_client::{AsyncClient, AsyncClientImpl}; use mudu_contract::protocol::{ClientRequest, ServerResponse}; + use mudu_sys::tokio::sync::Mutex as AsyncMutex; + use mudu_sys::tokio::time::{sleep, timeout}; use mudu_type::dat_type_id::DatTypeID; use mudu_type::datum::DatumDyn; - use mudu_utils::notifier::notify_wait; + use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use std::fs; use std::net::TcpListener; use std::path::PathBuf; + use std::sync::Once; use std::thread; use std::thread::JoinHandle; use std::time::{Duration, Instant}; - use tokio::sync::Mutex as AsyncMutex; - use tokio::time::{sleep, timeout}; use tracing::info; lazy_static! { static ref SQL_ASYNC_BACKEND_TEST_LOCK: AsyncMutex<()> = AsyncMutex::new(()); } + static LOG_INIT: Once = Once::new(); + + fn init_test_logging() { + LOG_INIT.call_once(|| { + mudu_utils::log::log_setup_ex("info", "", false); + }); + } fn temp_dir(prefix: &str) -> PathBuf { std::env::temp_dir().join(format!( @@ -37,8 +45,12 @@ mod tests { .and_then(|listener| listener.local_addr().ok().map(|addr| addr.port())) } - fn test_cfg() -> Option { + fn test_cfg(server_mode: ServerMode) -> Option { let tcp_port = reserve_port()?; + let mut http_port = reserve_port()?; + while http_port == tcp_port { + http_port = reserve_port()?; + } let db_path = temp_dir("mudu_sql_async_db"); let mpk_path = temp_dir("mudu_sql_async_mpk"); fs::create_dir_all(&db_path).ok()?; @@ -47,10 +59,10 @@ mod tests { mpk_path: mpk_path.to_string_lossy().into_owned(), db_path: db_path.to_string_lossy().into_owned(), listen_ip: "127.0.0.1".to_string(), - http_listen_port: 0, + http_listen_port: http_port, pg_listen_port: 0, tcp_listen_port: tcp_port, - server_mode: ServerMode::IOUring, + server_mode, io_uring_worker_threads: 1, ..Default::default() }) @@ -96,6 +108,33 @@ mod tests { } } + async fn wait_for_backend_ready(waiter: Waiter, ready_timeout: Duration) -> RS<()> { + // Async client tests connect immediately after startup, so they must + // wait for the backend's logical ready barrier instead of assuming + // that a listening socket already means recovery is complete. + timeout(ready_timeout, waiter.wait()).await.map_err(|_| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + "sql async backend ready barrier timed out" + ) + })?; + Ok(()) + } + + async fn spawn_backend_server(cfg: MuduDBCfg) -> RS<(Notifier, JoinHandle>)> { + let (stop_notifier, stop_waiter) = notify_wait(); + let (ready_notifier, ready_waiter) = notify_wait(); + let server = thread::spawn(move || { + Backend::sync_serve_with_stop_and_ready(cfg, stop_waiter, Some(ready_notifier)) + }); + if let Err(err) = wait_for_backend_ready(ready_waiter, Duration::from_secs(10)).await { + stop_notifier.notify_all(); + let _ = server.join(); + return Err(err); + } + Ok((stop_notifier, server)) + } + async fn with_timeout(future: impl std::future::Future>) -> RS { timeout(Duration::from_secs(20), future) .await @@ -107,6 +146,28 @@ mod tests { })? } + async fn with_timeout_named( + label: &str, + future: impl std::future::Future>, + ) -> RS { + info!("sql async client test begin: {}", label); + let started = Instant::now(); + let result = with_timeout(future).await; + match &result { + Ok(_) => info!( + elapsed_ms = started.elapsed().as_millis(), + "sql async client test success: {}", label + ), + Err(err) => info!( + elapsed_ms = started.elapsed().as_millis(), + error = %err, + "sql async client test failed: {}", + label + ), + } + result + } + fn response_rows_as_strings(response: &ServerResponse) -> Vec> { response .rows() @@ -115,16 +176,16 @@ mod tests { row.values() .iter() .zip(response.row_desc().fields().iter()) - .map(|(value, field_desc)| { - if field_desc.dat_type().dat_type_id() == DatTypeID::String { - value.expect_string().clone() - } else { - value + .map( + |(value, field_desc)| match field_desc.dat_type().dat_type_id() { + DatTypeID::String => value.expect_string().clone(), + DatTypeID::Numeric => value.expect_numeric().to_plain_string(), + _ => value .to_textual(field_desc.dat_type()) .map(|text| text.to_string()) - .unwrap() - } - }) + .unwrap(), + }, + ) .collect::>() }) .collect::>() @@ -145,28 +206,38 @@ mod tests { })? } - async fn start_client_backend() -> Option< + async fn start_client_backend( + server_mode: ServerMode, + ) -> Option< RS<( AsyncClientImpl, mudu_utils::notifier::Notifier, JoinHandle>, )>, > { - if should_skip_iouring_env() { + if server_mode == ServerMode::IOUring && should_skip_iouring_env() { return None; } - let Some(cfg) = test_cfg() else { + let Some(cfg) = test_cfg(server_mode) else { return None; }; let addr = format!("127.0.0.1:{}", cfg.tcp_listen_port); - let (stop_notifier, stop_waiter) = notify_wait(); - let server = thread::spawn(move || Backend::sync_serve_with_stop(cfg, stop_waiter)); + let (stop_notifier, server) = match spawn_backend_server(cfg).await { + Ok(started) => started, + Err(err) => { + if server_mode == ServerMode::IOUring && should_skip_iouring_test(&err) { + eprintln!("skip io_uring async client test: {}", err); + return None; + } + return Some(Err(err)); + } + }; let client = match wait_for_client(&addr, Duration::from_secs(10)).await { Ok(client) => client, Err(err) => { stop_notifier.notify_all(); let _ = server.join(); - if should_skip_iouring_test(&err) { + if server_mode == ServerMode::IOUring && should_skip_iouring_test(&err) { eprintln!("skip io_uring async client test: {}", err); return None; } @@ -176,24 +247,65 @@ mod tests { Some(Ok((client, stop_notifier, server))) } + async fn run_with_client_backend( + server_mode: ServerMode, + ) -> Option< + RS<( + AsyncClientImpl, + mudu_utils::notifier::Notifier, + JoinHandle>, + )>, + > { + start_client_backend(server_mode).await + } + async fn exec_sql(client: &mut AsyncClientImpl, sql: &str) -> RS<()> { - with_timeout(client.execute(ClientRequest::new("default", sql))) - .await - .map(|_| ()) + with_timeout_named( + &format!("execute sql: {}", sql), + client.execute(ClientRequest::new("default", sql)), + ) + .await + .map(|_| ()) + } + + async fn batch_sql(client: &mut AsyncClientImpl, sql: &str) -> RS<()> { + with_timeout_named( + &format!("batch sql: {}", sql), + client.batch(ClientRequest::new("default", sql)), + ) + .await + .map(|_| ()) + } + + async fn query_sql(client: &mut AsyncClientImpl, sql: &str) -> RS { + with_timeout_named( + &format!("query sql: {}", sql), + client.query(ClientRequest::new("default", sql)), + ) + .await } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn async_client_roundtrip_sql_crud_over_iouring_backend() -> RS<()> { + init_test_logging(); if should_skip_iouring_env() { return Ok(()); } let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; - let Some(cfg) = test_cfg() else { + let Some(cfg) = test_cfg(ServerMode::IOUring) else { return Ok(()); }; let addr = format!("127.0.0.1:{}", cfg.tcp_listen_port); - let (stop_notifier, stop_waiter) = notify_wait(); - let server = thread::spawn(move || Backend::sync_serve_with_stop(cfg, stop_waiter)); + let (stop_notifier, server) = match spawn_backend_server(cfg).await { + Ok(started) => started, + Err(err) => { + if should_skip_iouring_test(&err) { + eprintln!("skip io_uring async client test: {}", err); + return Ok(()); + } + return Err(err); + } + }; let mut client = match wait_for_client(&addr, Duration::from_secs(10)).await { Ok(client) => client, @@ -264,25 +376,49 @@ mod tests { Ok(()) } + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_roundtrip_sql_crud_over_tokio_backend() -> RS<()> { + init_test_logging(); + run_async_client_roundtrip_sql_crud(ServerMode::Tokio).await + } + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn async_client_batch_executes_multiple_sql_commands() -> RS<()> { - if should_skip_iouring_env() { - return Ok(()); - } + init_test_logging(); + run_async_client_batch_executes_multiple_sql_commands(ServerMode::IOUring).await + } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_batch_executes_multiple_sql_commands_tokio() -> RS<()> { + init_test_logging(); + run_async_client_batch_executes_multiple_sql_commands(ServerMode::Tokio).await + } + + async fn run_async_client_batch_executes_multiple_sql_commands( + server_mode: ServerMode, + ) -> RS<()> { let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; - let Some(cfg) = test_cfg() else { + let Some(cfg) = test_cfg(server_mode) else { return Ok(()); }; let addr = format!("127.0.0.1:{}", cfg.tcp_listen_port); - let (stop_notifier, stop_waiter) = notify_wait(); - let server = thread::spawn(move || Backend::sync_serve_with_stop(cfg, stop_waiter)); + let (stop_notifier, server) = match spawn_backend_server(cfg).await { + Ok(started) => started, + Err(err) => { + if server_mode == ServerMode::IOUring && should_skip_iouring_test(&err) { + eprintln!("skip io_uring async client test: {}", err); + return Ok(()); + } + return Err(err); + } + }; let mut client = match wait_for_client(&addr, Duration::from_secs(10)).await { Ok(client) => client, Err(err) => { stop_notifier.notify_all(); let _ = server.join(); - if should_skip_iouring_test(&err) { + if server_mode == ServerMode::IOUring && should_skip_iouring_test(&err) { eprintln!("skip io_uring async client test: {}", err); return Ok(()); } @@ -290,18 +426,14 @@ mod tests { } }; - with_timeout(client.batch(ClientRequest::new( - "default", + batch_sql( + &mut client, "CREATE TABLE t(id INT, v INT, PRIMARY KEY(id));\ INSERT INTO t(id, v) VALUES (1, 11);", - ))) + ) .await?; - let selected = with_timeout(client.query(ClientRequest::new( - "default", - "SELECT id, v FROM t WHERE id = 1", - ))) - .await?; + let selected = query_sql(&mut client, "SELECT id, v FROM t WHERE id = 1").await?; assert_eq!( response_rows_as_strings(&selected), vec![vec!["1".to_string(), "11".to_string()]] @@ -313,8 +445,21 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn async_client_drop_table_removes_table_from_catalog() -> RS<()> { + init_test_logging(); + run_async_client_drop_table_removes_table_from_catalog(ServerMode::IOUring).await + } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_drop_table_removes_table_from_catalog_tokio() -> RS<()> { + init_test_logging(); + run_async_client_drop_table_removes_table_from_catalog(ServerMode::Tokio).await + } + + async fn run_async_client_drop_table_removes_table_from_catalog( + server_mode: ServerMode, + ) -> RS<()> { let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; - let Some(started) = start_client_backend().await else { + let Some(started) = run_with_client_backend(server_mode).await else { return Ok(()); }; let (mut client, stop_notifier, server) = started?; @@ -327,12 +472,9 @@ mod tests { exec_sql(&mut client, "INSERT INTO t(id, v) VALUES (1, 10)").await?; exec_sql(&mut client, "DROP TABLE t").await?; - let err = with_timeout(client.query(ClientRequest::new( - "default", - "SELECT id, v FROM t WHERE id = 1", - ))) - .await - .expect_err("query on dropped table should fail"); + let err = query_sql(&mut client, "SELECT id, v FROM t WHERE id = 1") + .await + .expect_err("query on dropped table should fail"); assert!(err.to_string().contains("no such table")); stop_server(client, stop_notifier, server)?; @@ -341,8 +483,19 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn async_client_range_scan_over_primary_key() -> RS<()> { + init_test_logging(); + run_async_client_range_scan_over_primary_key(ServerMode::IOUring).await + } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_range_scan_over_primary_key_tokio() -> RS<()> { + init_test_logging(); + run_async_client_range_scan_over_primary_key(ServerMode::Tokio).await + } + + async fn run_async_client_range_scan_over_primary_key(server_mode: ServerMode) -> RS<()> { let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; - let Some(started) = start_client_backend().await else { + let Some(started) = run_with_client_backend(server_mode).await else { return Ok(()); }; let (mut client, stop_notifier, server) = started?; @@ -352,14 +505,14 @@ mod tests { "CREATE TABLE t(id INT, v INT, PRIMARY KEY(id))", ) .await?; - with_timeout(client.batch(ClientRequest::new( - "default", + batch_sql( + &mut client, "INSERT INTO t(id, v) VALUES (5, 50);\ INSERT INTO t(id, v) VALUES (1, 10);\ INSERT INTO t(id, v) VALUES (3, 30);\ INSERT INTO t(id, v) VALUES (2, 20);\ INSERT INTO t(id, v) VALUES (4, 40);", - ))) + ) .await?; let selected = with_timeout(client.query(ClientRequest::new( @@ -443,8 +596,21 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn async_client_rejects_mixed_equality_and_range_key_predicates() -> RS<()> { + init_test_logging(); + run_async_client_rejects_mixed_equality_and_range_key_predicates(ServerMode::IOUring).await + } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_rejects_mixed_equality_and_range_key_predicates_tokio() -> RS<()> { + init_test_logging(); + run_async_client_rejects_mixed_equality_and_range_key_predicates(ServerMode::Tokio).await + } + + async fn run_async_client_rejects_mixed_equality_and_range_key_predicates( + server_mode: ServerMode, + ) -> RS<()> { let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; - let Some(started) = start_client_backend().await else { + let Some(started) = run_with_client_backend(server_mode).await else { return Ok(()); }; let (mut client, stop_notifier, server) = started?; @@ -468,4 +634,148 @@ mod tests { stop_server(client, stop_notifier, server)?; Ok(()) } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_roundtrip_numeric_primary_key_and_values() -> RS<()> { + init_test_logging(); + run_async_client_roundtrip_numeric_primary_key_and_values(ServerMode::IOUring).await + } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn async_client_roundtrip_numeric_primary_key_and_values_tokio() -> RS<()> { + init_test_logging(); + run_async_client_roundtrip_numeric_primary_key_and_values(ServerMode::Tokio).await + } + + async fn run_async_client_roundtrip_numeric_primary_key_and_values( + server_mode: ServerMode, + ) -> RS<()> { + let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; + let Some(started) = run_with_client_backend(server_mode).await else { + return Ok(()); + }; + let (mut client, stop_notifier, server) = started?; + + exec_sql( + &mut client, + "CREATE TABLE ledger(amount NUMERIC(9, 4), note CHAR(16), PRIMARY KEY(amount))", + ) + .await?; + batch_sql( + &mut client, + "INSERT INTO ledger(amount, note) VALUES (12.3400, 'coffee');\ + INSERT INTO ledger(amount, note) VALUES (-0.0100, 'refund');", + ) + .await?; + + let selected = with_timeout(client.query(ClientRequest::new( + "default", + "SELECT amount, note FROM ledger WHERE amount = 12.3400", + ))) + .await?; + assert_eq!( + response_rows_as_strings(&selected), + vec![vec!["12.3400".to_string(), "'coffee'".to_string()]] + ); + + let selected = with_timeout(client.query(ClientRequest::new( + "default", + "SELECT amount FROM ledger WHERE amount >= -0.0100 AND amount <= 12.3400", + ))) + .await?; + assert_eq!( + response_rows_as_strings(&selected), + vec![vec!["-0.0100".to_string()], vec!["12.3400".to_string()]] + ); + + stop_server(client, stop_notifier, server)?; + Ok(()) + } + + async fn run_async_client_roundtrip_sql_crud(server_mode: ServerMode) -> RS<()> { + init_test_logging(); + let _guard = SQL_ASYNC_BACKEND_TEST_LOCK.lock().await; + let Some(cfg) = test_cfg(server_mode) else { + return Ok(()); + }; + let addr = format!("127.0.0.1:{}", cfg.tcp_listen_port); + let (stop_notifier, server) = match spawn_backend_server(cfg).await { + Ok(started) => started, + Err(err) => { + if server_mode == ServerMode::IOUring && should_skip_iouring_test(&err) { + eprintln!("skip io_uring async client test: {}", err); + return Ok(()); + } + return Err(err); + } + }; + + let mut client = match wait_for_client(&addr, Duration::from_secs(10)).await { + Ok(client) => client, + Err(err) => { + stop_notifier.notify_all(); + let _ = server.join(); + if server_mode == ServerMode::IOUring && should_skip_iouring_test(&err) { + eprintln!("skip io_uring async client test: {}", err); + return Ok(()); + } + return Err(err); + } + }; + + with_timeout(client.execute(ClientRequest::new( + "default", + "CREATE TABLE t(id INT, v INT, PRIMARY KEY(id))", + ))) + .await?; + let inserted = with_timeout(client.execute(ClientRequest::new( + "default", + "INSERT INTO t(id, v) VALUES (1, 10)", + ))) + .await?; + assert_eq!(inserted.affected_rows(), 1); + + let selected = with_timeout(client.query(ClientRequest::new( + "default", + "SELECT id, v FROM t WHERE id = 1", + ))) + .await?; + assert_eq!( + response_rows_as_strings(&selected), + vec![vec!["1".to_string(), "10".to_string()]] + ); + + let updated = with_timeout(client.execute(ClientRequest::new( + "default", + "UPDATE t SET v = 20 WHERE id = 1", + ))) + .await?; + assert_eq!(updated.affected_rows(), 1); + + let selected = with_timeout(client.query(ClientRequest::new( + "default", + "SELECT v FROM t WHERE id = 1", + ))) + .await?; + assert_eq!( + response_rows_as_strings(&selected), + vec![vec!["20".to_string()]] + ); + + let deleted = with_timeout( + client.execute(ClientRequest::new("default", "DELETE FROM t WHERE id = 1")), + ) + .await?; + assert_eq!(deleted.affected_rows(), 1); + + let selected = with_timeout(client.query(ClientRequest::new( + "default", + "SELECT id FROM t WHERE id = 1", + ))) + .await?; + assert!(selected.rows().is_empty()); + + stop_server(client, stop_notifier, server)?; + Ok(()) + } } diff --git a/mudu_runtime/src/backend/tokio_backend.rs b/mudu_runtime/src/backend/tokio_backend.rs new file mode 100644 index 0000000..3725e23 --- /dev/null +++ b/mudu_runtime/src/backend/tokio_backend.rs @@ -0,0 +1,85 @@ +use crate::backend::app_mgr::AppMgr; +use crate::backend::management_thread::spawn_management_thread; +use crate::backend::mudu_app_mgr::MuduAppMgr; +use crate::backend::mududb_cfg::MuduDBCfg; +use crate::service::runtime_opt::RuntimeOpt; +use mudu::common::result::RS; +use mudu_kernel::mudu_conn::mudu_conn_async::{ + clear_default_remote_if_current, set_default_remote_addr, set_default_remote_async_runtime, + set_default_remote_worker_id, +}; +use mudu_kernel::server::routing::RoutingMode; +use mudu_kernel::server::server::TokioTcpBackend as KernelTokioTcpBackend; +use mudu_kernel::server::server::WorkerTcpServerConfig; +use mudu_sys::task_async; +use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; +use std::sync::Arc; + +pub struct TokioBackend; + +impl TokioBackend { + pub fn sync_serve(cfg: MuduDBCfg) -> RS<()> { + let (_stop_notifier, stop_waiter) = notify_wait(); + Self::sync_serve_with_stop(cfg, stop_waiter) + } + + pub fn sync_serve_with_stop(cfg: MuduDBCfg, stop: Waiter) -> RS<()> { + Self::sync_serve_with_stop_and_ready(cfg, stop, None) + } + + pub fn sync_serve_with_stop_and_ready( + cfg: MuduDBCfg, + stop: Waiter, + ready: Option, + ) -> RS<()> { + let worker_count = cfg.effective_worker_threads(); + let async_runtime = RuntimeOpt::build_async_runtime(cfg.server_mode); + let app_mgr = Arc::new(MuduAppMgr::new_with_async_runtime( + cfg.clone(), + async_runtime.clone(), + )); + let routing_mode = match cfg.routing_mode { + crate::backend::mududb_cfg::RoutingMode::ConnectionId => RoutingMode::ConnectionId, + crate::backend::mududb_cfg::RoutingMode::PlayerId => RoutingMode::PlayerId, + crate::backend::mududb_cfg::RoutingMode::RemoteHash => RoutingMode::RemoteHash, + }; + let base_server_cfg = WorkerTcpServerConfig::new( + worker_count, + cfg.listen_ip.clone(), + cfg.tcp_listen_port, + cfg.db_path.clone(), + cfg.db_path.clone(), + routing_mode, + None, + )? + .with_log_chunk_size(cfg.io_uring_log_chunk_size); + let base_server_cfg = match async_runtime { + Some(async_runtime) => base_server_cfg.with_async_runtime(async_runtime), + None => base_server_cfg, + }; + let default_remote_addr = format!("{}:{}", cfg.listen_ip, cfg.tcp_listen_port); + let default_remote_worker_id = base_server_cfg.worker_registry().default_global_worker_id(); + set_default_remote_async_runtime(base_server_cfg.async_runtime()); + set_default_remote_addr(Some(default_remote_addr.clone())); + set_default_remote_worker_id(default_remote_worker_id); + let procedure_cfg = cfg.clone(); + let procedure_app_mgr = app_mgr.clone(); + let procedure_runtimes = task_async::block_on_tokio_current_thread(async move { + let mut runtimes = Vec::with_capacity(worker_count); + for _ in 0..worker_count { + runtimes.push(procedure_app_mgr.create_invoker(&procedure_cfg).await?); + } + Ok::<_, mudu::error::err::MError>(runtimes) + })??; + let server_cfg = base_server_cfg.with_worker_procedure_runtimes(procedure_runtimes); + spawn_management_thread( + cfg.clone(), + app_mgr.clone(), + server_cfg.worker_registry(), + stop.clone(), + )?; + let result = KernelTokioTcpBackend::sync_serve_with_stop_and_ready(server_cfg, stop, ready); + clear_default_remote_if_current(&default_remote_addr, default_remote_worker_id); + result + } +} diff --git a/mudu_runtime/src/backend/web_serve.rs b/mudu_runtime/src/backend/web_serve.rs index f070774..10c0727 100644 --- a/mudu_runtime/src/backend/web_serve.rs +++ b/mudu_runtime/src/backend/web_serve.rs @@ -23,6 +23,7 @@ pub async fn async_serve( component_target, enable_async, sever_mode: cfg.server_mode, + async_runtime: RuntimeOpt::build_async_runtime(cfg.server_mode), }; let service = create_runtime_service( &cfg.mpk_path, diff --git a/mudu_runtime/src/db_connector.rs b/mudu_runtime/src/db_connector.rs index b4b9042..f8b8f64 100644 --- a/mudu_runtime/src/db_connector.rs +++ b/mudu_runtime/src/db_connector.rs @@ -6,6 +6,7 @@ use mudu::error::ec::EC; use mudu::m_error; use mudu_contract::database::db_conn::DBConnSync; use mudu_contract::database::sql::DBConn; +use mudu_kernel::async_rt::contract::AsyncRuntime; use mudu_kernel::mudu_conn::mudu_conn_async::MuduConnAsync; use std::str::FromStr; use std::sync::Arc; @@ -22,6 +23,13 @@ enum DBType { impl DBConnector { pub async fn connect(connect_string: &str) -> RS { + Self::connect_with_async_runtime(connect_string, None).await + } + + pub async fn connect_with_async_runtime( + connect_string: &str, + async_runtime: Option>, + ) -> RS { let db_str_param = parse_db_connect_string(connect_string); let mut passing_param = Vec::new(); let mut opt_ddl_path = None; @@ -60,7 +68,7 @@ impl DBConnector { Some(db_type) => match db_type { DBType::LibSQL => create_ls_conn(&db_path, &app_name, &ddl_path), DBType::LibSQLAsync => create_libsql_async_conn(&db_path, &app_name).await, - DBType::MuduDB => create_mudu_conn().await, + DBType::MuduDB => create_mudu_conn(async_runtime).await, }, None => Err(m_error!(EC::ParseErr, "not a valid DB type")), } @@ -71,8 +79,10 @@ impl DBConnector { } } -async fn create_mudu_conn() -> RS { - Ok(DBConn::Async(Arc::new(MuduConnAsync::new()?))) +async fn create_mudu_conn(async_runtime: Option>) -> RS { + Ok(DBConn::Async(Arc::new(MuduConnAsync::new_with_runtime( + async_runtime, + )?))) } fn parse_key_value(s: &str) -> RS<(String, String)> { diff --git a/mudu_runtime/src/db_libsql/ls_conn.rs b/mudu_runtime/src/db_libsql/ls_conn.rs index 96164fb..2ca314b 100644 --- a/mudu_runtime/src/db_libsql/ls_conn.rs +++ b/mudu_runtime/src/db_libsql/ls_conn.rs @@ -84,16 +84,16 @@ mod test { use mudu::this_file; use mudu_contract::database::db_conn::DBConnSync; use mudu_contract::database::sql::DBConn; + use mudu_sys::tokio::runtime::Builder; use mudu_utils::log::log_setup; use mudu_utils::notifier::NotifyWait; - use mudu_utils::task::spawn_task; + use mudu_utils::task_async::spawn_task; use std::env::temp_dir; use std::fs; use std::fs::File; use std::io::{BufRead, BufReader}; use std::path::{Path, PathBuf}; use std::sync::Arc; - use tokio::runtime::Builder; use tracing::debug; fn test_db_temp_folder() -> String { diff --git a/mudu_runtime/src/db_libsql/ls_trans.rs b/mudu_runtime/src/db_libsql/ls_trans.rs index 94b4c4c..8825ca6 100644 --- a/mudu_runtime/src/db_libsql/ls_trans.rs +++ b/mudu_runtime/src/db_libsql/ls_trans.rs @@ -13,8 +13,8 @@ use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dat_value::DatValue; +use mudu_utils::sync::a_mutex::AMutex; use std::sync::Arc; -use tokio::sync::Mutex; pub struct LSTrans { xid: XID, @@ -26,7 +26,7 @@ struct LSResultSet { } struct ResultSetInner { - row: Mutex, + row: AMutex, tuple_desc: Arc, } @@ -112,7 +112,7 @@ impl ResultSet for LSResultSet { impl ResultSetInner { fn new(row: Rows, tuple_desc: Arc) -> ResultSetInner { Self { - row: Mutex::new(row), + row: AMutex::new(row), tuple_desc, } } diff --git a/mudu_runtime/src/db_libsql_async/libsql_async_conn.rs b/mudu_runtime/src/db_libsql_async/libsql_async_conn.rs index fdc8fa6..f8f3fe7 100644 --- a/mudu_runtime/src/db_libsql_async/libsql_async_conn.rs +++ b/mudu_runtime/src/db_libsql_async/libsql_async_conn.rs @@ -9,9 +9,9 @@ use mudu_contract::database::result_set::ResultSetAsync; use mudu_contract::database::sql::DBConn; use mudu_contract::database::sql_params::SQLParams; use mudu_contract::database::sql_stmt::SQLStmt; +use mudu_utils::sync::a_mutex::{AMutex, AMutexGuard}; use std::path::PathBuf; use std::sync::Arc; -use tokio::sync::{Mutex, MutexGuard}; pub async fn create_libsql_async_conn(db_path: &String, app_name: &String) -> RS { let db_file_path = PathBuf::from(db_path).join(app_name); @@ -21,20 +21,20 @@ pub async fn create_libsql_async_conn(db_path: &String, app_name: &String) -> RS } pub struct LibSQLAsyncConn { - inner: Arc>, + inner: Arc>, } impl LibSQLAsyncConn { async fn new(db_path: String) -> RS { let conn = LibSQLAsyncConnInner::new(db_path).await?; Ok(Self { - inner: Arc::new(Mutex::new(conn)), + inner: Arc::new(AMutex::new(conn)), }) } async fn handle_inner(&self, f: F) -> RS where - F: AsyncFnOnce(MutexGuard) -> RS, + F: AsyncFnOnce(AMutexGuard) -> RS, { let guard = self.inner.lock().await; f(guard).await @@ -44,35 +44,35 @@ impl LibSQLAsyncConn { #[async_trait] impl DBConnAsync for LibSQLAsyncConn { async fn prepare(&self, stmt: Box) -> RS> { - self.handle_inner(async move |inner: MutexGuard| { + self.handle_inner(async move |inner: AMutexGuard| { inner.prepare(stmt).await }) .await } async fn exec_silent(&self, sql_text: String) -> RS<()> { - self.handle_inner(async move |inner: MutexGuard| { + self.handle_inner(async move |inner: AMutexGuard| { inner.exec_silent(sql_text).await }) .await } async fn begin_tx(&self) -> RS { - self.handle_inner(async |mut inner: MutexGuard| { + self.handle_inner(async |mut inner: AMutexGuard| { inner.begin_tx().await }) .await } async fn rollback_tx(&self) -> RS<()> { - self.handle_inner(async |mut inner: MutexGuard| { + self.handle_inner(async |mut inner: AMutexGuard| { inner.rollback_tx().await }) .await } async fn commit_tx(&self) -> RS<()> { - self.handle_inner(async |mut inner: MutexGuard| { + self.handle_inner(async |mut inner: AMutexGuard| { inner.commit_tx().await }) .await @@ -83,18 +83,18 @@ impl DBConnAsync for LibSQLAsyncConn { sql: Box, param: Box, ) -> RS> { - let f = async move |inner: MutexGuard| inner.query(sql, param).await; + let f = async move |inner: AMutexGuard| inner.query(sql, param).await; self.handle_inner(f).await } async fn execute(&self, sql: Box, param: Box) -> RS { let f = - async move |inner: MutexGuard| inner.command(sql, param).await; + async move |inner: AMutexGuard| inner.command(sql, param).await; self.handle_inner(f).await } async fn batch(&self, sql: Box, param: Box) -> RS { - let f = async move |inner: MutexGuard| inner.batch(sql, param).await; + let f = async move |inner: AMutexGuard| inner.batch(sql, param).await; self.handle_inner(f).await } } diff --git a/mudu_runtime/src/db_libsql_async/libsql_async_conn_inner.rs b/mudu_runtime/src/db_libsql_async/libsql_async_conn_inner.rs index 14b36c0..ac7334a 100644 --- a/mudu_runtime/src/db_libsql_async/libsql_async_conn_inner.rs +++ b/mudu_runtime/src/db_libsql_async/libsql_async_conn_inner.rs @@ -255,6 +255,21 @@ fn _to_libsql_value(datum: &DatValue, ty: &DatType) -> RS { DatTypeID::F32 => libsql::Value::Real(datum.expect_f32().clone() as _), DatTypeID::F64 => libsql::Value::Real(datum.expect_f64().clone() as _), DatTypeID::String => libsql::Value::Text(datum.expect_string().clone()), + DatTypeID::Numeric => libsql::Value::Text(datum.expect_numeric().to_plain_string()), + DatTypeID::Date => libsql::Value::Text(datum.expect_date().format()), + DatTypeID::Time => libsql::Value::Text(datum.expect_time().format(6)), + DatTypeID::Timestamp => libsql::Value::Text( + datum + .expect_timestamp() + .format(6) + .map_err(|e| m_error!(EC::TypeErr, e))?, + ), + DatTypeID::TimestampTz => libsql::Value::Text( + datum + .expect_timestamptz() + .format(6) + .map_err(|e| m_error!(EC::TypeErr, e))?, + ), DatTypeID::Array => libsql::Value::Blob(datum.to_binary(ty)?.into()), DatTypeID::Record => libsql::Value::Blob(datum.to_binary(ty)?.into()), DatTypeID::Binary => libsql::Value::Blob(datum.to_binary(ty)?.into()), diff --git a/mudu_runtime/src/db_libsql_async/result_set.rs b/mudu_runtime/src/db_libsql_async/result_set.rs index 9f2ac0d..2ef8455 100644 --- a/mudu_runtime/src/db_libsql_async/result_set.rs +++ b/mudu_runtime/src/db_libsql_async/result_set.rs @@ -9,9 +9,9 @@ use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_contract::tuple::tuple_value::TupleValue; use mudu_type::dat_type_id::DatTypeID; use mudu_type::dat_value::DatValue; +use mudu_utils::sync::a_mutex::AMutex; use std::sync::Arc; use std::sync::Mutex as StdMutex; -use tokio::sync::Mutex; use tracing::debug; pub trait ResultSetLease: Send + Sync { @@ -23,7 +23,7 @@ pub struct LibSQLAsyncResultSet { } pub struct ResultSetInner { - row: Mutex, + row: AMutex, tuple_desc: Arc, lease: StdMutex>>, } @@ -59,7 +59,7 @@ impl ResultSetInner { lease: Option>, ) -> ResultSetInner { Self { - row: Mutex::new(row), + row: AMutex::new(row), tuple_desc, lease: StdMutex::new(lease), } diff --git a/mudu_runtime/src/interface/kernel.rs b/mudu_runtime/src/interface/kernel.rs index d5eee89..337b8d0 100644 --- a/mudu_runtime/src/interface/kernel.rs +++ b/mudu_runtime/src/interface/kernel.rs @@ -8,6 +8,7 @@ use mudu_contract::database::result_batch::ResultBatch; use mudu_contract::database::sql::Context; use mudu_contract::tuple::tuple_field_desc::TupleFieldDesc; use mudu_kernel::server::worker_local::WorkerLocalRef; +use mudu_utils::task_trace; /// Execute a SQL query with parameters pub fn query_internal(query_in: &[u8]) -> Vec { @@ -76,7 +77,20 @@ pub async fn async_fetch_internal(_: Vec) -> Vec { /// Execute a SQL command with parameters pub async fn async_command_internal(command_in: Vec) -> Vec { + let trace = task_trace!(); + trace.watch( + "procedure.host.command.stage", + "async_command_internal_start", + ); let r = _async_command_internal(command_in).await; + trace.watch( + "procedure.host.command.stage", + if r.is_ok() { + "async_command_internal_done" + } else { + "async_command_internal_error" + }, + ); mudu_binding::system::command_invoke::serialize_command_result(r) } @@ -89,8 +103,7 @@ async fn _async_command_internal(command_in: Vec) -> RS { let (oid, stmt, param) = mudu_binding::system::command_invoke::deserialize_command_param(&command_in)?; let context = get_context(oid)?; - let r = context.command_async(stmt, param).await?; - Ok(r) + context.command_async(stmt, param).await } async fn _async_batch_internal(batch_in: Vec) -> RS { diff --git a/mudu_runtime/src/lib.rs b/mudu_runtime/src/lib.rs index b67dc5d..b553f08 100644 --- a/mudu_runtime/src/lib.rs +++ b/mudu_runtime/src/lib.rs @@ -8,3 +8,5 @@ mod procedure; pub mod resolver; pub mod service; mod sql_prepare; + +pub use mudu_sys::tokio; diff --git a/mudu_runtime/src/service/app_inst_impl.rs b/mudu_runtime/src/service/app_inst_impl.rs index 32d8233..f4718dd 100644 --- a/mudu_runtime/src/service/app_inst_impl.rs +++ b/mudu_runtime/src/service/app_inst_impl.rs @@ -17,6 +17,7 @@ use mudu_contract::database::sql::{Context, DBConn}; use mudu_contract::procedure::proc_desc::ProcDesc; use mudu_contract::procedure::procedure_param::ProcedureParam; use mudu_contract::procedure::procedure_result::ProcedureResult; +use mudu_kernel::async_rt::contract::AsyncRuntime; use mudu_kernel::server::worker_local::WorkerLocalRef; use mudu_utils::task_id::{TaskID, new_task_id}; use mudu_utils::task_trace; @@ -39,6 +40,7 @@ struct AppInstImplInner { modules: HashMap, _conn: HashMap, component_target: ComponentTarget, + async_runtime: Option>, } impl AppInstImpl { @@ -49,6 +51,7 @@ impl AppInstImpl { component_target: ComponentTarget, enable_async: bool, server_mode: ServerMode, + async_runtime: Option>, ) -> RS { Ok(Self { inner: Arc::new( @@ -59,6 +62,7 @@ impl AppInstImpl { component_target, enable_async, server_mode, + async_runtime, ) .await?, ), @@ -88,6 +92,10 @@ impl AppInstImpl { pub fn schema_mgr(&self) -> &SchemaMgr { &self.inner.schema_mgr() } + + pub fn async_runtime(&self) -> Option> { + self.inner.async_runtime() + } } impl AppInstImplInner { @@ -98,6 +106,7 @@ impl AppInstImplInner { component_target: ComponentTarget, enable_async: bool, server_mode: ServerMode, + async_runtime: Option>, ) -> RS { let modules = HashMap::new(); let app_cfg = &package.package_cfg; @@ -116,6 +125,7 @@ impl AppInstImplInner { &schema_mgr, enable_async, server_mode, + async_runtime.clone(), ) .await?; Ok(Self { @@ -127,6 +137,7 @@ impl AppInstImplInner { modules, _conn: Default::default(), component_target, + async_runtime, }) } @@ -185,16 +196,23 @@ impl AppInstImplInner { param: ProcedureParam, worker_local: Option, ) -> RS { - task_trace!(); + let trace = task_trace!(); + trace.watch("procedure.mode", "async"); + trace.watch("procedure.task_id", &task_id.to_string()); + trace.watch("procedure.module", mod_name); + trace.watch("procedure.name", proc_name); if !self.enable_async { return Err(m_error!( EC::DBInternalError, "enable async mode when call async procedure" )); } + trace.watch("procedure.stage", "pre_invoke"); let (procedure, param, new_tx) = self.pre_invoke(task_id, mod_name, proc_name, param).await?; let xid = param.session_id(); + trace.watch("procedure.session_id", &xid.to_string()); + trace.watch("procedure.stage", "call_async"); let result = ProcedureInvokeComponent::call_async( &procedure, self.component_target, @@ -205,11 +223,14 @@ impl AppInstImplInner { .await; if new_tx { if result.is_ok() { + trace.watch("procedure.stage", "commit_async"); Context::commit_async(xid).await?; } else { + trace.watch("procedure.stage", "rollback_async"); Context::rollback_async(xid).await?; } } + trace.watch("procedure.stage", "done"); Ok(result?) } @@ -223,6 +244,7 @@ impl AppInstImplInner { &self.package_cfg.name, self.enable_async, self.server_mode, + self.async_runtime(), ) .await?; self._conn.insert_sync(task_id, db_conn).map_err(|_e| { @@ -250,6 +272,10 @@ impl AppInstImplInner { &self.schema_mgr } + pub fn async_runtime(&self) -> Option> { + self.async_runtime.clone() + } + async fn pre_invoke( &self, task_id: TaskID, @@ -257,7 +283,8 @@ impl AppInstImplInner { proc_name: &String, param: ProcedureParam, ) -> RS<(Procedure, ProcedureParam, bool)> { - task_trace!(); + let trace = task_trace!(); + trace.watch("procedure.pre_invoke.stage", "lookup"); let procedure = self.procedure(mod_name, proc_name).ok_or_else(|| { m_error!( EC::NoneErr, @@ -273,11 +300,14 @@ impl AppInstImplInner { let context = Context::create(task_id, conn)?; let mut param = param; param.set_session_id(context.session_id()); + trace.watch("procedure.pre_invoke.stage", "begin_tx_start"); context.begin_tx().await?; + trace.watch("procedure.pre_invoke.stage", "begin_tx_done"); (param, true) } else { (param, false) }; + trace.watch("procedure.pre_invoke.stage", "done"); Ok((procedure, param, new_tx)) } } @@ -287,8 +317,9 @@ async fn new_conn( app_name: &String, enable_async: bool, server_mode: ServerMode, + async_runtime: Option>, ) -> RS { - let db_type = if server_mode == ServerMode::IOUring { + let db_type = if matches!(server_mode, ServerMode::IOUring | ServerMode::Tokio) { "MuduDB".to_string() } else if enable_async { "LibSQLAsync".to_string() @@ -296,7 +327,7 @@ async fn new_conn( "LibSQL".to_string() }; let conn_str = format!("db={} app={} db_type={}", db_path, app_name, db_type); - let db_conn = DBConnector::connect(&conn_str).await?; + let db_conn = DBConnector::connect_with_async_runtime(&conn_str, async_runtime).await?; Ok(db_conn) } @@ -307,17 +338,27 @@ async fn initdb( schema_mgr: &SchemaMgr, enable_async: bool, server_mode: ServerMode, + async_runtime: Option>, ) -> RS<()> { let init_db_lock = PathBuf::from(&db_path).join(format!("{}.lock", app_name)); if init_db_lock.exists() { - if server_mode == ServerMode::IOUring { + if matches!(server_mode, ServerMode::IOUring | ServerMode::Tokio) { return Ok(()); } - if is_schema_initialized(db_path, app_name, schema_mgr, enable_async, server_mode).await? { + if is_schema_initialized( + db_path, + app_name, + schema_mgr, + enable_async, + server_mode, + async_runtime.clone(), + ) + .await? + { return Ok(()); } } - let conn = new_conn(db_path, app_name, enable_async, server_mode).await?; + let conn = new_conn(db_path, app_name, enable_async, server_mode, async_runtime).await?; conn.execute_silent(sql.clone()).await?; File::create(&init_db_lock).map_err(|e| { m_error!( @@ -335,8 +376,9 @@ async fn is_schema_initialized( schema_mgr: &SchemaMgr, enable_async: bool, server_mode: ServerMode, + async_runtime: Option>, ) -> RS { - let conn = new_conn(db_path, app_name, enable_async, server_mode).await?; + let conn = new_conn(db_path, app_name, enable_async, server_mode, async_runtime).await?; for table_name in schema_mgr.table_names() { let verify_sql = format!("SELECT 1 FROM {} LIMIT 1;", table_name); if conn.execute_silent(verify_sql).await.is_err() { diff --git a/mudu_runtime/src/service/procedure_invoke_component.rs b/mudu_runtime/src/service/procedure_invoke_component.rs index d00d365..33ad4dd 100644 --- a/mudu_runtime/src/service/procedure_invoke_component.rs +++ b/mudu_runtime/src/service/procedure_invoke_component.rs @@ -9,6 +9,7 @@ use mudu_binding::procedure::procedure_invoke; use mudu_contract::procedure::procedure_param::ProcedureParam; use mudu_contract::procedure::procedure_result::ProcedureResult; use mudu_kernel::server::worker_local::WorkerLocalRef; +use mudu_utils::task_trace; use std::sync::Mutex; use wasmtime::Store; use wasmtime::component::{InstancePre, TypedFunc}; @@ -41,11 +42,15 @@ impl ProcedureInvokeComponent { param: ProcedureParam, worker_local: Option, ) -> RS { + let trace = task_trace!(); + trace.watch("procedure.component.stage", "call_async_start"); let name = component_proc_name(component_target, procedure.proc_name())?; let name = to_kebab_case(&name); + trace.watch("procedure.component.name", &name); let context = build_wasi_component_context(worker_local); let p = procedure.instance().as_component_instance_pre(); let this: Self = Self::new_async(context, p, name, proc_opt).await?; + trace.watch("procedure.component.stage", "invoke_async_start"); this.invoke_async(param).await } @@ -82,7 +87,7 @@ impl ProcedureInvokeComponent { let inner: ProcedureInvokeInner = inner .into_inner() .map_err(|e| m_error!(EC::MuduError, "mutex into inner error", e))?; - let thread = mudu_sys::task::spawn_thread(move || { + let thread = mudu_sys::task_sync::spawn_thread(move || { let ret = inner.invoke(param); ret })?; diff --git a/mudu_runtime/src/service/runtime.rs b/mudu_runtime/src/service/runtime.rs index c59b40d..6509a3d 100644 --- a/mudu_runtime/src/service/runtime.rs +++ b/mudu_runtime/src/service/runtime.rs @@ -1,6 +1,7 @@ use crate::service::app_inst::AppInst; use async_trait::async_trait; use mudu::common::result::RS; +use mudu_kernel::async_rt::contract::AsyncRuntime; use std::sync::Arc; #[async_trait] @@ -10,4 +11,6 @@ pub trait Runtime: Send + Sync { async fn app(&self, app_name: String) -> Option>; async fn install(&self, pkg_path: String) -> RS<()>; + + fn async_runtime(&self) -> Option>; } diff --git a/mudu_runtime/src/service/runtime_impl.rs b/mudu_runtime/src/service/runtime_impl.rs index 2cf9c97..aedcc30 100644 --- a/mudu_runtime/src/service/runtime_impl.rs +++ b/mudu_runtime/src/service/runtime_impl.rs @@ -6,6 +6,7 @@ use async_trait::async_trait; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_kernel::async_rt::contract::AsyncRuntime; use mudu_utils::notifier::Notifier; use std::path::PathBuf; use std::sync::Arc; @@ -55,6 +56,10 @@ impl Runtime for RuntimeImpl { async fn install(&self, pkg_path: String) -> RS<()> { self.inner.install(pkg_path).await } + + fn async_runtime(&self) -> Option> { + self.inner.async_runtime() + } } unsafe impl Sync for RuntimeImpl {} diff --git a/mudu_runtime/src/service/runtime_impl_test.rs b/mudu_runtime/src/service/runtime_impl_test.rs index 788ea35..4ecddf3 100644 --- a/mudu_runtime/src/service/runtime_impl_test.rs +++ b/mudu_runtime/src/service/runtime_impl_test.rs @@ -1,5 +1,6 @@ #[cfg(test)] mod tests { + use crate::backend::mududb_cfg::ServerMode; use crate::service::runtime_impl::create_runtime_service; use crate::service::runtime_opt::RuntimeOpt; use crate::service::test_wasm_mod_path::wasm_mod_path; @@ -56,4 +57,33 @@ mod tests { let _ = fs::remove_dir_all(package_dir); let _ = fs::remove_dir_all(db_path); } + + #[tokio::test] + async fn create_runtime_service_injects_tokio_async_runtime() { + let package_dir = temp_path("runtime_impl_tokio_pkg_dir"); + let db_path = temp_path("runtime_impl_tokio_db_dir"); + fs::create_dir_all(&package_dir).unwrap(); + + let runtime = create_runtime_service( + &package_dir.to_string_lossy().to_string(), + &db_path.to_string_lossy().to_string(), + None, + RuntimeOpt { + sever_mode: ServerMode::Tokio, + async_runtime: RuntimeOpt::build_async_runtime(ServerMode::Tokio), + ..RuntimeOpt::default() + }, + ) + .await + .unwrap(); + + let async_runtime = runtime.async_runtime().expect("tokio async runtime"); + assert!(matches!( + async_runtime.mode(), + mudu_kernel::async_rt::mode::AsyncMode::Tokio + )); + + let _ = fs::remove_dir_all(package_dir); + let _ = fs::remove_dir_all(db_path); + } } diff --git a/mudu_runtime/src/service/runtime_opt.rs b/mudu_runtime/src/service/runtime_opt.rs index 5700b20..7c9bbde 100644 --- a/mudu_runtime/src/service/runtime_opt.rs +++ b/mudu_runtime/src/service/runtime_opt.rs @@ -1,5 +1,10 @@ use crate::backend::mududb_cfg::ServerMode; +use mudu_kernel::async_rt::contract::AsyncRuntime; +#[cfg(target_os = "linux")] +use mudu_kernel::async_rt::linux::runtime::IoUringRuntime; +use mudu_kernel::async_rt::tokio::runtime::TokioRuntime; use serde::{Deserialize, Serialize}; +use std::sync::Arc; #[derive(Debug, Clone, Copy, Serialize, Deserialize, Eq, PartialEq, Default)] #[serde(rename_all = "snake_case")] @@ -9,18 +14,31 @@ pub enum ComponentTarget { P3, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Clone)] pub struct RuntimeOpt { - #[serde(default)] pub component_target: ComponentTarget, pub enable_async: bool, pub sever_mode: ServerMode, + pub async_runtime: Option>, } impl RuntimeOpt { pub fn component_target(&self) -> ComponentTarget { self.component_target } + + pub fn async_runtime(&self) -> Option> { + self.async_runtime.clone() + } + + pub fn build_async_runtime(server_mode: ServerMode) -> Option> { + match server_mode { + #[cfg(target_os = "linux")] + ServerMode::IOUring => Some(Arc::new(IoUringRuntime::new())), + ServerMode::Tokio => Some(Arc::new(TokioRuntime::new())), + _ => None, + } + } } impl Default for RuntimeOpt { @@ -29,6 +47,18 @@ impl Default for RuntimeOpt { component_target: ComponentTarget::P2, enable_async: false, sever_mode: Default::default(), + async_runtime: None, } } } + +impl std::fmt::Debug for RuntimeOpt { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("RuntimeOpt") + .field("component_target", &self.component_target) + .field("enable_async", &self.enable_async) + .field("sever_mode", &self.sever_mode) + .field("has_async_runtime", &self.async_runtime.is_some()) + .finish() + } +} diff --git a/mudu_runtime/src/service/runtime_simple.rs b/mudu_runtime/src/service/runtime_simple.rs index f267ac3..ae9ef63 100644 --- a/mudu_runtime/src/service/runtime_simple.rs +++ b/mudu_runtime/src/service/runtime_simple.rs @@ -7,6 +7,7 @@ use crate::service::wt_runtime::WTRuntime; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_kernel::async_rt::contract::AsyncRuntime; use scc::HashMap as SCCHashMap; use std::fs; use std::path::{Path, PathBuf}; @@ -141,6 +142,7 @@ impl RuntimeSimple { self.rt_opt.component_target(), self.rt_opt.enable_async, self.rt_opt.sever_mode, + self.rt_opt.async_runtime(), ) .await?; let mpk_name = app_instance.name().clone(); @@ -180,4 +182,8 @@ impl RuntimeSimple { self.install_pkg(pkg_path).await?; Ok(()) } + + pub fn async_runtime(&self) -> Option> { + self.rt_opt.async_runtime() + } } diff --git a/mudu_runtime/src/service/runtime_simple_test.rs b/mudu_runtime/src/service/runtime_simple_test.rs index 8aef19d..b9c17c4 100644 --- a/mudu_runtime/src/service/runtime_simple_test.rs +++ b/mudu_runtime/src/service/runtime_simple_test.rs @@ -11,7 +11,7 @@ mod tests { use mudu_contract::tuple::tuple_datum::TupleDatum; use mudu_utils::log::log_setup_ex; use mudu_utils::notifier::NotifyWait; - use mudu_utils::task::spawn_task; + use mudu_utils::task_async::spawn_task; use mudu_utils::task_trace::this_task_id; use std::env::temp_dir; use std::path::PathBuf; @@ -40,8 +40,8 @@ mod tests { } fn test_runtime_simple(test_kind: TestProc) { - log_setup_ex("debug", "", false); - tokio::runtime::Builder::new_multi_thread() + log_setup_ex("info", "", false); + mudu_sys::tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .unwrap() @@ -70,6 +70,7 @@ mod tests { component_target: crate::service::runtime_opt::ComponentTarget::P2, enable_async, sever_mode: Default::default(), + async_runtime: None, }, ) .await?; diff --git a/mudu_runtime/src/service/service_impl.rs b/mudu_runtime/src/service/service_impl.rs index 2335d68..5a517d8 100644 --- a/mudu_runtime/src/service/service_impl.rs +++ b/mudu_runtime/src/service/service_impl.rs @@ -3,6 +3,7 @@ use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; use mudu_utils::sync::async_task::TaskWrapper; +use mudu_utils::task_async::build_current_thread_runtime; use tracing::debug; pub struct ServiceImpl { @@ -25,10 +26,7 @@ impl ServiceTrait for ServiceImpl { fn serve(self) -> RS<()> { let tasks = self.tasks; - let mut builder = tokio::runtime::Builder::new_current_thread(); - let r = builder - .enable_all() - .build() + let r = build_current_thread_runtime() .map_err(|e| m_error!(EC::IOErr, "build runtime error", e))? .block_on(async { let mut task_result = vec![]; diff --git a/mudu_runtime/src/service/wt_runtime_component_test.rs b/mudu_runtime/src/service/wt_runtime_component_test.rs index e12aff2..131a17f 100644 --- a/mudu_runtime/src/service/wt_runtime_component_test.rs +++ b/mudu_runtime/src/service/wt_runtime_component_test.rs @@ -40,6 +40,7 @@ mod tests { component_target: ComponentTarget::P3, enable_async: false, sever_mode: Default::default(), + async_runtime: None, }) .unwrap(); diff --git a/mudu_sys/Cargo.toml b/mudu_sys/Cargo.toml index 451e9cc..e051176 100644 --- a/mudu_sys/Cargo.toml +++ b/mudu_sys/Cargo.toml @@ -9,6 +9,10 @@ uuid = { workspace = true } chrono = { workspace = true } async-trait = { workspace = true } tracing = { workspace = true } +lazy_static = { workspace = true } +scc = { workspace = true } +async-backtrace = { workspace = true } +futures = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] libc = { workspace = true } diff --git a/mudu_sys/src/api/env.rs b/mudu_sys/src/api/env.rs index fcb4c45..c93255a 100644 --- a/mudu_sys/src/api/env.rs +++ b/mudu_sys/src/api/env.rs @@ -2,7 +2,8 @@ use crate::api::fs::SysFs; use crate::api::net::SysNet; use crate::api::random::SysRandom; use crate::api::sync::SysSync; -use crate::api::task::SysTask; +use crate::api::task_async::SysTaskAsync; +use crate::api::task_sync::SysTaskSync; use crate::api::time::SysTime; pub trait SysEnv: Send + Sync { @@ -10,6 +11,7 @@ pub trait SysEnv: Send + Sync { fn random(&self) -> &dyn SysRandom; fn fs(&self) -> &dyn SysFs; fn net(&self) -> &dyn SysNet; - fn task(&self) -> &dyn SysTask; + fn task_async(&self) -> &dyn SysTaskAsync; + fn task_sync(&self) -> &dyn SysTaskSync; fn sync(&self) -> &dyn SysSync; } diff --git a/mudu_sys/src/api/mod.rs b/mudu_sys/src/api/mod.rs index 52734cf..5d34e8e 100644 --- a/mudu_sys/src/api/mod.rs +++ b/mudu_sys/src/api/mod.rs @@ -3,5 +3,6 @@ pub mod fs; pub mod net; pub mod random; pub mod sync; -pub mod task; +pub mod task_async; +pub mod task_sync; pub mod time; diff --git a/mudu_sys/src/api/task.rs b/mudu_sys/src/api/task.rs index 4ca6210..c6fd2b8 100644 --- a/mudu_sys/src/api/task.rs +++ b/mudu_sys/src/api/task.rs @@ -1,9 +1,2 @@ -use async_trait::async_trait; -use mudu::common::result::RS; -use std::time::Duration; - -#[async_trait] -pub trait SysTask: Send + Sync { - async fn sleep(&self, dur: Duration) -> RS<()>; - fn sleep_blocking(&self, dur: Duration); -} +pub use crate::api::task_async::SysTaskAsync; +pub use crate::api::task_sync::SysTaskSync; diff --git a/mudu_sys/src/api/task_async.rs b/mudu_sys/src/api/task_async.rs new file mode 100644 index 0000000..950e549 --- /dev/null +++ b/mudu_sys/src/api/task_async.rs @@ -0,0 +1,8 @@ +use async_trait::async_trait; +use mudu::common::result::RS; +use std::time::Duration; + +#[async_trait] +pub trait SysTaskAsync: Send + Sync { + async fn sleep(&self, dur: Duration) -> RS<()>; +} diff --git a/mudu_sys/src/api/task_sync.rs b/mudu_sys/src/api/task_sync.rs new file mode 100644 index 0000000..fcde170 --- /dev/null +++ b/mudu_sys/src/api/task_sync.rs @@ -0,0 +1,5 @@ +use std::time::Duration; + +pub trait SysTaskSync: Send + Sync { + fn sleep_blocking(&self, dur: Duration); +} diff --git a/mudu_sys/src/lib.rs b/mudu_sys/src/lib.rs index 7626563..a94d278 100644 --- a/mudu_sys/src/lib.rs +++ b/mudu_sys/src/lib.rs @@ -8,11 +8,23 @@ pub mod net; #[cfg(not(target_os = "linux"))] mod portable; pub mod sync; +#[cfg(not(target_arch = "wasm32"))] +pub mod sync_async; +pub mod sync_sync; +#[deprecated(note = "use mudu_sys::task_async or mudu_sys::task_sync instead")] pub mod task; +#[cfg(not(target_arch = "wasm32"))] +pub mod task_async; +pub mod task_context; +pub mod task_id; +pub mod task_sync; #[cfg(target_os = "linux")] #[path = "linux/uring.rs"] pub mod uring; +#[cfg(not(target_arch = "wasm32"))] +pub use tokio; + pub mod random { pub use crate::api::random::{next_uuid_v4_string, uuid_v4}; } diff --git a/mudu_sys/src/linux/env.rs b/mudu_sys/src/linux/env.rs index 5cc0c4d..7c3e0aa 100644 --- a/mudu_sys/src/linux/env.rs +++ b/mudu_sys/src/linux/env.rs @@ -3,13 +3,15 @@ use crate::api::fs::SysFs; use crate::api::net::SysNet; use crate::api::random::SysRandom; use crate::api::sync::SysSync; -use crate::api::task::SysTask; +use crate::api::task_async::SysTaskAsync; +use crate::api::task_sync::SysTaskSync; use crate::api::time::SysTime; use crate::linux::fs::LinuxFs; use crate::linux::net::LinuxNet; use crate::linux::random::LinuxRandom; use crate::linux::sync::LinuxSync; -use crate::linux::task::LinuxTask; +use crate::linux::task_async::LinuxTaskAsync; +use crate::linux::task_sync::LinuxTaskSync; use crate::linux::time::LinuxTime; pub struct LinuxSysEnv { @@ -17,7 +19,8 @@ pub struct LinuxSysEnv { random: LinuxRandom, fs: LinuxFs, net: LinuxNet, - task: LinuxTask, + task_async: LinuxTaskAsync, + task_sync: LinuxTaskSync, sync: LinuxSync, } @@ -28,7 +31,8 @@ impl LinuxSysEnv { random: LinuxRandom, fs: LinuxFs, net: LinuxNet, - task: LinuxTask, + task_async: LinuxTaskAsync, + task_sync: LinuxTaskSync, sync: LinuxSync, } } @@ -51,8 +55,12 @@ impl SysEnv for LinuxSysEnv { &self.net } - fn task(&self) -> &dyn SysTask { - &self.task + fn task_async(&self) -> &dyn SysTaskAsync { + &self.task_async + } + + fn task_sync(&self) -> &dyn SysTaskSync { + &self.task_sync } fn sync(&self) -> &dyn SysSync { diff --git a/mudu_sys/src/linux/mod.rs b/mudu_sys/src/linux/mod.rs index 52734cf..5d34e8e 100644 --- a/mudu_sys/src/linux/mod.rs +++ b/mudu_sys/src/linux/mod.rs @@ -3,5 +3,6 @@ pub mod fs; pub mod net; pub mod random; pub mod sync; -pub mod task; +pub mod task_async; +pub mod task_sync; pub mod time; diff --git a/mudu_sys/src/linux/task.rs b/mudu_sys/src/linux/task.rs index f0b873b..aedf74c 100644 --- a/mudu_sys/src/linux/task.rs +++ b/mudu_sys/src/linux/task.rs @@ -1,18 +1,2 @@ -use crate::api::task::SysTask; -use async_trait::async_trait; -use mudu::common::result::RS; -use std::time::Duration; - -pub struct LinuxTask; - -#[async_trait] -impl SysTask for LinuxTask { - async fn sleep(&self, dur: Duration) -> RS<()> { - tokio::time::sleep(dur).await; - Ok(()) - } - - fn sleep_blocking(&self, dur: Duration) { - std::thread::sleep(dur); - } -} +pub use crate::linux::task_async::*; +pub use crate::linux::task_sync::*; diff --git a/mudu_sys/src/linux/task_async.rs b/mudu_sys/src/linux/task_async.rs new file mode 100644 index 0000000..406a565 --- /dev/null +++ b/mudu_sys/src/linux/task_async.rs @@ -0,0 +1,14 @@ +use crate::api::task_async::SysTaskAsync; +use async_trait::async_trait; +use mudu::common::result::RS; +use std::time::Duration; + +pub struct LinuxTaskAsync; + +#[async_trait] +impl SysTaskAsync for LinuxTaskAsync { + async fn sleep(&self, dur: Duration) -> RS<()> { + tokio::time::sleep(dur).await; + Ok(()) + } +} diff --git a/mudu_sys/src/linux/task_sync.rs b/mudu_sys/src/linux/task_sync.rs new file mode 100644 index 0000000..e50c37a --- /dev/null +++ b/mudu_sys/src/linux/task_sync.rs @@ -0,0 +1,10 @@ +use crate::api::task_sync::SysTaskSync; +use std::time::Duration; + +pub struct LinuxTaskSync; + +impl SysTaskSync for LinuxTaskSync { + fn sleep_blocking(&self, dur: Duration) { + std::thread::sleep(dur); + } +} diff --git a/mudu_sys/src/linux/uring.rs b/mudu_sys/src/linux/uring.rs index 2cca839..13e78da 100644 --- a/mudu_sys/src/linux/uring.rs +++ b/mudu_sys/src/linux/uring.rs @@ -134,6 +134,12 @@ mod linux { } } + pub fn prep_mkdirat(&mut self, dirfd: RawFd, path: &CStr, mode: u32) { + unsafe { + rliburing::io_uring_prep_mkdirat(self.raw, dirfd, path.as_ptr(), mode); + } + } + pub fn prep_close(&mut self, fd: RawFd) { unsafe { rliburing::io_uring_prep_close(self.raw, fd) }; } @@ -189,6 +195,32 @@ mod linux { pub fn prep_shutdown(&mut self, fd: RawFd, how: i32) { unsafe { rliburing::io_uring_prep_shutdown(self.raw, fd, how) }; } + + pub fn prep_unlinkat(&mut self, dirfd: RawFd, path: &CStr, flags: i32) { + unsafe { + rliburing::io_uring_prep_unlinkat(self.raw, dirfd, path.as_ptr(), flags); + } + } + + pub fn prep_statx( + &mut self, + dirfd: RawFd, + path: &CStr, + flags: i32, + mask: u32, + statxbuf: *mut libc::statx, + ) { + unsafe { + rliburing::io_uring_prep_statx( + self.raw, + dirfd, + path.as_ptr(), + flags, + mask, + statxbuf as *mut rliburing::statx, + ); + } + } } impl SockAddrBuf { diff --git a/mudu_sys/src/portable/env.rs b/mudu_sys/src/portable/env.rs index 615bc0f..f62cbda 100644 --- a/mudu_sys/src/portable/env.rs +++ b/mudu_sys/src/portable/env.rs @@ -3,9 +3,11 @@ use crate::api::fs::SysFs; use crate::api::net::SysNet; use crate::api::random::SysRandom; use crate::api::sync::SysSync; -use crate::api::task::SysTask; +use crate::api::task_async::SysTaskAsync; +use crate::api::task_sync::SysTaskSync; use crate::api::time::SysTime; -use async_trait::async_trait; +use crate::portable::task_async::PortableTaskAsync; +use crate::portable::task_sync::PortableTaskSync; use chrono::{DateTime, Utc}; use mudu::common::result::RS; use mudu::error::ec::EC; @@ -13,7 +15,7 @@ use mudu::m_error; use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; use std::path::{Path, PathBuf}; -use std::time::{Duration, Instant, SystemTime}; +use std::time::{Instant, SystemTime}; use uuid::Uuid; pub struct PortableSysEnv { @@ -21,7 +23,8 @@ pub struct PortableSysEnv { random: PortableRandom, fs: PortableFs, net: UnsupportedNet, - task: PortableTask, + task_async: PortableTaskAsync, + task_sync: PortableTaskSync, sync: UnsupportedSync, } @@ -32,7 +35,8 @@ impl PortableSysEnv { random: PortableRandom, fs: PortableFs, net: UnsupportedNet, - task: PortableTask, + task_async: PortableTaskAsync, + task_sync: PortableTaskSync, sync: UnsupportedSync, } } @@ -55,8 +59,12 @@ impl SysEnv for PortableSysEnv { &self.net } - fn task(&self) -> &dyn SysTask { - &self.task + fn task_async(&self) -> &dyn SysTaskAsync { + &self.task_async + } + + fn task_sync(&self) -> &dyn SysTaskSync { + &self.task_sync } fn sync(&self) -> &dyn SysSync { @@ -287,17 +295,3 @@ impl SysSync for UnsupportedSync { )) } } - -struct PortableTask; - -#[async_trait] -impl SysTask for PortableTask { - async fn sleep(&self, dur: Duration) -> RS<()> { - std::thread::sleep(dur); - Ok(()) - } - - fn sleep_blocking(&self, dur: Duration) { - std::thread::sleep(dur); - } -} diff --git a/mudu_sys/src/portable/mod.rs b/mudu_sys/src/portable/mod.rs index 3d7924f..f00cd62 100644 --- a/mudu_sys/src/portable/mod.rs +++ b/mudu_sys/src/portable/mod.rs @@ -1 +1,3 @@ pub mod env; +pub mod task_async; +pub mod task_sync; diff --git a/mudu_sys/src/portable/task_async.rs b/mudu_sys/src/portable/task_async.rs new file mode 100644 index 0000000..f67c84d --- /dev/null +++ b/mudu_sys/src/portable/task_async.rs @@ -0,0 +1,14 @@ +use crate::api::task_async::SysTaskAsync; +use async_trait::async_trait; +use mudu::common::result::RS; +use std::time::Duration; + +pub struct PortableTaskAsync; + +#[async_trait] +impl SysTaskAsync for PortableTaskAsync { + async fn sleep(&self, dur: Duration) -> RS<()> { + std::thread::sleep(dur); + Ok(()) + } +} diff --git a/mudu_sys/src/portable/task_sync.rs b/mudu_sys/src/portable/task_sync.rs new file mode 100644 index 0000000..cd03e55 --- /dev/null +++ b/mudu_sys/src/portable/task_sync.rs @@ -0,0 +1,10 @@ +use crate::api::task_sync::SysTaskSync; +use std::time::Duration; + +pub struct PortableTaskSync; + +impl SysTaskSync for PortableTaskSync { + fn sleep_blocking(&self, dur: Duration) { + std::thread::sleep(dur); + } +} diff --git a/mudu_sys/src/sync.rs b/mudu_sys/src/sync.rs index 4d6c186..1cd014c 100644 --- a/mudu_sys/src/sync.rs +++ b/mudu_sys/src/sync.rs @@ -1,295 +1,16 @@ -use crate::env::default_env; -use crate::fd::RawFd; -use mudu::common::result::RS; -use mudu::error::ec::EC; -use mudu::m_error; -use std::sync::mpsc; -use std::time::Duration; - -pub fn eventfd() -> RS { - default_env().sync().eventfd() -} - -pub fn notify_eventfd(fd: RawFd) -> RS<()> { - default_env().sync().notify_eventfd(fd) -} - -pub fn read_eventfd(fd: RawFd) -> RS { - default_env().sync().read_eventfd(fd) -} - -pub fn close_fd(fd: RawFd) -> RS<()> { - default_env().sync().close_fd(fd) -} - +//! Compatibility facade for synchronization helpers. +//! +//! New code should import async notification primitives from +//! [`crate::sync_async`] and OS/blocking helpers from [`crate::sync_sync`]. #[cfg(not(target_arch = "wasm32"))] -use std::sync::atomic::{AtomicBool, Ordering}; +pub mod a_mutex; #[cfg(not(target_arch = "wasm32"))] -use std::sync::Arc; +pub mod a_notify; #[cfg(not(target_arch = "wasm32"))] -use tokio::sync::Notify; +pub mod a_rwlock; +pub mod f_mutex; #[cfg(not(target_arch = "wasm32"))] -use tracing::trace; - -// Notifies tasks to wake up. -// If Notifier::notify_waiters is called, all the task call Notifier::notified would complete, and -// the following invocation of Notifier::notified, which after Notifier::notify_waiters called, -// would return immediately +pub mod notify_wait; #[cfg(not(target_arch = "wasm32"))] -#[derive(Clone)] -pub struct NotifyWait { - inner: Arc, -} - -#[cfg(not(target_arch = "wasm32"))] -#[derive(Clone)] -pub struct Notifier { - inner: Arc, -} - -#[cfg(not(target_arch = "wasm32"))] -#[derive(Clone)] -pub struct Waiter { - inner: Arc, -} - -#[cfg(not(target_arch = "wasm32"))] -pub struct NotifyWaitInner { - name: String, - notify: Notify, - is_notified: AtomicBool, -} - -#[cfg(not(target_arch = "wasm32"))] -impl Default for NotifyWait { - fn default() -> Self { - Self::new() - } -} - -#[cfg(not(target_arch = "wasm32"))] -pub fn notify_wait() -> (Notifier, Waiter) { - NotifyWait::new_notify_wait() -} - -#[cfg(not(target_arch = "wasm32"))] -impl NotifyWait { - pub fn new_notify_wait() -> (Notifier, Waiter) { - let inner = Arc::new(NotifyWaitInner::new()); - ( - Notifier { - inner: inner.clone(), - }, - Waiter { inner }, - ) - } - - pub fn notify_wait(&self) -> (Notifier, Waiter) { - ( - Notifier { - inner: self.inner.clone(), - }, - Waiter { - inner: self.inner.clone(), - }, - ) - } - - pub fn new() -> Self { - Self { - inner: Arc::new(NotifyWaitInner::new()), - } - } - - pub fn new_with_name(name: String) -> Self { - Self { - inner: Arc::new(NotifyWaitInner::new_with_name(name)), - } - } - - pub fn is_notified(&self) -> bool { - self.inner.is_notified() - } - - pub async fn notified(&self) { - trace!("notified {}", self.inner.name); - self.inner.notified().await; - } - - pub fn notify_all(&self) -> bool { - trace!("notify waiter {}", self.inner.name); - self.inner.notify_all() - } -} - -#[cfg(not(target_arch = "wasm32"))] -impl NotifyWaitInner { - fn new() -> Self { - Self::new_with_name(Default::default()) - } - - fn new_with_name(name: String) -> Self { - Self { - name, - is_notified: AtomicBool::new(false), - notify: Notify::new(), - } - } - - async fn notified(&self) { - if !self.is_notified.load(Ordering::SeqCst) { - self.notify.notified().await; - } - } - - fn is_notified(&self) -> bool { - self.is_notified.load(Ordering::SeqCst) - } - - fn notify_all(&self) -> bool { - let r = self - .is_notified - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst); - - match r { - Ok(_) => { - self.notify.notify_waiters(); - true - } - Err(_) => { - self.notify.notify_waiters(); - false - } - } - } -} - -#[cfg(not(target_arch = "wasm32"))] -impl Waiter { - pub async fn wait(&self) { - self.inner.notified().await; - } - - pub fn into(self) -> NotifyWait { - NotifyWait { inner: self.inner } - } -} - -#[cfg(not(target_arch = "wasm32"))] -impl Notifier { - pub fn is_notified(&self) -> bool { - self.inner.is_notified() - } - pub fn notify_all(&self) -> bool { - self.inner.notify_all() - } - - pub fn into(self) -> NotifyWait { - NotifyWait { inner: self.inner } - } -} - -pub struct ChannelSender { - inner: mpsc::Sender, -} - -pub struct ChannelSyncSender { - inner: mpsc::SyncSender, -} - -pub struct ChannelReceiver { - inner: mpsc::Receiver, -} - -impl Clone for ChannelSender { - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - } - } -} - -impl Clone for ChannelSyncSender { - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - } - } -} - -pub fn channel() -> (ChannelSender, ChannelReceiver) { - let (tx, rx) = mpsc::channel(); - (ChannelSender { inner: tx }, ChannelReceiver { inner: rx }) -} - -pub fn sync_channel(bound: usize) -> (ChannelSyncSender, ChannelReceiver) { - let (tx, rx) = mpsc::sync_channel(bound); - ( - ChannelSyncSender { inner: tx }, - ChannelReceiver { inner: rx }, - ) -} - -impl ChannelSender { - pub fn send(&self, value: T) -> RS<()> { - match self.inner.send(value) { - Ok(()) => Ok(()), - Err(_) => Err(m_error!(EC::SyncErr, "channel send failed")), - } - } - - pub fn into_inner(self) -> mpsc::Sender { - self.inner - } -} - -impl ChannelSyncSender { - pub fn send(&self, value: T) -> RS<()> { - match self.inner.send(value) { - Ok(()) => Ok(()), - Err(_) => Err(m_error!(EC::SyncErr, "sync_channel send failed")), - } - } - - pub fn try_send(&self, value: T) -> RS<()> { - match self.inner.try_send(value) { - Ok(()) => Ok(()), - Err(mpsc::TrySendError::Full(_)) => Err(m_error!(EC::SyncErr, "sync_channel is full")), - Err(mpsc::TrySendError::Disconnected(_)) => { - Err(m_error!(EC::SyncErr, "sync_channel is disconnected")) - } - } - } - - pub fn into_inner(self) -> mpsc::SyncSender { - self.inner - } -} - -impl ChannelReceiver { - pub fn recv(&self) -> RS { - self.inner - .recv() - .map_err(|e| m_error!(EC::SyncErr, "channel recv failed", e)) - } - - pub fn try_recv(&self) -> RS> { - match self.inner.try_recv() { - Ok(v) => Ok(Some(v)), - Err(mpsc::TryRecvError::Empty) => Ok(None), - Err(e) => Err(m_error!(EC::SyncErr, "channel try_recv failed", e)), - } - } - - pub fn recv_timeout(&self, dur: Duration) -> RS> { - match self.inner.recv_timeout(dur) { - Ok(v) => Ok(Some(v)), - Err(mpsc::RecvTimeoutError::Timeout) => Ok(None), - Err(e) => Err(m_error!(EC::SyncErr, "channel recv_timeout failed", e)), - } - } - - pub fn into_inner(self) -> mpsc::Receiver { - self.inner - } -} +pub use crate::sync_async::*; +pub use crate::sync_sync::*; diff --git a/mudu_sys/src/sync/a_mutex.rs b/mudu_sys/src/sync/a_mutex.rs new file mode 100644 index 0000000..a7d5896 --- /dev/null +++ b/mudu_sys/src/sync/a_mutex.rs @@ -0,0 +1,190 @@ +use std::fmt; +use std::ops::{Deref, DerefMut}; + +use tokio::sync::{ + MappedMutexGuard as TokioMappedMutexGuard, Mutex as TokioMutex, MutexGuard as TokioMutexGuard, +}; + +pub struct AMutex { + inner: TokioMutex, +} + +pub struct AMutexGuard<'a, T: ?Sized> { + inner: TokioMutexGuard<'a, T>, +} + +pub struct MappedAMutexGuard<'a, T: ?Sized> { + inner: TokioMappedMutexGuard<'a, T>, +} + +unsafe impl Send for AMutex where T: ?Sized + Send {} +unsafe impl Sync for AMutex where T: ?Sized + Send {} +unsafe impl Sync for AMutexGuard<'_, T> where T: ?Sized + Send + Sync {} +unsafe impl<'a, T> Sync for MappedAMutexGuard<'a, T> where T: ?Sized + Sync + 'a {} +unsafe impl<'a, T> Send for MappedAMutexGuard<'a, T> where T: ?Sized + Send + 'a {} + +#[derive(Debug)] +pub struct TryLockError(pub ()); + +impl fmt::Display for TryLockError { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(fmt, "operation would block") + } +} + +impl AMutex { + pub fn new(t: T) -> Self + where + T: Sized, + { + Self { + inner: TokioMutex::new(t), + } + } + + pub const fn const_new(t: T) -> Self + where + T: Sized, + { + Self { + inner: TokioMutex::const_new(t), + } + } + + pub async fn lock(&self) -> AMutexGuard<'_, T> { + AMutexGuard { + inner: self.inner.lock().await, + } + } + + pub fn try_lock(&self) -> Option> { + self.inner + .try_lock() + .ok() + .map(|inner| AMutexGuard { inner }) + } + + pub fn into_inner(self) -> T + where + T: Sized, + { + self.inner.into_inner() + } +} + +impl From for AMutex { + fn from(value: T) -> Self { + Self::new(value) + } +} + +impl Default for AMutex +where + T: Default, +{ + fn default() -> Self { + Self::new(T::default()) + } +} + +impl fmt::Debug for AMutex { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl<'a, T: ?Sized> AMutexGuard<'a, T> { + pub fn map(this: Self, f: F) -> MappedAMutexGuard<'a, U> + where + U: ?Sized, + F: FnOnce(&mut T) -> &mut U, + { + MappedAMutexGuard { + inner: TokioMutexGuard::map(this.inner, f), + } + } + + pub fn try_map(this: Self, f: F) -> Result, Self> + where + U: ?Sized, + F: FnOnce(&mut T) -> Option<&mut U>, + { + match TokioMutexGuard::try_map(this.inner, f) { + Ok(inner) => Ok(MappedAMutexGuard { inner }), + Err(inner) => Err(AMutexGuard { inner }), + } + } +} + +impl Deref for AMutexGuard<'_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.inner.deref() + } +} + +impl DerefMut for AMutexGuard<'_, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.inner.deref_mut() + } +} + +impl fmt::Debug for AMutexGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl fmt::Display for AMutexGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl<'a, T: ?Sized> MappedAMutexGuard<'a, T> { + pub fn map(this: Self, f: F) -> MappedAMutexGuard<'a, U> + where + F: FnOnce(&mut T) -> &mut U, + { + MappedAMutexGuard { + inner: TokioMappedMutexGuard::map(this.inner, f), + } + } + + pub fn try_map(this: Self, f: F) -> Result, Self> + where + F: FnOnce(&mut T) -> Option<&mut U>, + { + match TokioMappedMutexGuard::try_map(this.inner, f) { + Ok(inner) => Ok(MappedAMutexGuard { inner }), + Err(inner) => Err(MappedAMutexGuard { inner }), + } + } +} + +impl Deref for MappedAMutexGuard<'_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.inner.deref() + } +} + +impl DerefMut for MappedAMutexGuard<'_, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.inner.deref_mut() + } +} + +impl fmt::Debug for MappedAMutexGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl fmt::Display for MappedAMutexGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} diff --git a/mudu_sys/src/sync/a_notify.rs b/mudu_sys/src/sync/a_notify.rs new file mode 100644 index 0000000..9a572a2 --- /dev/null +++ b/mudu_sys/src/sync/a_notify.rs @@ -0,0 +1,45 @@ +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; + +use tokio::sync::{futures::Notified, Notify as TokioNotify}; + +pub struct ANotify { + inner: TokioNotify, +} + +pub struct ANotified<'a> { + inner: Pin>>, +} + +impl ANotify { + pub fn new() -> Self { + Self { + inner: TokioNotify::new(), + } + } + + pub fn notified(&self) -> ANotified<'_> { + ANotified { + inner: Box::pin(self.inner.notified()), + } + } + + pub fn notify_waiters(&self) { + self.inner.notify_waiters(); + } +} + +impl Default for ANotify { + fn default() -> Self { + Self::new() + } +} + +impl Future for ANotified<'_> { + type Output = (); + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + self.inner.as_mut().poll(cx) + } +} diff --git a/mudu_sys/src/sync/a_rwlock.rs b/mudu_sys/src/sync/a_rwlock.rs new file mode 100644 index 0000000..30abca1 --- /dev/null +++ b/mudu_sys/src/sync/a_rwlock.rs @@ -0,0 +1,119 @@ +use std::fmt; +use std::ops::{Deref, DerefMut}; + +use tokio::sync::{ + RwLock as TokioRwLock, RwLockReadGuard as TokioRwLockReadGuard, + RwLockWriteGuard as TokioRwLockWriteGuard, +}; + +pub struct ARwLock { + inner: TokioRwLock, +} + +pub struct ARwLockReadGuard<'a, T: ?Sized> { + inner: TokioRwLockReadGuard<'a, T>, +} + +pub struct ARwLockWriteGuard<'a, T: ?Sized> { + inner: TokioRwLockWriteGuard<'a, T>, +} + +unsafe impl Send for ARwLock where T: ?Sized + Send + Sync {} +unsafe impl Sync for ARwLock where T: ?Sized + Send + Sync {} + +impl ARwLock { + pub fn new(t: T) -> Self + where + T: Sized, + { + Self { + inner: TokioRwLock::new(t), + } + } + + pub async fn read(&self) -> ARwLockReadGuard<'_, T> { + ARwLockReadGuard { + inner: self.inner.read().await, + } + } + + pub async fn write(&self) -> ARwLockWriteGuard<'_, T> { + ARwLockWriteGuard { + inner: self.inner.write().await, + } + } + + pub fn into_inner(self) -> T + where + T: Sized, + { + self.inner.into_inner() + } +} + +impl From for ARwLock { + fn from(value: T) -> Self { + Self::new(value) + } +} + +impl Default for ARwLock +where + T: Default, +{ + fn default() -> Self { + Self::new(T::default()) + } +} + +impl fmt::Debug for ARwLock { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl Deref for ARwLockReadGuard<'_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.inner.deref() + } +} + +impl fmt::Debug for ARwLockReadGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl fmt::Display for ARwLockReadGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl Deref for ARwLockWriteGuard<'_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.inner.deref() + } +} + +impl DerefMut for ARwLockWriteGuard<'_, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.inner.deref_mut() + } +} + +impl fmt::Debug for ARwLockWriteGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl fmt::Display for ARwLockWriteGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} diff --git a/mudu_sys/src/sync/f_mutex.rs b/mudu_sys/src/sync/f_mutex.rs new file mode 100644 index 0000000..ea325ae --- /dev/null +++ b/mudu_sys/src/sync/f_mutex.rs @@ -0,0 +1,96 @@ +use futures::lock::{Mutex as FuturesMutex, MutexGuard as FuturesMutexGuard}; +use std::fmt; +use std::ops::{Deref, DerefMut}; + +/// Async mutex backed by `futures::lock::Mutex`. +/// +/// We keep this wrapper in `mudu_sys` so higher-level crates do not depend on +/// `futures` directly. This type is specifically useful on execution paths that +/// do not run on a plain Tokio scheduler. In our io_uring/custom-runtime path +/// we observed `tokio::sync::Mutex::lock().await` stall even without real lock +/// contention, while the futures mutex remained stable. +pub struct FMutex { + inner: FuturesMutex, +} + +pub struct FMutexGuard<'a, T: ?Sized> { + inner: FuturesMutexGuard<'a, T>, +} + +unsafe impl Send for FMutex where T: ?Sized + Send {} +unsafe impl Sync for FMutex where T: ?Sized + Send {} + +impl FMutex { + pub fn new(t: T) -> Self + where + T: Sized, + { + Self { + inner: FuturesMutex::new(t), + } + } + + pub async fn lock(&self) -> FMutexGuard<'_, T> { + FMutexGuard { + inner: self.inner.lock().await, + } + } + + pub fn try_lock(&self) -> Option> { + self.inner.try_lock().map(|inner| FMutexGuard { inner }) + } + + pub fn into_inner(self) -> T + where + T: Sized, + { + self.inner.into_inner() + } +} + +impl From for FMutex { + fn from(value: T) -> Self { + Self::new(value) + } +} + +impl Default for FMutex +where + T: Default, +{ + fn default() -> Self { + Self::new(T::default()) + } +} + +impl fmt::Debug for FMutex { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl Deref for FMutexGuard<'_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.inner.deref() + } +} + +impl DerefMut for FMutexGuard<'_, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.inner.deref_mut() + } +} + +impl fmt::Debug for FMutexGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl fmt::Display for FMutexGuard<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} diff --git a/mudu_sys/src/sync/notify_wait.rs b/mudu_sys/src/sync/notify_wait.rs new file mode 100644 index 0000000..dfe46bc --- /dev/null +++ b/mudu_sys/src/sync/notify_wait.rs @@ -0,0 +1,90 @@ +use crate::sync::a_mutex::AMutex; +use mudu::common::result::RS; +use std::sync::{Arc, Mutex}; +use tokio::sync::oneshot::{channel, Receiver, Sender}; +use tokio::sync::Notify as TokioNotify; + +pub fn create_notify_wait() -> (Notify, Wait) { + let (sender, receiver) = channel(); + (Notify::new(sender), Wait::new(receiver)) +} + +#[derive(Clone)] +pub struct Notify { + inner: Arc>>>, +} + +#[derive(Clone)] +pub struct Wait { + inner: Arc>>, +} + +struct WaitInner { + wait: Option>, + result: Option>, + ready: Arc, +} + +impl Notify { + fn new(sender: Sender) -> Self { + Self { + inner: Arc::new(Mutex::new(Some(sender))), + } + } + + pub fn notify(&self, value: T) -> RS { + let sender = self.inner.lock().unwrap().take(); + Ok(sender.is_some_and(|sender| sender.send(value).is_ok())) + } +} + +impl Wait { + fn new(receiver: Receiver) -> Self { + Self { + inner: Arc::new(AMutex::new(WaitInner::new(receiver))), + } + } + + pub async fn wait(&self) -> RS> { + loop { + enum Action { + Return(Option), + AwaitReceiver(Receiver), + AwaitReady(Arc), + } + + let action = { + let mut guard = self.inner.lock().await; + if let Some(result) = guard.result.clone() { + Action::Return(result) + } else if let Some(wait) = guard.wait.take() { + Action::AwaitReceiver(wait) + } else { + Action::AwaitReady(guard.ready.clone()) + } + }; + + match action { + Action::Return(result) => return Ok(result), + Action::AwaitReceiver(wait) => { + let result = wait.await.ok(); + let mut guard = self.inner.lock().await; + guard.result = Some(result.clone()); + guard.ready.notify_waiters(); + return Ok(result); + } + Action::AwaitReady(ready) => ready.notified().await, + } + } + } +} + +impl WaitInner { + fn new(wait: Receiver) -> Self { + Self { + wait: Some(wait), + result: None, + ready: Arc::new(TokioNotify::new()), + } + } +} diff --git a/mudu_sys/src/sync_async.rs b/mudu_sys/src/sync_async.rs new file mode 100644 index 0000000..528e495 --- /dev/null +++ b/mudu_sys/src/sync_async.rs @@ -0,0 +1,158 @@ +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use tokio::sync::Notify; +use tracing::trace; + +#[derive(Clone)] +pub struct NotifyWait { + inner: Arc, +} + +#[derive(Clone)] +pub struct Notifier { + inner: Arc, +} + +#[derive(Clone)] +pub struct Waiter { + inner: Arc, +} + +pub struct NotifyWaitInner { + name: String, + notify: Notify, + is_notified: AtomicBool, +} + +impl Default for NotifyWait { + fn default() -> Self { + Self::new() + } +} + +pub fn notify_wait() -> (Notifier, Waiter) { + NotifyWait::new_notify_wait() +} + +impl NotifyWait { + pub fn new_notify_wait() -> (Notifier, Waiter) { + let inner = Arc::new(NotifyWaitInner::new()); + ( + Notifier { + inner: inner.clone(), + }, + Waiter { inner }, + ) + } + + pub fn notify_wait(&self) -> (Notifier, Waiter) { + ( + Notifier { + inner: self.inner.clone(), + }, + Waiter { + inner: self.inner.clone(), + }, + ) + } + + pub fn new() -> Self { + Self { + inner: Arc::new(NotifyWaitInner::new()), + } + } + + pub fn new_with_name(name: String) -> Self { + Self { + inner: Arc::new(NotifyWaitInner::new_with_name(name)), + } + } + + pub fn is_notified(&self) -> bool { + self.inner.is_notified() + } + + pub async fn notified(&self) { + trace!("notified {}", self.inner.name); + self.inner.notified().await; + } + + pub fn notify_all(&self) -> bool { + trace!("notify waiter {}", self.inner.name); + self.inner.notify_all() + } +} + +impl NotifyWaitInner { + fn new() -> Self { + Self::new_with_name(Default::default()) + } + + fn new_with_name(name: String) -> Self { + Self { + name, + is_notified: AtomicBool::new(false), + notify: Notify::new(), + } + } + + async fn notified(&self) { + if self.is_notified.load(Ordering::SeqCst) { + return; + } + + let notified = self.notify.notified(); + tokio::pin!(notified); + + if self.is_notified.load(Ordering::SeqCst) { + return; + } + + notified.await; + } + + fn is_notified(&self) -> bool { + self.is_notified.load(Ordering::SeqCst) + } + + fn notify_all(&self) -> bool { + let r = self + .is_notified + .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst); + + match r { + Ok(_) => { + self.notify.notify_waiters(); + true + } + Err(_) => { + self.notify.notify_waiters(); + false + } + } + } +} + +impl Waiter { + pub async fn wait(&self) { + self.inner.notified().await; + } + + pub fn into(self) -> NotifyWait { + NotifyWait { inner: self.inner } + } +} + +impl Notifier { + pub fn is_notified(&self) -> bool { + self.inner.is_notified() + } + + pub fn notify_all(&self) -> bool { + self.inner.notify_all() + } + + pub fn into(self) -> NotifyWait { + NotifyWait { inner: self.inner } + } +} diff --git a/mudu_sys/src/sync_sync.rs b/mudu_sys/src/sync_sync.rs new file mode 100644 index 0000000..8202f7c --- /dev/null +++ b/mudu_sys/src/sync_sync.rs @@ -0,0 +1,128 @@ +use crate::env::default_env; +use crate::fd::RawFd; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use std::sync::mpsc; +use std::time::Duration; + +pub fn eventfd() -> RS { + default_env().sync().eventfd() +} + +pub fn notify_eventfd(fd: RawFd) -> RS<()> { + default_env().sync().notify_eventfd(fd) +} + +pub fn read_eventfd(fd: RawFd) -> RS { + default_env().sync().read_eventfd(fd) +} + +pub fn close_fd(fd: RawFd) -> RS<()> { + default_env().sync().close_fd(fd) +} + +pub struct ChannelSender { + inner: mpsc::Sender, +} + +pub struct ChannelSyncSender { + inner: mpsc::SyncSender, +} + +pub struct ChannelReceiver { + inner: mpsc::Receiver, +} + +impl Clone for ChannelSender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + } + } +} + +impl Clone for ChannelSyncSender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + } + } +} + +pub fn channel() -> (ChannelSender, ChannelReceiver) { + let (tx, rx) = mpsc::channel(); + (ChannelSender { inner: tx }, ChannelReceiver { inner: rx }) +} + +pub fn sync_channel(bound: usize) -> (ChannelSyncSender, ChannelReceiver) { + let (tx, rx) = mpsc::sync_channel(bound); + ( + ChannelSyncSender { inner: tx }, + ChannelReceiver { inner: rx }, + ) +} + +impl ChannelSender { + pub fn send(&self, value: T) -> RS<()> { + match self.inner.send(value) { + Ok(()) => Ok(()), + Err(_) => Err(m_error!(EC::SyncErr, "channel send failed")), + } + } + + pub fn into_inner(self) -> mpsc::Sender { + self.inner + } +} + +impl ChannelSyncSender { + pub fn send(&self, value: T) -> RS<()> { + match self.inner.send(value) { + Ok(()) => Ok(()), + Err(_) => Err(m_error!(EC::SyncErr, "sync_channel send failed")), + } + } + + pub fn try_send(&self, value: T) -> RS<()> { + match self.inner.try_send(value) { + Ok(()) => Ok(()), + Err(mpsc::TrySendError::Full(_)) => Err(m_error!(EC::SyncErr, "sync_channel is full")), + Err(mpsc::TrySendError::Disconnected(_)) => { + Err(m_error!(EC::SyncErr, "sync_channel is disconnected")) + } + } + } + + pub fn into_inner(self) -> mpsc::SyncSender { + self.inner + } +} + +impl ChannelReceiver { + pub fn recv(&self) -> RS { + self.inner + .recv() + .map_err(|e| m_error!(EC::SyncErr, "channel recv failed", e)) + } + + pub fn try_recv(&self) -> RS> { + match self.inner.try_recv() { + Ok(v) => Ok(Some(v)), + Err(mpsc::TryRecvError::Empty) => Ok(None), + Err(e) => Err(m_error!(EC::SyncErr, "channel try_recv failed", e)), + } + } + + pub fn recv_timeout(&self, dur: Duration) -> RS> { + match self.inner.recv_timeout(dur) { + Ok(v) => Ok(Some(v)), + Err(mpsc::RecvTimeoutError::Timeout) => Ok(None), + Err(e) => Err(m_error!(EC::SyncErr, "channel recv_timeout failed", e)), + } + } + + pub fn into_inner(self) -> mpsc::Receiver { + self.inner + } +} diff --git a/mudu_sys/src/task.rs b/mudu_sys/src/task.rs index 08b788a..be4602e 100644 --- a/mudu_sys/src/task.rs +++ b/mudu_sys/src/task.rs @@ -1,127 +1,7 @@ -use crate::env::default_env; +//! Compatibility facade for task helpers. +//! +//! New code should import from [`crate::task_async`] or [`crate::task_sync`] +//! directly so sync and async call sites stay explicit. #[cfg(not(target_arch = "wasm32"))] -use crate::sync::Notifier; -use mudu::common::result::RS; -use mudu::error::ec::EC; -use mudu::m_error; -#[cfg(not(target_arch = "wasm32"))] -use std::future::Future; -use std::thread; -use std::time::Duration; -#[cfg(not(target_arch = "wasm32"))] -use tracing::{error, info}; - -pub async fn sleep(dur: Duration) -> RS<()> { - default_env().task().sleep(dur).await -} - -pub fn sleep_blocking(dur: Duration) { - default_env().task().sleep_blocking(dur) -} - -pub fn spawn_thread(f: F) -> RS> -where - F: FnOnce() -> T + Send + 'static, - T: Send + 'static, -{ - Ok(thread::spawn(f)) -} - -pub fn spawn_thread_named(name: impl Into, f: F) -> RS> -where - F: FnOnce() -> T + Send + 'static, - T: Send + 'static, -{ - thread::Builder::new() - .name(name.into()) - .spawn(f) - .map_err(|e| m_error!(EC::ThreadErr, "spawn thread error", e)) -} - -#[cfg(not(target_arch = "wasm32"))] -pub fn spawn_tokio(fut: F) -> tokio::task::JoinHandle -where - F: Future + Send + 'static, - F::Output: Send + 'static, -{ - tokio::spawn(fut) -} - -#[cfg(not(target_arch = "wasm32"))] -pub fn block_on_tokio_current_thread(fut: F) -> RS -where - F: Future, -{ - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .map_err(|e| m_error!(EC::TokioErr, "create current thread runtime error", e))?; - Ok(runtime.block_on(fut)) -} - -#[cfg(not(target_arch = "wasm32"))] -pub fn wait_for_shutdown_signal(stop: Notifier) { - let runtime = match tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - { - Ok(runtime) => runtime, - Err(e) => { - error!("create runtime for signal listener error: {}", e); - return; - } - }; - - runtime.block_on(async move { - let stop_wait = stop.clone().into(); - - #[cfg(unix)] - { - use tokio::signal::unix::{signal, SignalKind}; - - let mut sigterm = match signal(SignalKind::terminate()) { - Ok(s) => s, - Err(e) => { - error!("register SIGTERM handler error: {}", e); - return; - } - }; - - tokio::select! { - _ = stop_wait.notified() => { - return; - } - r = tokio::signal::ctrl_c() => { - if let Err(e) = r { - error!("register Ctrl-C handler error: {}", e); - return; - } - info!("received Ctrl-C/SIGINT, starting graceful shutdown"); - } - _ = sigterm.recv() => { - info!("received SIGTERM, starting graceful shutdown"); - } - } - - stop.notify_all(); - return; - } - - #[cfg(not(unix))] - { - tokio::select! { - _ = stop_wait.notified() => { - return; - } - r = tokio::signal::ctrl_c() => { - if let Err(e) = r { - error!("register Ctrl-C handler error: {}", e); - return; - } - info!("received Ctrl-C, starting graceful shutdown"); - stop.notify_all(); - } - } - } - }); -} +pub use crate::task_async::*; +pub use crate::task_sync::*; diff --git a/mudu_sys/src/task_async.rs b/mudu_sys/src/task_async.rs new file mode 100644 index 0000000..8b98664 --- /dev/null +++ b/mudu_sys/src/task_async.rs @@ -0,0 +1,416 @@ +use crate::env::default_env; +use crate::sync_async::notify_wait; +use crate::sync_async::Notifier; +use crate::sync_async::NotifyWait; +use crate::task_context::TaskContext; +use crate::task_id::{self, TaskID}; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use std::cell::Cell; +use std::future::Future; +use std::time::Duration; +use tokio::runtime::Runtime; +use tokio::task::{JoinHandle, LocalSet}; +use tokio::time::sleep as tokio_sleep; +use tokio::{select, task, task_local}; + +use tracing::trace; +use tracing::{error, info}; + +task_local! { + static TASK_ID: TaskID; +} + +thread_local! { + static CURRENT_POLL_TASK_ID: Cell> = const { Cell::new(None) }; +} + +pub struct PollTaskIdGuard { + prev: Option, +} + +impl PollTaskIdGuard { + pub fn enter(id: TaskID) -> Self { + let prev = CURRENT_POLL_TASK_ID.with(|slot| { + let prev = slot.get(); + slot.set(Some(id)); + prev + }); + Self { prev } + } +} + +impl Drop for PollTaskIdGuard { + fn drop(&mut self) { + CURRENT_POLL_TASK_ID.with(|slot| { + slot.set(self.prev); + }); + } +} + +pub async fn sleep(dur: Duration) -> RS<()> { + default_env().task_async().sleep(dur).await +} + +pub fn this_task_id() -> TaskID { + try_this_task_id() + .expect("cannot access task id: neither tokio task-local nor poll-task TLS is set") +} + +pub fn try_this_task_id() -> Option { + TASK_ID + .try_with(|id| *id) + .ok() + .or_else(current_poll_task_id) +} + +pub fn current_poll_task_id() -> Option { + CURRENT_POLL_TASK_ID.with(|slot| slot.get()) +} + +pub fn spawn_local_task( + cancel_notifier: NotifyWait, + name: &str, + future: F, +) -> RS>> +where + F: Future + 'static, + F::Output: 'static, +{ + + let id = { + let id = task_id::new_task_id(); + let _ = TaskContext::new_context(id, name.to_string(), false); + id + }; + Ok(task::spawn_local(TASK_ID.scope(id, async move { + let result = __select_local_till_done(cancel_notifier, future).await; + TaskContext::remove_context(id); + result + }))) +} + +pub fn spawn_local_detached(name: &str, future: F) -> RS>> +where + F: Future + 'static, + F::Output: 'static, +{ + let (_cancel_notifier, cancel_waiter) = notify_wait(); + spawn_local_task(cancel_waiter.into(), name, future) +} + +pub fn spawn_task( + cancel_notifier: NotifyWait, + name: &str, + future: F, +) -> RS>> +where + F: Future + Send + 'static, + F::Output: Send + 'static, +{ + let id = task_id::new_task_id(); + let _ = TaskContext::new_context(id, name.to_string(), false); + Ok(task::spawn(TASK_ID.scope(id, async move { + let result = __select_till_done(cancel_notifier, future).await; + TaskContext::remove_context(id); + result + }))) +} + +pub fn spawn_local_task_timeout( + cancel_notifier: NotifyWait, + duration: Duration, + _name: &str, + future: F, +) -> RS>> +where + F: Future + Send + 'static, + F::Output: Send + 'static, +{ + Ok(task::spawn_local(async move { + __select_local_till_done_or_timeout(cancel_notifier, duration, future).await + })) +} + +pub fn spawn_tokio(fut: F) -> tokio::task::JoinHandle +where + F: Future + Send + 'static, + F::Output: Send + 'static, +{ + tokio::spawn(fut) +} + +pub async fn spawn_blocking(f: F) -> RS +where + F: FnOnce() -> T + Send + 'static, + T: Send + 'static, +{ + tokio::task::spawn_blocking(f) + .await + .map_err(|e| m_error!(EC::ThreadErr, "spawn_blocking join error", e)) +} + +pub async fn timeout(dur: Duration, fut: F) -> Option +where + F: Future, +{ + tokio::time::timeout(dur, fut).await.ok() +} + +pub fn has_tokio_runtime() -> bool { + tokio::runtime::Handle::try_current().is_ok() +} + +pub fn build_current_thread_runtime() -> RS { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .map_err(|e| m_error!(EC::TokioErr, "create current thread runtime error", e)) +} + +pub fn build_multi_thread_runtime() -> RS { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .map_err(|e| m_error!(EC::TokioErr, "create multi thread runtime error", e)) +} + +pub struct LocalTaskSet { + inner: LocalSet, +} + +impl LocalTaskSet { + pub fn new() -> Self { + Self { + inner: LocalSet::new(), + } + } + + pub fn spawn( + &self, + cancel_notifier: NotifyWait, + name: &str, + future: F, + ) -> RS>> + where + F: Future + 'static, + F::Output: 'static, + { + let id = task_id::new_task_id(); + let _ = TaskContext::new_context(id, name.to_string(), false); + Ok(self.inner.spawn_local(TASK_ID.scope(id, async move { + let result = __select_local_till_done(cancel_notifier, future).await; + TaskContext::remove_context(id); + result + }))) + } + + pub fn spawn_detached(&self, name: &str, future: F) -> RS>> + where + F: Future + 'static, + F::Output: 'static, + { + let (_cancel_notifier, cancel_waiter) = notify_wait(); + self.spawn(cancel_waiter.into(), name, future) + } + + pub async fn run_until(&self, future: F) -> F::Output + where + F: Future, + { + self.inner.run_until(future).await + } + + pub fn block_on(&self, runtime: &Runtime, future: F) -> F::Output + where + F: Future, + { + self.inner.block_on(runtime, future) + } +} + +pub struct CurrentThreadTaskRuntime { + runtime: Runtime, + local: LocalTaskSet, +} + +impl CurrentThreadTaskRuntime { + pub fn new() -> RS { + Ok(Self { + runtime: build_current_thread_runtime()?, + local: LocalTaskSet::new(), + }) + } + + pub fn local(&self) -> &LocalTaskSet { + &self.local + } + + pub fn block_on(&self, future: F) -> F::Output + where + F: Future + 'static, + F::Output: 'static, + { + self.local.block_on(&self.runtime, future) + } +} + +pub fn block_on_tokio_current_thread(fut: F) -> RS +where + F: Future + 'static, + F::Output: 'static, +{ + + let runtime = build_current_thread_runtime()?; + let ls = LocalSet::new(); + let task = ls.run_until(async move { + let join = spawn_local_detached("block-on", fut)?; + join.await.map_err(|e| m_error!(EC::TokioErr, "task runtime error", e)) + }); + let r = runtime.block_on(async move { + let r = task.await; + r + }); + let opt = r.map_err(|e| m_error!(EC::TokioErr, "tokio tokio error", e))?; + match opt { + None => { Err(m_error!(EC::TokioErr, "return none")) }, + Some(output) => { Ok(output) } + } +} + +pub fn wait_for_shutdown_signal(stop: Notifier) { + let runtime = match tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + { + Ok(runtime) => runtime, + Err(e) => { + error!("create runtime for signal listener error: {}", e); + return; + } + }; + + runtime.block_on(async move { + let stop_wait = stop.clone().into(); + + #[cfg(unix)] + { + use tokio::signal::unix::{signal, SignalKind}; + + let mut sigterm = match signal(SignalKind::terminate()) { + Ok(s) => s, + Err(e) => { + error!("register SIGTERM handler error: {}", e); + return; + } + }; + + tokio::select! { + _ = stop_wait.notified() => { + return; + } + r = tokio::signal::ctrl_c() => { + if let Err(e) = r { + error!("register Ctrl-C handler error: {}", e); + return; + } + info!("received Ctrl-C/SIGINT, starting graceful shutdown"); + } + _ = sigterm.recv() => { + info!("received SIGTERM, starting graceful shutdown"); + } + } + + stop.notify_all(); + return; + } + + #[cfg(not(unix))] + { + tokio::select! { + _ = stop_wait.notified() => { + return; + } + r = tokio::signal::ctrl_c() => { + if let Err(e) = r { + error!("register Ctrl-C handler error: {}", e); + return; + } + info!("received Ctrl-C, starting graceful shutdown"); + stop.notify_all(); + } + } + } + }); +} + +pub enum TaskFailed { + Cancel, + Timeout, +} + +async fn __select_local_till_done(notify: NotifyWait, future: F) -> Option +where + F: Future + 'static, + F::Output: 'static, +{ + async move { + select! { + _ = notify.notified() => { + trace!("local task stop"); + None + } + result = future => { + trace!("local task end"); + Some(result) + } + } + } + .await +} + +async fn __select_local_till_done_or_timeout( + notify: NotifyWait, + duration: Duration, + future: F, +) -> Result +where + F: Future + 'static, + F::Output: 'static, +{ + async move { + select! { + _ = notify.notified() => { + trace!("local task stop"); + Err(TaskFailed::Cancel) + } + result = future => { + trace!("local task end"); + Ok(result) + } + _ = tokio_sleep(duration) => Err(TaskFailed::Timeout), + } + } + .await +} + +async fn __select_till_done(notify: NotifyWait, future: F) -> Option +where + F: Future + 'static, + F::Output: Send + 'static, +{ + async move { + select! { + _ = notify.notified() => { + trace!("task stop"); + None + } + result = future => { + trace!("task end"); + Some(result) + } + } + } + .await +} diff --git a/mudu_sys/src/task_context.rs b/mudu_sys/src/task_context.rs new file mode 100644 index 0000000..318f180 --- /dev/null +++ b/mudu_sys/src/task_context.rs @@ -0,0 +1,163 @@ +use async_backtrace::Location as BtLoc; +use lazy_static::lazy_static; +use scc::HashIndex; +use std::collections::{HashMap, VecDeque}; +use std::sync::{Arc, Mutex}; + +use crate::task_id::TaskID; + +lazy_static! { + static ref TASK_CONTEXT: HashIndex> = HashIndex::new(); +} + +pub struct TaskContext { + name: String, + local_task: bool, + id: u128, + backtrace: Mutex>, + thread_backtrace: Mutex>, + // Keep watch_data on a plain Mutex instead of scc::HashMap. + // This field is only for debug/trace metadata, and using scc here hit a + // reclamation edge case during TLS/global destructor paths where drop + // could stall inside the collector. + watch_data: Mutex>, +} + +impl TaskContext { + pub fn new(id: TaskID, name: String) -> Arc { + Self::new_context(id, name, true) + } + + pub fn new_context(id: TaskID, name: String, local_task: bool) -> Arc { + let ctx = Arc::new(Self { + name, + local_task, + id, + backtrace: Default::default(), + thread_backtrace: Default::default(), + watch_data: Default::default(), + }); + let _ = TASK_CONTEXT.insert_sync(ctx.id(), ctx.clone()); + ctx + } + + pub fn remove_context(id: TaskID) { + let _ = TASK_CONTEXT.remove_sync(&id); + } + + pub fn get(id: TaskID) -> Option> { + TASK_CONTEXT.get_sync(&id).map(|entry| entry.get().clone()) + } + + pub fn is_local(&self) -> bool { + self.local_task + } + + pub fn id(&self) -> TaskID { + self.id + } + + pub fn watch(&self, k: &str, v: &str) { + let mut watch_data = self.watch_data.lock().unwrap(); + let _ = watch_data.insert(k.to_string(), v.to_string()); + } + + pub fn unwatch(&self, k: &str) { + let mut watch_data = self.watch_data.lock().unwrap(); + let _ = watch_data.remove(k); + } + + pub fn name(&self) -> String { + self.name.clone() + } + + pub fn enter(&self, loc: BtLoc) { + let mut backtrace = self.backtrace.lock().unwrap(); + backtrace.push_back(loc); + } + + pub fn exit(&self) { + let mut backtrace = self.backtrace.lock().unwrap(); + let _ = backtrace.pop_back(); + } + + pub fn enter_thread(&self, trace: String) { + let mut backtrace = self.thread_backtrace.lock().unwrap(); + backtrace.push_back(trace); + } + + pub fn exit_thread(&self) { + let mut backtrace = self.thread_backtrace.lock().unwrap(); + let _ = backtrace.pop_back(); + } + + pub fn backtrace(&self) -> String { + if self.local_task { + return self.thread_backtrace_string(); + } + self.task_backtrace_string() + } + + fn task_backtrace_string(&self) -> String { + let deque = self.backtrace.lock().unwrap(); + let mut out = String::from("backtrace:\n"); + for (depth, loc) in deque.iter().enumerate() { + out.push_str(" "); + for _ in 0..depth { + out.push_str("--"); + } + out.push_str("->"); + out.push_str(loc.to_string().as_str()); + out.push('\n'); + } + let watch_data = self.watch_data.lock().unwrap(); + if !watch_data.is_empty() { + out.push_str("watch:\n"); + } + for (k, v) in watch_data.iter() { + out.push_str(format!("=== {}:\t=\t{}\n", k, v).as_str()); + } + out + } + + fn thread_backtrace_string(&self) -> String { + let deque = self.thread_backtrace.lock().unwrap(); + let mut out = String::from("backtrace:\n"); + for (depth, trace) in deque.iter().enumerate() { + out.push_str(" "); + for _ in 0..depth { + out.push_str("--"); + } + out.push_str("->"); + out.push_str(trace); + if !trace.ends_with('\n') { + out.push('\n'); + } + } + let watch_data = self.watch_data.lock().unwrap(); + if !watch_data.is_empty() { + out.push_str("watch:\n"); + } + for (k, v) in watch_data.iter() { + out.push_str(format!("=== {}:\t=\t{}\n", k, v).as_str()); + } + out + } + + pub fn dump_task_trace() -> String { + let mut out = String::new(); + let guard = scc::Guard::new(); + for (id, task) in TASK_CONTEXT.iter(&guard) { + out.push_str( + format!( + "name:{},\t id: {},\t trace {}\n", + task.name(), + id, + task.backtrace() + ) + .as_str(), + ); + } + out + } +} diff --git a/mudu_sys/src/task_id.rs b/mudu_sys/src/task_id.rs new file mode 100644 index 0000000..623798f --- /dev/null +++ b/mudu_sys/src/task_id.rs @@ -0,0 +1,7 @@ +use uuid::Uuid; + +pub type TaskID = u128; + +pub fn new_task_id() -> TaskID { + Uuid::new_v4().as_u128() +} diff --git a/mudu_sys/src/task_sync.rs b/mudu_sys/src/task_sync.rs new file mode 100644 index 0000000..4520c1a --- /dev/null +++ b/mudu_sys/src/task_sync.rs @@ -0,0 +1,29 @@ +use crate::env::default_env; +use mudu::common::result::RS; +use mudu::error::ec::EC; +use mudu::m_error; +use std::thread; +use std::time::Duration; + +pub fn sleep_blocking(dur: Duration) { + default_env().task_sync().sleep_blocking(dur) +} + +pub fn spawn_thread(f: F) -> RS> +where + F: FnOnce() -> T + Send + 'static, + T: Send + 'static, +{ + Ok(thread::spawn(f)) +} + +pub fn spawn_thread_named(name: impl Into, f: F) -> RS> +where + F: FnOnce() -> T + Send + 'static, + T: Send + 'static, +{ + thread::Builder::new() + .name(name.into()) + .spawn(f) + .map_err(|e| m_error!(EC::ThreadErr, "spawn thread error", e)) +} diff --git a/mudu_transpiler/src/rust/ts_const/ts_field_id.rs b/mudu_transpiler/src/rust/ts_const/ts_field_id.rs index ffa464b..e185446 100644 --- a/mudu_transpiler/src/rust/ts_const/ts_field_id.rs +++ b/mudu_transpiler/src/rust/ts_const/ts_field_id.rs @@ -4,34 +4,34 @@ // // field id -pub const FI_ALIAS : u16 = 1; -pub const FI_ALTERNATIVE : u16 = 2; -pub const FI_ARGUMENT : u16 = 3; -pub const FI_ARGUMENTS : u16 = 4; -pub const FI_BODY : u16 = 5; -pub const FI_BOUNDS : u16 = 6; -pub const FI_CONDITION : u16 = 7; -pub const FI_CONSEQUENCE : u16 = 8; -pub const FI_DEFAULT_TYPE : u16 = 9; -pub const FI_DOC : u16 = 10; -pub const FI_ELEMENT : u16 = 11; -pub const FI_FIELD : u16 = 12; -pub const FI_FUNCTION : u16 = 13; -pub const FI_INNER : u16 = 14; -pub const FI_LEFT : u16 = 15; -pub const FI_LENGTH : u16 = 16; -pub const FI_LIST : u16 = 17; -pub const FI_MACRO : u16 = 18; -pub const FI_NAME : u16 = 19; -pub const FI_OPERATOR : u16 = 20; -pub const FI_OUTER : u16 = 21; -pub const FI_PARAMETERS : u16 = 22; -pub const FI_PATH : u16 = 23; -pub const FI_PATTERN : u16 = 24; -pub const FI_RETURN_TYPE : u16 = 25; -pub const FI_RIGHT : u16 = 26; -pub const FI_TRAIT : u16 = 27; -pub const FI_TYPE : u16 = 28; -pub const FI_TYPE_ARGUMENTS : u16 = 29; -pub const FI_TYPE_PARAMETERS : u16 = 30; -pub const FI_VALUE : u16 = 31; +pub const FI_ALIAS: u16 = 1; +pub const FI_ALTERNATIVE: u16 = 2; +pub const FI_ARGUMENT: u16 = 3; +pub const FI_ARGUMENTS: u16 = 4; +pub const FI_BODY: u16 = 5; +pub const FI_BOUNDS: u16 = 6; +pub const FI_CONDITION: u16 = 7; +pub const FI_CONSEQUENCE: u16 = 8; +pub const FI_DEFAULT_TYPE: u16 = 9; +pub const FI_DOC: u16 = 10; +pub const FI_ELEMENT: u16 = 11; +pub const FI_FIELD: u16 = 12; +pub const FI_FUNCTION: u16 = 13; +pub const FI_INNER: u16 = 14; +pub const FI_LEFT: u16 = 15; +pub const FI_LENGTH: u16 = 16; +pub const FI_LIST: u16 = 17; +pub const FI_MACRO: u16 = 18; +pub const FI_NAME: u16 = 19; +pub const FI_OPERATOR: u16 = 20; +pub const FI_OUTER: u16 = 21; +pub const FI_PARAMETERS: u16 = 22; +pub const FI_PATH: u16 = 23; +pub const FI_PATTERN: u16 = 24; +pub const FI_RETURN_TYPE: u16 = 25; +pub const FI_RIGHT: u16 = 26; +pub const FI_TRAIT: u16 = 27; +pub const FI_TYPE: u16 = 28; +pub const FI_TYPE_ARGUMENTS: u16 = 29; +pub const FI_TYPE_PARAMETERS: u16 = 30; +pub const FI_VALUE: u16 = 31; diff --git a/mudu_transpiler/src/rust/ts_const/ts_field_name.rs b/mudu_transpiler/src/rust/ts_const/ts_field_name.rs index 2cc1957..fed217d 100644 --- a/mudu_transpiler/src/rust/ts_const/ts_field_name.rs +++ b/mudu_transpiler/src/rust/ts_const/ts_field_name.rs @@ -4,34 +4,34 @@ // // field name -pub const ALIAS : &'static str = "alias"; -pub const ALTERNATIVE : &'static str = "alternative"; -pub const ARGUMENT : &'static str = "argument"; -pub const ARGUMENTS : &'static str = "arguments"; -pub const BODY : &'static str = "body"; -pub const BOUNDS : &'static str = "bounds"; -pub const CONDITION : &'static str = "condition"; -pub const CONSEQUENCE : &'static str = "consequence"; -pub const DEFAULT_TYPE : &'static str = "default_type"; -pub const DOC : &'static str = "doc"; -pub const ELEMENT : &'static str = "element"; -pub const FIELD : &'static str = "field"; -pub const FUNCTION : &'static str = "function"; -pub const INNER : &'static str = "inner"; -pub const LEFT : &'static str = "left"; -pub const LENGTH : &'static str = "length"; -pub const LIST : &'static str = "list"; -pub const MACRO : &'static str = "macro"; -pub const NAME : &'static str = "name"; -pub const OPERATOR : &'static str = "operator"; -pub const OUTER : &'static str = "outer"; -pub const PARAMETERS : &'static str = "parameters"; -pub const PATH : &'static str = "path"; -pub const PATTERN : &'static str = "pattern"; -pub const RETURN_TYPE : &'static str = "return_type"; -pub const RIGHT : &'static str = "right"; -pub const TRAIT : &'static str = "trait"; -pub const TYPE : &'static str = "type"; -pub const TYPE_ARGUMENTS : &'static str = "type_arguments"; -pub const TYPE_PARAMETERS : &'static str = "type_parameters"; -pub const VALUE : &'static str = "value"; +pub const ALIAS: &'static str = "alias"; +pub const ALTERNATIVE: &'static str = "alternative"; +pub const ARGUMENT: &'static str = "argument"; +pub const ARGUMENTS: &'static str = "arguments"; +pub const BODY: &'static str = "body"; +pub const BOUNDS: &'static str = "bounds"; +pub const CONDITION: &'static str = "condition"; +pub const CONSEQUENCE: &'static str = "consequence"; +pub const DEFAULT_TYPE: &'static str = "default_type"; +pub const DOC: &'static str = "doc"; +pub const ELEMENT: &'static str = "element"; +pub const FIELD: &'static str = "field"; +pub const FUNCTION: &'static str = "function"; +pub const INNER: &'static str = "inner"; +pub const LEFT: &'static str = "left"; +pub const LENGTH: &'static str = "length"; +pub const LIST: &'static str = "list"; +pub const MACRO: &'static str = "macro"; +pub const NAME: &'static str = "name"; +pub const OPERATOR: &'static str = "operator"; +pub const OUTER: &'static str = "outer"; +pub const PARAMETERS: &'static str = "parameters"; +pub const PATH: &'static str = "path"; +pub const PATTERN: &'static str = "pattern"; +pub const RETURN_TYPE: &'static str = "return_type"; +pub const RIGHT: &'static str = "right"; +pub const TRAIT: &'static str = "trait"; +pub const TYPE: &'static str = "type"; +pub const TYPE_ARGUMENTS: &'static str = "type_arguments"; +pub const TYPE_PARAMETERS: &'static str = "type_parameters"; +pub const VALUE: &'static str = "value"; diff --git a/mudu_transpiler/src/rust/ts_const/ts_kind_id.rs b/mudu_transpiler/src/rust/ts_const/ts_kind_id.rs index 5b28fe1..595b6c4 100644 --- a/mudu_transpiler/src/rust/ts_const/ts_kind_id.rs +++ b/mudu_transpiler/src/rust/ts_const/ts_kind_id.rs @@ -4,194 +4,194 @@ // // kind id of Node -pub const _NON_DELIM_TOKEN : u16 = 0; -pub const SCOPED_TYPE_IDENTIFIER_IN_EXPRESSION_POSITION : u16 = 0; -pub const _INNER_LINE_DOC_COMMENT_MARKER : u16 = 0; -pub const _OUTER_LINE_DOC_COMMENT_MARKER : u16 = 0; -pub const _BLOCK_DOC_COMMENT_MARKER : u16 = 0; -pub const _TYPE_IDENTIFIER : u16 = 0; -pub const _FIELD_IDENTIFIER : u16 = 0; -pub const _EXPRESSION_EXCEPT_RANGE : u16 = 0; -pub const _DECLARATION_STATEMENT : u16 = 0; -pub const _PATH : u16 = 0; -pub const LAST_MATCH_ARM : u16 = 0; -pub const _DELIM_TOKENS : u16 = 0; -pub const _TOKEN_PATTERN : u16 = 0; -pub const COMMENT : u16 = 0; -pub const _RESERVED_IDENTIFIER : u16 = 0; -pub const _LINE_DOC_COMMENT_MARKER : u16 = 0; -pub const _EXPRESSION_ENDING_WITH_BLOCK : u16 = 0; -pub const _STATEMENT : u16 = 0; -pub const _CONDITION : u16 = 0; -pub const _TOKENS : u16 = 0; -pub const DELIM_TOKEN_TREE : u16 = 0; -pub const _LET_CHAIN : u16 = 0; -pub const _NON_SPECIAL_TOKEN : u16 = 0; -pub const _USE_CLAUSE : u16 = 0; -pub const IDENTIFIER : u16 = 1; -pub const PRIMITIVE_TYPE : u16 = 32; -pub const MUTABLE_SPECIFIER : u16 = 122; -pub const INTEGER_LITERAL : u16 = 127; -pub const CHAR_LITERAL : u16 = 129; -pub const ESCAPE_SEQUENCE : u16 = 130; -pub const SHEBANG : u16 = 141; -pub const SELF : u16 = 142; -pub const SUPER : u16 = 143; -pub const CRATE : u16 = 144; -pub const METAVARIABLE : u16 = 145; -pub const STRING_CONTENT : u16 = 146; -pub const OUTER_DOC_COMMENT_MARKER : u16 = 152; -pub const INNER_DOC_COMMENT_MARKER : u16 = 153; -pub const DOC_COMMENT : u16 = 155; -pub const SOURCE_FILE : u16 = 157; -pub const EMPTY_STATEMENT : u16 = 159; -pub const EXPRESSION_STATEMENT : u16 = 160; -pub const MACRO_DEFINITION : u16 = 161; -pub const MACRO_RULE : u16 = 162; -pub const TOKEN_TREE_PATTERN : u16 = 164; -pub const TOKEN_BINDING_PATTERN : u16 = 165; -pub const TOKEN_REPETITION_PATTERN : u16 = 166; -pub const FRAGMENT_SPECIFIER : u16 = 167; -pub const TOKEN_TREE : u16 = 168; -pub const TOKEN_REPETITION : u16 = 169; -pub const ATTRIBUTE_ITEM : u16 = 170; -pub const INNER_ATTRIBUTE_ITEM : u16 = 171; -pub const ATTRIBUTE : u16 = 172; -pub const MOD_ITEM : u16 = 173; -pub const FOREIGN_MOD_ITEM : u16 = 174; -pub const DECLARATION_LIST : u16 = 175; -pub const STRUCT_ITEM : u16 = 176; -pub const UNION_ITEM : u16 = 177; -pub const ENUM_ITEM : u16 = 178; -pub const ENUM_VARIANT_LIST : u16 = 179; -pub const ENUM_VARIANT : u16 = 180; -pub const FIELD_DECLARATION_LIST : u16 = 181; -pub const FIELD_DECLARATION : u16 = 182; -pub const ORDERED_FIELD_DECLARATION_LIST : u16 = 183; -pub const EXTERN_CRATE_DECLARATION : u16 = 184; -pub const CONST_ITEM : u16 = 185; -pub const STATIC_ITEM : u16 = 186; -pub const TYPE_ITEM : u16 = 187; -pub const FUNCTION_ITEM : u16 = 188; -pub const FUNCTION_SIGNATURE_ITEM : u16 = 189; -pub const FUNCTION_MODIFIERS : u16 = 190; -pub const WHERE_CLAUSE : u16 = 191; -pub const WHERE_PREDICATE : u16 = 192; -pub const IMPL_ITEM : u16 = 193; -pub const TRAIT_ITEM : u16 = 194; -pub const ASSOCIATED_TYPE : u16 = 195; -pub const TRAIT_BOUNDS : u16 = 196; -pub const HIGHER_RANKED_TRAIT_BOUND : u16 = 197; -pub const REMOVED_TRAIT_BOUND : u16 = 198; -pub const TYPE_PARAMETERS : u16 = 199; -pub const CONST_PARAMETER : u16 = 200; -pub const TYPE_PARAMETER : u16 = 201; -pub const LIFETIME_PARAMETER : u16 = 202; -pub const LET_DECLARATION : u16 = 203; -pub const USE_DECLARATION : u16 = 204; -pub const SCOPED_USE_LIST : u16 = 206; -pub const USE_LIST : u16 = 207; -pub const USE_AS_CLAUSE : u16 = 208; -pub const USE_WILDCARD : u16 = 209; -pub const PARAMETERS : u16 = 210; -pub const SELF_PARAMETER : u16 = 211; -pub const VARIADIC_PARAMETER : u16 = 212; -pub const PARAMETER : u16 = 213; -pub const EXTERN_MODIFIER : u16 = 214; -pub const VISIBILITY_MODIFIER : u16 = 215; -pub const _TYPE : u16 = 216; -pub const BRACKETED_TYPE : u16 = 217; -pub const QUALIFIED_TYPE : u16 = 218; -pub const LIFETIME : u16 = 219; -pub const ARRAY_TYPE : u16 = 220; -pub const FOR_LIFETIMES : u16 = 221; -pub const FUNCTION_TYPE : u16 = 222; -pub const TUPLE_TYPE : u16 = 223; -pub const UNIT_TYPE : u16 = 224; -pub const GENERIC_FUNCTION : u16 = 225; -pub const GENERIC_TYPE : u16 = 226; -pub const GENERIC_TYPE_WITH_TURBOFISH : u16 = 227; -pub const BOUNDED_TYPE : u16 = 228; -pub const USE_BOUNDS : u16 = 229; -pub const TYPE_ARGUMENTS : u16 = 230; -pub const TYPE_BINDING : u16 = 231; -pub const REFERENCE_TYPE : u16 = 232; -pub const POINTER_TYPE : u16 = 233; -pub const NEVER_TYPE : u16 = 234; -pub const ABSTRACT_TYPE : u16 = 235; -pub const DYNAMIC_TYPE : u16 = 236; -pub const _EXPRESSION : u16 = 238; -pub const MACRO_INVOCATION : u16 = 239; -pub const SCOPED_IDENTIFIER : u16 = 243; -pub const SCOPED_TYPE_IDENTIFIER : u16 = 245; -pub const RANGE_EXPRESSION : u16 = 246; -pub const UNARY_EXPRESSION : u16 = 247; -pub const TRY_EXPRESSION : u16 = 248; -pub const REFERENCE_EXPRESSION : u16 = 249; -pub const BINARY_EXPRESSION : u16 = 250; -pub const ASSIGNMENT_EXPRESSION : u16 = 251; -pub const COMPOUND_ASSIGNMENT_EXPR : u16 = 252; -pub const TYPE_CAST_EXPRESSION : u16 = 253; -pub const RETURN_EXPRESSION : u16 = 254; -pub const YIELD_EXPRESSION : u16 = 255; -pub const CALL_EXPRESSION : u16 = 256; -pub const ARGUMENTS : u16 = 257; -pub const ARRAY_EXPRESSION : u16 = 258; -pub const PARENTHESIZED_EXPRESSION : u16 = 259; -pub const TUPLE_EXPRESSION : u16 = 260; -pub const UNIT_EXPRESSION : u16 = 261; -pub const STRUCT_EXPRESSION : u16 = 262; -pub const FIELD_INITIALIZER_LIST : u16 = 263; -pub const SHORTHAND_FIELD_INITIALIZER : u16 = 264; -pub const FIELD_INITIALIZER : u16 = 265; -pub const BASE_FIELD_INITIALIZER : u16 = 266; -pub const IF_EXPRESSION : u16 = 267; -pub const LET_CONDITION : u16 = 268; -pub const ELSE_CLAUSE : u16 = 271; -pub const MATCH_EXPRESSION : u16 = 272; -pub const MATCH_BLOCK : u16 = 273; -pub const MATCH_ARM : u16 = 274; -pub const MATCH_PATTERN : u16 = 276; -pub const WHILE_EXPRESSION : u16 = 277; -pub const LOOP_EXPRESSION : u16 = 278; -pub const FOR_EXPRESSION : u16 = 279; -pub const CONST_BLOCK : u16 = 280; -pub const CLOSURE_EXPRESSION : u16 = 281; -pub const CLOSURE_PARAMETERS : u16 = 282; -pub const LABEL : u16 = 283; -pub const BREAK_EXPRESSION : u16 = 284; -pub const CONTINUE_EXPRESSION : u16 = 285; -pub const INDEX_EXPRESSION : u16 = 286; -pub const AWAIT_EXPRESSION : u16 = 287; -pub const FIELD_EXPRESSION : u16 = 288; -pub const UNSAFE_BLOCK : u16 = 289; -pub const ASYNC_BLOCK : u16 = 290; -pub const GEN_BLOCK : u16 = 291; -pub const TRY_BLOCK : u16 = 292; -pub const BLOCK : u16 = 293; -pub const _PATTERN : u16 = 294; -pub const GENERIC_PATTERN : u16 = 295; -pub const TUPLE_PATTERN : u16 = 296; -pub const SLICE_PATTERN : u16 = 297; -pub const TUPLE_STRUCT_PATTERN : u16 = 298; -pub const STRUCT_PATTERN : u16 = 299; -pub const FIELD_PATTERN : u16 = 300; -pub const REMAINING_FIELD_PATTERN : u16 = 301; -pub const MUT_PATTERN : u16 = 302; -pub const RANGE_PATTERN : u16 = 303; -pub const REF_PATTERN : u16 = 304; -pub const CAPTURED_PATTERN : u16 = 305; -pub const REFERENCE_PATTERN : u16 = 306; -pub const OR_PATTERN : u16 = 307; -pub const _LITERAL : u16 = 308; -pub const _LITERAL_PATTERN : u16 = 309; -pub const NEGATIVE_LITERAL : u16 = 310; -pub const STRING_LITERAL : u16 = 311; -pub const RAW_STRING_LITERAL : u16 = 312; -pub const BOOLEAN_LITERAL : u16 = 313; -pub const LINE_COMMENT : u16 = 314; -pub const BLOCK_COMMENT : u16 = 318; -pub const FIELD_IDENTIFIER : u16 = 351; -pub const LET_CHAIN : u16 = 352; -pub const SHORTHAND_FIELD_IDENTIFIER : u16 = 353; -pub const TYPE_IDENTIFIER : u16 = 354; +pub const _NON_DELIM_TOKEN: u16 = 0; +pub const SCOPED_TYPE_IDENTIFIER_IN_EXPRESSION_POSITION: u16 = 0; +pub const _INNER_LINE_DOC_COMMENT_MARKER: u16 = 0; +pub const _OUTER_LINE_DOC_COMMENT_MARKER: u16 = 0; +pub const _BLOCK_DOC_COMMENT_MARKER: u16 = 0; +pub const _TYPE_IDENTIFIER: u16 = 0; +pub const _FIELD_IDENTIFIER: u16 = 0; +pub const _EXPRESSION_EXCEPT_RANGE: u16 = 0; +pub const _DECLARATION_STATEMENT: u16 = 0; +pub const _PATH: u16 = 0; +pub const LAST_MATCH_ARM: u16 = 0; +pub const _DELIM_TOKENS: u16 = 0; +pub const _TOKEN_PATTERN: u16 = 0; +pub const COMMENT: u16 = 0; +pub const _RESERVED_IDENTIFIER: u16 = 0; +pub const _LINE_DOC_COMMENT_MARKER: u16 = 0; +pub const _EXPRESSION_ENDING_WITH_BLOCK: u16 = 0; +pub const _STATEMENT: u16 = 0; +pub const _CONDITION: u16 = 0; +pub const _TOKENS: u16 = 0; +pub const DELIM_TOKEN_TREE: u16 = 0; +pub const _LET_CHAIN: u16 = 0; +pub const _NON_SPECIAL_TOKEN: u16 = 0; +pub const _USE_CLAUSE: u16 = 0; +pub const IDENTIFIER: u16 = 1; +pub const PRIMITIVE_TYPE: u16 = 32; +pub const MUTABLE_SPECIFIER: u16 = 122; +pub const INTEGER_LITERAL: u16 = 127; +pub const CHAR_LITERAL: u16 = 129; +pub const ESCAPE_SEQUENCE: u16 = 130; +pub const SHEBANG: u16 = 141; +pub const SELF: u16 = 142; +pub const SUPER: u16 = 143; +pub const CRATE: u16 = 144; +pub const METAVARIABLE: u16 = 145; +pub const STRING_CONTENT: u16 = 146; +pub const OUTER_DOC_COMMENT_MARKER: u16 = 152; +pub const INNER_DOC_COMMENT_MARKER: u16 = 153; +pub const DOC_COMMENT: u16 = 155; +pub const SOURCE_FILE: u16 = 157; +pub const EMPTY_STATEMENT: u16 = 159; +pub const EXPRESSION_STATEMENT: u16 = 160; +pub const MACRO_DEFINITION: u16 = 161; +pub const MACRO_RULE: u16 = 162; +pub const TOKEN_TREE_PATTERN: u16 = 164; +pub const TOKEN_BINDING_PATTERN: u16 = 165; +pub const TOKEN_REPETITION_PATTERN: u16 = 166; +pub const FRAGMENT_SPECIFIER: u16 = 167; +pub const TOKEN_TREE: u16 = 168; +pub const TOKEN_REPETITION: u16 = 169; +pub const ATTRIBUTE_ITEM: u16 = 170; +pub const INNER_ATTRIBUTE_ITEM: u16 = 171; +pub const ATTRIBUTE: u16 = 172; +pub const MOD_ITEM: u16 = 173; +pub const FOREIGN_MOD_ITEM: u16 = 174; +pub const DECLARATION_LIST: u16 = 175; +pub const STRUCT_ITEM: u16 = 176; +pub const UNION_ITEM: u16 = 177; +pub const ENUM_ITEM: u16 = 178; +pub const ENUM_VARIANT_LIST: u16 = 179; +pub const ENUM_VARIANT: u16 = 180; +pub const FIELD_DECLARATION_LIST: u16 = 181; +pub const FIELD_DECLARATION: u16 = 182; +pub const ORDERED_FIELD_DECLARATION_LIST: u16 = 183; +pub const EXTERN_CRATE_DECLARATION: u16 = 184; +pub const CONST_ITEM: u16 = 185; +pub const STATIC_ITEM: u16 = 186; +pub const TYPE_ITEM: u16 = 187; +pub const FUNCTION_ITEM: u16 = 188; +pub const FUNCTION_SIGNATURE_ITEM: u16 = 189; +pub const FUNCTION_MODIFIERS: u16 = 190; +pub const WHERE_CLAUSE: u16 = 191; +pub const WHERE_PREDICATE: u16 = 192; +pub const IMPL_ITEM: u16 = 193; +pub const TRAIT_ITEM: u16 = 194; +pub const ASSOCIATED_TYPE: u16 = 195; +pub const TRAIT_BOUNDS: u16 = 196; +pub const HIGHER_RANKED_TRAIT_BOUND: u16 = 197; +pub const REMOVED_TRAIT_BOUND: u16 = 198; +pub const TYPE_PARAMETERS: u16 = 199; +pub const CONST_PARAMETER: u16 = 200; +pub const TYPE_PARAMETER: u16 = 201; +pub const LIFETIME_PARAMETER: u16 = 202; +pub const LET_DECLARATION: u16 = 203; +pub const USE_DECLARATION: u16 = 204; +pub const SCOPED_USE_LIST: u16 = 206; +pub const USE_LIST: u16 = 207; +pub const USE_AS_CLAUSE: u16 = 208; +pub const USE_WILDCARD: u16 = 209; +pub const PARAMETERS: u16 = 210; +pub const SELF_PARAMETER: u16 = 211; +pub const VARIADIC_PARAMETER: u16 = 212; +pub const PARAMETER: u16 = 213; +pub const EXTERN_MODIFIER: u16 = 214; +pub const VISIBILITY_MODIFIER: u16 = 215; +pub const _TYPE: u16 = 216; +pub const BRACKETED_TYPE: u16 = 217; +pub const QUALIFIED_TYPE: u16 = 218; +pub const LIFETIME: u16 = 219; +pub const ARRAY_TYPE: u16 = 220; +pub const FOR_LIFETIMES: u16 = 221; +pub const FUNCTION_TYPE: u16 = 222; +pub const TUPLE_TYPE: u16 = 223; +pub const UNIT_TYPE: u16 = 224; +pub const GENERIC_FUNCTION: u16 = 225; +pub const GENERIC_TYPE: u16 = 226; +pub const GENERIC_TYPE_WITH_TURBOFISH: u16 = 227; +pub const BOUNDED_TYPE: u16 = 228; +pub const USE_BOUNDS: u16 = 229; +pub const TYPE_ARGUMENTS: u16 = 230; +pub const TYPE_BINDING: u16 = 231; +pub const REFERENCE_TYPE: u16 = 232; +pub const POINTER_TYPE: u16 = 233; +pub const NEVER_TYPE: u16 = 234; +pub const ABSTRACT_TYPE: u16 = 235; +pub const DYNAMIC_TYPE: u16 = 236; +pub const _EXPRESSION: u16 = 238; +pub const MACRO_INVOCATION: u16 = 239; +pub const SCOPED_IDENTIFIER: u16 = 243; +pub const SCOPED_TYPE_IDENTIFIER: u16 = 245; +pub const RANGE_EXPRESSION: u16 = 246; +pub const UNARY_EXPRESSION: u16 = 247; +pub const TRY_EXPRESSION: u16 = 248; +pub const REFERENCE_EXPRESSION: u16 = 249; +pub const BINARY_EXPRESSION: u16 = 250; +pub const ASSIGNMENT_EXPRESSION: u16 = 251; +pub const COMPOUND_ASSIGNMENT_EXPR: u16 = 252; +pub const TYPE_CAST_EXPRESSION: u16 = 253; +pub const RETURN_EXPRESSION: u16 = 254; +pub const YIELD_EXPRESSION: u16 = 255; +pub const CALL_EXPRESSION: u16 = 256; +pub const ARGUMENTS: u16 = 257; +pub const ARRAY_EXPRESSION: u16 = 258; +pub const PARENTHESIZED_EXPRESSION: u16 = 259; +pub const TUPLE_EXPRESSION: u16 = 260; +pub const UNIT_EXPRESSION: u16 = 261; +pub const STRUCT_EXPRESSION: u16 = 262; +pub const FIELD_INITIALIZER_LIST: u16 = 263; +pub const SHORTHAND_FIELD_INITIALIZER: u16 = 264; +pub const FIELD_INITIALIZER: u16 = 265; +pub const BASE_FIELD_INITIALIZER: u16 = 266; +pub const IF_EXPRESSION: u16 = 267; +pub const LET_CONDITION: u16 = 268; +pub const ELSE_CLAUSE: u16 = 271; +pub const MATCH_EXPRESSION: u16 = 272; +pub const MATCH_BLOCK: u16 = 273; +pub const MATCH_ARM: u16 = 274; +pub const MATCH_PATTERN: u16 = 276; +pub const WHILE_EXPRESSION: u16 = 277; +pub const LOOP_EXPRESSION: u16 = 278; +pub const FOR_EXPRESSION: u16 = 279; +pub const CONST_BLOCK: u16 = 280; +pub const CLOSURE_EXPRESSION: u16 = 281; +pub const CLOSURE_PARAMETERS: u16 = 282; +pub const LABEL: u16 = 283; +pub const BREAK_EXPRESSION: u16 = 284; +pub const CONTINUE_EXPRESSION: u16 = 285; +pub const INDEX_EXPRESSION: u16 = 286; +pub const AWAIT_EXPRESSION: u16 = 287; +pub const FIELD_EXPRESSION: u16 = 288; +pub const UNSAFE_BLOCK: u16 = 289; +pub const ASYNC_BLOCK: u16 = 290; +pub const GEN_BLOCK: u16 = 291; +pub const TRY_BLOCK: u16 = 292; +pub const BLOCK: u16 = 293; +pub const _PATTERN: u16 = 294; +pub const GENERIC_PATTERN: u16 = 295; +pub const TUPLE_PATTERN: u16 = 296; +pub const SLICE_PATTERN: u16 = 297; +pub const TUPLE_STRUCT_PATTERN: u16 = 298; +pub const STRUCT_PATTERN: u16 = 299; +pub const FIELD_PATTERN: u16 = 300; +pub const REMAINING_FIELD_PATTERN: u16 = 301; +pub const MUT_PATTERN: u16 = 302; +pub const RANGE_PATTERN: u16 = 303; +pub const REF_PATTERN: u16 = 304; +pub const CAPTURED_PATTERN: u16 = 305; +pub const REFERENCE_PATTERN: u16 = 306; +pub const OR_PATTERN: u16 = 307; +pub const _LITERAL: u16 = 308; +pub const _LITERAL_PATTERN: u16 = 309; +pub const NEGATIVE_LITERAL: u16 = 310; +pub const STRING_LITERAL: u16 = 311; +pub const RAW_STRING_LITERAL: u16 = 312; +pub const BOOLEAN_LITERAL: u16 = 313; +pub const LINE_COMMENT: u16 = 314; +pub const BLOCK_COMMENT: u16 = 318; +pub const FIELD_IDENTIFIER: u16 = 351; +pub const LET_CHAIN: u16 = 352; +pub const SHORTHAND_FIELD_IDENTIFIER: u16 = 353; +pub const TYPE_IDENTIFIER: u16 = 354; diff --git a/mudu_transpiler/src/rust/ts_const/ts_kind_name.rs b/mudu_transpiler/src/rust/ts_const/ts_kind_name.rs index 54d2b4a..11dae45 100644 --- a/mudu_transpiler/src/rust/ts_const/ts_kind_name.rs +++ b/mudu_transpiler/src/rust/ts_const/ts_kind_name.rs @@ -4,194 +4,195 @@ // // kind name of Node -pub const S__NON_DELIM_TOKEN : &str = "_non_delim_token"; -pub const S_SCOPED_TYPE_IDENTIFIER_IN_EXPRESSION_POSITION : &str = "scoped_type_identifier_in_expression_position"; -pub const S__INNER_LINE_DOC_COMMENT_MARKER : &str = "_inner_line_doc_comment_marker"; -pub const S__OUTER_LINE_DOC_COMMENT_MARKER : &str = "_outer_line_doc_comment_marker"; -pub const S__BLOCK_DOC_COMMENT_MARKER : &str = "_block_doc_comment_marker"; -pub const S__TYPE_IDENTIFIER : &str = "_type_identifier"; -pub const S__FIELD_IDENTIFIER : &str = "_field_identifier"; -pub const S__EXPRESSION_EXCEPT_RANGE : &str = "_expression_except_range"; -pub const S__DECLARATION_STATEMENT : &str = "_declaration_statement"; -pub const S__PATH : &str = "_path"; -pub const S_LAST_MATCH_ARM : &str = "last_match_arm"; -pub const S__DELIM_TOKENS : &str = "_delim_tokens"; -pub const S__TOKEN_PATTERN : &str = "_token_pattern"; -pub const S_COMMENT : &str = "comment"; -pub const S__RESERVED_IDENTIFIER : &str = "_reserved_identifier"; -pub const S__LINE_DOC_COMMENT_MARKER : &str = "_line_doc_comment_marker"; -pub const S__EXPRESSION_ENDING_WITH_BLOCK : &str = "_expression_ending_with_block"; -pub const S__STATEMENT : &str = "_statement"; -pub const S__CONDITION : &str = "_condition"; -pub const S__TOKENS : &str = "_tokens"; -pub const S_DELIM_TOKEN_TREE : &str = "delim_token_tree"; -pub const S__LET_CHAIN : &str = "_let_chain"; -pub const S__NON_SPECIAL_TOKEN : &str = "_non_special_token"; -pub const S__USE_CLAUSE : &str = "_use_clause"; -pub const S_IDENTIFIER : &str = "identifier"; -pub const S_PRIMITIVE_TYPE : &str = "primitive_type"; -pub const S_MUTABLE_SPECIFIER : &str = "mutable_specifier"; -pub const S_INTEGER_LITERAL : &str = "integer_literal"; -pub const S_CHAR_LITERAL : &str = "char_literal"; -pub const S_ESCAPE_SEQUENCE : &str = "escape_sequence"; -pub const S_SHEBANG : &str = "shebang"; -pub const S_SELF : &str = "self"; -pub const S_SUPER : &str = "super"; -pub const S_CRATE : &str = "crate"; -pub const S_METAVARIABLE : &str = "metavariable"; -pub const S_STRING_CONTENT : &str = "string_content"; -pub const S_OUTER_DOC_COMMENT_MARKER : &str = "outer_doc_comment_marker"; -pub const S_INNER_DOC_COMMENT_MARKER : &str = "inner_doc_comment_marker"; -pub const S_DOC_COMMENT : &str = "doc_comment"; -pub const S_SOURCE_FILE : &str = "source_file"; -pub const S_EMPTY_STATEMENT : &str = "empty_statement"; -pub const S_EXPRESSION_STATEMENT : &str = "expression_statement"; -pub const S_MACRO_DEFINITION : &str = "macro_definition"; -pub const S_MACRO_RULE : &str = "macro_rule"; -pub const S_TOKEN_TREE_PATTERN : &str = "token_tree_pattern"; -pub const S_TOKEN_BINDING_PATTERN : &str = "token_binding_pattern"; -pub const S_TOKEN_REPETITION_PATTERN : &str = "token_repetition_pattern"; -pub const S_FRAGMENT_SPECIFIER : &str = "fragment_specifier"; -pub const S_TOKEN_TREE : &str = "token_tree"; -pub const S_TOKEN_REPETITION : &str = "token_repetition"; -pub const S_ATTRIBUTE_ITEM : &str = "attribute_item"; -pub const S_INNER_ATTRIBUTE_ITEM : &str = "inner_attribute_item"; -pub const S_ATTRIBUTE : &str = "attribute"; -pub const S_MOD_ITEM : &str = "mod_item"; -pub const S_FOREIGN_MOD_ITEM : &str = "foreign_mod_item"; -pub const S_DECLARATION_LIST : &str = "declaration_list"; -pub const S_STRUCT_ITEM : &str = "struct_item"; -pub const S_UNION_ITEM : &str = "union_item"; -pub const S_ENUM_ITEM : &str = "enum_item"; -pub const S_ENUM_VARIANT_LIST : &str = "enum_variant_list"; -pub const S_ENUM_VARIANT : &str = "enum_variant"; -pub const S_FIELD_DECLARATION_LIST : &str = "field_declaration_list"; -pub const S_FIELD_DECLARATION : &str = "field_declaration"; -pub const S_ORDERED_FIELD_DECLARATION_LIST : &str = "ordered_field_declaration_list"; -pub const S_EXTERN_CRATE_DECLARATION : &str = "extern_crate_declaration"; -pub const S_CONST_ITEM : &str = "const_item"; -pub const S_STATIC_ITEM : &str = "static_item"; -pub const S_TYPE_ITEM : &str = "type_item"; -pub const S_FUNCTION_ITEM : &str = "function_item"; -pub const S_FUNCTION_SIGNATURE_ITEM : &str = "function_signature_item"; -pub const S_FUNCTION_MODIFIERS : &str = "function_modifiers"; -pub const S_WHERE_CLAUSE : &str = "where_clause"; -pub const S_WHERE_PREDICATE : &str = "where_predicate"; -pub const S_IMPL_ITEM : &str = "impl_item"; -pub const S_TRAIT_ITEM : &str = "trait_item"; -pub const S_ASSOCIATED_TYPE : &str = "associated_type"; -pub const S_TRAIT_BOUNDS : &str = "trait_bounds"; -pub const S_HIGHER_RANKED_TRAIT_BOUND : &str = "higher_ranked_trait_bound"; -pub const S_REMOVED_TRAIT_BOUND : &str = "removed_trait_bound"; -pub const S_TYPE_PARAMETERS : &str = "type_parameters"; -pub const S_CONST_PARAMETER : &str = "const_parameter"; -pub const S_TYPE_PARAMETER : &str = "type_parameter"; -pub const S_LIFETIME_PARAMETER : &str = "lifetime_parameter"; -pub const S_LET_DECLARATION : &str = "let_declaration"; -pub const S_USE_DECLARATION : &str = "use_declaration"; -pub const S_SCOPED_USE_LIST : &str = "scoped_use_list"; -pub const S_USE_LIST : &str = "use_list"; -pub const S_USE_AS_CLAUSE : &str = "use_as_clause"; -pub const S_USE_WILDCARD : &str = "use_wildcard"; -pub const S_PARAMETERS : &str = "parameters"; -pub const S_SELF_PARAMETER : &str = "self_parameter"; -pub const S_VARIADIC_PARAMETER : &str = "variadic_parameter"; -pub const S_PARAMETER : &str = "parameter"; -pub const S_EXTERN_MODIFIER : &str = "extern_modifier"; -pub const S_VISIBILITY_MODIFIER : &str = "visibility_modifier"; -pub const S__TYPE : &str = "_type"; -pub const S_BRACKETED_TYPE : &str = "bracketed_type"; -pub const S_QUALIFIED_TYPE : &str = "qualified_type"; -pub const S_LIFETIME : &str = "lifetime"; -pub const S_ARRAY_TYPE : &str = "array_type"; -pub const S_FOR_LIFETIMES : &str = "for_lifetimes"; -pub const S_FUNCTION_TYPE : &str = "function_type"; -pub const S_TUPLE_TYPE : &str = "tuple_type"; -pub const S_UNIT_TYPE : &str = "unit_type"; -pub const S_GENERIC_FUNCTION : &str = "generic_function"; -pub const S_GENERIC_TYPE : &str = "generic_type"; -pub const S_GENERIC_TYPE_WITH_TURBOFISH : &str = "generic_type_with_turbofish"; -pub const S_BOUNDED_TYPE : &str = "bounded_type"; -pub const S_USE_BOUNDS : &str = "use_bounds"; -pub const S_TYPE_ARGUMENTS : &str = "type_arguments"; -pub const S_TYPE_BINDING : &str = "type_binding"; -pub const S_REFERENCE_TYPE : &str = "reference_type"; -pub const S_POINTER_TYPE : &str = "pointer_type"; -pub const S_NEVER_TYPE : &str = "never_type"; -pub const S_ABSTRACT_TYPE : &str = "abstract_type"; -pub const S_DYNAMIC_TYPE : &str = "dynamic_type"; -pub const S__EXPRESSION : &str = "_expression"; -pub const S_MACRO_INVOCATION : &str = "macro_invocation"; -pub const S_SCOPED_IDENTIFIER : &str = "scoped_identifier"; -pub const S_SCOPED_TYPE_IDENTIFIER : &str = "scoped_type_identifier"; -pub const S_RANGE_EXPRESSION : &str = "range_expression"; -pub const S_UNARY_EXPRESSION : &str = "unary_expression"; -pub const S_TRY_EXPRESSION : &str = "try_expression"; -pub const S_REFERENCE_EXPRESSION : &str = "reference_expression"; -pub const S_BINARY_EXPRESSION : &str = "binary_expression"; -pub const S_ASSIGNMENT_EXPRESSION : &str = "assignment_expression"; -pub const S_COMPOUND_ASSIGNMENT_EXPR : &str = "compound_assignment_expr"; -pub const S_TYPE_CAST_EXPRESSION : &str = "type_cast_expression"; -pub const S_RETURN_EXPRESSION : &str = "return_expression"; -pub const S_YIELD_EXPRESSION : &str = "yield_expression"; -pub const S_CALL_EXPRESSION : &str = "call_expression"; -pub const S_ARGUMENTS : &str = "arguments"; -pub const S_ARRAY_EXPRESSION : &str = "array_expression"; -pub const S_PARENTHESIZED_EXPRESSION : &str = "parenthesized_expression"; -pub const S_TUPLE_EXPRESSION : &str = "tuple_expression"; -pub const S_UNIT_EXPRESSION : &str = "unit_expression"; -pub const S_STRUCT_EXPRESSION : &str = "struct_expression"; -pub const S_FIELD_INITIALIZER_LIST : &str = "field_initializer_list"; -pub const S_SHORTHAND_FIELD_INITIALIZER : &str = "shorthand_field_initializer"; -pub const S_FIELD_INITIALIZER : &str = "field_initializer"; -pub const S_BASE_FIELD_INITIALIZER : &str = "base_field_initializer"; -pub const S_IF_EXPRESSION : &str = "if_expression"; -pub const S_LET_CONDITION : &str = "let_condition"; -pub const S_ELSE_CLAUSE : &str = "else_clause"; -pub const S_MATCH_EXPRESSION : &str = "match_expression"; -pub const S_MATCH_BLOCK : &str = "match_block"; -pub const S_MATCH_ARM : &str = "match_arm"; -pub const S_MATCH_PATTERN : &str = "match_pattern"; -pub const S_WHILE_EXPRESSION : &str = "while_expression"; -pub const S_LOOP_EXPRESSION : &str = "loop_expression"; -pub const S_FOR_EXPRESSION : &str = "for_expression"; -pub const S_CONST_BLOCK : &str = "const_block"; -pub const S_CLOSURE_EXPRESSION : &str = "closure_expression"; -pub const S_CLOSURE_PARAMETERS : &str = "closure_parameters"; -pub const S_LABEL : &str = "label"; -pub const S_BREAK_EXPRESSION : &str = "break_expression"; -pub const S_CONTINUE_EXPRESSION : &str = "continue_expression"; -pub const S_INDEX_EXPRESSION : &str = "index_expression"; -pub const S_AWAIT_EXPRESSION : &str = "await_expression"; -pub const S_FIELD_EXPRESSION : &str = "field_expression"; -pub const S_UNSAFE_BLOCK : &str = "unsafe_block"; -pub const S_ASYNC_BLOCK : &str = "async_block"; -pub const S_GEN_BLOCK : &str = "gen_block"; -pub const S_TRY_BLOCK : &str = "try_block"; -pub const S_BLOCK : &str = "block"; -pub const S__PATTERN : &str = "_pattern"; -pub const S_GENERIC_PATTERN : &str = "generic_pattern"; -pub const S_TUPLE_PATTERN : &str = "tuple_pattern"; -pub const S_SLICE_PATTERN : &str = "slice_pattern"; -pub const S_TUPLE_STRUCT_PATTERN : &str = "tuple_struct_pattern"; -pub const S_STRUCT_PATTERN : &str = "struct_pattern"; -pub const S_FIELD_PATTERN : &str = "field_pattern"; -pub const S_REMAINING_FIELD_PATTERN : &str = "remaining_field_pattern"; -pub const S_MUT_PATTERN : &str = "mut_pattern"; -pub const S_RANGE_PATTERN : &str = "range_pattern"; -pub const S_REF_PATTERN : &str = "ref_pattern"; -pub const S_CAPTURED_PATTERN : &str = "captured_pattern"; -pub const S_REFERENCE_PATTERN : &str = "reference_pattern"; -pub const S_OR_PATTERN : &str = "or_pattern"; -pub const S__LITERAL : &str = "_literal"; -pub const S__LITERAL_PATTERN : &str = "_literal_pattern"; -pub const S_NEGATIVE_LITERAL : &str = "negative_literal"; -pub const S_STRING_LITERAL : &str = "string_literal"; -pub const S_RAW_STRING_LITERAL : &str = "raw_string_literal"; -pub const S_BOOLEAN_LITERAL : &str = "boolean_literal"; -pub const S_LINE_COMMENT : &str = "line_comment"; -pub const S_BLOCK_COMMENT : &str = "block_comment"; -pub const S_FIELD_IDENTIFIER : &str = "field_identifier"; -pub const S_LET_CHAIN : &str = "let_chain"; -pub const S_SHORTHAND_FIELD_IDENTIFIER : &str = "shorthand_field_identifier"; -pub const S_TYPE_IDENTIFIER : &str = "type_identifier"; +pub const S__NON_DELIM_TOKEN: &str = "_non_delim_token"; +pub const S_SCOPED_TYPE_IDENTIFIER_IN_EXPRESSION_POSITION: &str = + "scoped_type_identifier_in_expression_position"; +pub const S__INNER_LINE_DOC_COMMENT_MARKER: &str = "_inner_line_doc_comment_marker"; +pub const S__OUTER_LINE_DOC_COMMENT_MARKER: &str = "_outer_line_doc_comment_marker"; +pub const S__BLOCK_DOC_COMMENT_MARKER: &str = "_block_doc_comment_marker"; +pub const S__TYPE_IDENTIFIER: &str = "_type_identifier"; +pub const S__FIELD_IDENTIFIER: &str = "_field_identifier"; +pub const S__EXPRESSION_EXCEPT_RANGE: &str = "_expression_except_range"; +pub const S__DECLARATION_STATEMENT: &str = "_declaration_statement"; +pub const S__PATH: &str = "_path"; +pub const S_LAST_MATCH_ARM: &str = "last_match_arm"; +pub const S__DELIM_TOKENS: &str = "_delim_tokens"; +pub const S__TOKEN_PATTERN: &str = "_token_pattern"; +pub const S_COMMENT: &str = "comment"; +pub const S__RESERVED_IDENTIFIER: &str = "_reserved_identifier"; +pub const S__LINE_DOC_COMMENT_MARKER: &str = "_line_doc_comment_marker"; +pub const S__EXPRESSION_ENDING_WITH_BLOCK: &str = "_expression_ending_with_block"; +pub const S__STATEMENT: &str = "_statement"; +pub const S__CONDITION: &str = "_condition"; +pub const S__TOKENS: &str = "_tokens"; +pub const S_DELIM_TOKEN_TREE: &str = "delim_token_tree"; +pub const S__LET_CHAIN: &str = "_let_chain"; +pub const S__NON_SPECIAL_TOKEN: &str = "_non_special_token"; +pub const S__USE_CLAUSE: &str = "_use_clause"; +pub const S_IDENTIFIER: &str = "identifier"; +pub const S_PRIMITIVE_TYPE: &str = "primitive_type"; +pub const S_MUTABLE_SPECIFIER: &str = "mutable_specifier"; +pub const S_INTEGER_LITERAL: &str = "integer_literal"; +pub const S_CHAR_LITERAL: &str = "char_literal"; +pub const S_ESCAPE_SEQUENCE: &str = "escape_sequence"; +pub const S_SHEBANG: &str = "shebang"; +pub const S_SELF: &str = "self"; +pub const S_SUPER: &str = "super"; +pub const S_CRATE: &str = "crate"; +pub const S_METAVARIABLE: &str = "metavariable"; +pub const S_STRING_CONTENT: &str = "string_content"; +pub const S_OUTER_DOC_COMMENT_MARKER: &str = "outer_doc_comment_marker"; +pub const S_INNER_DOC_COMMENT_MARKER: &str = "inner_doc_comment_marker"; +pub const S_DOC_COMMENT: &str = "doc_comment"; +pub const S_SOURCE_FILE: &str = "source_file"; +pub const S_EMPTY_STATEMENT: &str = "empty_statement"; +pub const S_EXPRESSION_STATEMENT: &str = "expression_statement"; +pub const S_MACRO_DEFINITION: &str = "macro_definition"; +pub const S_MACRO_RULE: &str = "macro_rule"; +pub const S_TOKEN_TREE_PATTERN: &str = "token_tree_pattern"; +pub const S_TOKEN_BINDING_PATTERN: &str = "token_binding_pattern"; +pub const S_TOKEN_REPETITION_PATTERN: &str = "token_repetition_pattern"; +pub const S_FRAGMENT_SPECIFIER: &str = "fragment_specifier"; +pub const S_TOKEN_TREE: &str = "token_tree"; +pub const S_TOKEN_REPETITION: &str = "token_repetition"; +pub const S_ATTRIBUTE_ITEM: &str = "attribute_item"; +pub const S_INNER_ATTRIBUTE_ITEM: &str = "inner_attribute_item"; +pub const S_ATTRIBUTE: &str = "attribute"; +pub const S_MOD_ITEM: &str = "mod_item"; +pub const S_FOREIGN_MOD_ITEM: &str = "foreign_mod_item"; +pub const S_DECLARATION_LIST: &str = "declaration_list"; +pub const S_STRUCT_ITEM: &str = "struct_item"; +pub const S_UNION_ITEM: &str = "union_item"; +pub const S_ENUM_ITEM: &str = "enum_item"; +pub const S_ENUM_VARIANT_LIST: &str = "enum_variant_list"; +pub const S_ENUM_VARIANT: &str = "enum_variant"; +pub const S_FIELD_DECLARATION_LIST: &str = "field_declaration_list"; +pub const S_FIELD_DECLARATION: &str = "field_declaration"; +pub const S_ORDERED_FIELD_DECLARATION_LIST: &str = "ordered_field_declaration_list"; +pub const S_EXTERN_CRATE_DECLARATION: &str = "extern_crate_declaration"; +pub const S_CONST_ITEM: &str = "const_item"; +pub const S_STATIC_ITEM: &str = "static_item"; +pub const S_TYPE_ITEM: &str = "type_item"; +pub const S_FUNCTION_ITEM: &str = "function_item"; +pub const S_FUNCTION_SIGNATURE_ITEM: &str = "function_signature_item"; +pub const S_FUNCTION_MODIFIERS: &str = "function_modifiers"; +pub const S_WHERE_CLAUSE: &str = "where_clause"; +pub const S_WHERE_PREDICATE: &str = "where_predicate"; +pub const S_IMPL_ITEM: &str = "impl_item"; +pub const S_TRAIT_ITEM: &str = "trait_item"; +pub const S_ASSOCIATED_TYPE: &str = "associated_type"; +pub const S_TRAIT_BOUNDS: &str = "trait_bounds"; +pub const S_HIGHER_RANKED_TRAIT_BOUND: &str = "higher_ranked_trait_bound"; +pub const S_REMOVED_TRAIT_BOUND: &str = "removed_trait_bound"; +pub const S_TYPE_PARAMETERS: &str = "type_parameters"; +pub const S_CONST_PARAMETER: &str = "const_parameter"; +pub const S_TYPE_PARAMETER: &str = "type_parameter"; +pub const S_LIFETIME_PARAMETER: &str = "lifetime_parameter"; +pub const S_LET_DECLARATION: &str = "let_declaration"; +pub const S_USE_DECLARATION: &str = "use_declaration"; +pub const S_SCOPED_USE_LIST: &str = "scoped_use_list"; +pub const S_USE_LIST: &str = "use_list"; +pub const S_USE_AS_CLAUSE: &str = "use_as_clause"; +pub const S_USE_WILDCARD: &str = "use_wildcard"; +pub const S_PARAMETERS: &str = "parameters"; +pub const S_SELF_PARAMETER: &str = "self_parameter"; +pub const S_VARIADIC_PARAMETER: &str = "variadic_parameter"; +pub const S_PARAMETER: &str = "parameter"; +pub const S_EXTERN_MODIFIER: &str = "extern_modifier"; +pub const S_VISIBILITY_MODIFIER: &str = "visibility_modifier"; +pub const S__TYPE: &str = "_type"; +pub const S_BRACKETED_TYPE: &str = "bracketed_type"; +pub const S_QUALIFIED_TYPE: &str = "qualified_type"; +pub const S_LIFETIME: &str = "lifetime"; +pub const S_ARRAY_TYPE: &str = "array_type"; +pub const S_FOR_LIFETIMES: &str = "for_lifetimes"; +pub const S_FUNCTION_TYPE: &str = "function_type"; +pub const S_TUPLE_TYPE: &str = "tuple_type"; +pub const S_UNIT_TYPE: &str = "unit_type"; +pub const S_GENERIC_FUNCTION: &str = "generic_function"; +pub const S_GENERIC_TYPE: &str = "generic_type"; +pub const S_GENERIC_TYPE_WITH_TURBOFISH: &str = "generic_type_with_turbofish"; +pub const S_BOUNDED_TYPE: &str = "bounded_type"; +pub const S_USE_BOUNDS: &str = "use_bounds"; +pub const S_TYPE_ARGUMENTS: &str = "type_arguments"; +pub const S_TYPE_BINDING: &str = "type_binding"; +pub const S_REFERENCE_TYPE: &str = "reference_type"; +pub const S_POINTER_TYPE: &str = "pointer_type"; +pub const S_NEVER_TYPE: &str = "never_type"; +pub const S_ABSTRACT_TYPE: &str = "abstract_type"; +pub const S_DYNAMIC_TYPE: &str = "dynamic_type"; +pub const S__EXPRESSION: &str = "_expression"; +pub const S_MACRO_INVOCATION: &str = "macro_invocation"; +pub const S_SCOPED_IDENTIFIER: &str = "scoped_identifier"; +pub const S_SCOPED_TYPE_IDENTIFIER: &str = "scoped_type_identifier"; +pub const S_RANGE_EXPRESSION: &str = "range_expression"; +pub const S_UNARY_EXPRESSION: &str = "unary_expression"; +pub const S_TRY_EXPRESSION: &str = "try_expression"; +pub const S_REFERENCE_EXPRESSION: &str = "reference_expression"; +pub const S_BINARY_EXPRESSION: &str = "binary_expression"; +pub const S_ASSIGNMENT_EXPRESSION: &str = "assignment_expression"; +pub const S_COMPOUND_ASSIGNMENT_EXPR: &str = "compound_assignment_expr"; +pub const S_TYPE_CAST_EXPRESSION: &str = "type_cast_expression"; +pub const S_RETURN_EXPRESSION: &str = "return_expression"; +pub const S_YIELD_EXPRESSION: &str = "yield_expression"; +pub const S_CALL_EXPRESSION: &str = "call_expression"; +pub const S_ARGUMENTS: &str = "arguments"; +pub const S_ARRAY_EXPRESSION: &str = "array_expression"; +pub const S_PARENTHESIZED_EXPRESSION: &str = "parenthesized_expression"; +pub const S_TUPLE_EXPRESSION: &str = "tuple_expression"; +pub const S_UNIT_EXPRESSION: &str = "unit_expression"; +pub const S_STRUCT_EXPRESSION: &str = "struct_expression"; +pub const S_FIELD_INITIALIZER_LIST: &str = "field_initializer_list"; +pub const S_SHORTHAND_FIELD_INITIALIZER: &str = "shorthand_field_initializer"; +pub const S_FIELD_INITIALIZER: &str = "field_initializer"; +pub const S_BASE_FIELD_INITIALIZER: &str = "base_field_initializer"; +pub const S_IF_EXPRESSION: &str = "if_expression"; +pub const S_LET_CONDITION: &str = "let_condition"; +pub const S_ELSE_CLAUSE: &str = "else_clause"; +pub const S_MATCH_EXPRESSION: &str = "match_expression"; +pub const S_MATCH_BLOCK: &str = "match_block"; +pub const S_MATCH_ARM: &str = "match_arm"; +pub const S_MATCH_PATTERN: &str = "match_pattern"; +pub const S_WHILE_EXPRESSION: &str = "while_expression"; +pub const S_LOOP_EXPRESSION: &str = "loop_expression"; +pub const S_FOR_EXPRESSION: &str = "for_expression"; +pub const S_CONST_BLOCK: &str = "const_block"; +pub const S_CLOSURE_EXPRESSION: &str = "closure_expression"; +pub const S_CLOSURE_PARAMETERS: &str = "closure_parameters"; +pub const S_LABEL: &str = "label"; +pub const S_BREAK_EXPRESSION: &str = "break_expression"; +pub const S_CONTINUE_EXPRESSION: &str = "continue_expression"; +pub const S_INDEX_EXPRESSION: &str = "index_expression"; +pub const S_AWAIT_EXPRESSION: &str = "await_expression"; +pub const S_FIELD_EXPRESSION: &str = "field_expression"; +pub const S_UNSAFE_BLOCK: &str = "unsafe_block"; +pub const S_ASYNC_BLOCK: &str = "async_block"; +pub const S_GEN_BLOCK: &str = "gen_block"; +pub const S_TRY_BLOCK: &str = "try_block"; +pub const S_BLOCK: &str = "block"; +pub const S__PATTERN: &str = "_pattern"; +pub const S_GENERIC_PATTERN: &str = "generic_pattern"; +pub const S_TUPLE_PATTERN: &str = "tuple_pattern"; +pub const S_SLICE_PATTERN: &str = "slice_pattern"; +pub const S_TUPLE_STRUCT_PATTERN: &str = "tuple_struct_pattern"; +pub const S_STRUCT_PATTERN: &str = "struct_pattern"; +pub const S_FIELD_PATTERN: &str = "field_pattern"; +pub const S_REMAINING_FIELD_PATTERN: &str = "remaining_field_pattern"; +pub const S_MUT_PATTERN: &str = "mut_pattern"; +pub const S_RANGE_PATTERN: &str = "range_pattern"; +pub const S_REF_PATTERN: &str = "ref_pattern"; +pub const S_CAPTURED_PATTERN: &str = "captured_pattern"; +pub const S_REFERENCE_PATTERN: &str = "reference_pattern"; +pub const S_OR_PATTERN: &str = "or_pattern"; +pub const S__LITERAL: &str = "_literal"; +pub const S__LITERAL_PATTERN: &str = "_literal_pattern"; +pub const S_NEGATIVE_LITERAL: &str = "negative_literal"; +pub const S_STRING_LITERAL: &str = "string_literal"; +pub const S_RAW_STRING_LITERAL: &str = "raw_string_literal"; +pub const S_BOOLEAN_LITERAL: &str = "boolean_literal"; +pub const S_LINE_COMMENT: &str = "line_comment"; +pub const S_BLOCK_COMMENT: &str = "block_comment"; +pub const S_FIELD_IDENTIFIER: &str = "field_identifier"; +pub const S_LET_CHAIN: &str = "let_chain"; +pub const S_SHORTHAND_FIELD_IDENTIFIER: &str = "shorthand_field_identifier"; +pub const S_TYPE_IDENTIFIER: &str = "type_identifier"; diff --git a/mudu_transpiler/src/rust/ts_const/ts_seq_index.rs b/mudu_transpiler/src/rust/ts_const/ts_seq_index.rs index 86eeab4..9b13a13 100644 --- a/mudu_transpiler/src/rust/ts_const/ts_seq_index.rs +++ b/mudu_transpiler/src/rust/ts_const/ts_seq_index.rs @@ -4,722 +4,722 @@ // // sequence index in array of SEQ type -pub const _LET_CHAIN_PREC_LEFT_CHOICE_SEQ_STRING : usize = 1; -pub const _LET_CHAIN_PREC_LEFT_CHOICE_SEQ_SYMBOL_0 : usize = 0; -pub const _LET_CHAIN_PREC_LEFT_CHOICE_SEQ_SYMBOL_2 : usize = 2; -pub const ABSTRACT_TYPE_SEQ_CHOICE : usize = 1; -pub const ABSTRACT_TYPE_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const ABSTRACT_TYPE_SEQ_CHOICE_SEQ_SYMBOL : usize = 1; -pub const ABSTRACT_TYPE_SEQ_FIELD : usize = 2; -pub const ABSTRACT_TYPE_SEQ_STRING : usize = 0; -pub const ARGUMENTS_SEQ_CHOICE_1 : usize = 1; -pub const ARGUMENTS_SEQ_CHOICE_2 : usize = 2; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT : usize = 0; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL : usize = 1; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 0; -pub const ARGUMENTS_SEQ_CHOICE_SEQ_SEQ_SYMBOL : usize = 1; -pub const ARGUMENTS_SEQ_STRING_0 : usize = 0; -pub const ARGUMENTS_SEQ_STRING_3 : usize = 3; -pub const ARRAY_EXPRESSION_SEQ_CHOICE : usize = 2; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_0 : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_1 : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_SEQ_SYMBOL : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_FIELD : usize = 2; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_REPEAT : usize = 1; -pub const ARRAY_EXPRESSION_SEQ_STRING_0 : usize = 0; -pub const ARRAY_EXPRESSION_SEQ_STRING_3 : usize = 3; -pub const ARRAY_TYPE_SEQ_CHOICE : usize = 2; -pub const ARRAY_TYPE_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const ARRAY_TYPE_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const ARRAY_TYPE_SEQ_FIELD : usize = 1; -pub const ARRAY_TYPE_SEQ_STRING_0 : usize = 0; -pub const ARRAY_TYPE_SEQ_STRING_3 : usize = 3; -pub const ASSIGNMENT_EXPRESSIO_PREC_LEFT_SEQ_FIELD_0 : usize = 0; -pub const ASSIGNMENT_EXPRESSIO_PREC_LEFT_SEQ_FIELD_2 : usize = 2; -pub const ASSIGNMENT_EXPRESSIO_PREC_LEFT_SEQ_STRING : usize = 1; -pub const ASSOCIATED_TYPE_SEQ_CHOICE : usize = 4; -pub const ASSOCIATED_TYPE_SEQ_FIELD_1 : usize = 1; -pub const ASSOCIATED_TYPE_SEQ_FIELD_2 : usize = 2; -pub const ASSOCIATED_TYPE_SEQ_FIELD_3 : usize = 3; -pub const ASSOCIATED_TYPE_SEQ_STRING_0 : usize = 0; -pub const ASSOCIATED_TYPE_SEQ_STRING_5 : usize = 5; -pub const ASYNC_BLOCK_SEQ_CHOICE : usize = 1; -pub const ASYNC_BLOCK_SEQ_STRING : usize = 0; -pub const ASYNC_BLOCK_SEQ_SYMBOL : usize = 2; -pub const ATTRIBUTE_SEQ_CHOICE : usize = 1; -pub const ATTRIBUTE_SEQ_CHOICE_CHOICE_SEQ_FIELD : usize = 1; -pub const ATTRIBUTE_SEQ_CHOICE_CHOICE_SEQ_STRING : usize = 0; -pub const ATTRIBUTE_SEQ_SYMBOL : usize = 0; -pub const ATTRIBUTE_ITEM_SEQ_STRING_0 : usize = 0; -pub const ATTRIBUTE_ITEM_SEQ_STRING_1 : usize = 1; -pub const ATTRIBUTE_ITEM_SEQ_STRING_3 : usize = 3; -pub const ATTRIBUTE_ITEM_SEQ_SYMBOL : usize = 2; -pub const AWAIT_EXPRESSION_PREC_SEQ_STRING_1 : usize = 1; -pub const AWAIT_EXPRESSION_PREC_SEQ_STRING_2 : usize = 2; -pub const AWAIT_EXPRESSION_PREC_SEQ_SYMBOL : usize = 0; -pub const BASE_FIELD_INITIALIZ_SEQ_STRING : usize = 0; -pub const BASE_FIELD_INITIALIZ_SEQ_SYMBOL : usize = 1; -pub const BINARY_EXPRESSION_CHOICE_PREC_LEFT_SEQ_FIELD_0 : usize = 0; -pub const BINARY_EXPRESSION_CHOICE_PREC_LEFT_SEQ_FIELD_1 : usize = 1; -pub const BINARY_EXPRESSION_CHOICE_PREC_LEFT_SEQ_FIELD_2 : usize = 2; -pub const BLOCK_SEQ_CHOICE_0 : usize = 0; -pub const BLOCK_SEQ_CHOICE_3 : usize = 3; -pub const BLOCK_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const BLOCK_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const BLOCK_SEQ_REPEAT : usize = 2; -pub const BLOCK_SEQ_STRING_1 : usize = 1; -pub const BLOCK_SEQ_STRING_4 : usize = 4; -pub const BLOCK_COMMENT_SEQ_CHOICE : usize = 1; -pub const BLOCK_COMMENT_SEQ_CHOICE_CHOICE_SEQ_CHOICE : usize = 1; -pub const BLOCK_COMMENT_SEQ_CHOICE_CHOICE_SEQ_SYMBOL : usize = 0; -pub const BLOCK_COMMENT_SEQ_STRING_0 : usize = 0; -pub const BLOCK_COMMENT_SEQ_STRING_2 : usize = 2; -pub const BOUNDED_TYPE_PREC_LEFT_SEQ_CHOICE_0 : usize = 0; -pub const BOUNDED_TYPE_PREC_LEFT_SEQ_CHOICE_2 : usize = 2; -pub const BOUNDED_TYPE_PREC_LEFT_SEQ_STRING : usize = 1; -pub const BRACKETED_TYPE_SEQ_CHOICE : usize = 1; -pub const BRACKETED_TYPE_SEQ_STRING_0 : usize = 0; -pub const BRACKETED_TYPE_SEQ_STRING_2 : usize = 2; -pub const BREAK_EXPRESSION_PREC_LEFT_SEQ_CHOICE_1 : usize = 1; -pub const BREAK_EXPRESSION_PREC_LEFT_SEQ_CHOICE_2 : usize = 2; -pub const BREAK_EXPRESSION_PREC_LEFT_SEQ_STRING : usize = 0; -pub const CALL_EXPRESSION_PREC_SEQ_FIELD_0 : usize = 0; -pub const CALL_EXPRESSION_PREC_SEQ_FIELD_1 : usize = 1; -pub const CAPTURED_PATTERN_SEQ_STRING : usize = 1; -pub const CAPTURED_PATTERN_SEQ_SYMBOL_0 : usize = 0; -pub const CAPTURED_PATTERN_SEQ_SYMBOL_2 : usize = 2; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_0 : usize = 0; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_1 : usize = 1; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_2 : usize = 2; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_4 : usize = 4; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const CLOSURE_EXPRESSION_PREC_SEQ_FIELD : usize = 3; -pub const CLOSURE_PARAMETERS_SEQ_CHOICE : usize = 1; -pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const CLOSURE_PARAMETERS_SEQ_STRING_0 : usize = 0; -pub const CLOSURE_PARAMETERS_SEQ_STRING_2 : usize = 2; -pub const COMPOUND_ASSIGNMENT__PREC_LEFT_SEQ_FIELD_0 : usize = 0; -pub const COMPOUND_ASSIGNMENT__PREC_LEFT_SEQ_FIELD_1 : usize = 1; -pub const COMPOUND_ASSIGNMENT__PREC_LEFT_SEQ_FIELD_2 : usize = 2; -pub const CONST_BLOCK_SEQ_FIELD : usize = 1; -pub const CONST_BLOCK_SEQ_STRING : usize = 0; -pub const CONST_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const CONST_ITEM_SEQ_CHOICE_5 : usize = 5; -pub const CONST_ITEM_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const CONST_ITEM_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const CONST_ITEM_SEQ_FIELD_2 : usize = 2; -pub const CONST_ITEM_SEQ_FIELD_4 : usize = 4; -pub const CONST_ITEM_SEQ_STRING_1 : usize = 1; -pub const CONST_ITEM_SEQ_STRING_3 : usize = 3; -pub const CONST_ITEM_SEQ_STRING_6 : usize = 6; -pub const CONST_PARAMETER_SEQ_CHOICE : usize = 4; -pub const CONST_PARAMETER_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const CONST_PARAMETER_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const CONST_PARAMETER_SEQ_FIELD_1 : usize = 1; -pub const CONST_PARAMETER_SEQ_FIELD_3 : usize = 3; -pub const CONST_PARAMETER_SEQ_STRING_0 : usize = 0; -pub const CONST_PARAMETER_SEQ_STRING_2 : usize = 2; -pub const CONTINUE_EXPRESSION_PREC_LEFT_SEQ_CHOICE : usize = 1; -pub const CONTINUE_EXPRESSION_PREC_LEFT_SEQ_STRING : usize = 0; -pub const DECLARATION_LIST_SEQ_REPEAT : usize = 1; -pub const DECLARATION_LIST_SEQ_STRING_0 : usize = 0; -pub const DECLARATION_LIST_SEQ_STRING_2 : usize = 2; -pub const DELIM_TOKEN_TREE_CHOICE_SEQ_REPEAT : usize = 1; -pub const DELIM_TOKEN_TREE_CHOICE_SEQ_STRING_0 : usize = 0; -pub const DELIM_TOKEN_TREE_CHOICE_SEQ_STRING_2 : usize = 2; -pub const DYNAMIC_TYPE_SEQ_FIELD : usize = 1; -pub const DYNAMIC_TYPE_SEQ_STRING : usize = 0; -pub const ELSE_CLAUSE_SEQ_CHOICE : usize = 1; -pub const ELSE_CLAUSE_SEQ_STRING : usize = 0; -pub const ENUM_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const ENUM_ITEM_SEQ_CHOICE_4 : usize = 4; -pub const ENUM_ITEM_SEQ_FIELD_2 : usize = 2; -pub const ENUM_ITEM_SEQ_FIELD_3 : usize = 3; -pub const ENUM_ITEM_SEQ_FIELD_5 : usize = 5; -pub const ENUM_ITEM_SEQ_STRING : usize = 1; -pub const ENUM_VARIANT_SEQ_CHOICE_0 : usize = 0; -pub const ENUM_VARIANT_SEQ_CHOICE_3 : usize = 3; -pub const ENUM_VARIANT_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const ENUM_VARIANT_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const ENUM_VARIANT_SEQ_FIELD_1 : usize = 1; -pub const ENUM_VARIANT_SEQ_FIELD_2 : usize = 2; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_1 : usize = 1; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_2 : usize = 2; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT : usize = 0; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL : usize = 1; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 0; -pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_SEQ_SYMBOL : usize = 1; -pub const ENUM_VARIANT_LIST_SEQ_STRING_0 : usize = 0; -pub const ENUM_VARIANT_LIST_SEQ_STRING_3 : usize = 3; -pub const EXPRESSION_STATEMENT_CHOICE_SEQ_STRING : usize = 1; -pub const EXPRESSION_STATEMENT_CHOICE_SEQ_SYMBOL : usize = 0; -pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_0 : usize = 0; -pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_4 : usize = 4; -pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const EXTERN_CRATE_DECLARA_SEQ_FIELD : usize = 3; -pub const EXTERN_CRATE_DECLARA_SEQ_STRING_1 : usize = 1; -pub const EXTERN_CRATE_DECLARA_SEQ_STRING_5 : usize = 5; -pub const EXTERN_CRATE_DECLARA_SEQ_SYMBOL : usize = 2; -pub const EXTERN_MODIFIER_SEQ_CHOICE : usize = 1; -pub const EXTERN_MODIFIER_SEQ_STRING : usize = 0; -pub const FIELD_DECLARATION_SEQ_CHOICE : usize = 0; -pub const FIELD_DECLARATION_SEQ_FIELD_1 : usize = 1; -pub const FIELD_DECLARATION_SEQ_FIELD_3 : usize = 3; -pub const FIELD_DECLARATION_SEQ_STRING : usize = 2; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_1 : usize = 1; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_2 : usize = 2; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT : usize = 0; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL : usize = 1; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 0; -pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_SEQ_SYMBOL : usize = 1; -pub const FIELD_DECLARATION_LI_SEQ_STRING_0 : usize = 0; -pub const FIELD_DECLARATION_LI_SEQ_STRING_3 : usize = 3; -pub const FIELD_EXPRESSION_PREC_SEQ_FIELD_0 : usize = 0; -pub const FIELD_EXPRESSION_PREC_SEQ_FIELD_2 : usize = 2; -pub const FIELD_EXPRESSION_PREC_SEQ_STRING : usize = 1; -pub const FIELD_INITIALIZER_SEQ_FIELD_1 : usize = 1; -pub const FIELD_INITIALIZER_SEQ_FIELD_3 : usize = 3; -pub const FIELD_INITIALIZER_SEQ_REPEAT : usize = 0; -pub const FIELD_INITIALIZER_SEQ_STRING : usize = 2; -pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_1 : usize = 1; -pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_2 : usize = 2; -pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const FIELD_INITIALIZER_LI_SEQ_STRING_0 : usize = 0; -pub const FIELD_INITIALIZER_LI_SEQ_STRING_3 : usize = 3; -pub const FIELD_PATTERN_SEQ_CHOICE_0 : usize = 0; -pub const FIELD_PATTERN_SEQ_CHOICE_1 : usize = 1; -pub const FIELD_PATTERN_SEQ_CHOICE_2 : usize = 2; -pub const FIELD_PATTERN_SEQ_CHOICE_SEQ_FIELD_0 : usize = 0; -pub const FIELD_PATTERN_SEQ_CHOICE_SEQ_FIELD_2 : usize = 2; -pub const FIELD_PATTERN_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const FOR_EXPRESSION_SEQ_CHOICE : usize = 0; -pub const FOR_EXPRESSION_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const FOR_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const FOR_EXPRESSION_SEQ_FIELD_2 : usize = 2; -pub const FOR_EXPRESSION_SEQ_FIELD_4 : usize = 4; -pub const FOR_EXPRESSION_SEQ_FIELD_5 : usize = 5; -pub const FOR_EXPRESSION_SEQ_STRING_1 : usize = 1; -pub const FOR_EXPRESSION_SEQ_STRING_3 : usize = 3; -pub const FOR_LIFETIMES_SEQ_CHOICE : usize = 3; -pub const FOR_LIFETIMES_SEQ_SEQ : usize = 2; -pub const FOR_LIFETIMES_SEQ_SEQ_REPEAT : usize = 1; -pub const FOR_LIFETIMES_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const FOR_LIFETIMES_SEQ_SEQ_REPEAT_SEQ_SYMBOL : usize = 1; -pub const FOR_LIFETIMES_SEQ_SEQ_SYMBOL : usize = 0; -pub const FOR_LIFETIMES_SEQ_STRING_0 : usize = 0; -pub const FOR_LIFETIMES_SEQ_STRING_1 : usize = 1; -pub const FOR_LIFETIMES_SEQ_STRING_4 : usize = 4; -pub const FOREIGN_MOD_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const FOREIGN_MOD_ITEM_SEQ_CHOICE_2 : usize = 2; -pub const FOREIGN_MOD_ITEM_SEQ_SYMBOL : usize = 1; -pub const FUNCTION_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const FUNCTION_ITEM_SEQ_CHOICE_1 : usize = 1; -pub const FUNCTION_ITEM_SEQ_CHOICE_6 : usize = 6; -pub const FUNCTION_ITEM_SEQ_CHOICE_7 : usize = 7; -pub const FUNCTION_ITEM_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const FUNCTION_ITEM_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const FUNCTION_ITEM_SEQ_FIELD_3 : usize = 3; -pub const FUNCTION_ITEM_SEQ_FIELD_4 : usize = 4; -pub const FUNCTION_ITEM_SEQ_FIELD_5 : usize = 5; -pub const FUNCTION_ITEM_SEQ_FIELD_8 : usize = 8; -pub const FUNCTION_ITEM_SEQ_STRING : usize = 2; -pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_0 : usize = 0; -pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_1 : usize = 1; -pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_6 : usize = 6; -pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_7 : usize = 7; -pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const FUNCTION_SIGNATURE_I_SEQ_FIELD_3 : usize = 3; -pub const FUNCTION_SIGNATURE_I_SEQ_FIELD_4 : usize = 4; -pub const FUNCTION_SIGNATURE_I_SEQ_FIELD_5 : usize = 5; -pub const FUNCTION_SIGNATURE_I_SEQ_STRING_2 : usize = 2; -pub const FUNCTION_SIGNATURE_I_SEQ_STRING_8 : usize = 8; -pub const FUNCTION_TYPE_SEQ_CHOICE_0 : usize = 0; -pub const FUNCTION_TYPE_SEQ_CHOICE_2 : usize = 2; -pub const FUNCTION_TYPE_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const FUNCTION_TYPE_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const FUNCTION_TYPE_SEQ_PREC : usize = 1; -pub const FUNCTION_TYPE_SEQ_PREC_SEQ_CHOICE : usize = 0; -pub const FUNCTION_TYPE_SEQ_PREC_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const FUNCTION_TYPE_SEQ_PREC_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const FUNCTION_TYPE_SEQ_PREC_SEQ_FIELD : usize = 1; -pub const GEN_BLOCK_SEQ_CHOICE : usize = 1; -pub const GEN_BLOCK_SEQ_STRING : usize = 0; -pub const GEN_BLOCK_SEQ_SYMBOL : usize = 2; -pub const GENERIC_FUNCTION_PREC_SEQ_FIELD_0 : usize = 0; -pub const GENERIC_FUNCTION_PREC_SEQ_FIELD_2 : usize = 2; -pub const GENERIC_FUNCTION_PREC_SEQ_STRING : usize = 1; -pub const GENERIC_PATTERN_SEQ_CHOICE : usize = 0; -pub const GENERIC_PATTERN_SEQ_FIELD : usize = 2; -pub const GENERIC_PATTERN_SEQ_STRING : usize = 1; -pub const GENERIC_TYPE_PREC_SEQ_FIELD_0 : usize = 0; -pub const GENERIC_TYPE_PREC_SEQ_FIELD_1 : usize = 1; -pub const GENERIC_TYPE_WITH_TU_SEQ_FIELD_0 : usize = 0; -pub const GENERIC_TYPE_WITH_TU_SEQ_FIELD_2 : usize = 2; -pub const GENERIC_TYPE_WITH_TU_SEQ_STRING : usize = 1; -pub const HIGHER_RANKED_TRAIT__SEQ_FIELD_1 : usize = 1; -pub const HIGHER_RANKED_TRAIT__SEQ_FIELD_2 : usize = 2; -pub const HIGHER_RANKED_TRAIT__SEQ_STRING : usize = 0; -pub const IF_EXPRESSION_PREC_RIGHT_SEQ_CHOICE : usize = 3; -pub const IF_EXPRESSION_PREC_RIGHT_SEQ_FIELD_1 : usize = 1; -pub const IF_EXPRESSION_PREC_RIGHT_SEQ_FIELD_2 : usize = 2; -pub const IF_EXPRESSION_PREC_RIGHT_SEQ_STRING : usize = 0; -pub const IMPL_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const IMPL_ITEM_SEQ_CHOICE_3 : usize = 3; -pub const IMPL_ITEM_SEQ_CHOICE_5 : usize = 5; -pub const IMPL_ITEM_SEQ_CHOICE_6 : usize = 6; -pub const IMPL_ITEM_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const IMPL_ITEM_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const IMPL_ITEM_SEQ_CHOICE_SEQ_STRING : usize = 2; -pub const IMPL_ITEM_SEQ_FIELD_2 : usize = 2; -pub const IMPL_ITEM_SEQ_FIELD_4 : usize = 4; -pub const IMPL_ITEM_SEQ_STRING : usize = 1; -pub const INDEX_EXPRESSION_PREC_SEQ_STRING_1 : usize = 1; -pub const INDEX_EXPRESSION_PREC_SEQ_STRING_3 : usize = 3; -pub const INDEX_EXPRESSION_PREC_SEQ_SYMBOL_0 : usize = 0; -pub const INDEX_EXPRESSION_PREC_SEQ_SYMBOL_2 : usize = 2; -pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_0 : usize = 0; -pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_1 : usize = 1; -pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_2 : usize = 2; -pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_4 : usize = 4; -pub const INNER_ATTRIBUTE_ITEM_SEQ_SYMBOL : usize = 3; -pub const LABEL_SEQ_STRING : usize = 0; -pub const LABEL_SEQ_SYMBOL : usize = 1; -pub const LAST_MATCH_ARM_SEQ_CHOICE : usize = 4; -pub const LAST_MATCH_ARM_SEQ_FIELD_1 : usize = 1; -pub const LAST_MATCH_ARM_SEQ_FIELD_3 : usize = 3; -pub const LAST_MATCH_ARM_SEQ_REPEAT : usize = 0; -pub const LAST_MATCH_ARM_SEQ_STRING : usize = 2; -pub const LET_CONDITION_SEQ_FIELD_1 : usize = 1; -pub const LET_CONDITION_SEQ_FIELD_3 : usize = 3; -pub const LET_CONDITION_SEQ_STRING_0 : usize = 0; -pub const LET_CONDITION_SEQ_STRING_2 : usize = 2; -pub const LET_DECLARATION_SEQ_CHOICE_1 : usize = 1; -pub const LET_DECLARATION_SEQ_CHOICE_3 : usize = 3; -pub const LET_DECLARATION_SEQ_CHOICE_4 : usize = 4; -pub const LET_DECLARATION_SEQ_CHOICE_5 : usize = 5; -pub const LET_DECLARATION_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const LET_DECLARATION_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const LET_DECLARATION_SEQ_FIELD : usize = 2; -pub const LET_DECLARATION_SEQ_STRING_0 : usize = 0; -pub const LET_DECLARATION_SEQ_STRING_6 : usize = 6; -pub const LIFETIME_PREC_SEQ_STRING : usize = 0; -pub const LIFETIME_PREC_SEQ_SYMBOL : usize = 1; -pub const LIFETIME_PARAMETER_PREC_SEQ_CHOICE : usize = 1; -pub const LIFETIME_PARAMETER_PREC_SEQ_FIELD : usize = 0; -pub const LINE_COMMENT_SEQ_CHOICE : usize = 1; -pub const LINE_COMMENT_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const LINE_COMMENT_SEQ_CHOICE_SEQ_IMMEDIATE_TOKEN : usize = 0; -pub const LINE_COMMENT_SEQ_CHOICE_SEQ_PATTERN : usize = 1; -pub const LINE_COMMENT_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const LINE_COMMENT_SEQ_STRING : usize = 0; -pub const LOOP_EXPRESSION_SEQ_CHOICE : usize = 0; -pub const LOOP_EXPRESSION_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const LOOP_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const LOOP_EXPRESSION_SEQ_FIELD : usize = 2; -pub const LOOP_EXPRESSION_SEQ_STRING : usize = 1; -pub const MACRO_DEFINITION_SEQ_CHOICE : usize = 2; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ : usize = 1; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_CHOICE : usize = 1; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 0; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 1; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_SYMBOL : usize = 0; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_STRING_0 : usize = 0; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_STRING_2 : usize = 2; -pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_STRING_3 : usize = 3; -pub const MACRO_DEFINITION_SEQ_FIELD : usize = 1; -pub const MACRO_DEFINITION_SEQ_STRING : usize = 0; -pub const MACRO_INVOCATION_SEQ_ALIAS : usize = 2; -pub const MACRO_INVOCATION_SEQ_FIELD : usize = 0; -pub const MACRO_INVOCATION_SEQ_STRING : usize = 1; -pub const MACRO_RULE_SEQ_FIELD_0 : usize = 0; -pub const MACRO_RULE_SEQ_FIELD_2 : usize = 2; -pub const MACRO_RULE_SEQ_STRING : usize = 1; -pub const MATCH_ARM_PREC_RIGHT_SEQ_CHOICE : usize = 3; -pub const MATCH_ARM_PREC_RIGHT_SEQ_CHOICE_SEQ_FIELD : usize = 0; -pub const MATCH_ARM_PREC_RIGHT_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const MATCH_ARM_PREC_RIGHT_SEQ_FIELD : usize = 1; -pub const MATCH_ARM_PREC_RIGHT_SEQ_REPEAT : usize = 0; -pub const MATCH_ARM_PREC_RIGHT_SEQ_STRING : usize = 2; -pub const MATCH_BLOCK_SEQ_CHOICE : usize = 1; -pub const MATCH_BLOCK_SEQ_CHOICE_SEQ_ALIAS : usize = 1; -pub const MATCH_BLOCK_SEQ_CHOICE_SEQ_REPEAT : usize = 0; -pub const MATCH_BLOCK_SEQ_STRING_0 : usize = 0; -pub const MATCH_BLOCK_SEQ_STRING_2 : usize = 2; -pub const MATCH_EXPRESSION_SEQ_FIELD_1 : usize = 1; -pub const MATCH_EXPRESSION_SEQ_FIELD_2 : usize = 2; -pub const MATCH_EXPRESSION_SEQ_STRING : usize = 0; -pub const MATCH_PATTERN_SEQ_CHOICE : usize = 1; -pub const MATCH_PATTERN_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const MATCH_PATTERN_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const MATCH_PATTERN_SEQ_SYMBOL : usize = 0; -pub const MOD_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const MOD_ITEM_SEQ_CHOICE_3 : usize = 3; -pub const MOD_ITEM_SEQ_FIELD : usize = 2; -pub const MOD_ITEM_SEQ_STRING : usize = 1; -pub const MUT_PATTERN_PREC_SEQ_SYMBOL_0 : usize = 0; -pub const MUT_PATTERN_PREC_SEQ_SYMBOL_1 : usize = 1; -pub const NEGATIVE_LITERAL_SEQ_CHOICE : usize = 1; -pub const NEGATIVE_LITERAL_SEQ_STRING : usize = 0; -pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_STRING_1 : usize = 1; -pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_STRING_0 : usize = 0; -pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_SYMBOL_0 : usize = 0; -pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_SYMBOL_2 : usize = 2; -pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_SYMBOL_1 : usize = 1; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_1 : usize = 1; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_2 : usize = 2; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_CHOICE : usize = 1; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_FIELD : usize = 2; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT : usize = 0; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ_CHOICE : usize = 1; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ_FIELD : usize = 2; -pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 0; -pub const ORDERED_FIELD_DECLAR_SEQ_STRING_0 : usize = 0; -pub const ORDERED_FIELD_DECLAR_SEQ_STRING_3 : usize = 3; -pub const PARAMETER_SEQ_CHOICE : usize = 0; -pub const PARAMETER_SEQ_FIELD_1 : usize = 1; -pub const PARAMETER_SEQ_FIELD_3 : usize = 3; -pub const PARAMETER_SEQ_STRING : usize = 2; -pub const PARAMETERS_SEQ_CHOICE_1 : usize = 1; -pub const PARAMETERS_SEQ_CHOICE_2 : usize = 2; -pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_CHOICE_0 : usize = 0; -pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_CHOICE_1 : usize = 1; -pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const PARAMETERS_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const PARAMETERS_SEQ_CHOICE_SEQ_SEQ_CHOICE_0 : usize = 0; -pub const PARAMETERS_SEQ_CHOICE_SEQ_SEQ_CHOICE_1 : usize = 1; -pub const PARAMETERS_SEQ_STRING_0 : usize = 0; -pub const PARAMETERS_SEQ_STRING_3 : usize = 3; -pub const PARENTHESIZED_EXPRES_SEQ_STRING_0 : usize = 0; -pub const PARENTHESIZED_EXPRES_SEQ_STRING_2 : usize = 2; -pub const PARENTHESIZED_EXPRES_SEQ_SYMBOL : usize = 1; -pub const POINTER_TYPE_SEQ_CHOICE : usize = 1; -pub const POINTER_TYPE_SEQ_FIELD : usize = 2; -pub const POINTER_TYPE_SEQ_STRING : usize = 0; -pub const QUALIFIED_TYPE_SEQ_FIELD_0 : usize = 0; -pub const QUALIFIED_TYPE_SEQ_FIELD_2 : usize = 2; -pub const QUALIFIED_TYPE_SEQ_STRING : usize = 1; -pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_CHOICE : usize = 1; -pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_STRING_1 : usize = 1; -pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_STRING_0 : usize = 0; -pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_SYMBOL_0 : usize = 0; -pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_SYMBOL_2 : usize = 2; -pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_SYMBOL_1 : usize = 1; -pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_1 : usize = 1; -pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_0 : usize = 0; -pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const RANGE_PATTERN_CHOICE_SEQ_FIELD_0 : usize = 0; -pub const RANGE_PATTERN_CHOICE_SEQ_FIELD_1 : usize = 1; -pub const RAW_STRING_LITERAL_SEQ_ALIAS : usize = 1; -pub const RAW_STRING_LITERAL_SEQ_SYMBOL_0 : usize = 0; -pub const RAW_STRING_LITERAL_SEQ_SYMBOL_2 : usize = 2; -pub const REF_PATTERN_SEQ_STRING : usize = 0; -pub const REF_PATTERN_SEQ_SYMBOL : usize = 1; -pub const REFERENCE_EXPRESSION_PREC_SEQ_CHOICE : usize = 1; -pub const REFERENCE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE : usize = 1; -pub const REFERENCE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const REFERENCE_EXPRESSION_PREC_SEQ_FIELD : usize = 2; -pub const REFERENCE_EXPRESSION_PREC_SEQ_STRING : usize = 0; -pub const REFERENCE_PATTERN_SEQ_CHOICE : usize = 1; -pub const REFERENCE_PATTERN_SEQ_STRING : usize = 0; -pub const REFERENCE_PATTERN_SEQ_SYMBOL : usize = 2; -pub const REFERENCE_TYPE_SEQ_CHOICE_1 : usize = 1; -pub const REFERENCE_TYPE_SEQ_CHOICE_2 : usize = 2; -pub const REFERENCE_TYPE_SEQ_FIELD : usize = 3; -pub const REFERENCE_TYPE_SEQ_STRING : usize = 0; -pub const REMOVED_TRAIT_BOUND_SEQ_STRING : usize = 0; -pub const REMOVED_TRAIT_BOUND_SEQ_SYMBOL : usize = 1; -pub const RETURN_EXPRESSION_CHOICE_PREC_LEFT_SEQ_STRING : usize = 0; -pub const RETURN_EXPRESSION_CHOICE_PREC_LEFT_SEQ_SYMBOL : usize = 1; -pub const SCOPED_IDENTIFIER_SEQ_FIELD_0 : usize = 0; -pub const SCOPED_IDENTIFIER_SEQ_FIELD_2 : usize = 2; -pub const SCOPED_IDENTIFIER_SEQ_STRING : usize = 1; -pub const SCOPED_TYPE_IDENTIFI_PREC_SEQ_FIELD_0 : usize = 0; -pub const SCOPED_TYPE_IDENTIFI_PREC_SEQ_FIELD_2 : usize = 2; -pub const SCOPED_TYPE_IDENTIFI_PREC_SEQ_STRING : usize = 1; -pub const SCOPED_TYPE_IDENTIFI_SEQ_FIELD_0 : usize = 0; -pub const SCOPED_TYPE_IDENTIFI_SEQ_FIELD_2 : usize = 2; -pub const SCOPED_TYPE_IDENTIFI_SEQ_STRING : usize = 1; -pub const SCOPED_USE_LIST_SEQ_FIELD_0 : usize = 0; -pub const SCOPED_USE_LIST_SEQ_FIELD_2 : usize = 2; -pub const SCOPED_USE_LIST_SEQ_STRING : usize = 1; -pub const SELF_PARAMETER_SEQ_CHOICE_0 : usize = 0; -pub const SELF_PARAMETER_SEQ_CHOICE_1 : usize = 1; -pub const SELF_PARAMETER_SEQ_CHOICE_2 : usize = 2; -pub const SELF_PARAMETER_SEQ_SYMBOL : usize = 3; -pub const SHORTHAND_FIELD_INIT_SEQ_REPEAT : usize = 0; -pub const SHORTHAND_FIELD_INIT_SEQ_SYMBOL : usize = 1; -pub const SLICE_PATTERN_SEQ_CHOICE_1 : usize = 1; -pub const SLICE_PATTERN_SEQ_CHOICE_2 : usize = 2; -pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_SYMBOL : usize = 1; -pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const SLICE_PATTERN_SEQ_STRING_0 : usize = 0; -pub const SLICE_PATTERN_SEQ_STRING_3 : usize = 3; -pub const SOURCE_FILE_SEQ_CHOICE : usize = 0; -pub const SOURCE_FILE_SEQ_REPEAT : usize = 1; -pub const STATIC_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const STATIC_ITEM_SEQ_CHOICE_2 : usize = 2; -pub const STATIC_ITEM_SEQ_CHOICE_3 : usize = 3; -pub const STATIC_ITEM_SEQ_CHOICE_7 : usize = 7; -pub const STATIC_ITEM_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const STATIC_ITEM_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const STATIC_ITEM_SEQ_FIELD_4 : usize = 4; -pub const STATIC_ITEM_SEQ_FIELD_6 : usize = 6; -pub const STATIC_ITEM_SEQ_STRING_1 : usize = 1; -pub const STATIC_ITEM_SEQ_STRING_5 : usize = 5; -pub const STATIC_ITEM_SEQ_STRING_8 : usize = 8; -pub const STRING_LITERAL_SEQ_ALIAS_0 : usize = 0; -pub const STRING_LITERAL_SEQ_ALIAS_2 : usize = 2; -pub const STRING_LITERAL_SEQ_REPEAT : usize = 1; -pub const STRUCT_EXPRESSION_SEQ_FIELD_0 : usize = 0; -pub const STRUCT_EXPRESSION_SEQ_FIELD_1 : usize = 1; -pub const STRUCT_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const STRUCT_ITEM_SEQ_CHOICE_4 : usize = 4; -pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_CHOICE_0 : usize = 0; -pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_CHOICE_1 : usize = 1; -pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_FIELD_1 : usize = 1; -pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_FIELD_0 : usize = 0; -pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_STRING : usize = 2; -pub const STRUCT_ITEM_SEQ_FIELD_2 : usize = 2; -pub const STRUCT_ITEM_SEQ_FIELD_3 : usize = 3; -pub const STRUCT_ITEM_SEQ_STRING : usize = 1; -pub const STRUCT_PATTERN_SEQ_CHOICE_2 : usize = 2; -pub const STRUCT_PATTERN_SEQ_CHOICE_3 : usize = 3; -pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const STRUCT_PATTERN_SEQ_FIELD : usize = 0; -pub const STRUCT_PATTERN_SEQ_STRING_1 : usize = 1; -pub const STRUCT_PATTERN_SEQ_STRING_4 : usize = 4; -pub const TOKEN_BINDING_PATTER_PREC_SEQ_FIELD_0 : usize = 0; -pub const TOKEN_BINDING_PATTER_PREC_SEQ_FIELD_2 : usize = 2; -pub const TOKEN_BINDING_PATTER_PREC_SEQ_STRING : usize = 1; -pub const TOKEN_REPETITION_SEQ_CHOICE_4 : usize = 4; -pub const TOKEN_REPETITION_SEQ_CHOICE_5 : usize = 5; -pub const TOKEN_REPETITION_SEQ_REPEAT : usize = 2; -pub const TOKEN_REPETITION_SEQ_STRING_0 : usize = 0; -pub const TOKEN_REPETITION_SEQ_STRING_1 : usize = 1; -pub const TOKEN_REPETITION_SEQ_STRING_3 : usize = 3; -pub const TOKEN_REPETITION_PAT_SEQ_CHOICE_4 : usize = 4; -pub const TOKEN_REPETITION_PAT_SEQ_CHOICE_5 : usize = 5; -pub const TOKEN_REPETITION_PAT_SEQ_REPEAT : usize = 2; -pub const TOKEN_REPETITION_PAT_SEQ_STRING_0 : usize = 0; -pub const TOKEN_REPETITION_PAT_SEQ_STRING_1 : usize = 1; -pub const TOKEN_REPETITION_PAT_SEQ_STRING_3 : usize = 3; -pub const TOKEN_TREE_CHOICE_SEQ_REPEAT : usize = 1; -pub const TOKEN_TREE_CHOICE_SEQ_STRING_0 : usize = 0; -pub const TOKEN_TREE_CHOICE_SEQ_STRING_2 : usize = 2; -pub const TOKEN_TREE_PATTERN_CHOICE_SEQ_REPEAT : usize = 1; -pub const TOKEN_TREE_PATTERN_CHOICE_SEQ_STRING_0 : usize = 0; -pub const TOKEN_TREE_PATTERN_CHOICE_SEQ_STRING_2 : usize = 2; -pub const TRAIT_BOUNDS_SEQ_SEQ : usize = 1; -pub const TRAIT_BOUNDS_SEQ_SEQ_CHOICE : usize = 0; -pub const TRAIT_BOUNDS_SEQ_SEQ_REPEAT : usize = 1; -pub const TRAIT_BOUNDS_SEQ_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const TRAIT_BOUNDS_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const TRAIT_BOUNDS_SEQ_STRING : usize = 0; -pub const TRAIT_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const TRAIT_ITEM_SEQ_CHOICE_1 : usize = 1; -pub const TRAIT_ITEM_SEQ_CHOICE_6 : usize = 6; -pub const TRAIT_ITEM_SEQ_FIELD_3 : usize = 3; -pub const TRAIT_ITEM_SEQ_FIELD_4 : usize = 4; -pub const TRAIT_ITEM_SEQ_FIELD_5 : usize = 5; -pub const TRAIT_ITEM_SEQ_FIELD_7 : usize = 7; -pub const TRAIT_ITEM_SEQ_STRING : usize = 2; -pub const TRY_BLOCK_SEQ_STRING : usize = 0; -pub const TRY_BLOCK_SEQ_SYMBOL : usize = 1; -pub const TRY_EXPRESSION_PREC_SEQ_STRING : usize = 1; -pub const TRY_EXPRESSION_PREC_SEQ_SYMBOL : usize = 0; -pub const TUPLE_EXPRESSION_SEQ_CHOICE : usize = 4; -pub const TUPLE_EXPRESSION_SEQ_REPEAT_1 : usize = 1; -pub const TUPLE_EXPRESSION_SEQ_REPEAT_3 : usize = 3; -pub const TUPLE_EXPRESSION_SEQ_REPEAT_SEQ_STRING : usize = 1; -pub const TUPLE_EXPRESSION_SEQ_REPEAT_SEQ_SYMBOL : usize = 0; -pub const TUPLE_EXPRESSION_SEQ_SEQ : usize = 2; -pub const TUPLE_EXPRESSION_SEQ_SEQ_STRING : usize = 1; -pub const TUPLE_EXPRESSION_SEQ_SEQ_SYMBOL : usize = 0; -pub const TUPLE_EXPRESSION_SEQ_STRING_0 : usize = 0; -pub const TUPLE_EXPRESSION_SEQ_STRING_5 : usize = 5; -pub const TUPLE_PATTERN_SEQ_CHOICE_1 : usize = 1; -pub const TUPLE_PATTERN_SEQ_CHOICE_2 : usize = 2; -pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const TUPLE_PATTERN_SEQ_STRING_0 : usize = 0; -pub const TUPLE_PATTERN_SEQ_STRING_3 : usize = 3; -pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_2 : usize = 2; -pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_3 : usize = 3; -pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_SYMBOL : usize = 1; -pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const TUPLE_STRUCT_PATTERN_SEQ_FIELD : usize = 0; -pub const TUPLE_STRUCT_PATTERN_SEQ_STRING_1 : usize = 1; -pub const TUPLE_STRUCT_PATTERN_SEQ_STRING_4 : usize = 4; -pub const TUPLE_TYPE_SEQ_CHOICE : usize = 2; -pub const TUPLE_TYPE_SEQ_SEQ : usize = 1; -pub const TUPLE_TYPE_SEQ_SEQ_REPEAT : usize = 1; -pub const TUPLE_TYPE_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const TUPLE_TYPE_SEQ_SEQ_REPEAT_SEQ_SYMBOL : usize = 1; -pub const TUPLE_TYPE_SEQ_SEQ_SYMBOL : usize = 0; -pub const TUPLE_TYPE_SEQ_STRING_0 : usize = 0; -pub const TUPLE_TYPE_SEQ_STRING_3 : usize = 3; -pub const TYPE_ARGUMENTS_SEQ_CHOICE : usize = 2; -pub const TYPE_ARGUMENTS_SEQ_SEQ : usize = 1; -pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT : usize = 1; -pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_SEQ_CHOICE_0 : usize = 0; -pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_SEQ_CHOICE_1 : usize = 1; -pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const TYPE_ARGUMENTS_SEQ_SEQ_SEQ : usize = 0; -pub const TYPE_ARGUMENTS_SEQ_SEQ_SEQ_CHOICE_0 : usize = 0; -pub const TYPE_ARGUMENTS_SEQ_SEQ_SEQ_CHOICE_1 : usize = 1; -pub const TYPE_ARGUMENTS_SEQ_STRING : usize = 3; -pub const TYPE_ARGUMENTS_SEQ_TOKEN : usize = 0; -pub const TYPE_BINDING_SEQ_FIELD_0 : usize = 0; -pub const TYPE_BINDING_SEQ_FIELD_1 : usize = 1; -pub const TYPE_BINDING_SEQ_FIELD_3 : usize = 3; -pub const TYPE_BINDING_SEQ_STRING : usize = 2; -pub const TYPE_CAST_EXPRESSION_PREC_LEFT_SEQ_FIELD_0 : usize = 0; -pub const TYPE_CAST_EXPRESSION_PREC_LEFT_SEQ_FIELD_2 : usize = 2; -pub const TYPE_CAST_EXPRESSION_PREC_LEFT_SEQ_STRING : usize = 1; -pub const TYPE_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const TYPE_ITEM_SEQ_CHOICE_4 : usize = 4; -pub const TYPE_ITEM_SEQ_CHOICE_7 : usize = 7; -pub const TYPE_ITEM_SEQ_FIELD_2 : usize = 2; -pub const TYPE_ITEM_SEQ_FIELD_3 : usize = 3; -pub const TYPE_ITEM_SEQ_FIELD_6 : usize = 6; -pub const TYPE_ITEM_SEQ_STRING_1 : usize = 1; -pub const TYPE_ITEM_SEQ_STRING_5 : usize = 5; -pub const TYPE_ITEM_SEQ_STRING_8 : usize = 8; -pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_1 : usize = 1; -pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_2 : usize = 2; -pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_SEQ_FIELD : usize = 1; -pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const TYPE_PARAMETER_PREC_SEQ_FIELD : usize = 0; -pub const TYPE_PARAMETERS_PREC_SEQ_CHOICE : usize = 2; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ : usize = 1; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT : usize = 1; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_SEQ : usize = 1; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_SEQ_CHOICE : usize = 1; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_SEQ_REPEAT : usize = 0; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_SEQ : usize = 0; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_SEQ_CHOICE : usize = 1; -pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_SEQ_REPEAT : usize = 0; -pub const TYPE_PARAMETERS_PREC_SEQ_STRING_0 : usize = 0; -pub const TYPE_PARAMETERS_PREC_SEQ_STRING_3 : usize = 3; -pub const UNARY_EXPRESSION_PREC_SEQ_CHOICE : usize = 0; -pub const UNARY_EXPRESSION_PREC_SEQ_SYMBOL : usize = 1; -pub const UNION_ITEM_SEQ_CHOICE_0 : usize = 0; -pub const UNION_ITEM_SEQ_CHOICE_4 : usize = 4; -pub const UNION_ITEM_SEQ_FIELD_2 : usize = 2; -pub const UNION_ITEM_SEQ_FIELD_3 : usize = 3; -pub const UNION_ITEM_SEQ_FIELD_5 : usize = 5; -pub const UNION_ITEM_SEQ_STRING : usize = 1; -pub const UNIT_EXPRESSION_SEQ_STRING_0 : usize = 0; -pub const UNIT_EXPRESSION_SEQ_STRING_1 : usize = 1; -pub const UNIT_TYPE_SEQ_STRING_0 : usize = 0; -pub const UNIT_TYPE_SEQ_STRING_1 : usize = 1; -pub const UNSAFE_BLOCK_SEQ_STRING : usize = 0; -pub const UNSAFE_BLOCK_SEQ_SYMBOL : usize = 1; -pub const USE_AS_CLAUSE_SEQ_FIELD_0 : usize = 0; -pub const USE_AS_CLAUSE_SEQ_FIELD_2 : usize = 2; -pub const USE_AS_CLAUSE_SEQ_STRING : usize = 1; -pub const USE_BOUNDS_SEQ_CHOICE_2 : usize = 2; -pub const USE_BOUNDS_SEQ_CHOICE_3 : usize = 3; -pub const USE_BOUNDS_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const USE_BOUNDS_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const USE_BOUNDS_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const USE_BOUNDS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const USE_BOUNDS_SEQ_STRING_0 : usize = 0; -pub const USE_BOUNDS_SEQ_STRING_4 : usize = 4; -pub const USE_BOUNDS_SEQ_TOKEN : usize = 1; -pub const USE_DECLARATION_SEQ_CHOICE : usize = 0; -pub const USE_DECLARATION_SEQ_FIELD : usize = 2; -pub const USE_DECLARATION_SEQ_STRING_1 : usize = 1; -pub const USE_DECLARATION_SEQ_STRING_3 : usize = 3; -pub const USE_LIST_SEQ_CHOICE_1 : usize = 1; -pub const USE_LIST_SEQ_CHOICE_2 : usize = 2; -pub const USE_LIST_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const USE_LIST_SEQ_CHOICE_SEQ_REPEAT : usize = 1; -pub const USE_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE : usize = 1; -pub const USE_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const USE_LIST_SEQ_STRING_0 : usize = 0; -pub const USE_LIST_SEQ_STRING_3 : usize = 3; -pub const USE_WILDCARD_SEQ_CHOICE : usize = 0; -pub const USE_WILDCARD_SEQ_CHOICE_SEQ_CHOICE : usize = 0; -pub const USE_WILDCARD_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const USE_WILDCARD_SEQ_STRING : usize = 1; -pub const VARIADIC_PARAMETER_SEQ_CHOICE_0 : usize = 0; -pub const VARIADIC_PARAMETER_SEQ_CHOICE_1 : usize = 1; -pub const VARIADIC_PARAMETER_SEQ_CHOICE_SEQ_FIELD : usize = 0; -pub const VARIADIC_PARAMETER_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const VARIADIC_PARAMETER_SEQ_STRING : usize = 2; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE : usize = 1; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_CHOICE : usize = 1; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_CHOICE_SEQ_STRING : usize = 0; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_CHOICE_SEQ_SYMBOL : usize = 1; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_STRING_0 : usize = 0; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_STRING_2 : usize = 2; -pub const VISIBILITY_MODIFIER_CHOICE_SEQ_STRING : usize = 0; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE : usize = 1; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_CHOICE : usize = 1; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ : usize = 0; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_REPEAT : usize = 1; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_STRING : usize = 0; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_SYMBOL : usize = 1; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_SYMBOL : usize = 0; -pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_STRING : usize = 0; -pub const WHERE_PREDICATE_SEQ_FIELD_0 : usize = 0; -pub const WHERE_PREDICATE_SEQ_FIELD_1 : usize = 1; -pub const WHILE_EXPRESSION_SEQ_CHOICE : usize = 0; -pub const WHILE_EXPRESSION_SEQ_CHOICE_SEQ_STRING : usize = 1; -pub const WHILE_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL : usize = 0; -pub const WHILE_EXPRESSION_SEQ_FIELD_2 : usize = 2; -pub const WHILE_EXPRESSION_SEQ_FIELD_3 : usize = 3; -pub const WHILE_EXPRESSION_SEQ_STRING : usize = 1; -pub const YIELD_EXPRESSION_CHOICE_PREC_LEFT_SEQ_STRING : usize = 0; -pub const YIELD_EXPRESSION_CHOICE_PREC_LEFT_SEQ_SYMBOL : usize = 1; +pub const _LET_CHAIN_PREC_LEFT_CHOICE_SEQ_STRING: usize = 1; +pub const _LET_CHAIN_PREC_LEFT_CHOICE_SEQ_SYMBOL_0: usize = 0; +pub const _LET_CHAIN_PREC_LEFT_CHOICE_SEQ_SYMBOL_2: usize = 2; +pub const ABSTRACT_TYPE_SEQ_CHOICE: usize = 1; +pub const ABSTRACT_TYPE_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const ABSTRACT_TYPE_SEQ_CHOICE_SEQ_SYMBOL: usize = 1; +pub const ABSTRACT_TYPE_SEQ_FIELD: usize = 2; +pub const ABSTRACT_TYPE_SEQ_STRING: usize = 0; +pub const ARGUMENTS_SEQ_CHOICE_1: usize = 1; +pub const ARGUMENTS_SEQ_CHOICE_2: usize = 2; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT: usize = 0; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL: usize = 1; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 0; +pub const ARGUMENTS_SEQ_CHOICE_SEQ_SEQ_SYMBOL: usize = 1; +pub const ARGUMENTS_SEQ_STRING_0: usize = 0; +pub const ARGUMENTS_SEQ_STRING_3: usize = 3; +pub const ARRAY_EXPRESSION_SEQ_CHOICE: usize = 2; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_0: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_1: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_CHOICE_SEQ_SEQ_SYMBOL: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_FIELD: usize = 2; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_REPEAT: usize = 1; +pub const ARRAY_EXPRESSION_SEQ_STRING_0: usize = 0; +pub const ARRAY_EXPRESSION_SEQ_STRING_3: usize = 3; +pub const ARRAY_TYPE_SEQ_CHOICE: usize = 2; +pub const ARRAY_TYPE_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const ARRAY_TYPE_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const ARRAY_TYPE_SEQ_FIELD: usize = 1; +pub const ARRAY_TYPE_SEQ_STRING_0: usize = 0; +pub const ARRAY_TYPE_SEQ_STRING_3: usize = 3; +pub const ASSIGNMENT_EXPRESSIO_PREC_LEFT_SEQ_FIELD_0: usize = 0; +pub const ASSIGNMENT_EXPRESSIO_PREC_LEFT_SEQ_FIELD_2: usize = 2; +pub const ASSIGNMENT_EXPRESSIO_PREC_LEFT_SEQ_STRING: usize = 1; +pub const ASSOCIATED_TYPE_SEQ_CHOICE: usize = 4; +pub const ASSOCIATED_TYPE_SEQ_FIELD_1: usize = 1; +pub const ASSOCIATED_TYPE_SEQ_FIELD_2: usize = 2; +pub const ASSOCIATED_TYPE_SEQ_FIELD_3: usize = 3; +pub const ASSOCIATED_TYPE_SEQ_STRING_0: usize = 0; +pub const ASSOCIATED_TYPE_SEQ_STRING_5: usize = 5; +pub const ASYNC_BLOCK_SEQ_CHOICE: usize = 1; +pub const ASYNC_BLOCK_SEQ_STRING: usize = 0; +pub const ASYNC_BLOCK_SEQ_SYMBOL: usize = 2; +pub const ATTRIBUTE_SEQ_CHOICE: usize = 1; +pub const ATTRIBUTE_SEQ_CHOICE_CHOICE_SEQ_FIELD: usize = 1; +pub const ATTRIBUTE_SEQ_CHOICE_CHOICE_SEQ_STRING: usize = 0; +pub const ATTRIBUTE_SEQ_SYMBOL: usize = 0; +pub const ATTRIBUTE_ITEM_SEQ_STRING_0: usize = 0; +pub const ATTRIBUTE_ITEM_SEQ_STRING_1: usize = 1; +pub const ATTRIBUTE_ITEM_SEQ_STRING_3: usize = 3; +pub const ATTRIBUTE_ITEM_SEQ_SYMBOL: usize = 2; +pub const AWAIT_EXPRESSION_PREC_SEQ_STRING_1: usize = 1; +pub const AWAIT_EXPRESSION_PREC_SEQ_STRING_2: usize = 2; +pub const AWAIT_EXPRESSION_PREC_SEQ_SYMBOL: usize = 0; +pub const BASE_FIELD_INITIALIZ_SEQ_STRING: usize = 0; +pub const BASE_FIELD_INITIALIZ_SEQ_SYMBOL: usize = 1; +pub const BINARY_EXPRESSION_CHOICE_PREC_LEFT_SEQ_FIELD_0: usize = 0; +pub const BINARY_EXPRESSION_CHOICE_PREC_LEFT_SEQ_FIELD_1: usize = 1; +pub const BINARY_EXPRESSION_CHOICE_PREC_LEFT_SEQ_FIELD_2: usize = 2; +pub const BLOCK_SEQ_CHOICE_0: usize = 0; +pub const BLOCK_SEQ_CHOICE_3: usize = 3; +pub const BLOCK_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const BLOCK_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const BLOCK_SEQ_REPEAT: usize = 2; +pub const BLOCK_SEQ_STRING_1: usize = 1; +pub const BLOCK_SEQ_STRING_4: usize = 4; +pub const BLOCK_COMMENT_SEQ_CHOICE: usize = 1; +pub const BLOCK_COMMENT_SEQ_CHOICE_CHOICE_SEQ_CHOICE: usize = 1; +pub const BLOCK_COMMENT_SEQ_CHOICE_CHOICE_SEQ_SYMBOL: usize = 0; +pub const BLOCK_COMMENT_SEQ_STRING_0: usize = 0; +pub const BLOCK_COMMENT_SEQ_STRING_2: usize = 2; +pub const BOUNDED_TYPE_PREC_LEFT_SEQ_CHOICE_0: usize = 0; +pub const BOUNDED_TYPE_PREC_LEFT_SEQ_CHOICE_2: usize = 2; +pub const BOUNDED_TYPE_PREC_LEFT_SEQ_STRING: usize = 1; +pub const BRACKETED_TYPE_SEQ_CHOICE: usize = 1; +pub const BRACKETED_TYPE_SEQ_STRING_0: usize = 0; +pub const BRACKETED_TYPE_SEQ_STRING_2: usize = 2; +pub const BREAK_EXPRESSION_PREC_LEFT_SEQ_CHOICE_1: usize = 1; +pub const BREAK_EXPRESSION_PREC_LEFT_SEQ_CHOICE_2: usize = 2; +pub const BREAK_EXPRESSION_PREC_LEFT_SEQ_STRING: usize = 0; +pub const CALL_EXPRESSION_PREC_SEQ_FIELD_0: usize = 0; +pub const CALL_EXPRESSION_PREC_SEQ_FIELD_1: usize = 1; +pub const CAPTURED_PATTERN_SEQ_STRING: usize = 1; +pub const CAPTURED_PATTERN_SEQ_SYMBOL_0: usize = 0; +pub const CAPTURED_PATTERN_SEQ_SYMBOL_2: usize = 2; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_0: usize = 0; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_1: usize = 1; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_2: usize = 2; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_4: usize = 4; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const CLOSURE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const CLOSURE_EXPRESSION_PREC_SEQ_FIELD: usize = 3; +pub const CLOSURE_PARAMETERS_SEQ_CHOICE: usize = 1; +pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const CLOSURE_PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const CLOSURE_PARAMETERS_SEQ_STRING_0: usize = 0; +pub const CLOSURE_PARAMETERS_SEQ_STRING_2: usize = 2; +pub const COMPOUND_ASSIGNMENT__PREC_LEFT_SEQ_FIELD_0: usize = 0; +pub const COMPOUND_ASSIGNMENT__PREC_LEFT_SEQ_FIELD_1: usize = 1; +pub const COMPOUND_ASSIGNMENT__PREC_LEFT_SEQ_FIELD_2: usize = 2; +pub const CONST_BLOCK_SEQ_FIELD: usize = 1; +pub const CONST_BLOCK_SEQ_STRING: usize = 0; +pub const CONST_ITEM_SEQ_CHOICE_0: usize = 0; +pub const CONST_ITEM_SEQ_CHOICE_5: usize = 5; +pub const CONST_ITEM_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const CONST_ITEM_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const CONST_ITEM_SEQ_FIELD_2: usize = 2; +pub const CONST_ITEM_SEQ_FIELD_4: usize = 4; +pub const CONST_ITEM_SEQ_STRING_1: usize = 1; +pub const CONST_ITEM_SEQ_STRING_3: usize = 3; +pub const CONST_ITEM_SEQ_STRING_6: usize = 6; +pub const CONST_PARAMETER_SEQ_CHOICE: usize = 4; +pub const CONST_PARAMETER_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const CONST_PARAMETER_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const CONST_PARAMETER_SEQ_FIELD_1: usize = 1; +pub const CONST_PARAMETER_SEQ_FIELD_3: usize = 3; +pub const CONST_PARAMETER_SEQ_STRING_0: usize = 0; +pub const CONST_PARAMETER_SEQ_STRING_2: usize = 2; +pub const CONTINUE_EXPRESSION_PREC_LEFT_SEQ_CHOICE: usize = 1; +pub const CONTINUE_EXPRESSION_PREC_LEFT_SEQ_STRING: usize = 0; +pub const DECLARATION_LIST_SEQ_REPEAT: usize = 1; +pub const DECLARATION_LIST_SEQ_STRING_0: usize = 0; +pub const DECLARATION_LIST_SEQ_STRING_2: usize = 2; +pub const DELIM_TOKEN_TREE_CHOICE_SEQ_REPEAT: usize = 1; +pub const DELIM_TOKEN_TREE_CHOICE_SEQ_STRING_0: usize = 0; +pub const DELIM_TOKEN_TREE_CHOICE_SEQ_STRING_2: usize = 2; +pub const DYNAMIC_TYPE_SEQ_FIELD: usize = 1; +pub const DYNAMIC_TYPE_SEQ_STRING: usize = 0; +pub const ELSE_CLAUSE_SEQ_CHOICE: usize = 1; +pub const ELSE_CLAUSE_SEQ_STRING: usize = 0; +pub const ENUM_ITEM_SEQ_CHOICE_0: usize = 0; +pub const ENUM_ITEM_SEQ_CHOICE_4: usize = 4; +pub const ENUM_ITEM_SEQ_FIELD_2: usize = 2; +pub const ENUM_ITEM_SEQ_FIELD_3: usize = 3; +pub const ENUM_ITEM_SEQ_FIELD_5: usize = 5; +pub const ENUM_ITEM_SEQ_STRING: usize = 1; +pub const ENUM_VARIANT_SEQ_CHOICE_0: usize = 0; +pub const ENUM_VARIANT_SEQ_CHOICE_3: usize = 3; +pub const ENUM_VARIANT_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const ENUM_VARIANT_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const ENUM_VARIANT_SEQ_FIELD_1: usize = 1; +pub const ENUM_VARIANT_SEQ_FIELD_2: usize = 2; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_1: usize = 1; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_2: usize = 2; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT: usize = 0; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL: usize = 1; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 0; +pub const ENUM_VARIANT_LIST_SEQ_CHOICE_SEQ_SEQ_SYMBOL: usize = 1; +pub const ENUM_VARIANT_LIST_SEQ_STRING_0: usize = 0; +pub const ENUM_VARIANT_LIST_SEQ_STRING_3: usize = 3; +pub const EXPRESSION_STATEMENT_CHOICE_SEQ_STRING: usize = 1; +pub const EXPRESSION_STATEMENT_CHOICE_SEQ_SYMBOL: usize = 0; +pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_0: usize = 0; +pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_4: usize = 4; +pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const EXTERN_CRATE_DECLARA_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const EXTERN_CRATE_DECLARA_SEQ_FIELD: usize = 3; +pub const EXTERN_CRATE_DECLARA_SEQ_STRING_1: usize = 1; +pub const EXTERN_CRATE_DECLARA_SEQ_STRING_5: usize = 5; +pub const EXTERN_CRATE_DECLARA_SEQ_SYMBOL: usize = 2; +pub const EXTERN_MODIFIER_SEQ_CHOICE: usize = 1; +pub const EXTERN_MODIFIER_SEQ_STRING: usize = 0; +pub const FIELD_DECLARATION_SEQ_CHOICE: usize = 0; +pub const FIELD_DECLARATION_SEQ_FIELD_1: usize = 1; +pub const FIELD_DECLARATION_SEQ_FIELD_3: usize = 3; +pub const FIELD_DECLARATION_SEQ_STRING: usize = 2; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_1: usize = 1; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_2: usize = 2; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT: usize = 0; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_SYMBOL: usize = 1; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 0; +pub const FIELD_DECLARATION_LI_SEQ_CHOICE_SEQ_SEQ_SYMBOL: usize = 1; +pub const FIELD_DECLARATION_LI_SEQ_STRING_0: usize = 0; +pub const FIELD_DECLARATION_LI_SEQ_STRING_3: usize = 3; +pub const FIELD_EXPRESSION_PREC_SEQ_FIELD_0: usize = 0; +pub const FIELD_EXPRESSION_PREC_SEQ_FIELD_2: usize = 2; +pub const FIELD_EXPRESSION_PREC_SEQ_STRING: usize = 1; +pub const FIELD_INITIALIZER_SEQ_FIELD_1: usize = 1; +pub const FIELD_INITIALIZER_SEQ_FIELD_3: usize = 3; +pub const FIELD_INITIALIZER_SEQ_REPEAT: usize = 0; +pub const FIELD_INITIALIZER_SEQ_STRING: usize = 2; +pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_1: usize = 1; +pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_2: usize = 2; +pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const FIELD_INITIALIZER_LI_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const FIELD_INITIALIZER_LI_SEQ_STRING_0: usize = 0; +pub const FIELD_INITIALIZER_LI_SEQ_STRING_3: usize = 3; +pub const FIELD_PATTERN_SEQ_CHOICE_0: usize = 0; +pub const FIELD_PATTERN_SEQ_CHOICE_1: usize = 1; +pub const FIELD_PATTERN_SEQ_CHOICE_2: usize = 2; +pub const FIELD_PATTERN_SEQ_CHOICE_SEQ_FIELD_0: usize = 0; +pub const FIELD_PATTERN_SEQ_CHOICE_SEQ_FIELD_2: usize = 2; +pub const FIELD_PATTERN_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const FOR_EXPRESSION_SEQ_CHOICE: usize = 0; +pub const FOR_EXPRESSION_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const FOR_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const FOR_EXPRESSION_SEQ_FIELD_2: usize = 2; +pub const FOR_EXPRESSION_SEQ_FIELD_4: usize = 4; +pub const FOR_EXPRESSION_SEQ_FIELD_5: usize = 5; +pub const FOR_EXPRESSION_SEQ_STRING_1: usize = 1; +pub const FOR_EXPRESSION_SEQ_STRING_3: usize = 3; +pub const FOR_LIFETIMES_SEQ_CHOICE: usize = 3; +pub const FOR_LIFETIMES_SEQ_SEQ: usize = 2; +pub const FOR_LIFETIMES_SEQ_SEQ_REPEAT: usize = 1; +pub const FOR_LIFETIMES_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const FOR_LIFETIMES_SEQ_SEQ_REPEAT_SEQ_SYMBOL: usize = 1; +pub const FOR_LIFETIMES_SEQ_SEQ_SYMBOL: usize = 0; +pub const FOR_LIFETIMES_SEQ_STRING_0: usize = 0; +pub const FOR_LIFETIMES_SEQ_STRING_1: usize = 1; +pub const FOR_LIFETIMES_SEQ_STRING_4: usize = 4; +pub const FOREIGN_MOD_ITEM_SEQ_CHOICE_0: usize = 0; +pub const FOREIGN_MOD_ITEM_SEQ_CHOICE_2: usize = 2; +pub const FOREIGN_MOD_ITEM_SEQ_SYMBOL: usize = 1; +pub const FUNCTION_ITEM_SEQ_CHOICE_0: usize = 0; +pub const FUNCTION_ITEM_SEQ_CHOICE_1: usize = 1; +pub const FUNCTION_ITEM_SEQ_CHOICE_6: usize = 6; +pub const FUNCTION_ITEM_SEQ_CHOICE_7: usize = 7; +pub const FUNCTION_ITEM_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const FUNCTION_ITEM_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const FUNCTION_ITEM_SEQ_FIELD_3: usize = 3; +pub const FUNCTION_ITEM_SEQ_FIELD_4: usize = 4; +pub const FUNCTION_ITEM_SEQ_FIELD_5: usize = 5; +pub const FUNCTION_ITEM_SEQ_FIELD_8: usize = 8; +pub const FUNCTION_ITEM_SEQ_STRING: usize = 2; +pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_0: usize = 0; +pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_1: usize = 1; +pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_6: usize = 6; +pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_7: usize = 7; +pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const FUNCTION_SIGNATURE_I_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const FUNCTION_SIGNATURE_I_SEQ_FIELD_3: usize = 3; +pub const FUNCTION_SIGNATURE_I_SEQ_FIELD_4: usize = 4; +pub const FUNCTION_SIGNATURE_I_SEQ_FIELD_5: usize = 5; +pub const FUNCTION_SIGNATURE_I_SEQ_STRING_2: usize = 2; +pub const FUNCTION_SIGNATURE_I_SEQ_STRING_8: usize = 8; +pub const FUNCTION_TYPE_SEQ_CHOICE_0: usize = 0; +pub const FUNCTION_TYPE_SEQ_CHOICE_2: usize = 2; +pub const FUNCTION_TYPE_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const FUNCTION_TYPE_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const FUNCTION_TYPE_SEQ_PREC: usize = 1; +pub const FUNCTION_TYPE_SEQ_PREC_SEQ_CHOICE: usize = 0; +pub const FUNCTION_TYPE_SEQ_PREC_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const FUNCTION_TYPE_SEQ_PREC_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const FUNCTION_TYPE_SEQ_PREC_SEQ_FIELD: usize = 1; +pub const GEN_BLOCK_SEQ_CHOICE: usize = 1; +pub const GEN_BLOCK_SEQ_STRING: usize = 0; +pub const GEN_BLOCK_SEQ_SYMBOL: usize = 2; +pub const GENERIC_FUNCTION_PREC_SEQ_FIELD_0: usize = 0; +pub const GENERIC_FUNCTION_PREC_SEQ_FIELD_2: usize = 2; +pub const GENERIC_FUNCTION_PREC_SEQ_STRING: usize = 1; +pub const GENERIC_PATTERN_SEQ_CHOICE: usize = 0; +pub const GENERIC_PATTERN_SEQ_FIELD: usize = 2; +pub const GENERIC_PATTERN_SEQ_STRING: usize = 1; +pub const GENERIC_TYPE_PREC_SEQ_FIELD_0: usize = 0; +pub const GENERIC_TYPE_PREC_SEQ_FIELD_1: usize = 1; +pub const GENERIC_TYPE_WITH_TU_SEQ_FIELD_0: usize = 0; +pub const GENERIC_TYPE_WITH_TU_SEQ_FIELD_2: usize = 2; +pub const GENERIC_TYPE_WITH_TU_SEQ_STRING: usize = 1; +pub const HIGHER_RANKED_TRAIT__SEQ_FIELD_1: usize = 1; +pub const HIGHER_RANKED_TRAIT__SEQ_FIELD_2: usize = 2; +pub const HIGHER_RANKED_TRAIT__SEQ_STRING: usize = 0; +pub const IF_EXPRESSION_PREC_RIGHT_SEQ_CHOICE: usize = 3; +pub const IF_EXPRESSION_PREC_RIGHT_SEQ_FIELD_1: usize = 1; +pub const IF_EXPRESSION_PREC_RIGHT_SEQ_FIELD_2: usize = 2; +pub const IF_EXPRESSION_PREC_RIGHT_SEQ_STRING: usize = 0; +pub const IMPL_ITEM_SEQ_CHOICE_0: usize = 0; +pub const IMPL_ITEM_SEQ_CHOICE_3: usize = 3; +pub const IMPL_ITEM_SEQ_CHOICE_5: usize = 5; +pub const IMPL_ITEM_SEQ_CHOICE_6: usize = 6; +pub const IMPL_ITEM_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const IMPL_ITEM_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const IMPL_ITEM_SEQ_CHOICE_SEQ_STRING: usize = 2; +pub const IMPL_ITEM_SEQ_FIELD_2: usize = 2; +pub const IMPL_ITEM_SEQ_FIELD_4: usize = 4; +pub const IMPL_ITEM_SEQ_STRING: usize = 1; +pub const INDEX_EXPRESSION_PREC_SEQ_STRING_1: usize = 1; +pub const INDEX_EXPRESSION_PREC_SEQ_STRING_3: usize = 3; +pub const INDEX_EXPRESSION_PREC_SEQ_SYMBOL_0: usize = 0; +pub const INDEX_EXPRESSION_PREC_SEQ_SYMBOL_2: usize = 2; +pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_0: usize = 0; +pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_1: usize = 1; +pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_2: usize = 2; +pub const INNER_ATTRIBUTE_ITEM_SEQ_STRING_4: usize = 4; +pub const INNER_ATTRIBUTE_ITEM_SEQ_SYMBOL: usize = 3; +pub const LABEL_SEQ_STRING: usize = 0; +pub const LABEL_SEQ_SYMBOL: usize = 1; +pub const LAST_MATCH_ARM_SEQ_CHOICE: usize = 4; +pub const LAST_MATCH_ARM_SEQ_FIELD_1: usize = 1; +pub const LAST_MATCH_ARM_SEQ_FIELD_3: usize = 3; +pub const LAST_MATCH_ARM_SEQ_REPEAT: usize = 0; +pub const LAST_MATCH_ARM_SEQ_STRING: usize = 2; +pub const LET_CONDITION_SEQ_FIELD_1: usize = 1; +pub const LET_CONDITION_SEQ_FIELD_3: usize = 3; +pub const LET_CONDITION_SEQ_STRING_0: usize = 0; +pub const LET_CONDITION_SEQ_STRING_2: usize = 2; +pub const LET_DECLARATION_SEQ_CHOICE_1: usize = 1; +pub const LET_DECLARATION_SEQ_CHOICE_3: usize = 3; +pub const LET_DECLARATION_SEQ_CHOICE_4: usize = 4; +pub const LET_DECLARATION_SEQ_CHOICE_5: usize = 5; +pub const LET_DECLARATION_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const LET_DECLARATION_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const LET_DECLARATION_SEQ_FIELD: usize = 2; +pub const LET_DECLARATION_SEQ_STRING_0: usize = 0; +pub const LET_DECLARATION_SEQ_STRING_6: usize = 6; +pub const LIFETIME_PREC_SEQ_STRING: usize = 0; +pub const LIFETIME_PREC_SEQ_SYMBOL: usize = 1; +pub const LIFETIME_PARAMETER_PREC_SEQ_CHOICE: usize = 1; +pub const LIFETIME_PARAMETER_PREC_SEQ_FIELD: usize = 0; +pub const LINE_COMMENT_SEQ_CHOICE: usize = 1; +pub const LINE_COMMENT_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const LINE_COMMENT_SEQ_CHOICE_SEQ_IMMEDIATE_TOKEN: usize = 0; +pub const LINE_COMMENT_SEQ_CHOICE_SEQ_PATTERN: usize = 1; +pub const LINE_COMMENT_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const LINE_COMMENT_SEQ_STRING: usize = 0; +pub const LOOP_EXPRESSION_SEQ_CHOICE: usize = 0; +pub const LOOP_EXPRESSION_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const LOOP_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const LOOP_EXPRESSION_SEQ_FIELD: usize = 2; +pub const LOOP_EXPRESSION_SEQ_STRING: usize = 1; +pub const MACRO_DEFINITION_SEQ_CHOICE: usize = 2; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ: usize = 1; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_CHOICE: usize = 1; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 0; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 1; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_SYMBOL: usize = 0; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_STRING_0: usize = 0; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_STRING_2: usize = 2; +pub const MACRO_DEFINITION_SEQ_CHOICE_SEQ_STRING_3: usize = 3; +pub const MACRO_DEFINITION_SEQ_FIELD: usize = 1; +pub const MACRO_DEFINITION_SEQ_STRING: usize = 0; +pub const MACRO_INVOCATION_SEQ_ALIAS: usize = 2; +pub const MACRO_INVOCATION_SEQ_FIELD: usize = 0; +pub const MACRO_INVOCATION_SEQ_STRING: usize = 1; +pub const MACRO_RULE_SEQ_FIELD_0: usize = 0; +pub const MACRO_RULE_SEQ_FIELD_2: usize = 2; +pub const MACRO_RULE_SEQ_STRING: usize = 1; +pub const MATCH_ARM_PREC_RIGHT_SEQ_CHOICE: usize = 3; +pub const MATCH_ARM_PREC_RIGHT_SEQ_CHOICE_SEQ_FIELD: usize = 0; +pub const MATCH_ARM_PREC_RIGHT_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const MATCH_ARM_PREC_RIGHT_SEQ_FIELD: usize = 1; +pub const MATCH_ARM_PREC_RIGHT_SEQ_REPEAT: usize = 0; +pub const MATCH_ARM_PREC_RIGHT_SEQ_STRING: usize = 2; +pub const MATCH_BLOCK_SEQ_CHOICE: usize = 1; +pub const MATCH_BLOCK_SEQ_CHOICE_SEQ_ALIAS: usize = 1; +pub const MATCH_BLOCK_SEQ_CHOICE_SEQ_REPEAT: usize = 0; +pub const MATCH_BLOCK_SEQ_STRING_0: usize = 0; +pub const MATCH_BLOCK_SEQ_STRING_2: usize = 2; +pub const MATCH_EXPRESSION_SEQ_FIELD_1: usize = 1; +pub const MATCH_EXPRESSION_SEQ_FIELD_2: usize = 2; +pub const MATCH_EXPRESSION_SEQ_STRING: usize = 0; +pub const MATCH_PATTERN_SEQ_CHOICE: usize = 1; +pub const MATCH_PATTERN_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const MATCH_PATTERN_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const MATCH_PATTERN_SEQ_SYMBOL: usize = 0; +pub const MOD_ITEM_SEQ_CHOICE_0: usize = 0; +pub const MOD_ITEM_SEQ_CHOICE_3: usize = 3; +pub const MOD_ITEM_SEQ_FIELD: usize = 2; +pub const MOD_ITEM_SEQ_STRING: usize = 1; +pub const MUT_PATTERN_PREC_SEQ_SYMBOL_0: usize = 0; +pub const MUT_PATTERN_PREC_SEQ_SYMBOL_1: usize = 1; +pub const NEGATIVE_LITERAL_SEQ_CHOICE: usize = 1; +pub const NEGATIVE_LITERAL_SEQ_STRING: usize = 0; +pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_STRING_1: usize = 1; +pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_STRING_0: usize = 0; +pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_SYMBOL_0: usize = 0; +pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_SYMBOL_2: usize = 2; +pub const OR_PATTERN_PREC_LEFT_CHOICE_SEQ_SYMBOL_1: usize = 1; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_1: usize = 1; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_2: usize = 2; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_CHOICE: usize = 1; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_FIELD: usize = 2; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_REPEAT: usize = 0; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ_CHOICE: usize = 1; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ_FIELD: usize = 2; +pub const ORDERED_FIELD_DECLAR_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 0; +pub const ORDERED_FIELD_DECLAR_SEQ_STRING_0: usize = 0; +pub const ORDERED_FIELD_DECLAR_SEQ_STRING_3: usize = 3; +pub const PARAMETER_SEQ_CHOICE: usize = 0; +pub const PARAMETER_SEQ_FIELD_1: usize = 1; +pub const PARAMETER_SEQ_FIELD_3: usize = 3; +pub const PARAMETER_SEQ_STRING: usize = 2; +pub const PARAMETERS_SEQ_CHOICE_1: usize = 1; +pub const PARAMETERS_SEQ_CHOICE_2: usize = 2; +pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_CHOICE_0: usize = 0; +pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_SEQ_CHOICE_1: usize = 1; +pub const PARAMETERS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const PARAMETERS_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const PARAMETERS_SEQ_CHOICE_SEQ_SEQ_CHOICE_0: usize = 0; +pub const PARAMETERS_SEQ_CHOICE_SEQ_SEQ_CHOICE_1: usize = 1; +pub const PARAMETERS_SEQ_STRING_0: usize = 0; +pub const PARAMETERS_SEQ_STRING_3: usize = 3; +pub const PARENTHESIZED_EXPRES_SEQ_STRING_0: usize = 0; +pub const PARENTHESIZED_EXPRES_SEQ_STRING_2: usize = 2; +pub const PARENTHESIZED_EXPRES_SEQ_SYMBOL: usize = 1; +pub const POINTER_TYPE_SEQ_CHOICE: usize = 1; +pub const POINTER_TYPE_SEQ_FIELD: usize = 2; +pub const POINTER_TYPE_SEQ_STRING: usize = 0; +pub const QUALIFIED_TYPE_SEQ_FIELD_0: usize = 0; +pub const QUALIFIED_TYPE_SEQ_FIELD_2: usize = 2; +pub const QUALIFIED_TYPE_SEQ_STRING: usize = 1; +pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_CHOICE: usize = 1; +pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_STRING_1: usize = 1; +pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_STRING_0: usize = 0; +pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_SYMBOL_0: usize = 0; +pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_SYMBOL_2: usize = 2; +pub const RANGE_EXPRESSION_PREC_LEFT_CHOICE_SEQ_SYMBOL_1: usize = 1; +pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_1: usize = 1; +pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_0: usize = 0; +pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const RANGE_PATTERN_CHOICE_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const RANGE_PATTERN_CHOICE_SEQ_FIELD_0: usize = 0; +pub const RANGE_PATTERN_CHOICE_SEQ_FIELD_1: usize = 1; +pub const RAW_STRING_LITERAL_SEQ_ALIAS: usize = 1; +pub const RAW_STRING_LITERAL_SEQ_SYMBOL_0: usize = 0; +pub const RAW_STRING_LITERAL_SEQ_SYMBOL_2: usize = 2; +pub const REF_PATTERN_SEQ_STRING: usize = 0; +pub const REF_PATTERN_SEQ_SYMBOL: usize = 1; +pub const REFERENCE_EXPRESSION_PREC_SEQ_CHOICE: usize = 1; +pub const REFERENCE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_CHOICE: usize = 1; +pub const REFERENCE_EXPRESSION_PREC_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const REFERENCE_EXPRESSION_PREC_SEQ_FIELD: usize = 2; +pub const REFERENCE_EXPRESSION_PREC_SEQ_STRING: usize = 0; +pub const REFERENCE_PATTERN_SEQ_CHOICE: usize = 1; +pub const REFERENCE_PATTERN_SEQ_STRING: usize = 0; +pub const REFERENCE_PATTERN_SEQ_SYMBOL: usize = 2; +pub const REFERENCE_TYPE_SEQ_CHOICE_1: usize = 1; +pub const REFERENCE_TYPE_SEQ_CHOICE_2: usize = 2; +pub const REFERENCE_TYPE_SEQ_FIELD: usize = 3; +pub const REFERENCE_TYPE_SEQ_STRING: usize = 0; +pub const REMOVED_TRAIT_BOUND_SEQ_STRING: usize = 0; +pub const REMOVED_TRAIT_BOUND_SEQ_SYMBOL: usize = 1; +pub const RETURN_EXPRESSION_CHOICE_PREC_LEFT_SEQ_STRING: usize = 0; +pub const RETURN_EXPRESSION_CHOICE_PREC_LEFT_SEQ_SYMBOL: usize = 1; +pub const SCOPED_IDENTIFIER_SEQ_FIELD_0: usize = 0; +pub const SCOPED_IDENTIFIER_SEQ_FIELD_2: usize = 2; +pub const SCOPED_IDENTIFIER_SEQ_STRING: usize = 1; +pub const SCOPED_TYPE_IDENTIFI_PREC_SEQ_FIELD_0: usize = 0; +pub const SCOPED_TYPE_IDENTIFI_PREC_SEQ_FIELD_2: usize = 2; +pub const SCOPED_TYPE_IDENTIFI_PREC_SEQ_STRING: usize = 1; +pub const SCOPED_TYPE_IDENTIFI_SEQ_FIELD_0: usize = 0; +pub const SCOPED_TYPE_IDENTIFI_SEQ_FIELD_2: usize = 2; +pub const SCOPED_TYPE_IDENTIFI_SEQ_STRING: usize = 1; +pub const SCOPED_USE_LIST_SEQ_FIELD_0: usize = 0; +pub const SCOPED_USE_LIST_SEQ_FIELD_2: usize = 2; +pub const SCOPED_USE_LIST_SEQ_STRING: usize = 1; +pub const SELF_PARAMETER_SEQ_CHOICE_0: usize = 0; +pub const SELF_PARAMETER_SEQ_CHOICE_1: usize = 1; +pub const SELF_PARAMETER_SEQ_CHOICE_2: usize = 2; +pub const SELF_PARAMETER_SEQ_SYMBOL: usize = 3; +pub const SHORTHAND_FIELD_INIT_SEQ_REPEAT: usize = 0; +pub const SHORTHAND_FIELD_INIT_SEQ_SYMBOL: usize = 1; +pub const SLICE_PATTERN_SEQ_CHOICE_1: usize = 1; +pub const SLICE_PATTERN_SEQ_CHOICE_2: usize = 2; +pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_SYMBOL: usize = 1; +pub const SLICE_PATTERN_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const SLICE_PATTERN_SEQ_STRING_0: usize = 0; +pub const SLICE_PATTERN_SEQ_STRING_3: usize = 3; +pub const SOURCE_FILE_SEQ_CHOICE: usize = 0; +pub const SOURCE_FILE_SEQ_REPEAT: usize = 1; +pub const STATIC_ITEM_SEQ_CHOICE_0: usize = 0; +pub const STATIC_ITEM_SEQ_CHOICE_2: usize = 2; +pub const STATIC_ITEM_SEQ_CHOICE_3: usize = 3; +pub const STATIC_ITEM_SEQ_CHOICE_7: usize = 7; +pub const STATIC_ITEM_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const STATIC_ITEM_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const STATIC_ITEM_SEQ_FIELD_4: usize = 4; +pub const STATIC_ITEM_SEQ_FIELD_6: usize = 6; +pub const STATIC_ITEM_SEQ_STRING_1: usize = 1; +pub const STATIC_ITEM_SEQ_STRING_5: usize = 5; +pub const STATIC_ITEM_SEQ_STRING_8: usize = 8; +pub const STRING_LITERAL_SEQ_ALIAS_0: usize = 0; +pub const STRING_LITERAL_SEQ_ALIAS_2: usize = 2; +pub const STRING_LITERAL_SEQ_REPEAT: usize = 1; +pub const STRUCT_EXPRESSION_SEQ_FIELD_0: usize = 0; +pub const STRUCT_EXPRESSION_SEQ_FIELD_1: usize = 1; +pub const STRUCT_ITEM_SEQ_CHOICE_0: usize = 0; +pub const STRUCT_ITEM_SEQ_CHOICE_4: usize = 4; +pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_CHOICE_0: usize = 0; +pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_CHOICE_1: usize = 1; +pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_FIELD_1: usize = 1; +pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_FIELD_0: usize = 0; +pub const STRUCT_ITEM_SEQ_CHOICE_SEQ_STRING: usize = 2; +pub const STRUCT_ITEM_SEQ_FIELD_2: usize = 2; +pub const STRUCT_ITEM_SEQ_FIELD_3: usize = 3; +pub const STRUCT_ITEM_SEQ_STRING: usize = 1; +pub const STRUCT_PATTERN_SEQ_CHOICE_2: usize = 2; +pub const STRUCT_PATTERN_SEQ_CHOICE_3: usize = 3; +pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const STRUCT_PATTERN_SEQ_FIELD: usize = 0; +pub const STRUCT_PATTERN_SEQ_STRING_1: usize = 1; +pub const STRUCT_PATTERN_SEQ_STRING_4: usize = 4; +pub const TOKEN_BINDING_PATTER_PREC_SEQ_FIELD_0: usize = 0; +pub const TOKEN_BINDING_PATTER_PREC_SEQ_FIELD_2: usize = 2; +pub const TOKEN_BINDING_PATTER_PREC_SEQ_STRING: usize = 1; +pub const TOKEN_REPETITION_SEQ_CHOICE_4: usize = 4; +pub const TOKEN_REPETITION_SEQ_CHOICE_5: usize = 5; +pub const TOKEN_REPETITION_SEQ_REPEAT: usize = 2; +pub const TOKEN_REPETITION_SEQ_STRING_0: usize = 0; +pub const TOKEN_REPETITION_SEQ_STRING_1: usize = 1; +pub const TOKEN_REPETITION_SEQ_STRING_3: usize = 3; +pub const TOKEN_REPETITION_PAT_SEQ_CHOICE_4: usize = 4; +pub const TOKEN_REPETITION_PAT_SEQ_CHOICE_5: usize = 5; +pub const TOKEN_REPETITION_PAT_SEQ_REPEAT: usize = 2; +pub const TOKEN_REPETITION_PAT_SEQ_STRING_0: usize = 0; +pub const TOKEN_REPETITION_PAT_SEQ_STRING_1: usize = 1; +pub const TOKEN_REPETITION_PAT_SEQ_STRING_3: usize = 3; +pub const TOKEN_TREE_CHOICE_SEQ_REPEAT: usize = 1; +pub const TOKEN_TREE_CHOICE_SEQ_STRING_0: usize = 0; +pub const TOKEN_TREE_CHOICE_SEQ_STRING_2: usize = 2; +pub const TOKEN_TREE_PATTERN_CHOICE_SEQ_REPEAT: usize = 1; +pub const TOKEN_TREE_PATTERN_CHOICE_SEQ_STRING_0: usize = 0; +pub const TOKEN_TREE_PATTERN_CHOICE_SEQ_STRING_2: usize = 2; +pub const TRAIT_BOUNDS_SEQ_SEQ: usize = 1; +pub const TRAIT_BOUNDS_SEQ_SEQ_CHOICE: usize = 0; +pub const TRAIT_BOUNDS_SEQ_SEQ_REPEAT: usize = 1; +pub const TRAIT_BOUNDS_SEQ_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const TRAIT_BOUNDS_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const TRAIT_BOUNDS_SEQ_STRING: usize = 0; +pub const TRAIT_ITEM_SEQ_CHOICE_0: usize = 0; +pub const TRAIT_ITEM_SEQ_CHOICE_1: usize = 1; +pub const TRAIT_ITEM_SEQ_CHOICE_6: usize = 6; +pub const TRAIT_ITEM_SEQ_FIELD_3: usize = 3; +pub const TRAIT_ITEM_SEQ_FIELD_4: usize = 4; +pub const TRAIT_ITEM_SEQ_FIELD_5: usize = 5; +pub const TRAIT_ITEM_SEQ_FIELD_7: usize = 7; +pub const TRAIT_ITEM_SEQ_STRING: usize = 2; +pub const TRY_BLOCK_SEQ_STRING: usize = 0; +pub const TRY_BLOCK_SEQ_SYMBOL: usize = 1; +pub const TRY_EXPRESSION_PREC_SEQ_STRING: usize = 1; +pub const TRY_EXPRESSION_PREC_SEQ_SYMBOL: usize = 0; +pub const TUPLE_EXPRESSION_SEQ_CHOICE: usize = 4; +pub const TUPLE_EXPRESSION_SEQ_REPEAT_1: usize = 1; +pub const TUPLE_EXPRESSION_SEQ_REPEAT_3: usize = 3; +pub const TUPLE_EXPRESSION_SEQ_REPEAT_SEQ_STRING: usize = 1; +pub const TUPLE_EXPRESSION_SEQ_REPEAT_SEQ_SYMBOL: usize = 0; +pub const TUPLE_EXPRESSION_SEQ_SEQ: usize = 2; +pub const TUPLE_EXPRESSION_SEQ_SEQ_STRING: usize = 1; +pub const TUPLE_EXPRESSION_SEQ_SEQ_SYMBOL: usize = 0; +pub const TUPLE_EXPRESSION_SEQ_STRING_0: usize = 0; +pub const TUPLE_EXPRESSION_SEQ_STRING_5: usize = 5; +pub const TUPLE_PATTERN_SEQ_CHOICE_1: usize = 1; +pub const TUPLE_PATTERN_SEQ_CHOICE_2: usize = 2; +pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const TUPLE_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const TUPLE_PATTERN_SEQ_STRING_0: usize = 0; +pub const TUPLE_PATTERN_SEQ_STRING_3: usize = 3; +pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_2: usize = 2; +pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_3: usize = 3; +pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_REPEAT_SEQ_SYMBOL: usize = 1; +pub const TUPLE_STRUCT_PATTERN_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const TUPLE_STRUCT_PATTERN_SEQ_FIELD: usize = 0; +pub const TUPLE_STRUCT_PATTERN_SEQ_STRING_1: usize = 1; +pub const TUPLE_STRUCT_PATTERN_SEQ_STRING_4: usize = 4; +pub const TUPLE_TYPE_SEQ_CHOICE: usize = 2; +pub const TUPLE_TYPE_SEQ_SEQ: usize = 1; +pub const TUPLE_TYPE_SEQ_SEQ_REPEAT: usize = 1; +pub const TUPLE_TYPE_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const TUPLE_TYPE_SEQ_SEQ_REPEAT_SEQ_SYMBOL: usize = 1; +pub const TUPLE_TYPE_SEQ_SEQ_SYMBOL: usize = 0; +pub const TUPLE_TYPE_SEQ_STRING_0: usize = 0; +pub const TUPLE_TYPE_SEQ_STRING_3: usize = 3; +pub const TYPE_ARGUMENTS_SEQ_CHOICE: usize = 2; +pub const TYPE_ARGUMENTS_SEQ_SEQ: usize = 1; +pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT: usize = 1; +pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_SEQ_CHOICE_0: usize = 0; +pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_SEQ_CHOICE_1: usize = 1; +pub const TYPE_ARGUMENTS_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const TYPE_ARGUMENTS_SEQ_SEQ_SEQ: usize = 0; +pub const TYPE_ARGUMENTS_SEQ_SEQ_SEQ_CHOICE_0: usize = 0; +pub const TYPE_ARGUMENTS_SEQ_SEQ_SEQ_CHOICE_1: usize = 1; +pub const TYPE_ARGUMENTS_SEQ_STRING: usize = 3; +pub const TYPE_ARGUMENTS_SEQ_TOKEN: usize = 0; +pub const TYPE_BINDING_SEQ_FIELD_0: usize = 0; +pub const TYPE_BINDING_SEQ_FIELD_1: usize = 1; +pub const TYPE_BINDING_SEQ_FIELD_3: usize = 3; +pub const TYPE_BINDING_SEQ_STRING: usize = 2; +pub const TYPE_CAST_EXPRESSION_PREC_LEFT_SEQ_FIELD_0: usize = 0; +pub const TYPE_CAST_EXPRESSION_PREC_LEFT_SEQ_FIELD_2: usize = 2; +pub const TYPE_CAST_EXPRESSION_PREC_LEFT_SEQ_STRING: usize = 1; +pub const TYPE_ITEM_SEQ_CHOICE_0: usize = 0; +pub const TYPE_ITEM_SEQ_CHOICE_4: usize = 4; +pub const TYPE_ITEM_SEQ_CHOICE_7: usize = 7; +pub const TYPE_ITEM_SEQ_FIELD_2: usize = 2; +pub const TYPE_ITEM_SEQ_FIELD_3: usize = 3; +pub const TYPE_ITEM_SEQ_FIELD_6: usize = 6; +pub const TYPE_ITEM_SEQ_STRING_1: usize = 1; +pub const TYPE_ITEM_SEQ_STRING_5: usize = 5; +pub const TYPE_ITEM_SEQ_STRING_8: usize = 8; +pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_1: usize = 1; +pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_2: usize = 2; +pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_SEQ_FIELD: usize = 1; +pub const TYPE_PARAMETER_PREC_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const TYPE_PARAMETER_PREC_SEQ_FIELD: usize = 0; +pub const TYPE_PARAMETERS_PREC_SEQ_CHOICE: usize = 2; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ: usize = 1; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT: usize = 1; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_SEQ: usize = 1; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_SEQ_CHOICE: usize = 1; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_SEQ_REPEAT: usize = 0; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_SEQ: usize = 0; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_SEQ_CHOICE: usize = 1; +pub const TYPE_PARAMETERS_PREC_SEQ_SEQ_SEQ_REPEAT: usize = 0; +pub const TYPE_PARAMETERS_PREC_SEQ_STRING_0: usize = 0; +pub const TYPE_PARAMETERS_PREC_SEQ_STRING_3: usize = 3; +pub const UNARY_EXPRESSION_PREC_SEQ_CHOICE: usize = 0; +pub const UNARY_EXPRESSION_PREC_SEQ_SYMBOL: usize = 1; +pub const UNION_ITEM_SEQ_CHOICE_0: usize = 0; +pub const UNION_ITEM_SEQ_CHOICE_4: usize = 4; +pub const UNION_ITEM_SEQ_FIELD_2: usize = 2; +pub const UNION_ITEM_SEQ_FIELD_3: usize = 3; +pub const UNION_ITEM_SEQ_FIELD_5: usize = 5; +pub const UNION_ITEM_SEQ_STRING: usize = 1; +pub const UNIT_EXPRESSION_SEQ_STRING_0: usize = 0; +pub const UNIT_EXPRESSION_SEQ_STRING_1: usize = 1; +pub const UNIT_TYPE_SEQ_STRING_0: usize = 0; +pub const UNIT_TYPE_SEQ_STRING_1: usize = 1; +pub const UNSAFE_BLOCK_SEQ_STRING: usize = 0; +pub const UNSAFE_BLOCK_SEQ_SYMBOL: usize = 1; +pub const USE_AS_CLAUSE_SEQ_FIELD_0: usize = 0; +pub const USE_AS_CLAUSE_SEQ_FIELD_2: usize = 2; +pub const USE_AS_CLAUSE_SEQ_STRING: usize = 1; +pub const USE_BOUNDS_SEQ_CHOICE_2: usize = 2; +pub const USE_BOUNDS_SEQ_CHOICE_3: usize = 3; +pub const USE_BOUNDS_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const USE_BOUNDS_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const USE_BOUNDS_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const USE_BOUNDS_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const USE_BOUNDS_SEQ_STRING_0: usize = 0; +pub const USE_BOUNDS_SEQ_STRING_4: usize = 4; +pub const USE_BOUNDS_SEQ_TOKEN: usize = 1; +pub const USE_DECLARATION_SEQ_CHOICE: usize = 0; +pub const USE_DECLARATION_SEQ_FIELD: usize = 2; +pub const USE_DECLARATION_SEQ_STRING_1: usize = 1; +pub const USE_DECLARATION_SEQ_STRING_3: usize = 3; +pub const USE_LIST_SEQ_CHOICE_1: usize = 1; +pub const USE_LIST_SEQ_CHOICE_2: usize = 2; +pub const USE_LIST_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const USE_LIST_SEQ_CHOICE_SEQ_REPEAT: usize = 1; +pub const USE_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_CHOICE: usize = 1; +pub const USE_LIST_SEQ_CHOICE_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const USE_LIST_SEQ_STRING_0: usize = 0; +pub const USE_LIST_SEQ_STRING_3: usize = 3; +pub const USE_WILDCARD_SEQ_CHOICE: usize = 0; +pub const USE_WILDCARD_SEQ_CHOICE_SEQ_CHOICE: usize = 0; +pub const USE_WILDCARD_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const USE_WILDCARD_SEQ_STRING: usize = 1; +pub const VARIADIC_PARAMETER_SEQ_CHOICE_0: usize = 0; +pub const VARIADIC_PARAMETER_SEQ_CHOICE_1: usize = 1; +pub const VARIADIC_PARAMETER_SEQ_CHOICE_SEQ_FIELD: usize = 0; +pub const VARIADIC_PARAMETER_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const VARIADIC_PARAMETER_SEQ_STRING: usize = 2; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE: usize = 1; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_CHOICE: usize = 1; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_CHOICE_SEQ_STRING: usize = 0; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_CHOICE_SEQ_SYMBOL: usize = 1; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_STRING_0: usize = 0; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_CHOICE_SEQ_STRING_2: usize = 2; +pub const VISIBILITY_MODIFIER_CHOICE_SEQ_STRING: usize = 0; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE: usize = 1; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_CHOICE: usize = 1; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ: usize = 0; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_REPEAT: usize = 1; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_STRING: usize = 0; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_REPEAT_SEQ_SYMBOL: usize = 1; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_CHOICE_SEQ_SEQ_SYMBOL: usize = 0; +pub const WHERE_CLAUSE_PREC_RIGHT_SEQ_STRING: usize = 0; +pub const WHERE_PREDICATE_SEQ_FIELD_0: usize = 0; +pub const WHERE_PREDICATE_SEQ_FIELD_1: usize = 1; +pub const WHILE_EXPRESSION_SEQ_CHOICE: usize = 0; +pub const WHILE_EXPRESSION_SEQ_CHOICE_SEQ_STRING: usize = 1; +pub const WHILE_EXPRESSION_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; +pub const WHILE_EXPRESSION_SEQ_FIELD_2: usize = 2; +pub const WHILE_EXPRESSION_SEQ_FIELD_3: usize = 3; +pub const WHILE_EXPRESSION_SEQ_STRING: usize = 1; +pub const YIELD_EXPRESSION_CHOICE_PREC_LEFT_SEQ_STRING: usize = 0; +pub const YIELD_EXPRESSION_CHOICE_PREC_LEFT_SEQ_SYMBOL: usize = 1; diff --git a/mudu_type/Cargo.toml b/mudu_type/Cargo.toml index c0f0d59..8fbbf86 100644 --- a/mudu_type/Cargo.toml +++ b/mudu_type/Cargo.toml @@ -18,6 +18,6 @@ mudu = { workspace = true } hex = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -console-subscriber = {workspace = true} +console-subscriber = { workspace = true} arbitrary = { workspace = true } test_utils = { workspace = true } diff --git a/mudu_type/src/dat_type.rs b/mudu_type/src/dat_type.rs index b74ef4d..5e81c7c 100644 --- a/mudu_type/src/dat_type.rs +++ b/mudu_type/src/dat_type.rs @@ -5,8 +5,12 @@ use crate::dt_impl::dat_table::get_fn_param; use crate::dt_info::DTInfo; use crate::dtp_array::DTPArray; use crate::dtp_kind::DTPKind; +use crate::dtp_numeric::DTPNumeric; use crate::dtp_object::DTPRecord; use crate::dtp_string::DTPString; +use crate::dtp_time::DTPTime; +use crate::dtp_timestamp::DTPTimestamp; +use crate::dtp_timestamptz::DTPTimestampTz; use crate::type_error::TyErr; use mudu::common::cmp_order::Order; use mudu::common::result::RS; @@ -27,7 +31,7 @@ unsafe impl Sync for DatType {} impl DatType { pub fn default_for(id: DatTypeID) -> DatType { - if !id.is_primitive_type() { + if !id.is_scalar_type() { panic!("DatType::default_for({:?})", id); } let opt = id.opt_fn_param(); @@ -80,7 +84,7 @@ impl DatType { } pub fn name(&self) -> String { - if self.id.is_primitive_type() { + if self.id.is_scalar_type() { self.id.name().to_string() } else { match &self.param { @@ -213,6 +217,10 @@ impl Default for DatType { impl_dat_type_methods! { (DTPString, String, string), + (DTPNumeric, Numeric, numeric), + (DTPTime, Time, time), + (DTPTimestamp, Timestamp, timestamp), + (DTPTimestampTz, TimestampTz, timestamptz), (DTPRecord, Record, record), (DTPArray, Array, array), } diff --git a/mudu_type/src/dat_type_id.rs b/mudu_type/src/dat_type_id.rs index 4be3f94..6766da6 100644 --- a/mudu_type/src/dat_type_id.rs +++ b/mudu_type/src/dat_type_id.rs @@ -19,18 +19,18 @@ use arbitrary::Arbitrary; use serde::{Deserialize, Serialize}; use std::hint; -/// Maximum ID for primitive data types -const PRIMITIVE_ID_MAX: u32 = 1000; +/// Maximum ID for scalar data types +const SCALAR_ID_MAX: u32 = 1000; /// Data Type Identifier /// /// Types with the same ID share the same conversion functions and in-memory object representation (DatObject). -/// Primitive types (i32, i64, f32, f64, String) can have default parameters. +/// Scalar types (i32, i64, f32, f64, String, Numeric, temporal types) can have default parameters. #[repr(u32)] #[derive(Hash, Eq, Ord, PartialEq, PartialOrd, Copy, Clone, Debug, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "test"), derive(Arbitrary))] pub enum DatTypeID { - // Primitive types + // Scalar types I32 = 0, I64 = 1, F32 = 2, @@ -38,11 +38,16 @@ pub enum DatTypeID { String = 4, U128 = 5, I128 = 6, - - // Complex types (start after primitive range) - Array = PRIMITIVE_ID_MAX + 1, - Record = PRIMITIVE_ID_MAX + 2, - Binary = PRIMITIVE_ID_MAX + 3, + Numeric = 7, + Date = 8, + Time = 9, + Timestamp = 10, + TimestampTz = 11, + + // Complex types (start after scalar range) + Array = SCALAR_ID_MAX + 1, + Record = SCALAR_ID_MAX + 2, + Binary = SCALAR_ID_MAX + 3, } // Cache the maximum ID for efficient access @@ -159,17 +164,18 @@ impl DatTypeID { } // Type classification - pub fn is_primitive_type(&self) -> bool { - self.to_u32() < PRIMITIVE_ID_MAX + pub fn is_scalar_type(&self) -> bool { + self.to_u32() < SCALAR_ID_MAX } pub fn dat_kind(&self) -> DTKind { - if self.is_primitive_type() { - DTKind::Primitive + if self.is_scalar_type() { + DTKind::Scalar } else { match self { DatTypeID::Array => DTKind::Array, - DatTypeID::Record => DTKind::Object, + DatTypeID::Record => DTKind::Record, + DatTypeID::Binary => DTKind::Binary, // Safety: All enum variants are covered above _ => unsafe { hint::unreachable_unchecked() }, } @@ -183,7 +189,8 @@ impl DatTypeID { | DatTypeID::I128 | DatTypeID::F32 | DatTypeID::F64 - | DatTypeID::U128 => false, + | DatTypeID::U128 + | DatTypeID::Date => false, _ => true, } } diff --git a/mudu_type/src/dat_typed.rs b/mudu_type/src/dat_typed.rs index 37b1b12..1af66a8 100644 --- a/mudu_type/src/dat_typed.rs +++ b/mudu_type/src/dat_typed.rs @@ -1,6 +1,11 @@ use crate::dat_type::DatType; use crate::dat_type_id::DatTypeID; use crate::dat_value::DatValue; +use mudu::data_type::date::DateValue; +use mudu::data_type::numeric::Numeric; +use mudu::data_type::time::TimeValue; +use mudu::data_type::timestamp::TimestampValue; +use mudu::data_type::timestamptz::TimestampTzValue; #[derive(Clone, Debug)] pub struct DatTyped { @@ -58,6 +63,41 @@ impl DatTyped { ) } + pub fn from_numeric(val: Numeric) -> Self { + Self::new( + DatType::default_for(DatTypeID::Numeric), + DatValue::from_numeric(val), + ) + } + + pub fn from_date(val: DateValue) -> Self { + Self::new( + DatType::default_for(DatTypeID::Date), + DatValue::from_date(val), + ) + } + + pub fn from_time(val: TimeValue) -> Self { + Self::new( + DatType::default_for(DatTypeID::Time), + DatValue::from_time(val), + ) + } + + pub fn from_timestamp(val: TimestampValue) -> Self { + Self::new( + DatType::default_for(DatTypeID::Timestamp), + DatValue::from_timestamp(val), + ) + } + + pub fn from_timestamptz(val: TimestampTzValue) -> Self { + Self::new( + DatType::default_for(DatTypeID::TimestampTz), + DatValue::from_timestamptz(val), + ) + } + pub fn new(dat_type: DatType, dat_internal: DatValue) -> Self { Self { dat_type, diff --git a/mudu_type/src/dat_value.rs b/mudu_type/src/dat_value.rs index eeaf223..5ed4a15 100644 --- a/mudu_type/src/dat_value.rs +++ b/mudu_type/src/dat_value.rs @@ -4,6 +4,11 @@ use crate::dat_type_id::DatTypeID; use crate::datum::{Datum, DatumDyn}; use crate::dt_fn_param::DatType; use mudu::common::result::RS; +use mudu::data_type::date::DateValue; +use mudu::data_type::numeric::Numeric; +use mudu::data_type::time::TimeValue; +use mudu::data_type::timestamp::TimestampValue; +use mudu::data_type::timestamptz::TimestampTzValue; use mudu::error::ec::EC; use mudu::m_error; use paste::paste; @@ -11,14 +16,14 @@ use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::hint; -/// A memory-efficient representation of data that can hold various primitive types +/// A memory-efficient representation of data that can hold various scalar types /// or complex types (arrays, records) in a unified enum container. #[derive(Clone, Debug, Serialize, Deserialize)] pub struct DatValue { inner: ValueKind, } -// Mark as thread-safe since all variants are either primitive types or boxed types +// Mark as thread-safe since all variants are either scalar types or boxed types unsafe impl Send for DatValue {} unsafe impl Sync for DatValue {} @@ -38,6 +43,11 @@ enum ValueKind { I64(i64), I128(i128), U128(u128), + Numeric(Numeric), + Date(DateValue), + Time(TimeValue), + Timestamp(TimestampValue), + TimestampTz(TimestampTzValue), String(String), Record(Vec), Array(Vec), @@ -199,6 +209,11 @@ impl_dat_value_methods! { (i64, I64, i64), (i128, I128, i128), (u128, U128, u128), + (Numeric, Numeric, numeric), + (DateValue, Date, date), + (TimeValue, Time, time), + (TimestampValue, Timestamp, timestamp), + (TimestampTzValue, TimestampTz, timestamptz), (f32, F32, f32), (f64, F64, f64), (String, String, string), diff --git a/mudu_type/src/datum.rs b/mudu_type/src/datum.rs index 197a1ac..198f0f0 100644 --- a/mudu_type/src/datum.rs +++ b/mudu_type/src/datum.rs @@ -7,6 +7,11 @@ use crate::dat_value::DatValue; use crate::dt_of_datum::DtOfDatum; use lazy_static::lazy_static; use mudu::common::result::RS; +use mudu::data_type::date::DateValue; +use mudu::data_type::numeric::Numeric; +use mudu::data_type::time::TimeValue; +use mudu::data_type::timestamp::TimestampValue; +use mudu::data_type::timestamptz::TimestampTzValue; use mudu::error::ec::EC; use mudu::m_error; use paste::paste; @@ -255,6 +260,11 @@ impl_datum_trait!( (I64, i64, i64), (I128, i128, i128), (U128, u128, u128), + (Numeric, numeric, Numeric), + (Date, date, DateValue), + (Time, time, TimeValue), + (Timestamp, timestamp, TimestampValue), + (TimestampTz, timestamptz, TimestampTzValue), (F32, f32, f32), (F64, f64, f64), (String, string, String) diff --git a/mudu_type/src/dt_impl/dat_table.rs b/mudu_type/src/dt_impl/dat_table.rs index eab8d8f..7964ccb 100644 --- a/mudu_type/src/dt_impl/dat_table.rs +++ b/mudu_type/src/dt_impl/dat_table.rs @@ -98,6 +98,56 @@ lazy_static! { fixed_length: Some(size_of::() as u32), opt_fn_param: None, }, + DatTypeDef { + id: DatTypeID::Numeric, + type_name: "numeric".to_string(), + fn_base: dt_impl::fn_numeric::FN_NUMERIC_CONVERT, + opt_fn_compare: Some(dt_impl::fn_numeric::FN_NUMERIC_COMPARE), + #[cfg(any(test, feature = "test"))] + fn_arbitrary: dt_impl::fn_numeric_arb::FN_NUMERIC_ARBITRARY, + fixed_length: None, + opt_fn_param: Some(dt_impl::fn_numeric_param::FN_NUMERIC_PARAM), + }, + DatTypeDef { + id: DatTypeID::Date, + type_name: "date".to_string(), + fn_base: dt_impl::fn_date::FN_DATE_CONVERT, + opt_fn_compare: Some(dt_impl::fn_date::FN_DATE_COMPARE), + #[cfg(any(test, feature = "test"))] + fn_arbitrary: dt_impl::fn_date_arb::FN_DATE_ARBITRARY, + fixed_length: Some(size_of::() as u32), + opt_fn_param: None, + }, + DatTypeDef { + id: DatTypeID::Time, + type_name: "time".to_string(), + fn_base: dt_impl::fn_time::FN_TIME_CONVERT, + opt_fn_compare: Some(dt_impl::fn_time::FN_TIME_COMPARE), + #[cfg(any(test, feature = "test"))] + fn_arbitrary: dt_impl::fn_time_arb::FN_TIME_ARBITRARY, + fixed_length: Some(size_of::() as u32), + opt_fn_param: Some(dt_impl::fn_time_param::FN_TIME_PARAM), + }, + DatTypeDef { + id: DatTypeID::Timestamp, + type_name: "timestamp".to_string(), + fn_base: dt_impl::fn_timestamp::FN_TIMESTAMP_CONVERT, + opt_fn_compare: Some(dt_impl::fn_timestamp::FN_TIMESTAMP_COMPARE), + #[cfg(any(test, feature = "test"))] + fn_arbitrary: dt_impl::fn_timestamp_arb::FN_TIMESTAMP_ARBITRARY, + fixed_length: Some(size_of::() as u32), + opt_fn_param: Some(dt_impl::fn_timestamp_param::FN_TIMESTAMP_PARAM), + }, + DatTypeDef { + id: DatTypeID::TimestampTz, + type_name: "timestamptz".to_string(), + fn_base: dt_impl::fn_timestamptz::FN_TIMESTAMPTZ_CONVERT, + opt_fn_compare: Some(dt_impl::fn_timestamptz::FN_TIMESTAMPTZ_COMPARE), + #[cfg(any(test, feature = "test"))] + fn_arbitrary: dt_impl::fn_timestamptz_arb::FN_TIMESTAMPTZ_ARBITRARY, + fixed_length: Some(size_of::() as u32), + opt_fn_param: Some(dt_impl::fn_timestamptz_param::FN_TIMESTAMPTZ_PARAM), + }, DatTypeDef { id: DatTypeID::Array, type_name: "array".to_string(), diff --git a/mudu_type/src/dt_impl/error_test.rs b/mudu_type/src/dt_impl/error_test.rs index 052ed13..55194f7 100644 --- a/mudu_type/src/dt_impl/error_test.rs +++ b/mudu_type/src/dt_impl/error_test.rs @@ -2,6 +2,7 @@ use crate::dat_type::DatType; use crate::dat_type_id::DatTypeID; use crate::dat_value::DatValue; use crate::dt_impl::dt_create::{create_array_type, create_object_type, create_string_type}; +use crate::dtp_numeric::DTPNumeric; use crate::type_error::{TyEC, TyErr}; use mudu::utils::json::JsonValue; @@ -51,6 +52,11 @@ fn invalid_textual_input_paths_return_type_convert_failed() { DatType::new_no_param(DatTypeID::Binary), "{\"oops\":1}", ), + ( + DatTypeID::Numeric, + DatType::from_numeric(DTPNumeric::new(9, 2)), + "\"bad\"", + ), ( DatTypeID::Array, create_array_type(DatType::new_no_param(DatTypeID::I32)), @@ -111,6 +117,11 @@ fn textual_input_rejects_json_with_wrong_shape() { DatType::new_no_param(DatTypeID::Binary), "{ [\"bad\"]", ), + ( + DatTypeID::Numeric, + DatType::from_numeric(DTPNumeric::new(9, 2)), + "{ [\"bad\"]", + ), ( DatTypeID::Array, create_array_type(DatType::new_no_param(DatTypeID::I32)), @@ -173,6 +184,29 @@ fn binary_error_paths_return_expected_error_codes() { assert_ty_ec(err, TyEC::InsufficientSpace); } +#[test] +fn numeric_error_paths_return_expected_error_codes() { + let dt = DatType::from_numeric(DTPNumeric::new(9, 2)); + + let err = DatTypeID::Numeric.fn_input_json()(&JsonValue::Bool(true), &dt).unwrap_err(); + assert_ty_ec(err, TyEC::TypeConvertFailed); + + let err = DatTypeID::Numeric.fn_recv()(&[0u8; 8], &dt).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + + let value = DatValue::from_numeric(mudu::data_type::numeric::Numeric::parse("7.50").unwrap()); + let err = DatTypeID::Numeric.fn_send_to()(&value, &dt, &mut [0u8; 8]).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + + let overflow = + DatValue::from_numeric(mudu::data_type::numeric::Numeric::parse("123456789.00").unwrap()); + let err = match DatTypeID::Numeric.fn_send()(&overflow, &dt) { + Ok(_) => panic!("expected numeric send precision overflow"), + Err(err) => err, + }; + assert_ty_ec(err, TyEC::TypeConvertFailed); +} + #[test] fn array_error_paths_return_expected_error_codes() { let dt = create_array_type(DatType::new_no_param(DatTypeID::I32)); diff --git a/mudu_type/src/dt_impl/fn_date.rs b/mudu_type/src/dt_impl/fn_date.rs new file mode 100644 index 0000000..78848ce --- /dev/null +++ b/mudu_type/src/dt_impl/fn_date.rs @@ -0,0 +1,159 @@ +use crate::dat_binary::DatBinary; +use crate::dat_json::DatJson; +use crate::dat_textual::DatTextual; +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_compare::{ErrCompare, FnCompare}; +use crate::dt_fn_convert::FnBase; +use crate::dt_impl::temporal::{ + decode_sortable_i32, encode_sortable_i32, parse_temporal_json_string, temporal_json_output, +}; +use crate::type_error::{TyEC, TyErr}; +use byteorder::ByteOrder; +use mudu::common::endian::Endian; +use mudu::data_type::date::DateValue; +use mudu::utils::json::{JsonValue, from_json_str}; +use mudu::utils::msg_pack::{MsgPackUtf8String, MsgPackValue}; +use std::cmp::Ordering; +use std::hash::Hasher; + +fn parse_date_str(value: &str) -> Result { + DateValue::parse(value) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, format!("invalid date {}", e))) +} + +fn fn_date_in_textual(v: &str, dt: &DatType) -> Result { + let json = from_json_str::(v) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e.to_string()))?; + fn_date_in_json(&json, dt) +} + +fn fn_date_out_textual(v: &DatValue, dt: &DatType) -> Result { + let json = fn_date_out_json(v, dt)?; + Ok(DatTextual::from(json.to_string())) +} + +fn fn_date_in_json(v: &JsonValue, _: &DatType) -> Result { + Ok(DatValue::from_date(parse_date_str( + parse_temporal_json_string(v, "date")?.as_str(), + )?)) +} + +fn fn_date_out_json(v: &DatValue, _: &DatType) -> Result { + temporal_json_output(v.expect_date().format()) +} + +fn fn_date_in_msgpack(msg_pack: &MsgPackValue, _: &DatType) -> Result { + let Some(s) = msg_pack.as_str() else { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + "cannot convert msg pack to date".to_string(), + )); + }; + Ok(DatValue::from_date(parse_date_str(s)?)) +} + +fn fn_date_out_msgpack(v: &DatValue, _: &DatType) -> Result { + Ok(MsgPackValue::String(MsgPackUtf8String::from( + v.expect_date().format(), + ))) +} + +fn fn_date_len(_: &DatType) -> Result, TyErr> { + Ok(Some(size_of::() as u32)) +} + +fn fn_date_dat_output_len(_: &DatValue, _: &DatType) -> Result { + Ok(size_of::() as u32) +} + +fn fn_date_send(v: &DatValue, _: &DatType) -> Result { + let mut buf = vec![0u8; size_of::()]; + Endian::write_u32( + &mut buf, + encode_sortable_i32(v.expect_date().days_since_epoch()), + ); + Ok(DatBinary::from(buf)) +} + +fn fn_date_send_to(v: &DatValue, _: &DatType, buf: &mut [u8]) -> Result { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + Endian::write_u32(buf, encode_sortable_i32(v.expect_date().days_since_epoch())); + Ok(size_of::() as u32) +} + +fn fn_date_recv(buf: &[u8], _: &DatType) -> Result<(DatValue, u32), TyErr> { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + let days = decode_sortable_i32(Endian::read_u32(buf)); + Ok(( + DatValue::from_date(DateValue::from_days_since_epoch(days)), + size_of::() as u32, + )) +} + +fn fn_date_default(_: &DatType) -> Result { + Ok(DatValue::from_date(DateValue::from_days_since_epoch(0))) +} + +fn fn_date_order(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_date().cmp(v2.expect_date())) +} + +fn fn_date_equal(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_date() == v2.expect_date()) +} + +fn fn_date_hash(v: &DatValue, hasher: &mut dyn Hasher) -> Result<(), ErrCompare> { + hasher.write_i32(v.expect_date().days_since_epoch()); + Ok(()) +} + +pub const FN_DATE_COMPARE: FnCompare = FnCompare { + order: fn_date_order, + equal: fn_date_equal, + hash: fn_date_hash, +}; + +pub const FN_DATE_CONVERT: FnBase = FnBase { + input_textual: fn_date_in_textual, + output_textual: fn_date_out_textual, + input_json: fn_date_in_json, + output_json: fn_date_out_json, + input_msg_pack: fn_date_in_msgpack, + output_msg_pack: fn_date_out_msgpack, + type_len: fn_date_len, + data_len: fn_date_dat_output_len, + receive: fn_date_recv, + send: fn_date_send, + send_to: fn_date_send_to, + default: fn_date_default, +}; + +#[cfg(test)] +mod tests { + use super::{fn_date_recv, fn_date_send}; + use crate::dat_type::DatType; + use crate::dat_type_id::DatTypeID; + use crate::dat_value::DatValue; + use mudu::data_type::date::DateValue; + + #[test] + fn date_binary_roundtrip_preserves_value() { + let ty = DatType::default_for(DatTypeID::Date); + let value = DatValue::from_date(DateValue::parse("2026-05-20").unwrap()); + let binary = fn_date_send(&value, &ty).unwrap(); + let (decoded, used) = fn_date_recv(binary.as_ref(), &ty).unwrap(); + assert_eq!(used as usize, size_of::()); + assert_eq!(decoded.expect_date().format(), "2026-05-20"); + } +} diff --git a/mudu_type/src/dt_impl/fn_date_arb.rs b/mudu_type/src/dt_impl/fn_date_arb.rs new file mode 100644 index 0000000..8f64fbf --- /dev/null +++ b/mudu_type/src/dt_impl/fn_date_arb.rs @@ -0,0 +1,26 @@ +use crate::dat_type::DatType; +use crate::dat_type_id::DatTypeID; +use crate::dat_value::DatValue; +use crate::dt_fn_arbitrary::FnArbitrary; +use arbitrary::{Arbitrary, Unstructured}; +use mudu::data_type::date::DateValue; + +pub fn fn_date_arb_val(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + Ok(DatValue::from_date(DateValue::from_days_since_epoch( + i32::arbitrary(u)?, + ))) +} + +pub fn fn_date_arb_printable(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + Ok(DateValue::from_days_since_epoch(i32::arbitrary(u)?).format()) +} + +pub fn fn_date_arb_dt_param(_u: &mut Unstructured) -> arbitrary::Result { + Ok(DatType::new_no_param(DatTypeID::Date)) +} + +pub const FN_DATE_ARBITRARY: FnArbitrary = FnArbitrary { + param: fn_date_arb_dt_param, + value_object: fn_date_arb_val, + value_print: fn_date_arb_printable, +}; diff --git a/mudu_type/src/dt_impl/fn_numeric.rs b/mudu_type/src/dt_impl/fn_numeric.rs new file mode 100644 index 0000000..b3a2bf1 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_numeric.rs @@ -0,0 +1,393 @@ +use crate::dat_binary::DatBinary; +use crate::dat_json::DatJson; +use crate::dat_textual::DatTextual; +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_compare::{ErrCompare, FnCompare}; +use crate::dt_fn_convert::FnBase; +use crate::type_error::{TyEC, TyErr}; +use byteorder::ByteOrder; +use mudu::common::endian::Endian; +use mudu::data_type::numeric::Numeric; +use mudu::utils::json::{JsonValue, from_json_str}; +use mudu::utils::msg_pack::{MsgPackUtf8String, MsgPackValue}; +use std::cmp::Ordering; +use std::hash::Hasher; + +fn parse_numeric_str(value: &str) -> Result { + Numeric::parse(value) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, format!("invalid numeric {}", e))) +} + +fn parse_numeric_json(value: &JsonValue) -> Result { + if let Some(s) = value.as_str() { + return parse_numeric_str(s); + } + match value { + JsonValue::Number(_) => parse_numeric_str(value.to_string().as_str()), + _ => Err(TyErr::new( + TyEC::TypeConvertFailed, + format!("cannot convert json {} to numeric", value), + )), + } +} + +fn precision_digit_count(value: &str) -> u8 { + let digits: String = value + .chars() + .filter(|ch| ch.is_ascii_digit()) + .collect::() + .trim_start_matches('0') + .to_string(); + if digits.is_empty() { + 1 + } else { + digits.len().min(u8::MAX as usize) as u8 + } +} + +fn normalize_numeric_for_type(value: &Numeric, dt: &DatType) -> Result { + let Some(param) = dt.as_numeric_param() else { + return Ok(value.clone()); + }; + let normalized = value.round_half_even(param.scale() as i64); + let precision = precision_digit_count(normalized.to_plain_string().as_str()); + if precision > param.precision() { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + format!( + "numeric precision {} exceeds declared precision {}", + precision, + param.precision() + ), + )); + } + Ok(normalized) +} + +fn numeric_scale(dt: &DatType) -> u8 { + dt.as_numeric_param() + .map(|param| param.scale()) + .unwrap_or(0) +} + +fn scaled_i128_from_numeric(value: &Numeric, dt: &DatType) -> Result { + let normalized = normalize_numeric_for_type(value, dt)?; + let scale = numeric_scale(dt) as usize; + let value = normalized.to_plain_string(); + let negative = value.starts_with('-'); + let unsigned = value.strip_prefix('-').unwrap_or(value.as_str()); + let mut parts = unsigned.split('.'); + let integer = parts.next().unwrap_or("0"); + let fraction = parts.next().unwrap_or(""); + if parts.next().is_some() { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + format!("invalid normalized numeric {}", value), + )); + } + if fraction.len() > scale { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + format!("numeric {} exceeds target scale {}", value, scale), + )); + } + let digits = if scale == 0 { + integer.to_string() + } else { + format!("{integer}{fraction:0().map_err(|e| { + TyErr::new( + TyEC::TypeConvertFailed, + format!( + "numeric {} cannot be represented as scaled i128: {}", + value, e + ), + ) + }) +} + +fn numeric_from_scaled_i128(scaled: i128, dt: &DatType) -> Result { + let scale = numeric_scale(dt) as usize; + if scale == 0 { + return parse_numeric_str(scaled.to_string().as_str()); + } + + let signed = scaled.to_string(); + let negative = signed.starts_with('-'); + let digits = signed.strip_prefix('-').unwrap_or(signed.as_str()); + let decimal = if digits.len() <= scale { + let padded = format!("{digits:0>width$}", width = scale + 1); + let split = padded.len() - scale; + format!("{}.{}", &padded[..split], &padded[split..]) + } else { + let split = digits.len() - scale; + format!("{}.{}", &digits[..split], &digits[split..]) + }; + let value = if negative { + format!("-{}", decimal) + } else { + decimal + }; + parse_numeric_str(value.as_str()) +} + +fn encode_sortable_scaled_i128(scaled: i128) -> u128 { + (scaled as u128) ^ (1u128 << 127) +} + +fn decode_sortable_scaled_i128(encoded: u128) -> i128 { + (encoded ^ (1u128 << 127)) as i128 +} + +fn fn_numeric_in_textual(v: &str, dt: &DatType) -> Result { + let json = from_json_str::(v) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e.to_string()))?; + fn_numeric_in_json(&json, dt) +} + +fn fn_numeric_out_textual(v: &DatValue, dt: &DatType) -> Result { + let json = fn_numeric_out_json(v, dt)?; + Ok(DatTextual::from(json.to_string())) +} + +fn fn_numeric_in_json(v: &JsonValue, dt: &DatType) -> Result { + Ok(DatValue::from_numeric(normalize_numeric_for_type( + &parse_numeric_json(v)?, + dt, + )?)) +} + +fn fn_numeric_out_json(v: &DatValue, dt: &DatType) -> Result { + Ok(DatJson::from(JsonValue::String( + normalize_numeric_for_type(v.expect_numeric(), dt)?.to_plain_string(), + ))) +} + +fn fn_numeric_in_msgpack(msg_pack: &MsgPackValue, dt: &DatType) -> Result { + if let Some(s) = msg_pack.as_str() { + return Ok(DatValue::from_numeric(normalize_numeric_for_type( + &parse_numeric_str(s)?, + dt, + )?)); + } + if let MsgPackValue::Integer(value) = msg_pack { + return Ok(DatValue::from_numeric(normalize_numeric_for_type( + &parse_numeric_str(value.to_string().as_str())?, + dt, + )?)); + } + if let MsgPackValue::F32(value) = msg_pack { + return Ok(DatValue::from_numeric(normalize_numeric_for_type( + &parse_numeric_str(value.to_string().as_str())?, + dt, + )?)); + } + if let MsgPackValue::F64(value) = msg_pack { + return Ok(DatValue::from_numeric(normalize_numeric_for_type( + &parse_numeric_str(value.to_string().as_str())?, + dt, + )?)); + } + Err(TyErr::new( + TyEC::TypeConvertFailed, + "cannot convert msg pack to numeric".to_string(), + )) +} + +fn fn_numeric_out_msgpack(v: &DatValue, dt: &DatType) -> Result { + Ok(MsgPackValue::String(MsgPackUtf8String::from( + normalize_numeric_for_type(v.expect_numeric(), dt)?.to_plain_string(), + ))) +} + +fn fn_numeric_len(_: &DatType) -> Result, TyErr> { + Ok(Some(size_of::() as u32)) +} + +fn fn_numeric_dat_output_len(val: &DatValue, ty: &DatType) -> Result { + let _ = scaled_i128_from_numeric(val.expect_numeric(), ty)?; + Ok(size_of::() as u32) +} + +fn fn_numeric_send(v: &DatValue, dt: &DatType) -> Result { + let scaled = scaled_i128_from_numeric(v.expect_numeric(), dt)?; + let mut vec = vec![0u8; size_of::()]; + Endian::write_u128(&mut vec, encode_sortable_scaled_i128(scaled)); + Ok(DatBinary::from(vec)) +} + +fn fn_numeric_send_to(v: &DatValue, dt: &DatType, buf: &mut [u8]) -> Result { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + let scaled = scaled_i128_from_numeric(v.expect_numeric(), dt)?; + Endian::write_u128(buf, encode_sortable_scaled_i128(scaled)); + Ok(size_of::() as u32) +} + +fn fn_numeric_recv(buf: &[u8], dt: &DatType) -> Result<(DatValue, u32), TyErr> { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + let scaled = decode_sortable_scaled_i128(Endian::read_u128(buf)); + let numeric = numeric_from_scaled_i128(scaled, dt)?; + Ok(( + DatValue::from_numeric(normalize_numeric_for_type(&numeric, dt)?), + size_of::() as u32, + )) +} + +fn fn_numeric_default(dt: &DatType) -> Result { + Ok(DatValue::from_numeric(normalize_numeric_for_type( + &Numeric::zero(), + dt, + )?)) +} + +fn fn_numeric_order(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_numeric().cmp(v2.expect_numeric())) +} + +fn fn_numeric_equal(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_numeric() == v2.expect_numeric()) +} + +fn fn_numeric_hash(v: &DatValue, hasher: &mut dyn Hasher) -> Result<(), ErrCompare> { + hasher.write(v.expect_numeric().to_plain_string().as_bytes()); + Ok(()) +} + +pub const FN_NUMERIC_COMPARE: FnCompare = FnCompare { + order: fn_numeric_order, + equal: fn_numeric_equal, + hash: fn_numeric_hash, +}; + +pub const FN_NUMERIC_CONVERT: FnBase = FnBase { + input_textual: fn_numeric_in_textual, + output_textual: fn_numeric_out_textual, + input_json: fn_numeric_in_json, + output_json: fn_numeric_out_json, + input_msg_pack: fn_numeric_in_msgpack, + output_msg_pack: fn_numeric_out_msgpack, + type_len: fn_numeric_len, + data_len: fn_numeric_dat_output_len, + receive: fn_numeric_recv, + send: fn_numeric_send, + send_to: fn_numeric_send_to, + default: fn_numeric_default, +}; + +#[cfg(test)] +mod tests { + use super::{fn_numeric_len, fn_numeric_recv, fn_numeric_send, fn_numeric_send_to}; + use crate::dat_type::DatType; + use crate::dat_value::DatValue; + use crate::dtp_numeric::DTPNumeric; + use crate::type_error::TyEC; + use mudu::data_type::numeric::Numeric; + use std::cmp::Ordering; + + #[test] + fn numeric_binary_roundtrip_uses_scaled_i128() { + let ty = DatType::from_numeric(DTPNumeric::new(18, 4)); + let value = DatValue::from_numeric(Numeric::parse("12.3400").unwrap()); + let binary = fn_numeric_send(&value, &ty).unwrap(); + assert_eq!(binary.as_ref().len(), size_of::()); + + let (decoded, used) = fn_numeric_recv(binary.as_ref(), &ty).unwrap(); + assert_eq!(used as usize, size_of::()); + assert_eq!(decoded.expect_numeric().to_plain_string(), "12.3400"); + } + + #[test] + fn numeric_binary_length_is_fixed() { + let ty = DatType::from_numeric(DTPNumeric::new(18, 2)); + assert_eq!(fn_numeric_len(&ty).unwrap(), Some(size_of::() as u32)); + } + + #[test] + fn numeric_binary_roundtrip_preserves_negative_scaled_values() { + let ty = DatType::from_numeric(DTPNumeric::new(18, 4)); + let value = DatValue::from_numeric(Numeric::parse("-0.0100").unwrap()); + let binary = fn_numeric_send(&value, &ty).unwrap(); + + let (decoded, used) = fn_numeric_recv(binary.as_ref(), &ty).unwrap(); + assert_eq!(used as usize, size_of::()); + assert_eq!(decoded.expect_numeric().to_plain_string(), "-0.0100"); + } + + #[test] + fn numeric_binary_send_rounds_half_even_to_declared_scale() { + let ty = DatType::from_numeric(DTPNumeric::new(5, 2)); + let lower = DatValue::from_numeric(Numeric::parse("1.235").unwrap()); + let upper = DatValue::from_numeric(Numeric::parse("1.245").unwrap()); + + let lower_binary = fn_numeric_send(&lower, &ty).unwrap(); + let upper_binary = fn_numeric_send(&upper, &ty).unwrap(); + + let (lower_decoded, _) = fn_numeric_recv(lower_binary.as_ref(), &ty).unwrap(); + let (upper_decoded, _) = fn_numeric_recv(upper_binary.as_ref(), &ty).unwrap(); + + assert_eq!(lower_decoded.expect_numeric().to_plain_string(), "1.24"); + assert_eq!(upper_decoded.expect_numeric().to_plain_string(), "1.24"); + } + + #[test] + fn numeric_binary_send_rejects_precision_overflow_after_rounding() { + let ty = DatType::from_numeric(DTPNumeric::new(4, 2)); + let value = DatValue::from_numeric(Numeric::parse("999.995").unwrap()); + let err = match fn_numeric_send(&value, &ty) { + Ok(_) => panic!("expected numeric precision overflow"), + Err(err) => err, + }; + + assert!(matches!(err.ec(), TyEC::TypeConvertFailed)); + assert!(err.msg().contains("exceeds declared precision")); + } + + #[test] + fn numeric_binary_send_to_rejects_short_buffer() { + let ty = DatType::from_numeric(DTPNumeric::new(18, 2)); + let value = DatValue::from_numeric(Numeric::parse("7.50").unwrap()); + let err = fn_numeric_send_to(&value, &ty, &mut [0u8; 8]).unwrap_err(); + + assert!(matches!(err.ec(), TyEC::InsufficientSpace)); + } + + #[test] + fn numeric_binary_recv_rejects_short_buffer() { + let ty = DatType::from_numeric(DTPNumeric::new(18, 2)); + let err = fn_numeric_recv(&[0u8; 8], &ty).unwrap_err(); + + assert!(matches!(err.ec(), TyEC::InsufficientSpace)); + } + + #[test] + fn numeric_binary_encoding_sorts_negative_before_positive() { + let ty = DatType::from_numeric(DTPNumeric::new(9, 4)); + let negative = DatValue::from_numeric(Numeric::parse("-0.0100").unwrap()); + let positive = DatValue::from_numeric(Numeric::parse("12.3400").unwrap()); + + let negative_binary = fn_numeric_send(&negative, &ty).unwrap(); + let positive_binary = fn_numeric_send(&positive, &ty).unwrap(); + + assert_eq!( + negative_binary.as_ref().cmp(positive_binary.as_ref()), + Ordering::Less + ); + } +} diff --git a/mudu_type/src/dt_impl/fn_numeric_arb.rs b/mudu_type/src/dt_impl/fn_numeric_arb.rs new file mode 100644 index 0000000..07f9ecf --- /dev/null +++ b/mudu_type/src/dt_impl/fn_numeric_arb.rs @@ -0,0 +1,31 @@ +use crate::dat_type::DatType; +use crate::dat_type_id::DatTypeID; +use crate::dat_value::DatValue; +use crate::dt_fn_arbitrary::FnArbitrary; +use crate::dtp_numeric::DTPNumeric; +use arbitrary::{Arbitrary, Unstructured}; +use mudu::data_type::numeric::Numeric; + +pub fn fn_numeric_arb_val(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + let whole = i64::arbitrary(u)?; + let frac = u16::arbitrary(u)? % 10_000; + let s = format!("{}.{:04}", whole, frac); + Ok(DatValue::from_numeric(Numeric::parse(&s).unwrap())) +} + +pub fn fn_numeric_arb_printable(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + let value = fn_numeric_arb_val(u, &DatType::new_no_param(DatTypeID::Numeric))?; + Ok(value.expect_numeric().to_plain_string()) +} + +pub fn fn_numeric_arb_dt_param(u: &mut Unstructured) -> arbitrary::Result { + let precision = (u8::arbitrary(u)? % 18) + 1; + let scale = u8::arbitrary(u)? % (precision + 1); + Ok(DatType::from_numeric(DTPNumeric::new(precision, scale))) +} + +pub const FN_NUMERIC_ARBITRARY: FnArbitrary = FnArbitrary { + param: fn_numeric_arb_dt_param, + value_object: fn_numeric_arb_val, + value_print: fn_numeric_arb_printable, +}; diff --git a/mudu_type/src/dt_impl/fn_numeric_param.rs b/mudu_type/src/dt_impl/fn_numeric_param.rs new file mode 100644 index 0000000..bfe980b --- /dev/null +++ b/mudu_type/src/dt_impl/fn_numeric_param.rs @@ -0,0 +1,30 @@ +use crate::dat_type::DatType; +use crate::dt_fn_param::FnParam; +use crate::dtp_numeric::DTPNumeric; +use crate::type_error::{TyEC, TyErr}; + +pub fn fn_numeric_dt_param_in(params: &str) -> Result { + let param: DTPNumeric = serde_json::from_str(params).map_err(|e| { + TyErr::new( + TyEC::ParamParseError, + format!("parse numeric parameter error {}", e), + ) + })?; + validate_numeric_param(¶m)?; + Ok(DatType::from_numeric(param)) +} + +pub fn fn_numeric_dt_param_default() -> DatType { + DatType::from_numeric(DTPNumeric::default()) +} + +fn validate_numeric_param(param: &DTPNumeric) -> Result<(), TyErr> { + param + .validate() + .map_err(|message| TyErr::new(TyEC::ParamParseError, message)) +} + +pub const FN_NUMERIC_PARAM: FnParam = FnParam { + input: fn_numeric_dt_param_in, + default: Some(fn_numeric_dt_param_default), +}; diff --git a/mudu_type/src/dt_impl/fn_time.rs b/mudu_type/src/dt_impl/fn_time.rs new file mode 100644 index 0000000..634b5bf --- /dev/null +++ b/mudu_type/src/dt_impl/fn_time.rs @@ -0,0 +1,220 @@ +use crate::dat_binary::DatBinary; +use crate::dat_json::DatJson; +use crate::dat_textual::DatTextual; +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_compare::{ErrCompare, FnCompare}; +use crate::dt_fn_convert::FnBase; +use crate::dt_impl::temporal::{ + decode_sortable_i64, encode_sortable_i64, parse_temporal_json_string, temporal_json_output, + time_precision, +}; +use crate::type_error::{TyEC, TyErr}; +use byteorder::ByteOrder; +use mudu::common::endian::Endian; +use mudu::data_type::time::TimeValue; +use mudu::utils::json::{JsonValue, from_json_str}; +use mudu::utils::msg_pack::{MsgPackUtf8String, MsgPackValue}; +use std::cmp::Ordering; +use std::hash::Hasher; + +fn parse_time_str(value: &str, dt: &DatType) -> Result { + let value = TimeValue::parse(value) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, format!("invalid time {}", e)))?; + value + .truncate_precision(time_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e)) +} + +fn fn_time_in_textual(v: &str, dt: &DatType) -> Result { + let json = from_json_str::(v) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e.to_string()))?; + fn_time_in_json(&json, dt) +} + +fn fn_time_out_textual(v: &DatValue, dt: &DatType) -> Result { + let json = fn_time_out_json(v, dt)?; + Ok(DatTextual::from(json.to_string())) +} + +fn fn_time_in_json(v: &JsonValue, dt: &DatType) -> Result { + Ok(DatValue::from_time(parse_time_str( + parse_temporal_json_string(v, "time")?.as_str(), + dt, + )?)) +} + +fn fn_time_out_json(v: &DatValue, dt: &DatType) -> Result { + temporal_json_output(v.expect_time().format(time_precision(dt))) +} + +fn fn_time_in_msgpack(msg_pack: &MsgPackValue, dt: &DatType) -> Result { + let Some(s) = msg_pack.as_str() else { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + "cannot convert msg pack to time".to_string(), + )); + }; + Ok(DatValue::from_time(parse_time_str(s, dt)?)) +} + +fn fn_time_out_msgpack(v: &DatValue, dt: &DatType) -> Result { + Ok(MsgPackValue::String(MsgPackUtf8String::from( + v.expect_time().format(time_precision(dt)), + ))) +} + +fn fn_time_len(_: &DatType) -> Result, TyErr> { + Ok(Some(size_of::() as u32)) +} + +fn fn_time_dat_output_len(_: &DatValue, _: &DatType) -> Result { + Ok(size_of::() as u32) +} + +fn fn_time_send(v: &DatValue, _: &DatType) -> Result { + let mut buf = vec![0u8; size_of::()]; + Endian::write_u64( + &mut buf, + encode_sortable_i64(v.expect_time().micros_since_midnight()), + ); + Ok(DatBinary::from(buf)) +} + +fn fn_time_send_to(v: &DatValue, _: &DatType, buf: &mut [u8]) -> Result { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + Endian::write_u64( + buf, + encode_sortable_i64(v.expect_time().micros_since_midnight()), + ); + Ok(size_of::() as u32) +} + +fn fn_time_recv(buf: &[u8], _: &DatType) -> Result<(DatValue, u32), TyErr> { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + let micros = decode_sortable_i64(Endian::read_u64(buf)); + let value = TimeValue::from_micros_since_midnight(micros) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e))?; + Ok((DatValue::from_time(value), size_of::() as u32)) +} + +fn fn_time_default(_: &DatType) -> Result { + Ok(DatValue::from_time( + TimeValue::from_micros_since_midnight(0) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e))?, + )) +} + +fn fn_time_order(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_time().cmp(v2.expect_time())) +} + +fn fn_time_equal(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_time() == v2.expect_time()) +} + +fn fn_time_hash(v: &DatValue, hasher: &mut dyn Hasher) -> Result<(), ErrCompare> { + hasher.write_i64(v.expect_time().micros_since_midnight()); + Ok(()) +} + +pub const FN_TIME_COMPARE: FnCompare = FnCompare { + order: fn_time_order, + equal: fn_time_equal, + hash: fn_time_hash, +}; + +pub const FN_TIME_CONVERT: FnBase = FnBase { + input_textual: fn_time_in_textual, + output_textual: fn_time_out_textual, + input_json: fn_time_in_json, + output_json: fn_time_out_json, + input_msg_pack: fn_time_in_msgpack, + output_msg_pack: fn_time_out_msgpack, + type_len: fn_time_len, + data_len: fn_time_dat_output_len, + receive: fn_time_recv, + send: fn_time_send, + send_to: fn_time_send_to, + default: fn_time_default, +}; + +#[cfg(test)] +mod tests { + use super::{ + fn_time_default, fn_time_in_json, fn_time_in_msgpack, fn_time_out_json, + fn_time_out_msgpack, fn_time_recv, fn_time_send, fn_time_send_to, + }; + use crate::dat_type::DatType; + use crate::dat_value::DatValue; + use crate::dtp_time::DTPTime; + use crate::type_error::{TyEC, TyErr}; + use mudu::data_type::time::TimeValue; + use mudu::utils::json::JsonValue; + use mudu::utils::msg_pack::MsgPackValue; + + fn assert_ty_ec(err: TyErr, ec: TyEC) { + assert_eq!( + std::mem::discriminant(&err.ec()), + std::mem::discriminant(&ec) + ); + } + + #[test] + fn time_binary_roundtrip_respects_precision() { + let ty = DatType::from_time(DTPTime::new(3)); + let value = DatValue::from_time(TimeValue::parse("12:34:56.123456").unwrap()); + let binary = fn_time_send(&value, &ty).unwrap(); + let (decoded, _) = fn_time_recv(binary.as_ref(), &ty).unwrap(); + assert_eq!(decoded.expect_time().format(3), "12:34:56.123"); + } + + #[test] + fn time_json_and_msgpack_io_respect_precision() { + let ty = DatType::from_time(DTPTime::new(2)); + let decoded = + fn_time_in_json(&JsonValue::String("12:34:56.123456".to_string()), &ty).unwrap(); + assert_eq!(decoded.expect_time().format(6), "12:34:56.120000"); + + let json = fn_time_out_json(&decoded, &ty).unwrap(); + assert_eq!( + json.as_json_value(), + &JsonValue::String("12:34:56.12".to_string()) + ); + + let msgpack = fn_time_out_msgpack(&decoded, &ty).unwrap(); + assert_eq!(msgpack.as_str(), Some("12:34:56.12")); + } + + #[test] + fn time_msgpack_non_string_and_short_buffers_are_rejected() { + let ty = DatType::from_time(DTPTime::new(3)); + let value = DatValue::from_time(TimeValue::parse("12:34:56.123456").unwrap()); + + let err = fn_time_in_msgpack(&MsgPackValue::from(7), &ty).unwrap_err(); + assert_ty_ec(err, TyEC::TypeConvertFailed); + + let err = fn_time_send_to(&value, &ty, &mut [0u8; 7]).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + + let err = fn_time_recv(&[0u8; 7], &ty).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + } + + #[test] + fn time_default_is_midnight() { + let ty = DatType::from_time(DTPTime::new(6)); + let value = fn_time_default(&ty).unwrap(); + assert_eq!(value.expect_time().format(6), "00:00:00.000000"); + } +} diff --git a/mudu_type/src/dt_impl/fn_time_arb.rs b/mudu_type/src/dt_impl/fn_time_arb.rs new file mode 100644 index 0000000..bcebec1 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_time_arb.rs @@ -0,0 +1,31 @@ +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_arbitrary::FnArbitrary; +use crate::dtp_time::DTPTime; +use arbitrary::{Arbitrary, Unstructured}; +use mudu::data_type::temporal::MICROS_PER_DAY; +use mudu::data_type::time::TimeValue; + +pub fn fn_time_arb_val(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + let micros = i64::arbitrary(u)?.rem_euclid(MICROS_PER_DAY); + Ok(DatValue::from_time( + TimeValue::from_micros_since_midnight(micros).unwrap(), + )) +} + +pub fn fn_time_arb_printable(u: &mut Unstructured, dt: &DatType) -> arbitrary::Result { + let micros = i64::arbitrary(u)?.rem_euclid(MICROS_PER_DAY); + Ok(TimeValue::from_micros_since_midnight(micros) + .unwrap() + .format(dt.expect_time_param().precision())) +} + +pub fn fn_time_arb_dt_param(u: &mut Unstructured) -> arbitrary::Result { + Ok(DatType::from_time(DTPTime::new(u.int_in_range(0..=6)?))) +} + +pub const FN_TIME_ARBITRARY: FnArbitrary = FnArbitrary { + param: fn_time_arb_dt_param, + value_object: fn_time_arb_val, + value_print: fn_time_arb_printable, +}; diff --git a/mudu_type/src/dt_impl/fn_time_param.rs b/mudu_type/src/dt_impl/fn_time_param.rs new file mode 100644 index 0000000..b300a15 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_time_param.rs @@ -0,0 +1,25 @@ +use crate::dat_type::DatType; +use crate::dt_fn_param::FnParam; +use crate::dt_impl::temporal::validate_time_param; +use crate::dtp_time::DTPTime; +use crate::type_error::{TyEC, TyErr}; + +pub fn fn_time_dt_param_in(params: &str) -> Result { + let param: DTPTime = serde_json::from_str(params).map_err(|e| { + TyErr::new( + TyEC::ParamParseError, + format!("parse time parameter error {}", e), + ) + })?; + validate_time_param(¶m)?; + Ok(DatType::from_time(param)) +} + +pub fn fn_time_dt_param_default() -> DatType { + DatType::from_time(DTPTime::default()) +} + +pub const FN_TIME_PARAM: FnParam = FnParam { + input: fn_time_dt_param_in, + default: Some(fn_time_dt_param_default), +}; diff --git a/mudu_type/src/dt_impl/fn_timestamp.rs b/mudu_type/src/dt_impl/fn_timestamp.rs new file mode 100644 index 0000000..2388c68 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_timestamp.rs @@ -0,0 +1,241 @@ +use crate::dat_binary::DatBinary; +use crate::dat_json::DatJson; +use crate::dat_textual::DatTextual; +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_compare::{ErrCompare, FnCompare}; +use crate::dt_fn_convert::FnBase; +use crate::dt_impl::temporal::{ + decode_sortable_i64, encode_sortable_i64, parse_temporal_json_string, temporal_json_output, + timestamp_precision, +}; +use crate::type_error::{TyEC, TyErr}; +use byteorder::ByteOrder; +use mudu::common::endian::Endian; +use mudu::data_type::timestamp::TimestampValue; +use mudu::utils::json::{JsonValue, from_json_str}; +use mudu::utils::msg_pack::{MsgPackUtf8String, MsgPackValue}; +use std::cmp::Ordering; +use std::hash::Hasher; + +fn parse_timestamp_str(value: &str, dt: &DatType) -> Result { + let value = TimestampValue::parse(value) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, format!("invalid timestamp {}", e)))?; + value + .truncate_precision(timestamp_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e)) +} + +fn fn_timestamp_in_textual(v: &str, dt: &DatType) -> Result { + let json = from_json_str::(v) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e.to_string()))?; + fn_timestamp_in_json(&json, dt) +} + +fn fn_timestamp_out_textual(v: &DatValue, dt: &DatType) -> Result { + let json = fn_timestamp_out_json(v, dt)?; + Ok(DatTextual::from(json.to_string())) +} + +fn fn_timestamp_in_json(v: &JsonValue, dt: &DatType) -> Result { + Ok(DatValue::from_timestamp(parse_timestamp_str( + parse_temporal_json_string(v, "timestamp")?.as_str(), + dt, + )?)) +} + +fn fn_timestamp_out_json(v: &DatValue, dt: &DatType) -> Result { + temporal_json_output( + v.expect_timestamp() + .format(timestamp_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e))?, + ) +} + +fn fn_timestamp_in_msgpack(msg_pack: &MsgPackValue, dt: &DatType) -> Result { + let Some(s) = msg_pack.as_str() else { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + "cannot convert msg pack to timestamp".to_string(), + )); + }; + Ok(DatValue::from_timestamp(parse_timestamp_str(s, dt)?)) +} + +fn fn_timestamp_out_msgpack(v: &DatValue, dt: &DatType) -> Result { + Ok(MsgPackValue::String(MsgPackUtf8String::from( + v.expect_timestamp() + .format(timestamp_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e))?, + ))) +} + +fn fn_timestamp_len(_: &DatType) -> Result, TyErr> { + Ok(Some(size_of::() as u32)) +} + +fn fn_timestamp_dat_output_len(_: &DatValue, _: &DatType) -> Result { + Ok(size_of::() as u32) +} + +fn fn_timestamp_send(v: &DatValue, _: &DatType) -> Result { + let mut buf = vec![0u8; size_of::()]; + Endian::write_u64( + &mut buf, + encode_sortable_i64(v.expect_timestamp().epoch_micros()), + ); + Ok(DatBinary::from(buf)) +} + +fn fn_timestamp_send_to(v: &DatValue, _: &DatType, buf: &mut [u8]) -> Result { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + Endian::write_u64( + buf, + encode_sortable_i64(v.expect_timestamp().epoch_micros()), + ); + Ok(size_of::() as u32) +} + +fn fn_timestamp_recv(buf: &[u8], _: &DatType) -> Result<(DatValue, u32), TyErr> { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + Ok(( + DatValue::from_timestamp(TimestampValue::from_epoch_micros(decode_sortable_i64( + Endian::read_u64(buf), + ))), + size_of::() as u32, + )) +} + +fn fn_timestamp_default(_: &DatType) -> Result { + Ok(DatValue::from_timestamp(TimestampValue::from_epoch_micros( + 0, + ))) +} + +fn fn_timestamp_order(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_timestamp().cmp(v2.expect_timestamp())) +} + +fn fn_timestamp_equal(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_timestamp() == v2.expect_timestamp()) +} + +fn fn_timestamp_hash(v: &DatValue, hasher: &mut dyn Hasher) -> Result<(), ErrCompare> { + hasher.write_i64(v.expect_timestamp().epoch_micros()); + Ok(()) +} + +pub const FN_TIMESTAMP_COMPARE: FnCompare = FnCompare { + order: fn_timestamp_order, + equal: fn_timestamp_equal, + hash: fn_timestamp_hash, +}; + +pub const FN_TIMESTAMP_CONVERT: FnBase = FnBase { + input_textual: fn_timestamp_in_textual, + output_textual: fn_timestamp_out_textual, + input_json: fn_timestamp_in_json, + output_json: fn_timestamp_out_json, + input_msg_pack: fn_timestamp_in_msgpack, + output_msg_pack: fn_timestamp_out_msgpack, + type_len: fn_timestamp_len, + data_len: fn_timestamp_dat_output_len, + receive: fn_timestamp_recv, + send: fn_timestamp_send, + send_to: fn_timestamp_send_to, + default: fn_timestamp_default, +}; + +#[cfg(test)] +mod tests { + use super::{ + fn_timestamp_default, fn_timestamp_in_json, fn_timestamp_in_msgpack, fn_timestamp_out_json, + fn_timestamp_out_msgpack, fn_timestamp_recv, fn_timestamp_send, fn_timestamp_send_to, + }; + use crate::dat_type::DatType; + use crate::dat_value::DatValue; + use crate::dtp_timestamp::DTPTimestamp; + use crate::type_error::{TyEC, TyErr}; + use mudu::data_type::timestamp::TimestampValue; + use mudu::utils::json::JsonValue; + use mudu::utils::msg_pack::MsgPackValue; + + fn assert_ty_ec(err: TyErr, ec: TyEC) { + assert_eq!( + std::mem::discriminant(&err.ec()), + std::mem::discriminant(&ec) + ); + } + + #[test] + fn timestamp_binary_roundtrip_respects_precision() { + let ty = DatType::from_timestamp(DTPTimestamp::new(4)); + let value = + DatValue::from_timestamp(TimestampValue::parse("2026-05-20 14:30:45.123456").unwrap()); + let binary = fn_timestamp_send(&value, &ty).unwrap(); + let (decoded, _) = fn_timestamp_recv(binary.as_ref(), &ty).unwrap(); + assert_eq!( + decoded.expect_timestamp().format(4).unwrap(), + "2026-05-20 14:30:45.1234" + ); + } + + #[test] + fn timestamp_json_and_msgpack_io_respect_precision() { + let ty = DatType::from_timestamp(DTPTimestamp::new(3)); + let decoded = fn_timestamp_in_json( + &JsonValue::String("2026-05-20 14:30:45.123456".to_string()), + &ty, + ) + .unwrap(); + assert_eq!( + decoded.expect_timestamp().format(6).unwrap(), + "2026-05-20 14:30:45.123000" + ); + + let json = fn_timestamp_out_json(&decoded, &ty).unwrap(); + assert_eq!( + json.as_json_value(), + &JsonValue::String("2026-05-20 14:30:45.123".to_string()) + ); + + let msgpack = fn_timestamp_out_msgpack(&decoded, &ty).unwrap(); + assert_eq!(msgpack.as_str(), Some("2026-05-20 14:30:45.123")); + } + + #[test] + fn timestamp_msgpack_non_string_and_short_buffers_are_rejected() { + let ty = DatType::from_timestamp(DTPTimestamp::new(4)); + let value = + DatValue::from_timestamp(TimestampValue::parse("2026-05-20 14:30:45.123456").unwrap()); + + let err = fn_timestamp_in_msgpack(&MsgPackValue::from(true), &ty).unwrap_err(); + assert_ty_ec(err, TyEC::TypeConvertFailed); + + let err = fn_timestamp_send_to(&value, &ty, &mut [0u8; 7]).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + + let err = fn_timestamp_recv(&[0u8; 7], &ty).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + } + + #[test] + fn timestamp_default_is_unix_epoch() { + let ty = DatType::from_timestamp(DTPTimestamp::new(6)); + let value = fn_timestamp_default(&ty).unwrap(); + assert_eq!( + value.expect_timestamp().format(6).unwrap(), + "1970-01-01 00:00:00.000000" + ); + } +} diff --git a/mudu_type/src/dt_impl/fn_timestamp_arb.rs b/mudu_type/src/dt_impl/fn_timestamp_arb.rs new file mode 100644 index 0000000..1307dd2 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_timestamp_arb.rs @@ -0,0 +1,30 @@ +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_arbitrary::FnArbitrary; +use crate::dtp_timestamp::DTPTimestamp; +use arbitrary::{Arbitrary, Unstructured}; +use mudu::data_type::timestamp::TimestampValue; + +pub fn fn_timestamp_arb_val(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + Ok(DatValue::from_timestamp(TimestampValue::from_epoch_micros( + i64::arbitrary(u)?, + ))) +} + +pub fn fn_timestamp_arb_printable(u: &mut Unstructured, dt: &DatType) -> arbitrary::Result { + Ok(TimestampValue::from_epoch_micros(i64::arbitrary(u)?) + .format(dt.expect_timestamp_param().precision()) + .unwrap()) +} + +pub fn fn_timestamp_arb_dt_param(u: &mut Unstructured) -> arbitrary::Result { + Ok(DatType::from_timestamp(DTPTimestamp::new( + u.int_in_range(0..=6)?, + ))) +} + +pub const FN_TIMESTAMP_ARBITRARY: FnArbitrary = FnArbitrary { + param: fn_timestamp_arb_dt_param, + value_object: fn_timestamp_arb_val, + value_print: fn_timestamp_arb_printable, +}; diff --git a/mudu_type/src/dt_impl/fn_timestamp_param.rs b/mudu_type/src/dt_impl/fn_timestamp_param.rs new file mode 100644 index 0000000..55b50d7 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_timestamp_param.rs @@ -0,0 +1,25 @@ +use crate::dat_type::DatType; +use crate::dt_fn_param::FnParam; +use crate::dt_impl::temporal::validate_timestamp_param; +use crate::dtp_timestamp::DTPTimestamp; +use crate::type_error::{TyEC, TyErr}; + +pub fn fn_timestamp_dt_param_in(params: &str) -> Result { + let param: DTPTimestamp = serde_json::from_str(params).map_err(|e| { + TyErr::new( + TyEC::ParamParseError, + format!("parse timestamp parameter error {}", e), + ) + })?; + validate_timestamp_param(¶m)?; + Ok(DatType::from_timestamp(param)) +} + +pub fn fn_timestamp_dt_param_default() -> DatType { + DatType::from_timestamp(DTPTimestamp::default()) +} + +pub const FN_TIMESTAMP_PARAM: FnParam = FnParam { + input: fn_timestamp_dt_param_in, + default: Some(fn_timestamp_dt_param_default), +}; diff --git a/mudu_type/src/dt_impl/fn_timestamptz.rs b/mudu_type/src/dt_impl/fn_timestamptz.rs new file mode 100644 index 0000000..2fa05be --- /dev/null +++ b/mudu_type/src/dt_impl/fn_timestamptz.rs @@ -0,0 +1,248 @@ +use crate::dat_binary::DatBinary; +use crate::dat_json::DatJson; +use crate::dat_textual::DatTextual; +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_compare::{ErrCompare, FnCompare}; +use crate::dt_fn_convert::FnBase; +use crate::dt_impl::temporal::{ + decode_sortable_i64, encode_sortable_i64, parse_temporal_json_string, temporal_json_output, + timestamptz_precision, +}; +use crate::type_error::{TyEC, TyErr}; +use byteorder::ByteOrder; +use mudu::common::endian::Endian; +use mudu::data_type::timestamptz::TimestampTzValue; +use mudu::utils::json::{JsonValue, from_json_str}; +use mudu::utils::msg_pack::{MsgPackUtf8String, MsgPackValue}; +use std::cmp::Ordering; +use std::hash::Hasher; + +fn parse_timestamptz_str(value: &str, dt: &DatType) -> Result { + let value = TimestampTzValue::parse(value).map_err(|e| { + TyErr::new( + TyEC::TypeConvertFailed, + format!("invalid timestamp with time zone {}", e), + ) + })?; + value + .truncate_precision(timestamptz_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e)) +} + +fn fn_timestamptz_in_textual(v: &str, dt: &DatType) -> Result { + let json = from_json_str::(v) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e.to_string()))?; + fn_timestamptz_in_json(&json, dt) +} + +fn fn_timestamptz_out_textual(v: &DatValue, dt: &DatType) -> Result { + let json = fn_timestamptz_out_json(v, dt)?; + Ok(DatTextual::from(json.to_string())) +} + +fn fn_timestamptz_in_json(v: &JsonValue, dt: &DatType) -> Result { + Ok(DatValue::from_timestamptz(parse_timestamptz_str( + parse_temporal_json_string(v, "timestamptz")?.as_str(), + dt, + )?)) +} + +fn fn_timestamptz_out_json(v: &DatValue, dt: &DatType) -> Result { + temporal_json_output( + v.expect_timestamptz() + .format(timestamptz_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e))?, + ) +} + +fn fn_timestamptz_in_msgpack(msg_pack: &MsgPackValue, dt: &DatType) -> Result { + let Some(s) = msg_pack.as_str() else { + return Err(TyErr::new( + TyEC::TypeConvertFailed, + "cannot convert msg pack to timestamp with time zone".to_string(), + )); + }; + Ok(DatValue::from_timestamptz(parse_timestamptz_str(s, dt)?)) +} + +fn fn_timestamptz_out_msgpack(v: &DatValue, dt: &DatType) -> Result { + Ok(MsgPackValue::String(MsgPackUtf8String::from( + v.expect_timestamptz() + .format(timestamptz_precision(dt)) + .map_err(|e| TyErr::new(TyEC::TypeConvertFailed, e))?, + ))) +} + +fn fn_timestamptz_len(_: &DatType) -> Result, TyErr> { + Ok(Some(size_of::() as u32)) +} + +fn fn_timestamptz_dat_output_len(_: &DatValue, _: &DatType) -> Result { + Ok(size_of::() as u32) +} + +fn fn_timestamptz_send(v: &DatValue, _: &DatType) -> Result { + let mut buf = vec![0u8; size_of::()]; + Endian::write_u64( + &mut buf, + encode_sortable_i64(v.expect_timestamptz().epoch_micros_utc()), + ); + Ok(DatBinary::from(buf)) +} + +fn fn_timestamptz_send_to(v: &DatValue, _: &DatType, buf: &mut [u8]) -> Result { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + Endian::write_u64( + buf, + encode_sortable_i64(v.expect_timestamptz().epoch_micros_utc()), + ); + Ok(size_of::() as u32) +} + +fn fn_timestamptz_recv(buf: &[u8], _: &DatType) -> Result<(DatValue, u32), TyErr> { + if buf.len() < size_of::() { + return Err(TyErr::new( + TyEC::InsufficientSpace, + "insufficient space".to_string(), + )); + } + Ok(( + DatValue::from_timestamptz(TimestampTzValue::from_epoch_micros_utc( + decode_sortable_i64(Endian::read_u64(buf)), + )), + size_of::() as u32, + )) +} + +fn fn_timestamptz_default(_: &DatType) -> Result { + Ok(DatValue::from_timestamptz( + TimestampTzValue::from_epoch_micros_utc(0), + )) +} + +fn fn_timestamptz_order(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_timestamptz().cmp(v2.expect_timestamptz())) +} + +fn fn_timestamptz_equal(v1: &DatValue, v2: &DatValue) -> Result { + Ok(v1.expect_timestamptz() == v2.expect_timestamptz()) +} + +fn fn_timestamptz_hash(v: &DatValue, hasher: &mut dyn Hasher) -> Result<(), ErrCompare> { + hasher.write_i64(v.expect_timestamptz().epoch_micros_utc()); + Ok(()) +} + +pub const FN_TIMESTAMPTZ_COMPARE: FnCompare = FnCompare { + order: fn_timestamptz_order, + equal: fn_timestamptz_equal, + hash: fn_timestamptz_hash, +}; + +pub const FN_TIMESTAMPTZ_CONVERT: FnBase = FnBase { + input_textual: fn_timestamptz_in_textual, + output_textual: fn_timestamptz_out_textual, + input_json: fn_timestamptz_in_json, + output_json: fn_timestamptz_out_json, + input_msg_pack: fn_timestamptz_in_msgpack, + output_msg_pack: fn_timestamptz_out_msgpack, + type_len: fn_timestamptz_len, + data_len: fn_timestamptz_dat_output_len, + receive: fn_timestamptz_recv, + send: fn_timestamptz_send, + send_to: fn_timestamptz_send_to, + default: fn_timestamptz_default, +}; + +#[cfg(test)] +mod tests { + use super::{ + fn_timestamptz_default, fn_timestamptz_in_json, fn_timestamptz_in_msgpack, + fn_timestamptz_out_json, fn_timestamptz_out_msgpack, fn_timestamptz_recv, + fn_timestamptz_send, fn_timestamptz_send_to, + }; + use crate::dat_type::DatType; + use crate::dat_value::DatValue; + use crate::dtp_timestamptz::DTPTimestampTz; + use crate::type_error::{TyEC, TyErr}; + use mudu::data_type::timestamptz::TimestampTzValue; + use mudu::utils::json::JsonValue; + use mudu::utils::msg_pack::MsgPackValue; + + fn assert_ty_ec(err: TyErr, ec: TyEC) { + assert_eq!( + std::mem::discriminant(&err.ec()), + std::mem::discriminant(&ec) + ); + } + + #[test] + fn timestamptz_binary_roundtrip_normalizes_to_utc_instant() { + let ty = DatType::from_timestamptz(DTPTimestampTz::new(6)); + let value = DatValue::from_timestamptz( + TimestampTzValue::parse("2026-05-20T14:30:45.123456+08:00").unwrap(), + ); + let binary = fn_timestamptz_send(&value, &ty).unwrap(); + let (decoded, _) = fn_timestamptz_recv(binary.as_ref(), &ty).unwrap(); + assert_eq!( + decoded.expect_timestamptz().format(6).unwrap(), + "2026-05-20 06:30:45.123456+00:00" + ); + } + + #[test] + fn timestamptz_json_and_msgpack_io_respect_precision() { + let ty = DatType::from_timestamptz(DTPTimestampTz::new(3)); + let decoded = fn_timestamptz_in_json( + &JsonValue::String("2026-05-20T14:30:45.123456+08:00".to_string()), + &ty, + ) + .unwrap(); + assert_eq!( + decoded.expect_timestamptz().format(6).unwrap(), + "2026-05-20 06:30:45.123000+00:00" + ); + + let json = fn_timestamptz_out_json(&decoded, &ty).unwrap(); + assert_eq!( + json.as_json_value(), + &JsonValue::String("2026-05-20 06:30:45.123+00:00".to_string()) + ); + + let msgpack = fn_timestamptz_out_msgpack(&decoded, &ty).unwrap(); + assert_eq!(msgpack.as_str(), Some("2026-05-20 06:30:45.123+00:00")); + } + + #[test] + fn timestamptz_msgpack_non_string_and_short_buffers_are_rejected() { + let ty = DatType::from_timestamptz(DTPTimestampTz::new(6)); + let value = DatValue::from_timestamptz( + TimestampTzValue::parse("2026-05-20T14:30:45.123456+08:00").unwrap(), + ); + + let err = fn_timestamptz_in_msgpack(&MsgPackValue::from(7), &ty).unwrap_err(); + assert_ty_ec(err, TyEC::TypeConvertFailed); + + let err = fn_timestamptz_send_to(&value, &ty, &mut [0u8; 7]).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + + let err = fn_timestamptz_recv(&[0u8; 7], &ty).unwrap_err(); + assert_ty_ec(err, TyEC::InsufficientSpace); + } + + #[test] + fn timestamptz_default_is_unix_epoch_in_utc() { + let ty = DatType::from_timestamptz(DTPTimestampTz::new(6)); + let value = fn_timestamptz_default(&ty).unwrap(); + assert_eq!( + value.expect_timestamptz().format(6).unwrap(), + "1970-01-01 00:00:00.000000+00:00" + ); + } +} diff --git a/mudu_type/src/dt_impl/fn_timestamptz_arb.rs b/mudu_type/src/dt_impl/fn_timestamptz_arb.rs new file mode 100644 index 0000000..ed5ba05 --- /dev/null +++ b/mudu_type/src/dt_impl/fn_timestamptz_arb.rs @@ -0,0 +1,33 @@ +use crate::dat_type::DatType; +use crate::dat_value::DatValue; +use crate::dt_fn_arbitrary::FnArbitrary; +use crate::dtp_timestamptz::DTPTimestampTz; +use arbitrary::{Arbitrary, Unstructured}; +use mudu::data_type::timestamptz::TimestampTzValue; + +pub fn fn_timestamptz_arb_val(u: &mut Unstructured, _: &DatType) -> arbitrary::Result { + Ok(DatValue::from_timestamptz( + TimestampTzValue::from_epoch_micros_utc(i64::arbitrary(u)?), + )) +} + +pub fn fn_timestamptz_arb_printable( + u: &mut Unstructured, + dt: &DatType, +) -> arbitrary::Result { + Ok(TimestampTzValue::from_epoch_micros_utc(i64::arbitrary(u)?) + .format(dt.expect_timestamptz_param().precision()) + .unwrap()) +} + +pub fn fn_timestamptz_arb_dt_param(u: &mut Unstructured) -> arbitrary::Result { + Ok(DatType::from_timestamptz(DTPTimestampTz::new( + u.int_in_range(0..=6)?, + ))) +} + +pub const FN_TIMESTAMPTZ_ARBITRARY: FnArbitrary = FnArbitrary { + param: fn_timestamptz_arb_dt_param, + value_object: fn_timestamptz_arb_val, + value_print: fn_timestamptz_arb_printable, +}; diff --git a/mudu_type/src/dt_impl/fn_timestamptz_param.rs b/mudu_type/src/dt_impl/fn_timestamptz_param.rs new file mode 100644 index 0000000..5929d3e --- /dev/null +++ b/mudu_type/src/dt_impl/fn_timestamptz_param.rs @@ -0,0 +1,25 @@ +use crate::dat_type::DatType; +use crate::dt_fn_param::FnParam; +use crate::dt_impl::temporal::validate_timestamptz_param; +use crate::dtp_timestamptz::DTPTimestampTz; +use crate::type_error::{TyEC, TyErr}; + +pub fn fn_timestamptz_dt_param_in(params: &str) -> Result { + let param: DTPTimestampTz = serde_json::from_str(params).map_err(|e| { + TyErr::new( + TyEC::ParamParseError, + format!("parse timestamptz parameter error {}", e), + ) + })?; + validate_timestamptz_param(¶m)?; + Ok(DatType::from_timestamptz(param)) +} + +pub fn fn_timestamptz_dt_param_default() -> DatType { + DatType::from_timestamptz(DTPTimestampTz::default()) +} + +pub const FN_TIMESTAMPTZ_PARAM: FnParam = FnParam { + input: fn_timestamptz_dt_param_in, + default: Some(fn_timestamptz_dt_param_default), +}; diff --git a/mudu_type/src/dt_impl/lang/rust.rs b/mudu_type/src/dt_impl/lang/rust.rs index 00e73c2..8afb336 100644 --- a/mudu_type/src/dt_impl/lang/rust.rs +++ b/mudu_type/src/dt_impl/lang/rust.rs @@ -13,7 +13,7 @@ lazy_static! { (DatTypeID::F64, "f64"), (DatTypeID::String, "String"), (DatTypeID::Array, "Vec"), - (DatTypeID::Record, "Object"), + (DatTypeID::Record, "Record"), (DatTypeID::Binary, "Vec") ]; static ref _id2name: HashMap = diff --git a/mudu_type/src/dt_impl/mod.rs b/mudu_type/src/dt_impl/mod.rs index 1fdff3d..6e1556e 100644 --- a/mudu_type/src/dt_impl/mod.rs +++ b/mudu_type/src/dt_impl/mod.rs @@ -2,13 +2,22 @@ pub mod dat_table; pub mod dt_create; pub mod lang; +mod fn_date; mod fn_f32; mod fn_f64; mod fn_i128; mod fn_i32; mod fn_i64; +mod fn_numeric; +mod fn_numeric_param; mod fn_string; mod fn_string_param; +mod fn_time; +mod fn_time_param; +mod fn_timestamp; +mod fn_timestamp_param; +mod fn_timestamptz; +mod fn_timestamptz_param; mod fn_u128; mod fn_array; @@ -19,6 +28,8 @@ mod fn_binary; #[cfg(any(test, feature = "test"))] mod fn_binary_arb; #[cfg(any(test, feature = "test"))] +mod fn_date_arb; +#[cfg(any(test, feature = "test"))] mod fn_f32_arb; #[cfg(any(test, feature = "test"))] mod fn_f64_arb; @@ -28,6 +39,8 @@ mod fn_i128_arb; mod fn_i32_arb; #[cfg(any(test, feature = "test"))] mod fn_i64_arb; +#[cfg(any(test, feature = "test"))] +mod fn_numeric_arb; mod fn_object; #[cfg(any(test, feature = "test"))] mod fn_object_arb; @@ -35,6 +48,12 @@ mod fn_object_param; #[cfg(any(test, feature = "test"))] mod fn_string_arb; #[cfg(any(test, feature = "test"))] +mod fn_time_arb; +#[cfg(any(test, feature = "test"))] +mod fn_timestamp_arb; +#[cfg(any(test, feature = "test"))] +mod fn_timestamptz_arb; +#[cfg(any(test, feature = "test"))] mod fn_u128_arb; #[cfg(test)] @@ -51,3 +70,5 @@ mod compare_test; #[cfg(test)] mod error_test; + +mod temporal; diff --git a/mudu_type/src/dt_impl/param_test.rs b/mudu_type/src/dt_impl/param_test.rs index 2a8948a..d4c7fb1 100644 --- a/mudu_type/src/dt_impl/param_test.rs +++ b/mudu_type/src/dt_impl/param_test.rs @@ -1,6 +1,7 @@ use crate::dat_type::DatType; use crate::dat_type_id::DatTypeID; use crate::dt_impl::dt_create::{create_array_type, create_object_type, create_string_type}; +use crate::dtp_numeric::{DTPNumeric, NUMERIC_MAX_PRECISION, NUMERIC_MAX_SCALE}; use mudu::common::default_value::DT_CHAR_FIXED_LEN_DEFAULT; fn assert_param_input_roundtrip(id: DatTypeID, dt: DatType) { @@ -31,6 +32,24 @@ fn string_param_default_matches_registered_default() { assert_eq!(string_param.length(), DT_CHAR_FIXED_LEN_DEFAULT as u32); } +#[test] +fn numeric_param_input_parses_and_roundtrips() { + assert_param_input_roundtrip( + DatTypeID::Numeric, + DatType::from_numeric(DTPNumeric::new(18, 4)), + ); +} + +#[test] +fn numeric_param_default_matches_registered_default() { + let default = DatTypeID::Numeric.fn_param_default().unwrap()(); + assert_eq!(default.dat_type_id(), DatTypeID::Numeric); + + let numeric_param = default.expect_numeric_param(); + assert_eq!(numeric_param.precision(), NUMERIC_MAX_PRECISION); + assert_eq!(numeric_param.scale(), 0); +} + #[test] fn array_param_input_parses_nested_type() { let dt = create_array_type(create_string_type(Some(16))); @@ -58,9 +77,28 @@ fn param_input_rejects_invalid_json() { let string_err = (DatTypeID::String.opt_fn_param().as_ref().unwrap().input)("{"); assert!(string_err.is_err()); + let numeric_err = (DatTypeID::Numeric.opt_fn_param().as_ref().unwrap().input)("{"); + assert!(numeric_err.is_err()); + let array_err = (DatTypeID::Array.opt_fn_param().as_ref().unwrap().input)("{"); assert!(array_err.is_err()); let record_err = (DatTypeID::Record.opt_fn_param().as_ref().unwrap().input)("{"); assert!(record_err.is_err()); } + +#[test] +fn numeric_param_validation_rejects_out_of_range_values() { + assert!(DTPNumeric::new(0, 0).validate().is_err()); + assert!( + DTPNumeric::new(NUMERIC_MAX_PRECISION + 1, 0) + .validate() + .is_err() + ); + assert!( + DTPNumeric::new(NUMERIC_MAX_PRECISION, NUMERIC_MAX_SCALE + 1) + .validate() + .is_err() + ); + assert!(DTPNumeric::new(4, 5).validate().is_err()); +} diff --git a/mudu_type/src/dt_impl/temporal.rs b/mudu_type/src/dt_impl/temporal.rs new file mode 100644 index 0000000..0fe4bc0 --- /dev/null +++ b/mudu_type/src/dt_impl/temporal.rs @@ -0,0 +1,72 @@ +use crate::dat_json::DatJson; +use crate::dat_type::DatType; +use crate::dtp_time::DTPTime; +use crate::dtp_timestamp::DTPTimestamp; +use crate::dtp_timestamptz::DTPTimestampTz; +use crate::type_error::{TyEC, TyErr}; +use mudu::utils::json::JsonValue; + +pub fn parse_temporal_json_string(value: &JsonValue, name: &str) -> Result { + value.as_str().map(ToOwned::to_owned).ok_or_else(|| { + TyErr::new( + TyEC::TypeConvertFailed, + format!("cannot convert json {} to {}", value, name), + ) + }) +} + +pub fn temporal_json_output(text: String) -> Result { + Ok(DatJson::from(JsonValue::String(text))) +} + +pub fn encode_sortable_i32(value: i32) -> u32 { + (value as u32) ^ (1u32 << 31) +} + +pub fn decode_sortable_i32(value: u32) -> i32 { + (value ^ (1u32 << 31)) as i32 +} + +pub fn encode_sortable_i64(value: i64) -> u64 { + (value as u64) ^ (1u64 << 63) +} + +pub fn decode_sortable_i64(value: u64) -> i64 { + (value ^ (1u64 << 63)) as i64 +} + +pub fn time_precision(dt: &DatType) -> u8 { + dt.as_time_param() + .map(|param| param.precision()) + .unwrap_or(6) +} + +pub fn timestamp_precision(dt: &DatType) -> u8 { + dt.as_timestamp_param() + .map(|param| param.precision()) + .unwrap_or(6) +} + +pub fn timestamptz_precision(dt: &DatType) -> u8 { + dt.as_timestamptz_param() + .map(|param| param.precision()) + .unwrap_or(6) +} + +pub fn validate_time_param(param: &DTPTime) -> Result<(), TyErr> { + param + .validate() + .map_err(|message| TyErr::new(TyEC::ParamParseError, message)) +} + +pub fn validate_timestamp_param(param: &DTPTimestamp) -> Result<(), TyErr> { + param + .validate() + .map_err(|message| TyErr::new(TyEC::ParamParseError, message)) +} + +pub fn validate_timestamptz_param(param: &DTPTimestampTz) -> Result<(), TyErr> { + param + .validate() + .map_err(|message| TyErr::new(TyEC::ParamParseError, message)) +} diff --git a/mudu_type/src/dt_kind.rs b/mudu_type/src/dt_kind.rs index b152010..cf99673 100644 --- a/mudu_type/src/dt_kind.rs +++ b/mudu_type/src/dt_kind.rs @@ -1,5 +1,6 @@ pub enum DTKind { - Primitive, + Scalar, Array, - Object, + Record, + Binary, } diff --git a/mudu_type/src/dtp_kind.rs b/mudu_type/src/dtp_kind.rs index f1dadcf..3661c4d 100644 --- a/mudu_type/src/dtp_kind.rs +++ b/mudu_type/src/dtp_kind.rs @@ -1,8 +1,12 @@ use crate::dat_type_id::DatTypeID; use crate::dt_param::DTPDyn; use crate::dtp_array::DTPArray; +use crate::dtp_numeric::DTPNumeric; use crate::dtp_object::DTPRecord; use crate::dtp_string::DTPString; +use crate::dtp_time::DTPTime; +use crate::dtp_timestamp::DTPTimestamp; +use crate::dtp_timestamptz::DTPTimestampTz; use mudu::common::cmp_order::Order; use mudu::common::result::RS; use paste::paste; @@ -12,6 +16,10 @@ use std::cmp::Ordering; #[derive(Clone, Debug, Serialize, Deserialize)] pub enum DTPKind { String(Box), + Numeric(Box), + Time(Box), + Timestamp(Box), + TimestampTz(Box), Record(Box), Array(Box), } @@ -102,6 +110,10 @@ impl Order for DTPKind { impl_dtp_kind_methods! { (DTPString, String, string), + (DTPNumeric, Numeric, numeric), + (DTPTime, Time, time), + (DTPTimestamp, Timestamp, timestamp), + (DTPTimestampTz, TimestampTz, timestamptz), (DTPRecord, Record, object), (DTPArray, Array, array), } diff --git a/mudu_type/src/dtp_numeric.rs b/mudu_type/src/dtp_numeric.rs new file mode 100644 index 0000000..b90c171 --- /dev/null +++ b/mudu_type/src/dtp_numeric.rs @@ -0,0 +1,100 @@ +use crate::dat_type_id::DatTypeID; +use crate::dt_param::{DTPDyn, DTPStatic}; +use mudu::common::cmp_order::Order; +use mudu::common::result::RS; +use mudu::utils; +use serde::{Deserialize, Serialize}; +use std::cmp::Ordering; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DTPNumeric { + precision: u8, + scale: u8, +} + +pub const NUMERIC_MAX_PRECISION: u8 = 38; +pub const NUMERIC_MAX_SCALE: u8 = 38; + +impl Default for DTPNumeric { + fn default() -> Self { + Self { + precision: 38, + scale: 0, + } + } +} + +impl DTPNumeric { + pub fn new(precision: u8, scale: u8) -> Self { + Self { precision, scale } + } + + pub fn precision(&self) -> u8 { + self.precision + } + + pub fn scale(&self) -> u8 { + self.scale + } + + pub fn compare(&self, other: &Self) -> Ordering { + self.precision + .cmp(&other.precision) + .then(self.scale.cmp(&other.scale)) + } + + pub fn validate(&self) -> Result<(), String> { + if self.precision == 0 { + return Err("numeric precision must be greater than zero".to_string()); + } + if self.precision > NUMERIC_MAX_PRECISION { + return Err(format!( + "numeric precision must be less than or equal to {}", + NUMERIC_MAX_PRECISION + )); + } + if self.scale > NUMERIC_MAX_SCALE { + return Err(format!( + "numeric scale must be less than or equal to {}", + NUMERIC_MAX_SCALE + )); + } + if self.scale > self.precision { + return Err("numeric scale must be less than or equal to precision".to_string()); + } + Ok(()) + } +} + +impl Order for DTPNumeric { + fn cmp_ord(&self, other: &Self) -> RS { + Ok(self.compare(other)) + } +} + +impl DTPDyn for DTPNumeric { + fn clone_boxed(&self) -> Box { + Box::new(self.clone()) + } + + fn de_from_json(&mut self, json: &str) -> RS<()> { + let s: DTPNumeric = utils::json::from_json_str::(json)?; + *self = s; + Ok(()) + } + + fn se_to_json(&self) -> RS { + utils::json::to_json_str(&self) + } + + fn name(&self) -> String { + format!( + "{}({}, {})", + DatTypeID::Numeric.name(), + self.precision, + self.scale + ) + } +} + +impl DTPStatic for DTPNumeric {} diff --git a/mudu_type/src/dtp_time.rs b/mudu_type/src/dtp_time.rs new file mode 100644 index 0000000..e0486fd --- /dev/null +++ b/mudu_type/src/dtp_time.rs @@ -0,0 +1,68 @@ +use crate::dat_type_id::DatTypeID; +use crate::dt_param::{DTPDyn, DTPStatic}; +use mudu::common::cmp_order::Order; +use mudu::common::result::RS; +use mudu::utils; +use serde::{Deserialize, Serialize}; +use std::cmp::Ordering; + +pub const TEMPORAL_MAX_PRECISION: u8 = 6; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DTPTime { + precision: u8, +} + +impl Default for DTPTime { + fn default() -> Self { + Self { precision: 6 } + } +} + +impl DTPTime { + pub fn new(precision: u8) -> Self { + Self { precision } + } + + pub fn precision(&self) -> u8 { + self.precision + } + + pub fn validate(&self) -> Result<(), String> { + if self.precision > TEMPORAL_MAX_PRECISION { + return Err(format!( + "temporal precision must be less than or equal to {}", + TEMPORAL_MAX_PRECISION + )); + } + Ok(()) + } +} + +impl Order for DTPTime { + fn cmp_ord(&self, other: &Self) -> RS { + Ok(self.precision.cmp(&other.precision)) + } +} + +impl DTPDyn for DTPTime { + fn clone_boxed(&self) -> Box { + Box::new(self.clone()) + } + + fn de_from_json(&mut self, json: &str) -> RS<()> { + let s: DTPTime = utils::json::from_json_str::(json)?; + *self = s; + Ok(()) + } + + fn se_to_json(&self) -> RS { + utils::json::to_json_str(&self) + } + + fn name(&self) -> String { + format!("{}({})", DatTypeID::Time.name(), self.precision) + } +} + +impl DTPStatic for DTPTime {} diff --git a/mudu_type/src/dtp_timestamp.rs b/mudu_type/src/dtp_timestamp.rs new file mode 100644 index 0000000..6fc9397 --- /dev/null +++ b/mudu_type/src/dtp_timestamp.rs @@ -0,0 +1,67 @@ +use crate::dat_type_id::DatTypeID; +use crate::dt_param::{DTPDyn, DTPStatic}; +use crate::dtp_time::TEMPORAL_MAX_PRECISION; +use mudu::common::cmp_order::Order; +use mudu::common::result::RS; +use mudu::utils; +use serde::{Deserialize, Serialize}; +use std::cmp::Ordering; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DTPTimestamp { + precision: u8, +} + +impl Default for DTPTimestamp { + fn default() -> Self { + Self { precision: 6 } + } +} + +impl DTPTimestamp { + pub fn new(precision: u8) -> Self { + Self { precision } + } + + pub fn precision(&self) -> u8 { + self.precision + } + + pub fn validate(&self) -> Result<(), String> { + if self.precision > TEMPORAL_MAX_PRECISION { + return Err(format!( + "temporal precision must be less than or equal to {}", + TEMPORAL_MAX_PRECISION + )); + } + Ok(()) + } +} + +impl Order for DTPTimestamp { + fn cmp_ord(&self, other: &Self) -> RS { + Ok(self.precision.cmp(&other.precision)) + } +} + +impl DTPDyn for DTPTimestamp { + fn clone_boxed(&self) -> Box { + Box::new(self.clone()) + } + + fn de_from_json(&mut self, json: &str) -> RS<()> { + let s: DTPTimestamp = utils::json::from_json_str::(json)?; + *self = s; + Ok(()) + } + + fn se_to_json(&self) -> RS { + utils::json::to_json_str(&self) + } + + fn name(&self) -> String { + format!("{}({})", DatTypeID::Timestamp.name(), self.precision) + } +} + +impl DTPStatic for DTPTimestamp {} diff --git a/mudu_type/src/dtp_timestamptz.rs b/mudu_type/src/dtp_timestamptz.rs new file mode 100644 index 0000000..2102a88 --- /dev/null +++ b/mudu_type/src/dtp_timestamptz.rs @@ -0,0 +1,67 @@ +use crate::dat_type_id::DatTypeID; +use crate::dt_param::{DTPDyn, DTPStatic}; +use crate::dtp_time::TEMPORAL_MAX_PRECISION; +use mudu::common::cmp_order::Order; +use mudu::common::result::RS; +use mudu::utils; +use serde::{Deserialize, Serialize}; +use std::cmp::Ordering; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DTPTimestampTz { + precision: u8, +} + +impl Default for DTPTimestampTz { + fn default() -> Self { + Self { precision: 6 } + } +} + +impl DTPTimestampTz { + pub fn new(precision: u8) -> Self { + Self { precision } + } + + pub fn precision(&self) -> u8 { + self.precision + } + + pub fn validate(&self) -> Result<(), String> { + if self.precision > TEMPORAL_MAX_PRECISION { + return Err(format!( + "temporal precision must be less than or equal to {}", + TEMPORAL_MAX_PRECISION + )); + } + Ok(()) + } +} + +impl Order for DTPTimestampTz { + fn cmp_ord(&self, other: &Self) -> RS { + Ok(self.precision.cmp(&other.precision)) + } +} + +impl DTPDyn for DTPTimestampTz { + fn clone_boxed(&self) -> Box { + Box::new(self.clone()) + } + + fn de_from_json(&mut self, json: &str) -> RS<()> { + let s: DTPTimestampTz = utils::json::from_json_str::(json)?; + *self = s; + Ok(()) + } + + fn se_to_json(&self) -> RS { + utils::json::to_json_str(&self) + } + + fn name(&self) -> String { + format!("{}({})", DatTypeID::TimestampTz.name(), self.precision) + } +} + +impl DTPStatic for DTPTimestampTz {} diff --git a/mudu_type/src/lib.rs b/mudu_type/src/lib.rs index 299a539..58800a4 100644 --- a/mudu_type/src/lib.rs +++ b/mudu_type/src/lib.rs @@ -1,7 +1,6 @@ #![feature(box_into_inner)] pub mod array; pub mod dat_binary; -pub mod dat_prim; pub mod dat_textual; pub mod dat_type; pub mod dat_type_id; @@ -27,9 +26,14 @@ pub mod dt_function; pub mod dt_of_datum; pub mod dtp_array; pub mod dtp_kind; +pub mod dtp_numeric; pub mod dtp_object; pub mod dtp_string; +pub mod dtp_time; +pub mod dtp_timestamp; +pub mod dtp_timestamptz; pub mod record; +pub mod scalar_type; pub mod string; pub mod type_error; //pub mod universal; diff --git a/mudu_type/src/dat_prim.rs b/mudu_type/src/scalar_type.rs similarity index 76% rename from mudu_type/src/dat_prim.rs rename to mudu_type/src/scalar_type.rs index 068992c..4d0aa2a 100644 --- a/mudu_type/src/dat_prim.rs +++ b/mudu_type/src/scalar_type.rs @@ -4,14 +4,14 @@ use crate::dt_info::DTInfo; use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[derive(Clone, Debug)] -pub struct DatPrim { +pub struct ScalarType { dat_type: DatType, } -impl DatPrim { +impl ScalarType { pub fn new_without_param(id: DatTypeID) -> Self { - if !id.is_primitive_type() { - panic!("DatPrim id must be primitive type, but got {}", id.name()); + if !id.is_scalar_type() { + panic!("ScalarType id must be scalar type, but got {}", id.name()); } Self { dat_type: DatType::new_no_param(id), @@ -19,16 +19,16 @@ impl DatPrim { } pub fn new_default(id: DatTypeID) -> Self { - if !id.is_primitive_type() { - panic!("DatPrim id must be primitive type, but got {}", id.name()); + if !id.is_scalar_type() { + panic!("ScalarType id must be scalar type, but got {}", id.name()); } Self::new(DatType::default_for(id)) } pub fn new(type_obj: DatType) -> Self { - if !type_obj.dat_type_id().is_primitive_type() { + if !type_obj.dat_type_id().is_scalar_type() { panic!( - "DatPrim id must be primitive type, but got {}", + "ScalarType id must be scalar type, but got {}", type_obj.dat_type_id().name() ); } @@ -52,7 +52,7 @@ impl DatPrim { } } -impl<'de> Deserialize<'de> for DatPrim { +impl<'de> Deserialize<'de> for ScalarType { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, @@ -62,7 +62,7 @@ impl<'de> Deserialize<'de> for DatPrim { } } -impl Serialize for DatPrim { +impl Serialize for ScalarType { fn serialize(&self, serializer: S) -> Result where S: Serializer, diff --git a/mudu_utils/Cargo.toml b/mudu_utils/Cargo.toml index 06aff7b..a7da9bf 100644 --- a/mudu_utils/Cargo.toml +++ b/mudu_utils/Cargo.toml @@ -17,7 +17,6 @@ http-body-util = "0.1.3" lazy_static = { workspace = true } mudu = { workspace = true } mudu_sys = { workspace = true } -tokio = { workspace = true } scc = { workspace = true } uuid = { workspace = true } async-backtrace = { workspace = true } diff --git a/mudu_utils/src/debug.rs b/mudu_utils/src/debug.rs index 7bf5264..5194d34 100644 --- a/mudu_utils/src/debug.rs +++ b/mudu_utils/src/debug.rs @@ -28,7 +28,7 @@ use scc::{HashIndex, HashSet}; use crate::dump_task_trace; use crate::notifier::NotifyWait; #[cfg(feature = "debug_trace")] -use crate::task::spawn_local_task; +use crate::task_async::CurrentThreadTaskRuntime; use mudu::common::result::RS; #[cfg(feature = "debug_trace")] use mudu::error::ec::EC; @@ -36,9 +36,9 @@ use mudu::error::err::MError; #[cfg(feature = "debug_trace")] use mudu::m_error; #[cfg(feature = "debug_trace")] -use tokio::net::TcpListener; +use mudu_sys::tokio::net::TcpListener; #[cfg(feature = "debug_trace")] -use tokio::task::LocalSet; +use mudu_sys::tokio::task::JoinSet; #[cfg(feature = "debug_trace")] use tracing::error; @@ -93,7 +93,8 @@ async fn handle_request(req: Request) -> Result>, } #[cfg(feature = "debug_trace")] -pub async fn async_debug_serve(addr: SocketAddr) -> Result<(), MError> { +pub async fn async_debug_serve_until(addr: SocketAddr, stop: NotifyWait) -> Result<(), MError> { + crate::scoped_task_trace!(); let port = addr.port(); let r = SERVER.insert_sync(port); if r.is_err() { @@ -101,30 +102,35 @@ pub async fn async_debug_serve(addr: SocketAddr) -> Result<(), MError> { } // Bind to the port and listen for incoming TCP connections - let listener = TcpListener::bind(addr) - .await - .map_err(|e| m_error!(EC::IOErr, "bind to address error", e))?; + let listener = match TcpListener::bind(addr).await { + Ok(listener) => listener, + Err(e) => { + let _ = SERVER.remove_sync(&port); + return Err(m_error!(EC::IOErr, "bind to address error", e)); + } + }; + let mut tasks = JoinSet::new(); loop { - // When an incoming TCP connection is received grab a TCP stream for - // client<->server communication. - // - // Note, this is a .await point, this loop will loop forever but is not a busy loop. The - // .await point allows the Tokio runtime to pull the task off of the thread until the task - // has work to do. In this case, a connection arrives on the port we are listening on and - // the task is woken up, at which point the task is then put back on a thread, and is - // driven forward by the runtime, eventually yielding a TCP stream. - let (tcp, _) = listener - .accept() - .await - .map_err(|e| m_error!(EC::IOErr, "accept error", e))?; + let accepted = mudu_sys::tokio::select! { + _ = stop.notified() => { + break; + } + accepted = listener.accept() => accepted + }; + let (tcp, _) = match accepted { + Ok(accepted) => accepted, + Err(e) => { + tasks.abort_all(); + while tasks.join_next().await.is_some() {} + let _ = SERVER.remove_sync(&port); + return Err(m_error!(EC::IOErr, "accept error", e)); + } + }; // Use an adapter to access something implementing `tokio::io` traits as if they implement // `hyper::rt` IO traits. let io = TokioIo::new(tcp); - // Spin up a new task in Tokio so we can continue to listen for new TCP connection on the - // current task without waiting for the processing of the HTTP1 connection we just received - // to finish - tokio::task::spawn(async move { + tasks.spawn(async move { // Handle the connection from the client using HTTP1 and pass any // HTTP requests received on that connection to the `hello` function if let Err(err) = http1::Builder::new() @@ -135,6 +141,21 @@ pub async fn async_debug_serve(addr: SocketAddr) -> Result<(), MError> { } }); } + + tasks.abort_all(); + while tasks.join_next().await.is_some() {} + let _ = SERVER.remove_sync(&port); + Ok(()) +} + +#[cfg(feature = "debug_trace")] +pub async fn async_debug_serve(addr: SocketAddr) -> Result<(), MError> { + async_debug_serve_until(addr, NotifyWait::new()).await +} + +#[cfg(not(feature = "debug_trace"))] +pub async fn async_debug_serve_until(_addr: SocketAddr, _stop: NotifyWait) -> Result<(), MError> { + Ok(()) } #[cfg(not(feature = "debug_trace"))] @@ -144,17 +165,14 @@ pub async fn async_debug_serve(_addr: SocketAddr) -> Result<(), MError> { #[cfg(feature = "debug_trace")] pub fn debug_serve(canceler: NotifyWait, port: u16) { - let async_debug_serve = async_debug_serve(([0, 0, 0, 0], port).into()); - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() + let async_debug_serve = async_debug_serve_until(([0, 0, 0, 0], port).into(), canceler.clone()); + let runtime = CurrentThreadTaskRuntime::new().unwrap(); + let join = runtime + .local() + .spawn(canceler, "debug_server", async_debug_serve) .unwrap(); - let ls = LocalSet::new(); runtime.block_on(async { - ls.spawn_local(async move { - let _ = spawn_local_task(canceler, "debug_server", async_debug_serve); - }); - ls.await; + let _ = join.await; }); } diff --git a/mudu_utils/src/init_log.rs b/mudu_utils/src/init_log.rs index 1c1a67d..0639455 100644 --- a/mudu_utils/src/init_log.rs +++ b/mudu_utils/src/init_log.rs @@ -75,12 +75,23 @@ fn _setup_with_console(level: &str, parse: &str, enable_console_layer: bool) { if !parse.is_empty() { let env_filter = EnvFilter::builder() .with_default_directive(level_filter.into()) - .parse(parse) - .unwrap(); - if enable_console_layer { - init_level_env_console(level_filter, env_filter); + .parse(parse); + if let Ok(env_filter) = env_filter { + if enable_console_layer { + init_level_env_console(level_filter, env_filter); + } else { + init_level_env(level_filter, env_filter); + } } else { - init_level_env(level_filter, env_filter); + eprintln!( + "invalid tracing filter '{}', fallback to level-only logging at {}", + parse, level + ); + if enable_console_layer { + init_level_console(level_filter) + } else { + init_level(level_filter) + } } } else { if enable_console_layer { diff --git a/mudu_utils/src/lib.rs b/mudu_utils/src/lib.rs index f41b92c..63276cf 100644 --- a/mudu_utils/src/lib.rs +++ b/mudu_utils/src/lib.rs @@ -4,9 +4,13 @@ pub mod log; pub mod md5; pub mod notifier; pub mod sync; +#[deprecated(note = "use mudu_utils::task_async or mudu_utils::task_sync instead")] pub mod task; +pub mod task_async; pub mod task_context; pub mod task_id; +mod task_macros; +pub mod task_sync; pub mod task_trace; mod test_debug_server; pub mod thread_trace; diff --git a/mudu_utils/src/notifier.rs b/mudu_utils/src/notifier.rs index 17be01b..359fcbe 100644 --- a/mudu_utils/src/notifier.rs +++ b/mudu_utils/src/notifier.rs @@ -1,2 +1,6 @@ +//! Async task-notification facade. +//! +//! This module intentionally remains separate from `task_sync`/`task_async` +//! because it only exposes async cancellation/notification primitives. #[cfg(not(target_arch = "wasm32"))] -pub use mudu_sys::sync::{Notifier, NotifyWait, Waiter, notify_wait}; +pub use mudu_sys::sync_async::{Notifier, NotifyWait, Waiter, notify_wait}; diff --git a/mudu_utils/src/sync/a_mutex.rs b/mudu_utils/src/sync/a_mutex.rs index 53685d4..d784b55 100644 --- a/mudu_utils/src/sync/a_mutex.rs +++ b/mudu_utils/src/sync/a_mutex.rs @@ -1,199 +1 @@ -use std::fmt; -use std::ops::{Deref, DerefMut}; - -use tokio::sync::{ - MappedMutexGuard as TokioMappedMutexGuard, Mutex as TokioMutex, MutexGuard as TokioMutexGuard, -}; - -pub struct AMutex { - inner: TokioMutex, -} - -pub struct AMutexGuard<'a, T: ?Sized> { - inner: TokioMutexGuard<'a, T>, -} - -pub struct MappedAMutexGuard<'a, T: ?Sized> { - inner: TokioMappedMutexGuard<'a, T>, -} - -// As long as T: Send, it's fine to send and share Mutex between threads. -// If T was not Send, sending and sharing a Mutex would be bad, since you can -// access T through Mutex. -unsafe impl Send for AMutex where T: ?Sized + Send {} -unsafe impl Sync for AMutex where T: ?Sized + Send {} -unsafe impl Sync for AMutexGuard<'_, T> where T: ?Sized + Send + Sync {} - -unsafe impl<'a, T> Sync for MappedAMutexGuard<'a, T> where T: ?Sized + Sync + 'a {} -unsafe impl<'a, T> Send for MappedAMutexGuard<'a, T> where T: ?Sized + Send + 'a {} - -#[derive(Debug)] -pub struct TryLockError(pub ()); - -impl fmt::Display for TryLockError { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(fmt, "operation would block") - } -} - -impl AMutex { - pub fn new(t: T) -> Self - where - T: Sized, - { - Self { - inner: TokioMutex::new(t), - } - } - - pub const fn const_new(t: T) -> Self - where - T: Sized, - { - Self { - inner: TokioMutex::const_new(t), - } - } - - pub async fn lock(&self) -> AMutexGuard<'_, T> { - let inner = self.inner.lock().await; - AMutexGuard { inner } - } - - pub fn try_lock(&self) -> Option> { - let r = self.inner.try_lock(); - match r { - Ok(g) => Some(AMutexGuard { inner: g }), - Err(_e) => None, - } - } - - pub fn into_inner(self) -> T - where - T: Sized, - { - self.inner.into_inner() - } -} - -impl From for AMutex { - fn from(s: T) -> Self { - Self::new(s) - } -} - -impl Default for AMutex -where - T: Default, -{ - fn default() -> Self { - Self::new(T::default()) - } -} - -impl std::fmt::Debug for AMutex -where - T: std::fmt::Debug, -{ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.inner.fmt(f) - } -} - -impl<'a, T: ?Sized> AMutexGuard<'a, T> { - #[inline] - pub fn map(this: Self, f: F) -> MappedAMutexGuard<'a, U> - where - U: ?Sized, - F: FnOnce(&mut T) -> &mut U, - { - let inner = TokioMutexGuard::map(this.inner, f); - MappedAMutexGuard { inner } - } - - #[inline] - pub fn try_map(this: Self, f: F) -> Result, Self> - where - U: ?Sized, - F: FnOnce(&mut T) -> Option<&mut U>, - { - let r = TokioMutexGuard::try_map(this.inner, f); - match r { - Ok(r) => Ok(MappedAMutexGuard { inner: r }), - Err(e) => Err(AMutexGuard { inner: e }), - } - } -} - -impl Deref for AMutexGuard<'_, T> { - type Target = T; - fn deref(&self) -> &Self::Target { - self.inner.deref() - } -} - -impl DerefMut for AMutexGuard<'_, T> { - fn deref_mut(&mut self) -> &mut Self::Target { - self.inner.deref_mut() - } -} - -impl fmt::Debug for AMutexGuard<'_, T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.inner.fmt(f) - } -} - -impl fmt::Display for AMutexGuard<'_, T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.inner.fmt(f) - } -} - -impl<'a, T: ?Sized> MappedAMutexGuard<'a, T> { - #[inline] - pub fn map(this: Self, f: F) -> MappedAMutexGuard<'a, U> - where - F: FnOnce(&mut T) -> &mut U, - { - let inner = TokioMappedMutexGuard::map(this.inner, f); - MappedAMutexGuard { inner } - } - - #[inline] - pub fn try_map(this: Self, f: F) -> Result, Self> - where - F: FnOnce(&mut T) -> Option<&mut U>, - { - let r = TokioMappedMutexGuard::try_map(this.inner, f); - match r { - Ok(r) => Ok(MappedAMutexGuard { inner: r }), - Err(e) => Err(MappedAMutexGuard { inner: e }), - } - } -} - -impl Deref for MappedAMutexGuard<'_, T> { - type Target = T; - fn deref(&self) -> &Self::Target { - self.inner.deref() - } -} - -impl DerefMut for MappedAMutexGuard<'_, T> { - fn deref_mut(&mut self) -> &mut Self::Target { - self.inner.deref_mut() - } -} - -impl fmt::Debug for MappedAMutexGuard<'_, T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.inner.fmt(f) - } -} - -impl fmt::Display for MappedAMutexGuard<'_, T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.inner.fmt(f) - } -} +pub use mudu_sys::sync::a_mutex::*; diff --git a/mudu_utils/src/sync/a_notify.rs b/mudu_utils/src/sync/a_notify.rs new file mode 100644 index 0000000..d28ef4f --- /dev/null +++ b/mudu_utils/src/sync/a_notify.rs @@ -0,0 +1 @@ +pub use mudu_sys::sync::a_notify::*; diff --git a/mudu_utils/src/sync/a_rwlock.rs b/mudu_utils/src/sync/a_rwlock.rs new file mode 100644 index 0000000..bfca8af --- /dev/null +++ b/mudu_utils/src/sync/a_rwlock.rs @@ -0,0 +1 @@ +pub use mudu_sys::sync::a_rwlock::*; diff --git a/mudu_utils/src/sync/a_task.rs b/mudu_utils/src/sync/a_task.rs index 7d1b75e..5e91fa2 100644 --- a/mudu_utils/src/sync/a_task.rs +++ b/mudu_utils/src/sync/a_task.rs @@ -1,6 +1,6 @@ use crate::notifier::NotifyWait; use crate::sync::unique_inner::UniqueInner; -use crate::task::spawn_local_task; +use crate::task_async::spawn_local_task; use async_trait::async_trait; use mudu::common::result::RS; use std::sync::Arc; diff --git a/mudu_utils/src/sync/async_task.rs b/mudu_utils/src/sync/async_task.rs index 38040c6..5c9592e 100644 --- a/mudu_utils/src/sync/async_task.rs +++ b/mudu_utils/src/sync/async_task.rs @@ -1,12 +1,12 @@ use crate::notifier::{NotifyWait, Waiter}; use crate::sync::unique_inner::UniqueInner; -use crate::task::{spawn_local_task, spawn_task}; +use crate::task_async::{LocalTaskSet, spawn_task}; use futures::future::try_join_all; use mudu::common::result::RS; use mudu::error::ec::EC; use mudu::m_error; +use mudu_sys::tokio::task::JoinHandle; use std::any::Any; -use tokio::task::{JoinHandle, LocalSet}; pub trait Task: Any {} pub trait AsyncTask: Task + Send + Sync { @@ -27,7 +27,7 @@ pub trait AsyncLocalTask: Task { } trait AsyncWrapper { - fn async_run(&self) -> RS<(Option, JoinHandle>>)>; + fn async_run(&self) -> RS<(Option, JoinHandle>>)>; fn name(&self) -> Option; } @@ -42,7 +42,7 @@ impl AsyncTaskWrapper { } } - fn task_async_run(&self) -> RS<(Option, JoinHandle>>)> { + fn task_async_run(&self) -> RS<(Option, JoinHandle>>)> { let t = self.inner.inner_into(); let join = spawn_task(t.notifier(), t.name().as_str(), async move { t.async_run().await @@ -56,25 +56,21 @@ impl AsyncTaskWrapper { } struct AsyncLocalTaskWrapper { - inner: UniqueInner<(LocalSet, T)>, + inner: UniqueInner<(LocalTaskSet, T)>, } impl AsyncLocalTaskWrapper { - fn new(ls: LocalSet, inner: T) -> Self { + fn new(ls: LocalTaskSet, inner: T) -> Self { Self { inner: UniqueInner::new((ls, inner)), } } - fn task_async_run(&self) -> RS<(Option, JoinHandle>>)> { + fn task_async_run(&self) -> RS<(Option, JoinHandle>>)> { let (ls, t) = self.inner.inner_into(); - let join = ls.spawn_local(async move { - let join = spawn_local_task(t.waiter().into(), t.name().as_str(), async move { - t.async_run_local().await - }); - let opt = join.unwrap().await.unwrap(); - opt - }); + let join = ls.spawn(t.waiter().into(), t.name().as_str(), async move { + t.async_run_local().await + })?; Ok((Some(ls), join)) } @@ -84,7 +80,7 @@ impl AsyncLocalTaskWrapper { } impl AsyncWrapper for AsyncLocalTaskWrapper { - fn async_run(&self) -> RS<(Option, JoinHandle>>)> { + fn async_run(&self) -> RS<(Option, JoinHandle>>)> { self.task_async_run() } @@ -94,7 +90,7 @@ impl AsyncWrapper for AsyncLocalTaskWrapper { } impl AsyncWrapper for AsyncTaskWrapper { - fn async_run(&self) -> RS<(Option, JoinHandle>>)> { + fn async_run(&self) -> RS<(Option, JoinHandle>>)> { self.task_async_run() } @@ -107,7 +103,7 @@ pub struct TaskWrapper { } pub struct AsyncResult { - opt_local: Option, + opt_local: Option, join_handle: JoinHandle>>, } @@ -118,7 +114,7 @@ impl TaskWrapper { } } - pub fn new_async_local(ls: LocalSet, t: T) -> Self { + pub fn new_async_local(ls: LocalTaskSet, t: T) -> Self { Self { inner: Box::new(AsyncLocalTaskWrapper::new(ls, t)), } diff --git a/mudu_utils/src/sync/f_mutex.rs b/mudu_utils/src/sync/f_mutex.rs new file mode 100644 index 0000000..47f62cd --- /dev/null +++ b/mudu_utils/src/sync/f_mutex.rs @@ -0,0 +1 @@ +pub use mudu_sys::sync::f_mutex::*; diff --git a/mudu_utils/src/sync/mod.rs b/mudu_utils/src/sync/mod.rs index 7aaa623..20047ed 100644 --- a/mudu_utils/src/sync/mod.rs +++ b/mudu_utils/src/sync/mod.rs @@ -1,6 +1,9 @@ pub mod a_mutex; +pub mod a_notify; +pub mod a_rwlock; pub mod a_task; pub mod async_task; +pub mod f_mutex; pub mod notify_wait; pub mod s_mutex; pub mod s_task; diff --git a/mudu_utils/src/sync/notify_wait.rs b/mudu_utils/src/sync/notify_wait.rs index 1c689ec..a01d959 100644 --- a/mudu_utils/src/sync/notify_wait.rs +++ b/mudu_utils/src/sync/notify_wait.rs @@ -1,123 +1,22 @@ -use crate::sync::a_mutex::AMutex; -use crate::sync::s_mutex::SMutex; -use mudu::common::result::RS; -use std::sync::Arc; -use tokio::sync::oneshot::{Receiver, Sender, channel}; - -pub fn create_notify_wait() -> (Notify, Wait) { - let (s, r) = channel(); - (Notify::::new(s), Wait::::new(r)) -} - -#[derive(Clone)] -pub struct Notify { - inner: Arc>>, -} - -#[derive(Clone)] -pub struct Wait { - inner: Arc>>, -} - -struct _LockNotify { - notify: Option>, -} - -struct _LockWait { - wait: Option>, - result: Option, -} - -impl Notify { - fn new(sender: Sender) -> Self { - Self { - inner: Arc::new(SMutex::new(_LockNotify::new(sender))), - } - } - - pub fn notify(&self, t: T) -> RS { - let mut g = self.inner.lock()?; - g.notify(t) - } -} - -impl Wait { - fn new(receiver: Receiver) -> Self { - Self { - inner: Arc::new(AMutex::new(_LockWait::new(receiver))), - } - } - - pub async fn wait(&self) -> RS> { - let mut guard = self.inner.lock().await; - guard.wait().await - } -} - -impl _LockWait { - fn new(ch: Receiver) -> _LockWait { - Self { - wait: Some(ch), - result: None, - } - } - - async fn wait(&mut self) -> RS> { - let mut opt_wait = None; - std::mem::swap(&mut opt_wait, &mut self.wait); - match opt_wait { - Some(recv) => { - // receive failed is ok - // for the sender can be dropped - let r = recv.await; - match r { - Ok(lock_r) => Ok(Some(lock_r)), - Err(_) => Ok(None), - } - } - None => match &self.result { - Some(result) => Ok(Some(result.clone())), - None => Ok(None), - }, - } - } -} - -impl _LockNotify { - fn new(sender: Sender) -> Self { - Self { - notify: Some(sender), - } - } - fn notify(&mut self, r: T) -> RS { - let mut opt_inner = None; - std::mem::swap(&mut opt_inner, &mut self.notify); - match opt_inner { - Some(inner) => { - // send failed is ok - // for the receiver can be dropped - let r = inner.send(r); - Ok(r.is_ok()) - } - None => Ok(false), - } - } -} +pub use mudu_sys::sync::notify_wait::*; #[cfg(test)] mod tests { use super::create_notify_wait; - #[tokio::test] - async fn notify_wait_delivers_value_once() { - let (notify, wait) = create_notify_wait::(); - assert!(notify.notify(7).unwrap()); - assert_eq!(wait.wait().await.unwrap(), Some(7)); - assert_eq!(wait.wait().await.unwrap(), None); + #[test] + fn notify_wait_delivers_value_once() { + let runtime = mudu_sys::task_async::build_current_thread_runtime().unwrap(); + runtime.block_on(async { + let (notify, wait) = create_notify_wait::(); + assert!(notify.notify(7).unwrap()); + assert_eq!(wait.wait().await.unwrap(), Some(7)); + assert_eq!(wait.wait().await.unwrap(), Some(7)); + }); } - #[tokio::test] - async fn notify_returns_false_after_receiver_is_dropped() { + #[test] + fn notify_returns_false_after_receiver_is_dropped() { let (notify, wait) = create_notify_wait::(); drop(wait); assert!(!notify.notify(9).unwrap()); diff --git a/mudu_utils/src/task.rs b/mudu_utils/src/task.rs index 381c70e..c95664f 100644 --- a/mudu_utils/src/task.rs +++ b/mudu_utils/src/task.rs @@ -1,238 +1,6 @@ -use std::future::Future; - -use std::cell::Cell; -use std::time::Duration; - -use crate::notifier::NotifyWait; -use crate::task_context::TaskContext; -use crate::task_id; -use crate::task_id::TaskID; -use mudu::common::result::RS; -use tokio::task::JoinHandle; -use tokio::time::sleep; -use tokio::{select, task, task_local}; -use tracing::trace; - -task_local! { - static TASK_ID: TaskID; -} - -thread_local! { - static CURRENT_POLL_TASK_ID: Cell> = const { Cell::new(None) }; -} - -pub struct PollTaskIdGuard { - prev: Option, -} - -impl PollTaskIdGuard { - pub fn enter(id: TaskID) -> Self { - let prev = CURRENT_POLL_TASK_ID.with(|slot| { - let prev = slot.get(); - slot.set(Some(id)); - prev - }); - Self { prev } - } -} - -impl Drop for PollTaskIdGuard { - fn drop(&mut self) { - CURRENT_POLL_TASK_ID.with(|slot| { - slot.set(self.prev); - }); - } -} - -/// The task must create by `task::spawn_local_task`, or `task::spawn_task` to set `TASK_ID` value. -/// if not, the `LocalKey::get` would raise such panic, -/// "cannot access a task-local storage value without setting it first" -pub fn this_task_id() -> TaskID { - try_this_task_id() - .expect("cannot access task id: neither tokio task-local nor poll-task TLS is set") -} - -pub fn try_this_task_id() -> Option { - TASK_ID - .try_with(|id| *id) - .ok() - .or_else(current_poll_task_id) -} - -pub fn current_poll_task_id() -> Option { - CURRENT_POLL_TASK_ID.with(|slot| slot.get()) -} - -#[macro_export] -macro_rules! task_trace { - () => {{ - #[cfg(feature = "debug_trace")] - { - let s = async_backtrace::location!(); - $crate::task_trace::TaskTrace::new(s) - } - #[cfg(not(feature = "debug_trace"))] - { - $crate::task_trace::NoopTaskTrace::new() - } - }}; -} - -#[macro_export] -macro_rules! dump_task_trace { - () => {{ - #[cfg(feature = "debug_trace")] - { - $crate::task_trace::TaskTrace::dump_task_trace() - } - #[cfg(not(feature = "debug_trace"))] - { - String::new() - } - }}; -} - -#[macro_export] -macro_rules! task_backtrace { - () => {{ - #[cfg(feature = "debug_trace")] - { - $crate::task_trace::TaskTrace::backtrace() - } - #[cfg(not(feature = "debug_trace"))] - { - String::new() - } - }}; -} - -#[macro_export] -macro_rules! this_task_id { - () => {{ $crate::task_trace::this_task_id() }}; -} - -pub fn spawn_local_task( - cancel_notifier: NotifyWait, - _name: &str, - future: F, -) -> RS>> -where - F: Future + 'static, - F::Output: 'static, -{ - let id = task_id::new_task_id(); - let _ = TaskContext::new_context(id, _name.to_string(), false); - Ok(task::spawn_local(TASK_ID.scope(id, async move { - let r = __select_local_till_done(cancel_notifier, future).await; - TaskContext::remove_context(id); - r - }))) -} - -pub fn spawn_task( - cancel_notifier: NotifyWait, - _name: &str, - future: F, -) -> RS>> -where - F: Future + Send + 'static, - F::Output: Send + 'static, -{ - let id = task_id::new_task_id(); - let _ = TaskContext::new_context(id, _name.to_string(), false); - Ok(task::spawn(TASK_ID.scope(id, async move { - let r = __select_till_done(cancel_notifier, future).await; - TaskContext::remove_context(id); - r - }))) -} - -pub fn spawn_local_task_timeout( - cancel_notifier: NotifyWait, - duration: Duration, - _name: &str, - future: F, -) -> RS>> -where - F: Future + Send + 'static, - F::Output: Send + 'static, -{ - Ok(task::spawn_local(async move { - __select_local_till_done_or_timeout(cancel_notifier, duration, future).await - })) -} - -async fn __select_local_till_done(notify: NotifyWait, future: F) -> Option -where - F: Future + 'static, - F::Output: 'static, -{ - let future = async move { - let r = select! { - _ = notify.notified() => { - trace ! ("local task stop"); - None - } - r = future => { - trace ! ("local task end"); - Some(r) - } - }; - r - }; - future.await -} - -pub enum TaskFailed { - Cancel, - Timeout, -} - -async fn __select_local_till_done_or_timeout( - notify: NotifyWait, - duration: Duration, - future: F, -) -> Result -where - F: Future + 'static, - F::Output: 'static, -{ - let future = async move { - let r = select! { - _ = notify.notified() => { - trace ! ("local task stop"); - Err(TaskFailed::Cancel) - } - r = future => { - trace ! ("local task end"); - Ok(r) - } - _ = sleep(duration) => { - Err(TaskFailed::Timeout) - } - }; - r - }; - future.await -} - -async fn __select_till_done(notify: NotifyWait, future: F) -> Option -where - F: Future + 'static, - F::Output: Send + 'static, -{ - let future = async move { - let r = select! { - _ = notify.notified() => { - trace ! ("task stop"); - None - } - r = future => { - trace ! ("task end"); - Some(r) - } - }; - r - }; - future.await -} +//! Compatibility facade for task helpers. +//! +//! New code should import runtime/task functions from [`crate::task_async`] or +//! [`crate::task_sync`] directly. +pub use crate::task_async::*; +pub use crate::task_sync::*; diff --git a/mudu_utils/src/task_async.rs b/mudu_utils/src/task_async.rs new file mode 100644 index 0000000..050922b --- /dev/null +++ b/mudu_utils/src/task_async.rs @@ -0,0 +1,8 @@ +//! Async task/runtime facade used by higher-level crates. +pub use mudu_sys::task_async::{ + CurrentThreadTaskRuntime, LocalTaskSet, PollTaskIdGuard, TaskFailed, + block_on_tokio_current_thread, build_current_thread_runtime, build_multi_thread_runtime, + current_poll_task_id, has_tokio_runtime, sleep, spawn_blocking, spawn_local_detached, + spawn_local_task, spawn_local_task_timeout, spawn_task, spawn_tokio, this_task_id, timeout, + try_this_task_id, wait_for_shutdown_signal, +}; diff --git a/mudu_utils/src/task_context.rs b/mudu_utils/src/task_context.rs index aaac544..b437e7e 100644 --- a/mudu_utils/src/task_context.rs +++ b/mudu_utils/src/task_context.rs @@ -1,163 +1 @@ -use async_backtrace::Location as BtLoc; -use lazy_static::lazy_static; -use scc::{HashIndex, HashMap}; -use std::collections::VecDeque; -use std::sync::{Arc, Mutex}; - -use crate::task_id::TaskID; - -lazy_static! { - static ref TASK_CONTEXT: HashIndex> = HashIndex::new(); -} - -pub struct TaskContext { - name: String, - local_task: bool, - id: u128, - backtrace: Mutex>, - thread_backtrace: Mutex>, - watch_data: HashMap, -} - -impl TaskContext { - pub fn new(id: TaskID, name: String) -> Arc { - Self::new_context(id, name, true) - } - - pub fn new_context(id: TaskID, name: String, local_task: bool) -> Arc { - let r = Self { - name, - - local_task, - id, - backtrace: Default::default(), - thread_backtrace: Default::default(), - watch_data: Default::default(), - }; - let ret = Arc::new(r); - let id = ret.id(); - let _ = TASK_CONTEXT.insert_sync(id, ret.clone()); - ret - } - - pub fn remove_context(id: TaskID) { - let _ = TASK_CONTEXT.remove_sync(&id); - } - - pub fn get(id: TaskID) -> Option> { - let opt = TASK_CONTEXT.get_sync(&id); - opt.map(|e| e.get().clone()) - } - - pub fn is_local(&self) -> bool { - self.local_task - } - - pub fn id(&self) -> TaskID { - self.id - } - - pub fn watch(&self, k: &str, v: &str) { - let _ = self.watch_data.insert_sync(k.to_string(), v.to_string()); - } - - pub fn unwatch(&self, k: &str) { - self.watch_data.remove_sync(k); - } - - pub fn name(&self) -> String { - self.name.clone() - } - - pub fn enter(&self, l: BtLoc) { - let mut location = self.backtrace.lock().unwrap(); - location.push_back(l); - } - - pub fn exit(&self) { - let mut location = self.backtrace.lock().unwrap(); - let _ = location.pop_back(); - } - - pub fn enter_thread(&self, trace: String) { - let mut location = self.thread_backtrace.lock().unwrap(); - location.push_back(trace); - } - - pub fn exit_thread(&self) { - let mut location = self.thread_backtrace.lock().unwrap(); - let _ = location.pop_back(); - } - - pub fn backtrace(&self) -> String { - if self.local_task { - return self.thread_backtrace_string(); - } - self.task_backtrace_string() - } - - fn task_backtrace_string(&self) -> String { - let deque = self.backtrace.lock().unwrap(); - let mut s = String::new(); - s.push_str("backtrace:\n"); - for (n, l) in deque.iter().enumerate() { - s.push_str(" "); - for _ in 0..n { - s.push_str("--"); - } - s.push_str("->"); - s.push_str(l.to_string().as_str()); - s.push('\n'); - } - if !self.watch_data.is_empty() { - s.push_str("watch:\n"); - } - self.watch_data.iter_sync(|k, v| { - s.push_str(format!("=== {}:\t=\t{}\n", k, v).as_str()); - true - }); - - s - } - - fn thread_backtrace_string(&self) -> String { - let deque = self.thread_backtrace.lock().unwrap(); - let mut s = String::new(); - s.push_str("backtrace:\n"); - for (n, trace) in deque.iter().enumerate() { - s.push_str(" "); - for _ in 0..n { - s.push_str("--"); - } - s.push_str("->"); - s.push_str(trace); - if !trace.ends_with('\n') { - s.push('\n'); - } - } - if !self.watch_data.is_empty() { - s.push_str("watch:\n"); - } - self.watch_data.iter_sync(|k, v| { - s.push_str(format!("=== {}:\t=\t{}\n", k, v).as_str()); - true - }); - - s - } - - pub fn dump_task_trace() -> String { - let mut ret = String::new(); - let guard = scc::Guard::new(); - for (_id, task) in TASK_CONTEXT.iter(&guard) { - let s = format!( - "name:{},\t id: {},\t trace {}\n", - task.name(), - _id, - task.backtrace() - ); - ret.push_str(s.as_str()); - } - ret - } -} +pub use mudu_sys::task_context::*; diff --git a/mudu_utils/src/task_id.rs b/mudu_utils/src/task_id.rs index 576395e..3b81148 100644 --- a/mudu_utils/src/task_id.rs +++ b/mudu_utils/src/task_id.rs @@ -1,11 +1 @@ -use uuid::Uuid; - -/// TaskID use to store async task related context -/// Any async function can have a TaskID parameter to retrieve this task context -/// If rust can support [Custom Future contexts](https://github.com/rust-lang/rfcs/issues/2900) -/// The context information can be kept in Future -pub type TaskID = u128; - -pub fn new_task_id() -> TaskID { - Uuid::new_v4().as_u128() -} +pub use mudu_sys::task_id::*; diff --git a/mudu_utils/src/task_macros.rs b/mudu_utils/src/task_macros.rs new file mode 100644 index 0000000..4e1455f --- /dev/null +++ b/mudu_utils/src/task_macros.rs @@ -0,0 +1,54 @@ +#[macro_export] +macro_rules! task_trace { + () => {{ + #[cfg(feature = "debug_trace")] + { + let s = async_backtrace::location!(); + $crate::task_trace::TaskTrace::new(s) + } + #[cfg(not(feature = "debug_trace"))] + { + $crate::task_trace::NoopTaskTrace::new() + } + }}; +} + +#[macro_export] +macro_rules! scoped_task_trace { + () => { + let _task_trace = $crate::task_trace!(); + }; +} + +#[macro_export] +macro_rules! dump_task_trace { + () => {{ + #[cfg(feature = "debug_trace")] + { + $crate::task_trace::TaskTrace::dump_task_trace() + } + #[cfg(not(feature = "debug_trace"))] + { + String::new() + } + }}; +} + +#[macro_export] +macro_rules! task_backtrace { + () => {{ + #[cfg(feature = "debug_trace")] + { + $crate::task_trace::TaskTrace::backtrace() + } + #[cfg(not(feature = "debug_trace"))] + { + String::new() + } + }}; +} + +#[macro_export] +macro_rules! this_task_id { + () => {{ $crate::task_trace::this_task_id() }}; +} diff --git a/mudu_utils/src/task_sync.rs b/mudu_utils/src/task_sync.rs new file mode 100644 index 0000000..fbde3ac --- /dev/null +++ b/mudu_utils/src/task_sync.rs @@ -0,0 +1,2 @@ +//! Blocking/thread-based task facade used by higher-level crates. +pub use mudu_sys::task_sync::{sleep_blocking, spawn_thread, spawn_thread_named}; diff --git a/mudu_utils/src/task_trace.rs b/mudu_utils/src/task_trace.rs index 11eeefb..487798b 100644 --- a/mudu_utils/src/task_trace.rs +++ b/mudu_utils/src/task_trace.rs @@ -3,8 +3,8 @@ use scc::HashSet; use crate::task_context::TaskContext; -pub use crate::task::this_task_id; -use crate::task::try_this_task_id; +pub use crate::task_async::this_task_id; +use crate::task_async::try_this_task_id; pub struct TaskTrace { watch: HashSet, diff --git a/mudu_utils/src/test_debug_server.rs b/mudu_utils/src/test_debug_server.rs index 4733938..141df0f 100644 --- a/mudu_utils/src/test_debug_server.rs +++ b/mudu_utils/src/test_debug_server.rs @@ -1,25 +1,66 @@ #[cfg(test)] mod test { - use crate::debug::async_debug_serve; + use crate::debug::debug_serve; use crate::log::log_setup; - use crate::notifier::NotifyWait; - use crate::task::spawn_local_task_timeout; + use crate::notifier::notify_wait; + use crate::task_sync::spawn_thread_named; + #[cfg(feature = "debug_trace")] + use std::io::{Read, Write}; use std::net::SocketAddr; use std::time::Duration; - use tokio::runtime::Runtime; - use tokio::task::LocalSet; #[test] fn test_server() { - log_setup("debug"); - let addr: SocketAddr = ([127, 0, 0, 1], 3000).into(); - let runtime = Runtime::new().unwrap(); - let local = LocalSet::new(); - local.spawn_local(async move { - spawn_local_task_timeout(NotifyWait::new(), Duration::from_secs(1), "", async move { - async_debug_serve(addr).await - }) - }); - let _ = runtime.block_on(local); + log_setup("info"); + let listener = match std::net::TcpListener::bind(SocketAddr::from(([127, 0, 0, 1], 0))) { + Ok(listener) => listener, + Err(err) => { + eprintln!("skip test_server: cannot bind local port: {err}"); + return; + } + }; + let addr: SocketAddr = listener.local_addr().unwrap(); + drop(listener); + let port = addr.port(); + + let (notifier, waiter) = notify_wait(); + let server_stop = waiter.into(); + let server = spawn_thread_named("test_server", move || { + debug_serve(server_stop, port); + }) + .unwrap(); + + #[cfg(feature = "debug_trace")] + { + let mut response = None; + for _ in 0..20 { + std::thread::sleep(Duration::from_millis(50)); + let attempt = (|| -> std::io::Result { + let mut stream = std::net::TcpStream::connect(addr)?; + stream.write_all( + b"GET /task HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n", + )?; + let mut buf = String::new(); + stream.read_to_string(&mut buf)?; + Ok(buf) + })(); + if let Ok(buf) = attempt { + response = Some(buf); + break; + } + } + let response = response.expect("debug server did not accept requests"); + assert!(response.starts_with("HTTP/1.1 200")); + } + + notifier.notify_all(); + for _ in 0..20 { + if server.is_finished() { + break; + } + std::thread::sleep(Duration::from_millis(50)); + } + assert!(server.is_finished(), "debug_serve thread did not stop after notify"); + server.join().unwrap(); } } diff --git a/mudu_wasm/src/generated/mod.rs b/mudu_wasm/src/generated/mod.rs index 8ce57f0..1975da6 100644 --- a/mudu_wasm/src/generated/mod.rs +++ b/mudu_wasm/src/generated/mod.rs @@ -1,2 +1,2 @@ pub mod proc; -pub mod proc2; \ No newline at end of file +pub mod proc2; diff --git a/mudu_wasm/src/generated/proc.rs b/mudu_wasm/src/generated/proc.rs index 237bf4c..797d5bc 100644 --- a/mudu_wasm/src/generated/proc.rs +++ b/mudu_wasm/src/generated/proc.rs @@ -8,66 +8,28 @@ pub fn proc_mtp(xid: XID, a: i32, b: i64, c: String) -> RS<(i32, String)> { format!("xid:{}, a={}, b={}, c={}", xid, a, b, c), )) } - fn mp2_proc_mtp(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure( - param, - mudu_inner_p2_proc_mtp, - ) +fn mp2_proc_mtp(param: Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure(param, mudu_inner_p2_proc_mtp) } -pub fn mudu_inner_p2_proc_mtp( +pub fn mudu_inner_p2_proc_mtp( param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { +) -> ::mududb::common::result::RS<::mududb::contract::procedure::procedure_result::ProcedureResult> +{ let res = proc_mtp( param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i64, - _, - >(¶m.param_list()[1], "i64")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - + ::mududb::types::datum::value_to_typed::(¶m.param_list()[0], "i32")?, + ::mududb::types::datum::value_to_typed::(¶m.param_list()[1], "i64")?, + ::mududb::types::datum::value_to_typed::(¶m.param_list()[2], "String")?, ); match res { Ok(tuple) => { let return_list = { - - let ( - - mudu_ret_0, - - mudu_ret_1, - - ) = tuple; + let (mudu_ret_0, mudu_ret_1) = tuple; vec![ - - - ::mududb::types::datum::value_from_typed(&mudu_ret_0, "i32")? - , - - - ::mududb::types::datum::value_from_typed(&mudu_ret_1, "String")? - , - + ::mududb::types::datum::value_from_typed(&mudu_ret_0, "i32")?, + ::mududb::types::datum::value_from_typed(&mudu_ret_1, "String")?, ] - }; Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) } @@ -75,79 +37,60 @@ pub fn mudu_inner_p2_proc_mtp( } } -pub fn mudu_argv_desc_proc_mtp() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "a".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "b".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "c".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) +pub fn mudu_argv_desc_proc_mtp() +-> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock< + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc, + > = std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "a".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "b".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "c".to_string(), + ::dat_type().clone(), + ), + ]) + }) } -pub fn mudu_result_desc_proc_mtp() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "1".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) +pub fn mudu_result_desc_proc_mtp() +-> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock< + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc, + > = std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "1".to_string(), + ::dat_type().clone(), + ), + ]) + }) } -pub fn mudu_proc_desc_proc_mtp() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "mod_0".to_string(), - "proc_mtp".to_string(), - mudu_argv_desc_proc_mtp().clone(), - mudu_result_desc_proc_mtp().clone(), - false - ) - }) +pub fn mudu_proc_desc_proc_mtp() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock<::mududb::contract::procedure::proc_desc::ProcDesc> = + std::sync::OnceLock::new(); + _PROC_DESC.get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "mod_0".to_string(), + "proc_mtp".to_string(), + mudu_argv_desc_proc_mtp().clone(), + mudu_result_desc_proc_mtp().clone(), + false, + ) + }) } mod mod_proc_mtp { @@ -158,7 +101,7 @@ mod mod_proc_mtp { export mp2-proc-mtp: func(param:list) -> list; } "##, - + }); #[allow(non_camel_case_types)] @@ -166,10 +109,10 @@ mod mod_proc_mtp { struct GuestProcMtp {} impl Guest for GuestProcMtp { - fn mp2_proc_mtp(param:Vec) -> Vec { + fn mp2_proc_mtp(param: Vec) -> Vec { super::mp2_proc_mtp(param) } } export!(GuestProcMtp); -} \ No newline at end of file +} diff --git a/mudu_wasm/src/generated/proc2.rs b/mudu_wasm/src/generated/proc2.rs index 4715d4a..0388fe0 100644 --- a/mudu_wasm/src/generated/proc2.rs +++ b/mudu_wasm/src/generated/proc2.rs @@ -1,9 +1,9 @@ use mududb::common::result::RS; use mududb::common::xid::XID; use mududb::contract::{sql_params, sql_stmt}; +use mududb::sys_interface::async_api::{mudu_command, mudu_query}; use mududb::types::datum::{Datum, DatumDyn}; use object::Wallets; -use mududb::sys_interface::async_api::{mudu_command, mudu_query}; /**mudu-proc**/ pub async fn proc_sys_call_mtp(xid: XID, a: i32, b: i64, c: String) -> RS<(i32, String)> { @@ -18,7 +18,8 @@ CREATE TABLE wallets );"# .to_string(), &vec![], - ).await?; + ) + .await?; for i in 1..=2 { let _affected_rows = mudu_command( @@ -36,14 +37,16 @@ INSERT INTO wallets )"# .to_string(), &(i, 100i32, 10000i32), - ).await?; + ) + .await?; } let wallet_rs = mudu_query::( xid, sql_stmt!(&"SELECT user_id, balance, updated_at FROM wallets;"), sql_params!(&()), - ).await?; + ) + .await?; let mut result = String::new(); while let Some(row) = wallet_rs.next_record()? { @@ -330,66 +333,33 @@ pub mod object { } } } // end mod object -async fn mp2_proc_sys_call_mtp(param:Vec) -> Vec { +async fn mp2_proc_sys_call_mtp(param: Vec) -> Vec { ::mududb::binding::procedure::procedure_invoke::invoke_procedure_async( param, mudu_inner_p2_proc_sys_call_mtp, - ).await + ) + .await } pub async fn mudu_inner_p2_proc_sys_call_mtp( param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { +) -> ::mududb::common::result::RS<::mududb::contract::procedure::procedure_result::ProcedureResult> +{ let res = proc_sys_call_mtp( param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i64, - _, - >(¶m.param_list()[1], "i64")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - - ).await; + ::mududb::types::datum::value_to_typed::(¶m.param_list()[0], "i32")?, + ::mududb::types::datum::value_to_typed::(¶m.param_list()[1], "i64")?, + ::mududb::types::datum::value_to_typed::(¶m.param_list()[2], "String")?, + ) + .await; match res { Ok(tuple) => { let return_list = { - - let ( - - mudu_ret_0, - - mudu_ret_1, - - ) = tuple; + let (mudu_ret_0, mudu_ret_1) = tuple; vec![ - - - ::mududb::types::datum::value_from_typed(&mudu_ret_0, "i32")? - , - - - ::mududb::types::datum::value_from_typed(&mudu_ret_1, "String")? - , - + ::mududb::types::datum::value_from_typed(&mudu_ret_0, "i32")?, + ::mududb::types::datum::value_from_typed(&mudu_ret_1, "String")?, ] - }; Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) } @@ -397,79 +367,61 @@ pub async fn mudu_inner_p2_proc_sys_call_mtp( } } -pub fn mudu_argv_desc_proc_sys_call_mtp() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "a".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "b".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "c".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) +pub fn mudu_argv_desc_proc_sys_call_mtp() +-> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock< + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc, + > = std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "a".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "b".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "c".to_string(), + ::dat_type().clone(), + ), + ]) + }) } -pub fn mudu_result_desc_proc_sys_call_mtp() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "1".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) +pub fn mudu_result_desc_proc_sys_call_mtp() +-> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock< + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc, + > = std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "1".to_string(), + ::dat_type().clone(), + ), + ]) + }) } -pub fn mudu_proc_desc_proc_sys_call_mtp() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "mod_0".to_string(), - "proc_sys_call_mtp".to_string(), - mudu_argv_desc_proc_sys_call_mtp().clone(), - mudu_result_desc_proc_sys_call_mtp().clone(), - false - ) - }) +pub fn mudu_proc_desc_proc_sys_call_mtp() +-> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock<::mududb::contract::procedure::proc_desc::ProcDesc> = + std::sync::OnceLock::new(); + _PROC_DESC.get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "mod_0".to_string(), + "proc_sys_call_mtp".to_string(), + mudu_argv_desc_proc_sys_call_mtp().clone(), + mudu_result_desc_proc_sys_call_mtp().clone(), + false, + ) + }) } mod mod_proc_sys_call_mtp { @@ -488,73 +440,35 @@ mod mod_proc_sys_call_mtp { struct GuestProcSysCallMtp {} impl Guest for GuestProcSysCallMtp { - async fn mp2_proc_sys_call_mtp(param:Vec) -> Vec { + async fn mp2_proc_sys_call_mtp(param: Vec) -> Vec { super::mp2_proc_sys_call_mtp(param).await } } export!(GuestProcSysCallMtp); } - fn mp2_proc2_mtp(param:Vec) -> Vec { - ::mududb::binding::procedure::procedure_invoke::invoke_procedure( - param, - mudu_inner_p2_proc2_mtp, - ) +fn mp2_proc2_mtp(param: Vec) -> Vec { + ::mududb::binding::procedure::procedure_invoke::invoke_procedure(param, mudu_inner_p2_proc2_mtp) } -pub fn mudu_inner_p2_proc2_mtp( +pub fn mudu_inner_p2_proc2_mtp( param: ::mududb::contract::procedure::procedure_param::ProcedureParam, -) -> ::mududb::common::result::RS< - ::mududb::contract::procedure::procedure_result::ProcedureResult, -> { +) -> ::mududb::common::result::RS<::mududb::contract::procedure::procedure_result::ProcedureResult> +{ let res = proc2_mtp( param.session_id(), - - - ::mududb::types::datum::value_to_typed::< - i32, - _, - >(¶m.param_list()[0], "i32")?, - - - - ::mududb::types::datum::value_to_typed::< - i64, - _, - >(¶m.param_list()[1], "i64")?, - - - - ::mududb::types::datum::value_to_typed::< - String, - _, - >(¶m.param_list()[2], "String")?, - - + ::mududb::types::datum::value_to_typed::(¶m.param_list()[0], "i32")?, + ::mududb::types::datum::value_to_typed::(¶m.param_list()[1], "i64")?, + ::mududb::types::datum::value_to_typed::(¶m.param_list()[2], "String")?, ); match res { Ok(tuple) => { let return_list = { - - let ( - - mudu_ret_0, - - mudu_ret_1, - - ) = tuple; + let (mudu_ret_0, mudu_ret_1) = tuple; vec![ - - - ::mududb::types::datum::value_from_typed(&mudu_ret_0, "i32")? - , - - - ::mududb::types::datum::value_from_typed(&mudu_ret_1, "String")? - , - + ::mududb::types::datum::value_from_typed(&mudu_ret_0, "i32")?, + ::mududb::types::datum::value_from_typed(&mudu_ret_1, "String")?, ] - }; Ok(::mududb::contract::procedure::procedure_result::ProcedureResult::new(return_list)) } @@ -562,79 +476,60 @@ pub fn mudu_inner_p2_proc2_mtp( } } -pub fn mudu_argv_desc_proc2_mtp() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static ARGV_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - ARGV_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "a".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "b".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "c".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) +pub fn mudu_argv_desc_proc2_mtp() +-> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static ARGV_DESC: std::sync::OnceLock< + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc, + > = std::sync::OnceLock::new(); + ARGV_DESC.get_or_init(|| { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "a".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "b".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "c".to_string(), + ::dat_type().clone(), + ), + ]) + }) } -pub fn mudu_result_desc_proc2_mtp() -> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { - static RESULT_DESC: std::sync::OnceLock<::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc> = - std::sync::OnceLock::new(); - RESULT_DESC.get_or_init(|| - { - ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "0".to_string(), - - ::dat_type().clone() - - ), - - ::mududb::contract::tuple::datum_desc::DatumDesc::new( - "1".to_string(), - - ::dat_type().clone() - - ), - - ]) - } - ) +pub fn mudu_result_desc_proc2_mtp() +-> &'static ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc { + static RESULT_DESC: std::sync::OnceLock< + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc, + > = std::sync::OnceLock::new(); + RESULT_DESC.get_or_init(|| { + ::mududb::contract::tuple::tuple_field_desc::TupleFieldDesc::new(vec![ + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "0".to_string(), + ::dat_type().clone(), + ), + ::mududb::contract::tuple::datum_desc::DatumDesc::new( + "1".to_string(), + ::dat_type().clone(), + ), + ]) + }) } -pub fn mudu_proc_desc_proc2_mtp() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { - static _PROC_DESC: std::sync::OnceLock< - ::mududb::contract::procedure::proc_desc::ProcDesc, - > = std::sync::OnceLock::new(); - _PROC_DESC - .get_or_init(|| { - ::mududb::contract::procedure::proc_desc::ProcDesc::new( - "mod_0".to_string(), - "proc2_mtp".to_string(), - mudu_argv_desc_proc2_mtp().clone(), - mudu_result_desc_proc2_mtp().clone(), - false - ) - }) +pub fn mudu_proc_desc_proc2_mtp() -> &'static ::mududb::contract::procedure::proc_desc::ProcDesc { + static _PROC_DESC: std::sync::OnceLock<::mududb::contract::procedure::proc_desc::ProcDesc> = + std::sync::OnceLock::new(); + _PROC_DESC.get_or_init(|| { + ::mududb::contract::procedure::proc_desc::ProcDesc::new( + "mod_0".to_string(), + "proc2_mtp".to_string(), + mudu_argv_desc_proc2_mtp().clone(), + mudu_result_desc_proc2_mtp().clone(), + false, + ) + }) } mod mod_proc2_mtp { @@ -645,7 +540,7 @@ mod mod_proc2_mtp { export mp2-proc2-mtp: func(param:list) -> list; } "##, - + }); #[allow(non_camel_case_types)] @@ -653,10 +548,10 @@ mod mod_proc2_mtp { struct GuestProc2Mtp {} impl Guest for GuestProc2Mtp { - fn mp2_proc2_mtp(param:Vec) -> Vec { + fn mp2_proc2_mtp(param: Vec) -> Vec { super::mp2_proc2_mtp(param) } } export!(GuestProc2Mtp); -} \ No newline at end of file +} diff --git a/mudu_wasm/src/wasm_mtp/proc2.rs b/mudu_wasm/src/wasm_mtp/proc2.rs index 2bcb954..dc975d5 100644 --- a/mudu_wasm/src/wasm_mtp/proc2.rs +++ b/mudu_wasm/src/wasm_mtp/proc2.rs @@ -1,9 +1,9 @@ use mududb::common::result::RS; use mududb::common::xid::XID; use mududb::contract::{sql_params, sql_stmt}; +use mududb::sys_interface::sync_api::{mudu_command, mudu_query}; use mududb::types::datum::{Datum, DatumDyn}; use object::Wallets; -use mududb::sys_interface::sync_api::{mudu_command, mudu_query}; /**mudu-proc**/ pub fn proc_sys_call_mtp(xid: XID, a: i32, b: i64, c: String) -> RS<(i32, String)> { diff --git a/mudud/src/main.rs b/mudud/src/main.rs index 038892c..6974446 100644 --- a/mudud/src/main.rs +++ b/mudud/src/main.rs @@ -1,14 +1,14 @@ use mudu::common::result::RS; use mudu_runtime::backend::backend::Backend; use mudu_runtime::backend::mududb_cfg::load_mududb_cfg; -use mudu_sys::task::wait_for_shutdown_signal; +use mudu_sys::task_async::wait_for_shutdown_signal; use mudu_utils::log::log_setup_ex; use mudu_utils::notifier::{Notifier, notify_wait}; use std::thread; use tracing::{error, info}; fn main() { - log_setup_ex("info", "mudu=info,mudu_runtime=info", false); + log_setup_ex("info", "", false); let r = serve(); match r { Ok(_) => {} diff --git a/mududb/src/lib.rs b/mududb/src/lib.rs index 46b8369..264b008 100644 --- a/mududb/src/lib.rs +++ b/mududb/src/lib.rs @@ -35,15 +35,15 @@ //! ## Feature `uniffi-bindings` //! Forwards to `sys_interface/uniffi-bindings`. -pub use mudu_binding as binding; +pub use mudu; pub use mudu::common; pub use mudu::error; -pub use mudu; pub use mudu::m_error; +pub use mudu_binding as binding; pub use mudu_contract as contract; +pub use mudu_contract::{sql_params, sql_stmt}; pub use mudu_sys as sys; pub use mudu_type as types; -pub use mudu_contract::{sql_params, sql_stmt}; #[cfg(feature = "interface")] pub use sys_interface; diff --git a/script/shell/build_all.sh b/script/shell/build_all.sh new file mode 100644 index 0000000..6c19429 --- /dev/null +++ b/script/shell/build_all.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +# Ensure cargo is on PATH +source "$HOME/.cargo/env" + +cd "$REPO_ROOT" + +echo "=== MuduDB Build & Install ===" +echo "" + +# 1. Build the full workspace (34 crates) +echo "[1/4] Building workspace (cargo build --release)..." +cargo build --release +echo "Workspace build complete." +echo "" + +# 2. Install binaries (mudud, mcli, mpk, mgen, mtp) +echo "[2/4] Installing binaries..." +python3 script/build/install_binaries.py +echo "Binaries installed to \$HOME/.cargo/bin/." +echo "" + +# 3. Add wasm target and build wallet example +echo "[3/4] Building wallet example (.mpk)..." +cd "$REPO_ROOT/example/wallet" +cargo make +cd "$REPO_ROOT" +echo "Wallet example built." +echo "" + +# 4. Show results +echo "[4/4] Build summary:" +echo " mudud : $(which mudud 2>/dev/null || echo 'not found')" +echo " mcli : $(which mcli 2>/dev/null || echo 'not found')" +echo " mpk : $(which mpk 2>/dev/null || echo 'not found')" +echo " wallet.mpk : $(ls target/wasm32-wasip2/release/wallet.mpk 2>/dev/null || echo 'not found')" +echo "" + +echo "=== Build complete ===" diff --git a/script/shell/debug_test.sh b/script/shell/debug_test.sh new file mode 100644 index 0000000..31488b8 --- /dev/null +++ b/script/shell/debug_test.sh @@ -0,0 +1,186 @@ +#!/bin/bash +set -uo pipefail + +source "$HOME/.cargo/env" 2>/dev/null || true + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +MPK_FILE="$REPO_ROOT/testing/mpk/wallet.mpk" +TEMP_DIR="/tmp/mudu_debug_$(date +%s)" +DATA_DIR="$TEMP_DIR/data" +MPK_DIR="$TEMP_DIR/mpk" +CONFIG_FILE="$HOME/.mududb/mududb_cfg.toml" +CONFIG_BACKUP="$HOME/.mududb/mududb_cfg.toml.bak" +SERVER_LOG="$TEMP_DIR/server.log" +HTTP_PORT=8300 +TCP_PORT=9527 + +cd "$REPO_ROOT" + +pass=0 +fail=0 + +check() { + local desc=$1 + shift + echo -n " [$desc] " + output=$("$@" 2>&1) + rc=$? + if [ $rc -eq 0 ]; then + echo "OK" + ((pass++)) + else + echo "FAIL (rc=$rc)" + echo " output: $output" + ((fail++)) + fi + return $rc +} + +check_contains() { + local desc=$1 pattern=$2 + shift 2 + echo -n " [$desc] " + output=$("$@" 2>&1) + if echo "$output" | grep -q "$pattern"; then + echo "OK" + ((pass++)) + else + echo "FAIL (expected '$pattern')" + echo " output: $output" + ((fail++)) + fi +} + +cleanup() { + echo "" + echo "=== 清理 ===" + [ -n "${SERVER_PID:-}" ] && { kill -9 "$SERVER_PID" 2>/dev/null || true; wait "$SERVER_PID" 2>/dev/null || true; } + [ -f "$CONFIG_BACKUP" ] && { cp "$CONFIG_BACKUP" "$CONFIG_FILE"; rm -f "$CONFIG_BACKUP"; } + echo "临时目录: $TEMP_DIR (保留用于分析)" + echo "" + echo "=== 结果: $pass passed, $fail failed ===" + echo "日志: $SERVER_LOG" +} +trap cleanup EXIT + +echo "=== MuduDB 调试测试 ===" +echo "临时目录: $TEMP_DIR" +echo "" + +# Setup +mkdir -p "$DATA_DIR" "$MPK_DIR" "$(dirname "$CONFIG_FILE")" +[ -f "$CONFIG_FILE" ] && cp "$CONFIG_FILE" "$CONFIG_BACKUP" + +# Step 1: Write config +echo "[1] 写入配置" +cat > "$CONFIG_FILE" < "$SERVER_LOG" 2>&1 & +SERVER_PID=$! +echo " PID: $SERVER_PID" + +# Wait for ports +for i in $(seq 1 15); do + http_ok=false; tcp_ok=false + curl -s http://127.0.0.1:$HTTP_PORT/ > /dev/null 2>&1 && http_ok=true + ss -tlnp "sport = :$TCP_PORT" 2>/dev/null | grep -q "$SERVER_PID" && tcp_ok=true + if $http_ok && $tcp_ok; then + echo " 服务器就绪 (${i}s, HTTP+TCP)" + break + fi + if ! kill -0 "$SERVER_PID" 2>/dev/null; then + echo " ERROR: 服务器启动失败" + echo " --- 日志 ---" + cat "$SERVER_LOG" + exit 1 + fi + sleep 1 +done + +echo "" +echo "[3] 检查启动后的数据目录" +echo " 文件列表:" +ls -la "$DATA_DIR/" 2>/dev/null | sed 's/^/ /' +echo "" + +# Step 4: Install wallet +echo "[4] 安装 wallet 应用" +check "app-install" mcli --http-addr 127.0.0.1:$HTTP_PORT app-install --mpk "$MPK_FILE" +echo "" + +# Step 5: Check server alive +echo "[5] 服务器存活检查" +if kill -0 "$SERVER_PID" 2>/dev/null; then + echo " 服务器进程存活" +else + echo " ERROR: 服务器已崩溃" + echo " --- 日志 ---" + cat "$SERVER_LOG" + exit 1 +fi +echo "" + +# Step 6: List apps +echo "[6] 列出已安装应用" +check_contains "list-apps" "wallet" curl -s http://127.0.0.1:$HTTP_PORT/mudu/app/list +echo "" + +# Step 7: SQL query via mcli +echo "[7] SQL 查询测试 (通过 TCP)" +check_contains "SELECT users" "cannot find column\|user_id\|MError" mcli command --json "{\"app_name\":\"wallet\",\"sql\":\"SELECT * FROM users\"}" --compact --no-table +echo "" + +# Step 8: Check server still alive +echo "[8] 服务器存活检查" +if kill -0 "$SERVER_PID" 2>/dev/null; then + echo " 服务器进程存活" +else + echo " ERROR: 服务器已崩溃" + echo " --- 日志 ---" + cat "$SERVER_LOG" + exit 1 +fi +echo "" + +# Step 9: HTTP invoke +echo "[9] HTTP 调用测试 (create_user)" +invoke_result=$(curl -s -w "\n%{http_code}" -X POST "http://127.0.0.1:$HTTP_PORT/mudu/app/invoke/wallet/wallet/create_user" \ + -H "Content-Type: application/json" \ + -d '{"user_id":3,"name":"Charlie","email":"charlie@test.com"}' 2>&1) +http_code=$(echo "$invoke_result" | tail -1) +body=$(echo "$invoke_result" | head -n -1) +echo " HTTP code: $http_code" +echo " Body: $body" + +# Check server alive after invoke +if kill -0 "$SERVER_PID" 2>/dev/null; then + echo " 服务器存活" +else + echo " ERROR: 服务器在 invoke 后崩溃" + echo " --- 日志 ---" + cat "$SERVER_LOG" +fi +echo "" + +# Step 10: Final log +echo "[10] 服务器日志" +cat "$SERVER_LOG" | sed 's/^/ /' diff --git a/script/shell/install_deps.sh b/script/shell/install_deps.sh new file mode 100644 index 0000000..b46ccdf --- /dev/null +++ b/script/shell/install_deps.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -euo pipefail + +echo "=== Installing MuduDB Dependencies ===" +echo "" + +# 1. System packages +echo "[1/5] Installing system packages..." +if [ "$(id -u)" -eq 0 ]; then + apt-get update -y + apt-get install -y python3 python3-pip python-is-python3 clang libclang-dev llvm-dev build-essential curl liburing-dev pkgconf iproute2 git +else + sudo apt-get update -y + sudo apt-get install -y python3 python3-pip python-is-python3 clang libclang-dev llvm-dev build-essential curl liburing-dev pkgconf iproute2 git +fi +# Ensure SSL root certificates are current (fixes Docker git SSL errors) +apt-get install -y --reinstall ca-certificates 2>/dev/null || sudo apt-get install -y --reinstall ca-certificates 2>/dev/null || true +update-ca-certificates 2>/dev/null || true +echo "System packages installed." +echo "" + +# 2. Rust nightly toolchain +echo "[2/5] Installing Rust nightly toolchain..." +if ! command -v rustup &> /dev/null; then + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source "$HOME/.cargo/env" +fi +rustup toolchain install nightly +rustup default nightly +rustup component add rustfmt --toolchain nightly +rustup update nightly +rustup target add wasm32-wasip2 +echo "Rust nightly toolchain installed." +echo "" + +# 3. Python packages +echo "[3/5] Installing Python packages..." +python3 -m pip install --break-system-packages toml tomli-w +echo "Python packages installed." +echo "" + +# 4. cargo-make +echo "[4/5] Installing cargo-make..." +cargo install cargo-make +echo "cargo-make installed." +echo "" + +# 5. Verify +echo "[5/5] Verifying installation..." +echo " rustc: $(rustc --version)" +echo " cargo: $(cargo --version)" +echo " rustfmt: $(rustfmt +nightly --version 2>&1)" +echo " wasm32-wasip2 target: $(rustup target list | grep wasm32-wasip2 | grep installed)" +echo " python3: $(python3 --version)" +echo " cargo-make: $(cargo make --version 2>&1)" +echo "" + +# Use system git for fetching (more robust SSL handling than libgit2) +mkdir -p "$HOME/.cargo" +grep -q "git-fetch-with-cli" "$HOME/.cargo/config.toml" 2>/dev/null || cat >> "$HOME/.cargo/config.toml" <<'CARGOEOF' +[net] +git-fetch-with-cli = true +CARGOEOF + +echo "=== All dependencies installed successfully ===" +echo "Run: source \$HOME/.cargo/env (if this is a fresh rustup install)" diff --git a/script/shell/run_test.sh b/script/shell/run_test.sh new file mode 100644 index 0000000..e51614d --- /dev/null +++ b/script/shell/run_test.sh @@ -0,0 +1,123 @@ +#!/bin/bash +set -euo pipefail + +source "$HOME/.cargo/env" 2>/dev/null || true + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +MPK_FILE="$REPO_ROOT/testing/mpk/wallet.mpk" +TEMP_DIR="/tmp/mudu_test_$(date +%s)" +DATA_DIR="$TEMP_DIR/data" +MPK_DIR="$TEMP_DIR/mpk" +CONFIG_FILE="$HOME/.mududb/mududb_cfg.toml" +CONFIG_BACKUP="$HOME/.mududb/mududb_cfg.toml.bak" +SERVER_LOG="$TEMP_DIR/server.log" +HTTP_PORT=8300 +TCP_PORT=9527 + +cd "$REPO_ROOT" + +echo "=== MuduDB 启动 & CRUD 测试 ===" +echo "" + +cleanup() { + echo "" + echo "清理中..." + [ -n "${SERVER_PID:-}" ] && { kill "$SERVER_PID" 2>/dev/null || true; wait "$SERVER_PID" 2>/dev/null || true; } + [ -f "$CONFIG_BACKUP" ] && { cp "$CONFIG_BACKUP" "$CONFIG_FILE"; rm -f "$CONFIG_BACKUP"; } + rm -rf "$TEMP_DIR" + echo "清理完成" +} +trap cleanup EXIT + +mkdir -p "$DATA_DIR" "$MPK_DIR" "$(dirname "$CONFIG_FILE")" + +[ -f "$CONFIG_FILE" ] && cp "$CONFIG_FILE" "$CONFIG_BACKUP" +cat > "$CONFIG_FILE" < "$SERVER_LOG" 2>&1 & +SERVER_PID=$! +echo " PID: $SERVER_PID" + +# Wait for both HTTP and TCP ports +for i in $(seq 1 30); do + http_ok=false; tcp_ok=false + curl -s http://127.0.0.1:$HTTP_PORT/ > /dev/null 2>&1 && http_ok=true + command -v ss &>/dev/null && ss -tlnp "sport = :$TCP_PORT" 2>/dev/null | grep -q "$SERVER_PID" && tcp_ok=true + if $http_ok && $tcp_ok; then echo " 服务器就绪 (${i}s)"; break; fi + if ! kill -0 "$SERVER_PID" 2>/dev/null; then echo " ERROR: 服务器意外退出"; cat "$SERVER_LOG"; exit 1; fi + sleep 1 +done + +# Install wallet app +echo "" +echo "[2/4] 安装 wallet 应用..." +mcli --http-addr 127.0.0.1:$HTTP_PORT app-install --mpk "$MPK_FILE" + +# CRUD tests +echo "" +echo "[3/4] 运行 CRUD 测试..." +echo "" + +# Helper: invoke procedure via HTTP API +invoke() { + local proc=$1 data=$2 + curl -s -X POST "http://127.0.0.1:$HTTP_PORT/mudu/app/invoke/wallet/wallet/$proc" \ + -H "Content-Type: application/json" -d "$data" +} + +# Helper: SQL query via mcli TCP +query() { + mcli command --json "{\"app_name\":\"wallet\",\"sql\":\"$1\"}" --compact --no-table 2>&1 +} + +# CREATE +echo " >> CREATE: 创建用户 user_id=3 (Charlie)" +invoke create_user '{"user_id":3,"name":"Charlie","email":"charlie@test.com"}' + +# READ (SQL) +echo " >> READ: 查询全部用户" +query "SELECT user_id, name, email FROM users" + +echo " >> READ: 初始钱包余额" +query "SELECT user_id, balance FROM wallets" + +# UPDATE (deposit to Alice) +echo " >> UPDATE: Alice (user_id=1) +5000" +invoke deposit '{"user_id":1,"amount":5000}' + +echo " >> READ: Alice 最新余额" +query "SELECT user_id, balance FROM wallets WHERE user_id=1" + +# INVOKE procedure (transfer) +echo " >> INVOKE: Alice -> Bob 转账 3000" +invoke transfer_funds '{"from_user_id":1,"to_user_id":2,"amount":3000}' + +echo " >> READ: 验证转账后余额" +query "SELECT user_id, balance FROM wallets" + +# DELETE +echo " >> DELETE: 删除用户 user_id=3" +invoke delete_user '{"user_id":3}' + +echo " >> READ: 最终用户列表(应只有 Alice, Bob)" +query "SELECT user_id, name, email FROM users" + +echo "" +echo "[4/4] 测试完成,关闭服务器..." +echo "" +echo "=== 全部测试通过 ===" diff --git a/script/shell/t.sh b/script/shell/t.sh new file mode 100644 index 0000000..f961f1b --- /dev/null +++ b/script/shell/t.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +DATA="/tmp/mudu_manual_test/data" +LOG="/tmp/mudu_manual_test/server.log" +BIN="$REPO_ROOT/target/release/mudud" + +pkill -9 mudud 2>/dev/null || true +sleep 1 +cp "$BIN" ~/.cargo/bin/mudud +rm -rf "$DATA"/* +mkdir -p "$DATA" +RUST_LOG=mudu_runtime=info mudud > "$LOG" 2>&1 & +echo "mudud PID: $!, log: $LOG" +sleep 5 +cat "$LOG" diff --git a/skills/run-mududb/SKILL.md b/skills/run-mududb/SKILL.md new file mode 100644 index 0000000..945baf5 --- /dev/null +++ b/skills/run-mududb/SKILL.md @@ -0,0 +1,163 @@ +--- +name: run-mududb +description: > + Build, configure, start, and test MuduDB (the io_uring database server). + Use this skill whenever the user wants to run mudud, start the database server, + test the wallet example, run CRUD operations, debug server crashes, or verify + that MuduDB is working. Also use for questions about mududb_cfg.toml configuration, + mcli commands, or HTTP API invocation of procedures. +--- + +# Run MuduDB + +MuduDB is an io_uring-based database server with WASM procedure execution. This skill covers the full lifecycle: build, configure, start, test, and debug. + +## Quick Start + +For a one-command build + install + start + test cycle, run: + +```bash +./script/shell/run_test.sh +``` + +This script handles everything: config, server startup, wallet install, CRUD tests, and cleanup. + +## Step-by-Step Guide + +### 1. Build + +```bash +cargo build --release +``` + +Binaries land in `target/release/`: `mudud` (server), `mcli` (client), `mpk`, `mgen`, `mtp`. + +### 2. Install Binaries + +Copy to `~/.cargo/bin/` so they're on PATH. **Kill any running mudud first** (the binary will be busy otherwise): + +```bash +pkill -9 mudud 2>/dev/null || true +sleep 1 +cp target/release/mudud ~/.cargo/bin/ +cp target/release/mcli ~/.cargo/bin/ +``` + +Or use the project script: `python script/build/install_binaries.py` + +### 3. Configure + +MuduDB reads `~/.mudu/mududb_cfg.toml`. Key settings for io_uring mode: + +```toml +mpk_path = "/tmp/mudu_test/mpk" # directory with .mpk app packages +db_path = "/tmp/mudu_test/data" # database storage directory +listen_ip = "127.0.0.1" +http_listen_port = 8300 # management API (REST) +tcp_listen_port = 9527 # internal protocol (io_uring workers) +pg_listen_port = 5432 # PostgreSQL wire protocol +server_mode = 1 # 0=Legacy, 1=IOUring +io_uring_worker_threads = 2 # 0=auto-detect CPU cores +routing_mode = 2 # 0=ConnectionId, 1=PlayerId, 2=RemoteHash +enable_async = true +http_worker_threads = 1 +``` + +Always create the data and mpk directories before starting: + +```bash +mkdir -p /tmp/mudu_test/data /tmp/mudu_test/mpk +``` + +### 4. Start the Server + +```bash +RUST_LOG=mudu_runtime=info mudud > /tmp/mudu_test/server.log 2>&1 & +``` + +Wait for both HTTP (8300) and TCP (9527) ports to be ready: + +```bash +for i in $(seq 1 30); do + curl -s http://127.0.0.1:8300/ > /dev/null 2>&1 && echo "Ready (${i}s)" && break + sleep 1 +done +``` + +The server log is at the path you redirected to. Check it if the server fails to start. + +### 5. Install an App + +```bash +mcli --http-addr 127.0.0.1:8300 app-install --mpk testing/mpk/wallet.mpk +``` + +### 6. Query and Invoke + +**SQL queries** go through `mcli command` over TCP: + +```bash +mcli command --json '{"app_name":"wallet","sql":"SELECT user_id, name FROM users"}' --compact --no-table +``` + +**Procedure invocations** go through the HTTP API: + +```bash +curl -s -X POST "http://127.0.0.1:8300/mudu/app/invoke/wallet/wallet/create_user" \ + -H "Content-Type: application/json" \ + -d '{"user_id":3,"name":"Charlie","email":"charlie@test.com"}' +``` + +The URL pattern is: `/mudu/app/invoke/{app_name}/{module_name}/{procedure_name}` + +### 7. Stop the Server + +```bash +pkill -9 mudud +``` + +## Helper Scripts + +The repo includes automation scripts: + +| Script | Purpose | +|--------|---------| +| `script/shell/run_test.sh` | Full integration test: build, start, install wallet, CRUD, cleanup | +| `script/shell/t.sh` | Quick restart: kill, install binary, start with clean data | +| `script/shell/debug_test.sh` | Detailed test with step-by-step checks and preserved temp dir | + +## Common Issues + +### "Text file busy" when copying mudud binary +A mudud process is still running. Kill it first: `pkill -9 mudud` + +### "Connection refused" during startup +The io_uring TCP server takes a moment to start. The DDL init thread retries automatically (up to 15s). If it persists, check the server log. + +### "no such table" on queries +The DDL initialization may have failed. Check the server log for "DDL execution failed" warnings. Restart with a clean data directory. + +### Server crashes (segfault) on procedure invoke +Check the server log. Common cause: database not initialized. Ensure the DDL init thread completed successfully (look for "DDL executed successfully" in logs). + +### SQL syntax errors +The built-in SQL parser (`sql_parser` based on `tree-sitter-sql`) has limited support. Known limitations: +- No `ORDER BY` support +- No `JOIN` support +- No `SELECT *` (enumerate columns explicitly) +- No subqueries + +## Ports Reference + +| Port | Protocol | Purpose | +|------|----------|---------| +| 8300 | HTTP/REST | Management API: app install, list, procedure invoke | +| 9527 | Custom TCP | Internal: io_uring worker communication, mcli queries | +| 5432 | PostgreSQL | Wire protocol (optional) | + +## Architecture Notes + +- **io_uring workers** each own their storage. DDL must execute through the TCP server (not direct file access). +- **DDL initialization** is deferred: the `ddl-init` thread waits for the TCP server, then executes CREATE TABLE via batch request. +- **HTTP management thread** runs on a standard tokio runtime (not io_uring). It proxies procedure invocations to the TCP server. +- Each procedure invocation: HTTP API -> TCP connection to io_uring worker -> WASM procedure execution -> SQL via worker-local storage. diff --git a/skills/run-mududb/scripts/build_and_start.sh b/skills/run-mududb/scripts/build_and_start.sh new file mode 100644 index 0000000..d6b63b9 --- /dev/null +++ b/skills/run-mududb/scripts/build_and_start.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# Build MuduDB, install binaries, and start the server. +# Usage: ./build_and_start.sh [--clean] +# --clean Remove existing data directory before starting +set -uo pipefail + +ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" +DATA="/tmp/mudu_manual_test/data" +LOG="/tmp/mudu_manual_test/server.log" +MPK_DIR="/tmp/mudu_manual_test/mpk" + +CLEAN=false +[[ "${1:-}" == "--clean" ]] && CLEAN=true + +echo "[1/3] Building..." +cargo build --release -p mudud -p mudu_cli 2>&1 | tail -3 + +echo "[2/3] Installing binaries..." +pkill -9 mudud 2>/dev/null || true +sleep 1 +cp "$ROOT/target/release/mudud" ~/.cargo/bin/mudud +cp "$ROOT/target/release/mcli" ~/.cargo/bin/mcli + +echo "[3/3] Starting server..." +mkdir -p "$DATA" "$MPK_DIR" +if $CLEAN; then + rm -rf "$DATA"/* +fi + +# Write config +cat > ~/.mudu/mududb_cfg.toml < "$LOG" 2>&1 & +SERVER_PID=$! +echo "mudud PID: $SERVER_PID, log: $LOG" + +# Wait for ready +for i in $(seq 1 30); do + curl -s http://127.0.0.1:8300/ > /dev/null 2>&1 && echo "Server ready (${i}s)" && exit 0 + if ! kill -0 "$SERVER_PID" 2>/dev/null; then + echo "Server failed to start. Log:" + cat "$LOG" + exit 1 + fi + sleep 1 +done +echo "Timeout waiting for server. Log:" +cat "$LOG" +exit 1 diff --git a/skills/run-mududb/scripts/test_wallet.sh b/skills/run-mududb/scripts/test_wallet.sh new file mode 100644 index 0000000..ec857a9 --- /dev/null +++ b/skills/run-mududb/scripts/test_wallet.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Run wallet CRUD tests against a running MuduDB server. +# Prerequisites: mudud must be running, wallet.mpk must be in the mpk path. +set -uo pipefail + +ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" +MPK="$ROOT/testing/mpk/wallet.mpk" +HTTP=8300 + +pass=0 +fail=0 + +invoke() { + curl -s -X POST "http://127.0.0.1:$HTTP/mudu/app/invoke/wallet/wallet/$1" \ + -H "Content-Type: application/json" -d "$2" +} + +query() { + mcli command --json "{\"app_name\":\"wallet\",\"sql\":\"$1\"}" --compact --no-table 2>&1 +} + +check_json() { + local desc=$1 expected=$2 + shift 2 + echo -n " [$desc] " + output=$("$@" 2>&1) + if echo "$output" | grep -q "$expected"; then + echo "OK" + ((pass++)) + else + echo "FAIL (expected '$expected')" + echo " got: $output" + ((fail++)) + fi +} + +echo "=== Wallet CRUD Tests ===" + +# Install app +echo "" +echo "[1] Install wallet" +mcli --http-addr 127.0.0.1:$HTTP app-install --mpk "$MPK" 2>&1 | head -1 + +echo "" +echo "[2] CRUD Operations" + +check_json "CREATE user 3" '"ok":true' invoke create_user '{"user_id":3,"name":"Charlie","email":"charlie@test.com"}' + +check_json "READ users" "Alice" query "SELECT user_id, name FROM users" +check_json "READ wallets" "10000" query "SELECT user_id, balance FROM wallets" + +check_json "DEPOSIT +5000" '"ok":true' invoke deposit '{"user_id":1,"amount":5000}' +check_json "READ Alice balance" "15000" query "SELECT balance FROM wallets WHERE user_id=1" + +check_json "TRANSFER 3000" '"ok":true' invoke transfer_funds '{"from_user_id":1,"to_user_id":2,"amount":3000}' +check_json "READ post-transfer" "12000" query "SELECT balance FROM wallets WHERE user_id=1" + +check_json "DELETE user 3" '"ok":true' invoke delete_user '{"user_id":3}' +check_json "READ final users" "Alice" query "SELECT name FROM users" + +echo "" +echo "=== Results: $pass passed, $fail failed ===" diff --git a/sql_parser/src/ast/parser.rs b/sql_parser/src/ast/parser.rs index ab8e208..785a532 100644 --- a/sql_parser/src/ast/parser.rs +++ b/sql_parser/src/ast/parser.rs @@ -33,15 +33,15 @@ use crate::ast::stmt_type::{StmtCommand, StmtType}; use crate::ast::stmt_update::{AssignedValue, Assignment, StmtUpdate}; use crate::ts_const::{ts_field_name, ts_kind_id}; use mudu::common::id::AttrIndex; +use mudu::data_type::numeric::Numeric; use mudu::error::err::MError; use mudu::m_error; use mudu_binding::universal::uni_dat_type::UniDatType; use mudu_binding::universal::uni_dat_value::UniDatValue; -use mudu_binding::universal::uni_primitive::UniPrimitive; -use mudu_binding::universal::uni_primitive_value::UniPrimitiveValue; +use mudu_binding::universal::uni_scalar::UniScalar; +use mudu_binding::universal::uni_scalar_value::UniScalarValue; use mudu_type::dat_typed::DatTyped; use std::collections::HashMap; -use std::f64; use std::io::Write; use std::str::FromStr; use std::sync::{Arc, Mutex}; @@ -653,8 +653,9 @@ impl SQLParser { DatTyped::from_i64(i) } else if let Some(n) = node.child_by_field_name("decimal") { let s = self.visit_decimal(context, n)?; - let f = f64::from_str(s.as_str()).unwrap(); - DatTyped::from_f64(f) + let numeric = Numeric::parse(s.as_str()) + .map_err(|e| m_error!(EC::ParseErr, format!("parse numeric error {}", e)))?; + DatTyped::from_numeric(numeric) } else if let Some(n) = node.child_by_field_name("string") { let s = self.visit_string(context, n)?; DatTyped::from_string(s) @@ -973,10 +974,10 @@ impl SQLParser { let child = rs_option(opt_n, "no child in data type kind")?; let kind = child.kind_id(); let ret = match kind { - ts_kind_id::INT => (UniDatType::Primitive(UniPrimitive::I32), None), - ts_kind_id::BIGINT => (UniDatType::Primitive(UniPrimitive::I64), None), - ts_kind_id::DOUBLE => (UniDatType::Primitive(UniPrimitive::F64), None), - ts_kind_id::FLOAT => (UniDatType::Primitive(UniPrimitive::F32), None), + ts_kind_id::INT => (UniDatType::Scalar(UniScalar::I32), None), + ts_kind_id::BIGINT => (UniDatType::Scalar(UniScalar::I64), None), + ts_kind_id::DOUBLE => (UniDatType::Scalar(UniScalar::F64), None), + ts_kind_id::FLOAT => (UniDatType::Scalar(UniScalar::F32), None), ts_kind_id::CHAR | ts_kind_id::VARCHAR | ts_kind_id::KEYWORD_TEXT => { let opt_params = if kind == ts_kind_id::CHAR || kind == ts_kind_id::VARCHAR { let param = self.visit_char_param(context, child)?; @@ -984,11 +985,37 @@ impl SQLParser { } else { None }; - (UniDatType::Primitive(UniPrimitive::String), opt_params) + (UniDatType::Scalar(UniScalar::String), opt_params) } - ts_kind_id::NUMERIC => (UniDatType::Primitive(UniPrimitive::F64), None), - ts_kind_id::DECIMAL => (UniDatType::Primitive(UniPrimitive::F64), None), - ts_kind_id::KEYWORD_TIMESTAMP => (UniDatType::Primitive(UniPrimitive::I64), None), + ts_kind_id::NUMERIC | ts_kind_id::DECIMAL => ( + UniDatType::Scalar(UniScalar::Numeric), + self.visit_numeric_params(context, child)?, + ), + ts_kind_id::KEYWORD_DATE => (UniDatType::Scalar(UniScalar::Date), None), + ts_kind_id::TIME => ( + UniDatType::Scalar(UniScalar::Time), + self.visit_optional_precision_param(context, child)?, + ), + ts_kind_id::KEYWORD_TIME => ( + UniDatType::Scalar(UniScalar::Time), + self.visit_optional_precision_param(context, node)?, + ), + ts_kind_id::TIMESTAMP => ( + UniDatType::Scalar(UniScalar::Timestamp), + self.visit_optional_precision_param(context, child)?, + ), + ts_kind_id::KEYWORD_TIMESTAMP_BASE => ( + UniDatType::Scalar(UniScalar::Timestamp), + self.visit_optional_precision_param(context, node)?, + ), + ts_kind_id::TIMESTAMPTZ => ( + UniDatType::Scalar(UniScalar::TimestampTz), + self.visit_optional_precision_param(context, child)?, + ), + ts_kind_id::KEYWORD_TIMESTAMPTZ_BASE => ( + UniDatType::Scalar(UniScalar::TimestampTz), + self.visit_optional_precision_param(context, node)?, + ), _ => { return Err(m_error!( EC::NotImplemented, @@ -1005,7 +1032,7 @@ impl SQLParser { let s = ts_node_context_string(&context.parse_str(), &n)?; let r = i64::from_str(s.as_str()); match r { - Ok(l) => Ok(UniDatValue::Primitive(UniPrimitiveValue::I64(l))), + Ok(l) => Ok(UniDatValue::Scalar(UniScalarValue::I64(l))), Err(e) => Err(m_error!(EC::ParseErr, "parse u32 error", e)), } } else { @@ -1013,6 +1040,49 @@ impl SQLParser { } } + fn visit_numeric_params( + &self, + context: &ParseContext, + node: Node, + ) -> RS>> { + let mut params = Vec::new(); + if let Some(n) = node.child_by_field_name(ts_field_name::PRECISION) { + let s = ts_node_context_string(&context.parse_str(), &n)?; + let value = i64::from_str(s.as_str()) + .map_err(|e| m_error!(EC::ParseErr, "parse precision error", e))?; + params.push(UniDatValue::Scalar(UniScalarValue::I64(value))); + } + if let Some(n) = node.child_by_field_name(ts_field_name::SCALE) { + let s = ts_node_context_string(&context.parse_str(), &n)?; + let value = i64::from_str(s.as_str()) + .map_err(|e| m_error!(EC::ParseErr, "parse scale error", e))?; + params.push(UniDatValue::Scalar(UniScalarValue::I64(value))); + } + if params.is_empty() { + Ok(None) + } else { + Ok(Some(params)) + } + } + + fn visit_optional_precision_param( + &self, + context: &ParseContext, + node: Node, + ) -> RS>> { + let opt = node + .child_by_field_name(ts_field_name::PRECISION) + .or_else(|| node.child_by_field_name(ts_field_name::SIZE)); + if let Some(n) = opt { + let s = ts_node_context_string(&context.parse_str(), &n)?; + let value = i64::from_str(s.as_str()) + .map_err(|e| m_error!(EC::ParseErr, "parse precision error", e))?; + Ok(Some(vec![UniDatValue::Scalar(UniScalarValue::I64(value))])) + } else { + Ok(None) + } + } + fn visit_insert_statement(&self, context: &ParseContext, node: Node) -> RS { let opt = node.child_by_field_name(ts_field_name::OBJECT_REFERENCE); let c = rs_option(opt, "no object reference in insert statement")?; diff --git a/sql_parser/src/ast/parser_test.rs b/sql_parser/src/ast/parser_test.rs index 058936a..e9b5bcb 100644 --- a/sql_parser/src/ast/parser_test.rs +++ b/sql_parser/src/ast/parser_test.rs @@ -8,6 +8,10 @@ mod tests { use crate::ast::stmt_type::{StmtCommand, StmtType}; use crate::ast::stmt_update::AssignedValue; use mudu::common::result::RS; + use mudu_binding::universal::uni_dat_type::UniDatType; + use mudu_binding::universal::uni_dat_value::UniDatValue; + use mudu_binding::universal::uni_scalar::UniScalar; + use mudu_binding::universal::uni_scalar_value::UniScalarValue; use project_root::get_project_root; use std::fs; use std::path::Path; @@ -89,6 +93,56 @@ mod tests { assert!(matches!(predicate.2, ValueCompare::LE)); } + #[test] + fn parse_decimal_literal_preserves_numeric_type() { + let stmts = parse_sql("select id from users where amount = 12.34;").unwrap(); + + let StmtType::Select(stmt) = &stmts[0] else { + panic!("expected select"); + }; + let predicate = &stmt.get_where_predicate()[0]; + match predicate.right() { + ExprItem::ItemValue(ExprValue::ValueLiteral(literal)) => { + assert_eq!( + literal.dat_type().dat_type().dat_type_id(), + mudu_type::dat_type_id::DatTypeID::Numeric + ); + assert_eq!( + literal + .dat_type() + .dat_internal() + .expect_numeric() + .to_plain_string(), + "12.34" + ); + } + other => panic!("expected numeric literal on right side, got {other:?}"), + } + } + + #[test] + fn parse_decimal_literal_preserves_trailing_fractional_zeros() { + let stmts = parse_sql("select id from users where amount = 12.3400;").unwrap(); + + let StmtType::Select(stmt) = &stmts[0] else { + panic!("expected select"); + }; + let predicate = &stmt.get_where_predicate()[0]; + match predicate.right() { + ExprItem::ItemValue(ExprValue::ValueLiteral(literal)) => { + assert_eq!( + literal + .dat_type() + .dat_internal() + .expect_numeric() + .to_plain_string(), + "12.3400" + ); + } + other => panic!("expected numeric literal on right side, got {other:?}"), + } + } + #[test] fn parse_insert_without_column_list() { let stmts = parse_sql("insert into users values (1, 'alice');").unwrap(); @@ -283,6 +337,183 @@ mod tests { assert!(r.is_ok()); } + #[test] + fn parse_create_table_numeric_type_preserves_precision_and_scale() { + let stmt = parse_create_table( + " + CREATE TABLE ledger ( + id BIGINT PRIMARY KEY, + amount NUMERIC(18, 2) + ); + ", + ) + .unwrap(); + + let amount = stmt + .non_primary_columns() + .into_iter() + .find(|column| column.column_name() == "amount") + .expect("amount column"); + assert!(matches!( + amount.data_type(), + UniDatType::Scalar(UniScalar::Numeric) + )); + let params = amount + .data_type_param() + .as_ref() + .expect("numeric params should exist"); + assert_eq!(params.len(), 2); + assert!(matches!( + params[0], + UniDatValue::Scalar(UniScalarValue::I64(18)) + )); + assert!(matches!( + params[1], + UniDatValue::Scalar(UniScalarValue::I64(2)) + )); + } + + #[test] + fn parse_create_table_decimal_alias_maps_to_numeric_scalar() { + let stmt = parse_create_table( + " + CREATE TABLE ledger ( + id BIGINT PRIMARY KEY, + amount DECIMAL(9, 4) + ); + ", + ) + .unwrap(); + + let amount = stmt + .non_primary_columns() + .into_iter() + .find(|column| column.column_name() == "amount") + .expect("amount column"); + assert!(matches!( + amount.data_type(), + UniDatType::Scalar(UniScalar::Numeric) + )); + let params = amount.data_type_param().as_ref().expect("decimal params"); + assert!(matches!( + params[0], + UniDatValue::Scalar(UniScalarValue::I64(9)) + )); + assert!(matches!( + params[1], + UniDatValue::Scalar(UniScalarValue::I64(4)) + )); + } + + #[test] + fn parse_create_table_numeric_without_params_keeps_numeric_type_without_param_payload() { + let stmt = parse_create_table( + " + CREATE TABLE ledger ( + id BIGINT PRIMARY KEY, + amount NUMERIC + ); + ", + ) + .unwrap(); + + let amount = stmt + .non_primary_columns() + .into_iter() + .find(|column| column.column_name() == "amount") + .expect("amount column"); + assert!(matches!( + amount.data_type(), + UniDatType::Scalar(UniScalar::Numeric) + )); + assert!(amount.data_type_param().is_none()); + } + + #[test] + fn parse_create_table_temporal_types_preserve_scalar_kinds_and_precision() { + let stmt = parse_create_table( + " + CREATE TABLE events ( + id BIGINT PRIMARY KEY, + event_date DATE, + event_time TIME(3), + created_at TIMESTAMP(4), + published_at TIMESTAMPTZ(2) + ); + ", + ) + .unwrap(); + + let columns = stmt.non_primary_columns(); + assert!(matches!( + columns[0].data_type(), + UniDatType::Scalar(UniScalar::Date) + )); + assert!(columns[0].data_type_param().is_none()); + + assert!(matches!( + columns[1].data_type(), + UniDatType::Scalar(UniScalar::Time) + )); + let time_params = columns[1] + .data_type_param() + .as_ref() + .expect("time params should exist"); + assert_eq!(time_params.len(), 1); + assert!(matches!( + time_params[0], + UniDatValue::Scalar(UniScalarValue::I64(3)) + )); + + assert!(matches!( + columns[2].data_type(), + UniDatType::Scalar(UniScalar::Timestamp) + )); + let timestamp_params = columns[2] + .data_type_param() + .as_ref() + .expect("timestamp params should exist"); + assert_eq!(timestamp_params.len(), 1); + assert!(matches!( + timestamp_params[0], + UniDatValue::Scalar(UniScalarValue::I64(4)) + )); + + assert!(matches!( + columns[3].data_type(), + UniDatType::Scalar(UniScalar::TimestampTz) + )); + let timestamptz_params = columns[3] + .data_type_param() + .as_ref() + .expect("timestamptz params should exist"); + assert_eq!(timestamptz_params.len(), 1); + assert!(matches!( + timestamptz_params[0], + UniDatValue::Scalar(UniScalarValue::I64(2)) + )); + } + + #[test] + fn parse_create_table_temporal_types_without_precision_keep_no_param_payload() { + let stmt = parse_create_table( + " + CREATE TABLE audit_log ( + id BIGINT PRIMARY KEY, + event_time TIME, + created_at TIMESTAMP, + published_at TIMESTAMPTZ + ); + ", + ) + .unwrap(); + + let columns = stmt.non_primary_columns(); + assert!(columns[0].data_type_param().is_none()); + assert!(columns[1].data_type_param().is_none()); + assert!(columns[2].data_type_param().is_none()); + } + #[test] fn test_create_table_ast_column_primary_key_index() { let stmt = parse_create_table( diff --git a/sql_parser/src/parser/ddl_parser.rs b/sql_parser/src/parser/ddl_parser.rs index dc1e568..a2fe113 100644 --- a/sql_parser/src/parser/ddl_parser.rs +++ b/sql_parser/src/parser/ddl_parser.rs @@ -40,6 +40,7 @@ impl DDLParser { let column_def = FieldDef::new( d.column_name().clone(), d.data_type().clone(), + d.data_type_param().clone(), d.primary_key_index().is_some(), ); column_def diff --git a/sql_parser/src/ts_const/ts_kind_id.rs b/sql_parser/src/ts_const/ts_kind_id.rs index d743a75..56f8455 100644 --- a/sql_parser/src/ts_const/ts_kind_id.rs +++ b/sql_parser/src/ts_const/ts_kind_id.rs @@ -5,203 +5,203 @@ // kind id of Node -pub const _OPTIMIZE_TABLE: u16 = 0; -pub const KEYWORD_RECURSIVE: u16 = 0; +pub const KEYWORD_REPLACE: u16 = 0; +pub const KEYWORD_AVG: u16 = 0; +pub const KEYWORD_TRIGGER: u16 = 0; +pub const INDEX_HINT: u16 = 0; +pub const ROW_FORMAT: u16 = 0; +pub const KEYWORD_TERMINATED: u16 = 0; +pub const KEYWORD_ROW: u16 = 0; +pub const _NOT_NULL: u16 = 0; +pub const _CONSTRAINT_LITERAL: u16 = 0; +pub const KEYWORD_RESTRICTED: u16 = 0; +pub const KEYWORD_TEXTFILE: u16 = 0; +pub const TABLE_SORT: u16 = 0; +pub const KEYWORD_RETURN: u16 = 0; +pub const FRAME_DEFINITION: u16 = 0; +pub const CREATE_MATERIALIZED_VIEW: u16 = 0; +pub const KEYWORD_UNBOUNDED: u16 = 0; +pub const _IF_NOT_EXISTS: u16 = 0; +pub const CASE: u16 = 0; +pub const KEYWORD_REPLICATION: u16 = 0; +pub const KEYWORD_OVERWRITE: u16 = 0; +pub const KEYWORD_ROWS: u16 = 0; +pub const WINDOW_SPECIFICATION: u16 = 0; +pub const KEYWORD_BRIN: u16 = 0; +pub const _TRUNCATE_STATEMENT: u16 = 0; +pub const WINDOW_FUNCTION: u16 = 0; +pub const STORED_AS: u16 = 0; pub const INTERVAL: u16 = 0; +pub const CREATE_INDEX: u16 = 0; +pub const CREATE_FUNCTION: u16 = 0; +pub const FUNCTION_DECLARATION: u16 = 0; pub const KEYWORD_FIELDS: u16 = 0; +pub const _INNER_DEFAULT_EXPRESSION: u16 = 0; +pub const CREATE_QUERY: u16 = 0; +pub const KEYWORD_VOLATILE: u16 = 0; +pub const _RENAME_TABLE_NAMES: u16 = 0; +pub const KEYWORD_UNSAFE: u16 = 0; +pub const KEYWORD_INTERSECT: u16 = 0; pub const KEYWORD_INPUT: u16 = 0; -pub const FUNCTION_VOLATILITY: u16 = 0; -pub const KEYWORD_LEAKPROOF: u16 = 0; -pub const KEYWORD_COST: u16 = 0; -pub const CASE: u16 = 0; -pub const _DROP_BEHAVIOR: u16 = 0; -pub const _INTERVAL_DEFINITION: u16 = 0; -pub const KEYWORD_UNION: u16 = 0; +pub const KEYWORD_RCFILE: u16 = 0; +pub const _CURRENT_ROW: u16 = 0; +pub const KEYWORD_PARQUET: u16 = 0; pub const WINDOW_FRAME: u16 = 0; -pub const STORED_AS: u16 = 0; -pub const KEYWORD_ADMIN: u16 = 0; -pub const KEYWORD_WINDOW: u16 = 0; -pub const _MERGE_STATEMENT: u16 = 0; -pub const KEYWORD_RANGE: u16 = 0; -pub const _PARTITION_SPEC: u16 = 0; -pub const KEYWORD_IMMUTABLE: u16 = 0; -pub const KEYWORD_RETURNS: u16 = 0; -pub const CREATE_QUERY: u16 = 0; -pub const KEYWORD_GROUPS: u16 = 0; +pub const _IDENTIFIER: u16 = 0; +pub const KEYWORD_NOTHING: u16 = 0; +pub const FUNCTION_VOLATILITY: u16 = 0; +pub const _USER_ACCESS_ROLE_CONFIG: u16 = 0; +pub const FUNCTION_LANGUAGE: u16 = 0; +pub const KEYWORD_STORED: u16 = 0; +pub const _VACUUM_TABLE: u16 = 0; pub const KEYWORD_OPTION: u16 = 0; -pub const LATERAL_CROSS_JOIN: u16 = 0; -pub const KEYWORD_SPGIST: u16 = 0; -pub const DELETE: u16 = 0; -pub const _HAVING: u16 = 0; -pub const FRAME_DEFINITION: u16 = 0; +pub const KEYWORD_LEAKPROOF: u16 = 0; pub const _TEMPORARY: u16 = 0; -pub const KEYWORD_PARTITIONED: u16 = 0; -pub const ORDERED_COLUMN: u16 = 0; -pub const _MYSQL_UPDATE_STATEMENT: u16 = 0; -pub const KEYWORD_TIES: u16 = 0; -pub const KEYWORD_PLPGSQL: u16 = 0; -pub const KEYWORD_TRIGGER: u16 = 0; -pub const WINDOW_CLAUSE: u16 = 0; -pub const CREATE_MATERIALIZED_VIEW: u16 = 0; -pub const KEYWORD_UNSAFE: u16 = 0; -pub const CTE: u16 = 0; -pub const FUNCTION_BODY: u16 = 0; -pub const CREATE_FUNCTION: u16 = 0; -pub const KEYWORD_AUTHORIZATION: u16 = 0; -pub const KEYWORD_CROSS: u16 = 0; -pub const KEYWORD_LOCATION: u16 = 0; -pub const KEYWORD_GIST: u16 = 0; -pub const CROSS_JOIN: u16 = 0; -pub const _POSTGRES_UPDATE_STATEMENT: u16 = 0; -pub const KEYWORD_RCFILE: u16 = 0; -pub const _OR_REPLACE: u16 = 0; pub const KEYWORD_EXCEPT: u16 = 0; -pub const KEYWORD_STORED: u16 = 0; +pub const _HAVING: u16 = 0; pub const INTERVAL_DEFINITIONS: u16 = 0; +pub const _DEFAULT_EXPRESSION: u16 = 0; +pub const KEYWORD_LANGUAGE: u16 = 0; +pub const KEYWORD_BTREE: u16 = 0; +pub const FUNCTION_SUPPORT: u16 = 0; +pub const _ALTER_SPECIFICATIONS: u16 = 0; +pub const _CHECK_OPTION: u16 = 0; +pub const KEYWORD_ATOMIC: u16 = 0; +pub const KEYWORD_CASE: u16 = 0; +pub const KEYWORD_OVER: u16 = 0; +pub const KEYWORD_LOW_PRIORITY: u16 = 0; +pub const KEYWORD_ELSE: u16 = 0; pub const CREATE_SCHEMA: u16 = 0; -pub const KEYWORD_ROW: u16 = 0; -pub const KEYWORD_USE: u16 = 0; -pub const _NOT_NULL: u16 = 0; -pub const KEYWORD_NOTHING: u16 = 0; -pub const IMPLICIT_CAST: u16 = 0; -pub const ROW_FORMAT: u16 = 0; -pub const KEYWORD_OVERWRITE: u16 = 0; -pub const KEYWORD_OUTER: u16 = 0; -pub const KEYWORD_UNBOUNDED: u16 = 0; -pub const _TRUNCATE_STATEMENT: u16 = 0; +pub const KEYWORD_HAVING: u16 = 0; pub const KEYWORD_OTHERS: u16 = 0; -pub const KEYWORD_CASE: u16 = 0; -pub const KEYWORD_TEXTFILE: u16 = 0; -pub const KEYWORD_REPLACE: u16 = 0; -pub const _EXCLUDE_TIES: u16 = 0; -pub const KEYWORD_TERMINATED: u16 = 0; -pub const KEYWORD_MATERIALIZED: u16 = 0; -pub const KEYWORD_CALLED: u16 = 0; -pub const PARTITION_BY: u16 = 0; +pub const KEYWORD_ESCAPED: u16 = 0; +pub const DELETE: u16 = 0; +pub const _ROLE_OPTIONS: u16 = 0; +pub const FUNCTION_SAFETY: u16 = 0; +pub const KEYWORD_AVRO: u16 = 0; pub const _OPTIMIZE_STATEMENT: u16 = 0; -pub const _CREATE_STATEMENT: u16 = 0; -pub const _IF_EXISTS: u16 = 0; -pub const KEYWORD_HAVING: u16 = 0; +pub const KEYWORD_PRESERVE: u16 = 0; +pub const _RENAME_STATEMENT: u16 = 0; +pub const KEYWORD_RIGHT: u16 = 0; +pub const KEYWORD_HASH: u16 = 0; +pub const KEYWORD_TBLPROPERTIES: u16 = 0; +pub const KEYWORD_INNER: u16 = 0; +pub const KEYWORD_PLPGSQL: u16 = 0; +pub const ORDERED_COLUMN: u16 = 0; pub const CREATE_ROLE: u16 = 0; -pub const VALUES: u16 = 0; -pub const FUNCTION_ROWS: u16 = 0; -pub const KEYWORD_SORT: u16 = 0; -pub const WINDOW_SPECIFICATION: u16 = 0; -pub const _VACUUM_OPTION: u16 = 0; -pub const _EXCLUDE_CURRENT_ROW: u16 = 0; -pub const KEYWORD_RESTRICTED: u16 = 0; -pub const KEYWORD_SUPPORT: u16 = 0; -pub const KEYWORD_SETOF: u16 = 0; -pub const KEYWORD_DELIMITED: u16 = 0; -pub const KEYWORD_INTERSECT: u16 = 0; -pub const _CURRENT_ROW: u16 = 0; -pub const FUNCTION_LEAKPROOF: u16 = 0; -pub const JOIN: u16 = 0; -pub const _COMPUTE_STATS: u16 = 0; -pub const KEYWORD_RETURNING: u16 = 0; -pub const KEYWORD_PARQUET: u16 = 0; -pub const _WITH_SETTINGS: u16 = 0; -pub const _USER_ACCESS_ROLE_CONFIG: u16 = 0; -pub const KEYWORD_OPTIONS: u16 = 0; +pub const TABLE_PARTITION: u16 = 0; +pub const KEYWORD_CROSS: u16 = 0; +pub const KEYWORD_CONFLICT: u16 = 0; pub const SET_OPERATION: u16 = 0; -pub const _SINGLE_QUOTE_STRING: u16 = 0; -pub const KEYWORD_DELAYED: u16 = 0; -pub const DOLLAR_QUOTE: u16 = 0; -pub const KEYWORD_CACHED: u16 = 0; -pub const KEYWORD_EXCLUDE: u16 = 0; -pub const _FUNCTION_RETURN: u16 = 0; -pub const _KEY_CONSTRAINT: u16 = 0; -pub const KEYWORD_OVER: u16 = 0; +pub const KEYWORD_GIN: u16 = 0; +pub const CTE: u16 = 0; +pub const _DROP_BEHAVIOR: u16 = 0; +pub const _TABLE_SETTINGS: u16 = 0; +pub const KEYWORD_LATERAL: u16 = 0; +pub const CREATE_DATABASE: u16 = 0; +pub const RETURNING: u16 = 0; +pub const KEYWORD_RETURNS: u16 = 0; +pub const KEYWORD_CALLED: u16 = 0; pub const KEYWORD_CASCADED: u16 = 0; +pub const KEYWORD_DELIMITED: u16 = 0; +pub const KEYWORD_COST: u16 = 0; +pub const KEYWORD_SAFE: u16 = 0; +pub const CROSS_JOIN: u16 = 0; +pub const KEYWORD_LEFT: u16 = 0; +pub const GROUP_BY: u16 = 0; +pub const KEYWORD_SEQUENCEFILE: u16 = 0; +pub const _INTERVAL_DEFINITION: u16 = 0; +pub const KEYWORD_EXCLUDE: u16 = 0; +pub const _EXCLUDE_NO_OTHERS: u16 = 0; +pub const ENUM_ELEMENTS: u16 = 0; +pub const _DEFAULT_NULL: u16 = 0; +pub const LATERAL_JOIN: u16 = 0; +pub const KEYWORD_DELAYED: u16 = 0; pub const _FUNCTION_BODY_STATEMENT: u16 = 0; -pub const EXISTS: u16 = 0; -pub const KEYWORD_STABLE: u16 = 0; -pub const FUNCTION_LANGUAGE: u16 = 0; -pub const KEYWORD_ROWS: u16 = 0; +pub const _ALTER_STATEMENT: u16 = 0; +pub const FUNCTION_BODY: u16 = 0; +pub const KEYWORD_FUNCTION: u16 = 0; +pub const _EXCLUDE_GROUP: u16 = 0; +pub const KEYWORD_UNCACHED: u16 = 0; pub const CREATE_SEQUENCE: u16 = 0; -pub const KEYWORD_END: u16 = 0; -pub const _VACUUM_TABLE: u16 = 0; -pub const KEYWORD_DO: u16 = 0; -pub const KEYWORD_AVRO: u16 = 0; -pub const _TABLE_SETTINGS: u16 = 0; -pub const KEYWORD_STRICT: u16 = 0; +pub const KEYWORD_CSV: u16 = 0; +pub const KEYWORD_MAX: u16 = 0; +pub const KEYWORD_SUPPORT: u16 = 0; pub const FUNCTION_COST: u16 = 0; -pub const KEYWORD_LANGUAGE: u16 = 0; +pub const KEYWORD_LINES: u16 = 0; +pub const FUNCTION_LEAKPROOF: u16 = 0; +pub const _KEY_VALUE_PAIR: u16 = 0; +pub const KEYWORD_GROUPS: u16 = 0; +pub const _VACUUM_OPTION: u16 = 0; +pub const KEYWORD_USE: u16 = 0; +pub const _COMPUTE_STATS: u16 = 0; +pub const _EXCLUDE_TIES: u16 = 0; pub const KEYWORD_SQL: u16 = 0; +pub const FUNCTION_ROWS: u16 = 0; +pub const CREATE_TYPE: u16 = 0; +pub const _POSTGRES_UPDATE_STATEMENT: u16 = 0; +pub const KEYWORD_CHECK: u16 = 0; +pub const KEYWORD_IGNORE: u16 = 0; +pub const _MYSQL_UPDATE_STATEMENT: u16 = 0; +pub const KEYWORD_LOCATION: u16 = 0; +pub const KEYWORD_OUTER: u16 = 0; +pub const KEYWORD_TIES: u16 = 0; +pub const KEYWORD_ADMIN: u16 = 0; +pub const _OPTIMIZE_TABLE: u16 = 0; +pub const _KEY_CONSTRAINT: u16 = 0; +pub const KEYWORD_DO: u16 = 0; +pub const KEYWORD_OPTIONS: u16 = 0; +pub const KEYWORD_UNION: u16 = 0; +pub const KEYWORD_HIGH_PRIORITY: u16 = 0; +pub const _EXCLUDE_CURRENT_ROW: u16 = 0; pub const _CTE: u16 = 0; -pub const KEYWORD_MIN: u16 = 0; +pub const _OR_REPLACE: u16 = 0; +pub const _ARRAY_SIZE_DEFINITION: u16 = 0; +pub const STORAGE_LOCATION: u16 = 0; +pub const IMPLICIT_CAST: u16 = 0; +pub const VALUES: u16 = 0; +pub const KEYWORD_END: u16 = 0; +pub const LATERAL_CROSS_JOIN: u16 = 0; +pub const _WITH_SETTINGS: u16 = 0; +pub const JOIN: u16 = 0; pub const KEYWORD_ORC: u16 = 0; -pub const _ROLE_OPTIONS: u16 = 0; +pub const KEYWORD_JOIN: u16 = 0; +pub const KEYWORD_FOLLOWING: u16 = 0; +pub const _SINGLE_QUOTE_STRING: u16 = 0; +pub const _MERGE_STATEMENT: u16 = 0; +pub const KEYWORD_DECLARE: u16 = 0; +pub const KEYWORD_RETURNING: u16 = 0; +pub const KEYWORD_MATERIALIZED: u16 = 0; pub const CREATE_VIEW: u16 = 0; -pub const CREATE_DATABASE: u16 = 0; -pub const TABLE_PARTITION: u16 = 0; -pub const KEYWORD_HIGH_PRIORITY: u16 = 0; -pub const KEYWORD_ELSE: u16 = 0; -pub const KEYWORD_BRIN: u16 = 0; -pub const KEYWORD_UNCACHED: u16 = 0; -pub const _RENAME_STATEMENT: u16 = 0; -pub const LATERAL_JOIN: u16 = 0; -pub const RETURNING: u16 = 0; -pub const FUNCTION_DECLARATION: u16 = 0; -pub const _IDENTIFIER: u16 = 0; -pub const KEYWORD_LOW_PRIORITY: u16 = 0; +pub const KEYWORD_FORMAT: u16 = 0; +pub const _CREATE_STATEMENT: u16 = 0; +pub const DOLLAR_QUOTE: u16 = 0; +pub const _PARTITION_SPEC: u16 = 0; +pub const KEYWORD_AUTHORIZATION: u16 = 0; +pub const FUNCTION_STRICTNESS: u16 = 0; +pub const KEYWORD_STRICT: u16 = 0; +pub const KEYWORD_SPGIST: u16 = 0; +pub const EXISTS: u16 = 0; +pub const WINDOW_CLAUSE: u16 = 0; +pub const KEYWORD_CACHED: u16 = 0; +pub const KEYWORD_RECURSIVE: u16 = 0; +pub const KEYWORD_SETOF: u16 = 0; +pub const KEYWORD_RANGE: u16 = 0; pub const _DOUBLE_QUOTE_STRING: u16 = 0; -pub const FUNCTION_SUPPORT: u16 = 0; -pub const _ALTER_STATEMENT: u16 = 0; -pub const _KEY_VALUE_PAIR: u16 = 0; -pub const KEYWORD_DECLARE: u16 = 0; -pub const KEYWORD_LINES: u16 = 0; -pub const KEYWORD_FUNCTION: u16 = 0; -pub const KEYWORD_PRECEDING: u16 = 0; -pub const KEYWORD_HASH: u16 = 0; -pub const _DEFAULT_NULL: u16 = 0; -pub const CREATE_INDEX: u16 = 0; -pub const KEYWORD_FOLLOWING: u16 = 0; -pub const KEYWORD_LEFT: u16 = 0; +pub const KEYWORD_MIN: u16 = 0; pub const _PRIMARY_KEY: u16 = 0; -pub const KEYWORD_SAFE: u16 = 0; -pub const KEYWORD_CSV: u16 = 0; -pub const _COLUMN_COMMENT: u16 = 0; -pub const FUNCTION_STRICTNESS: u16 = 0; -pub const KEYWORD_JOIN: u16 = 0; -pub const KEYWORD_ESCAPED: u16 = 0; -pub const _ALTER_SPECIFICATIONS: u16 = 0; -pub const KEYWORD_FORMAT: u16 = 0; -pub const _INNER_DEFAULT_EXPRESSION: u16 = 0; -pub const GROUP_BY: u16 = 0; -pub const KEYWORD_VOLATILE: u16 = 0; -pub const _EXCLUDE_NO_OTHERS: u16 = 0; -pub const KEYWORD_REPLICATION: u16 = 0; -pub const INDEX_HINT: u16 = 0; -pub const KEYWORD_ATOMIC: u16 = 0; -pub const FUNCTION_SAFETY: u16 = 0; -pub const KEYWORD_CONFLICT: u16 = 0; -pub const TABLE_SORT: u16 = 0; -pub const _IF_NOT_EXISTS: u16 = 0; -pub const KEYWORD_PRESERVE: u16 = 0; -pub const KEYWORD_MAX: u16 = 0; +pub const PARTITION_BY: u16 = 0; +pub const KEYWORD_STABLE: u16 = 0; +pub const KEYWORD_WINDOW: u16 = 0; +pub const KEYWORD_IMMUTABLE: u16 = 0; +pub const _FUNCTION_RETURN: u16 = 0; pub const KEYWORD_JSONFILE: u16 = 0; -pub const _RENAME_TABLE_NAMES: u16 = 0; -pub const _EXCLUDE_GROUP: u16 = 0; -pub const KEYWORD_INNER: u16 = 0; -pub const ENUM_ELEMENTS: u16 = 0; -pub const KEYWORD_GIN: u16 = 0; -pub const KEYWORD_IGNORE: u16 = 0; -pub const KEYWORD_CHECK: u16 = 0; -pub const KEYWORD_LATERAL: u16 = 0; -pub const KEYWORD_AVG: u16 = 0; -pub const KEYWORD_RETURN: u16 = 0; -pub const _CONSTRAINT_LITERAL: u16 = 0; -pub const KEYWORD_TBLPROPERTIES: u16 = 0; -pub const KEYWORD_RIGHT: u16 = 0; -pub const _DEFAULT_EXPRESSION: u16 = 0; -pub const KEYWORD_BTREE: u16 = 0; -pub const KEYWORD_SEQUENCEFILE: u16 = 0; -pub const _CHECK_OPTION: u16 = 0; -pub const _ARRAY_SIZE_DEFINITION: u16 = 0; -pub const STORAGE_LOCATION: u16 = 0; -pub const CREATE_TYPE: u16 = 0; -pub const WINDOW_FUNCTION: u16 = 0; +pub const KEYWORD_PARTITIONED: u16 = 0; +pub const KEYWORD_SORT: u16 = 0; +pub const _COLUMN_COMMENT: u16 = 0; +pub const KEYWORD_PRECEDING: u16 = 0; +pub const _IF_EXISTS: u16 = 0; +pub const KEYWORD_GIST: u16 = 0; pub const KEYWORD_SELECT: u16 = 3; pub const KEYWORD_DELETE: u16 = 4; pub const KEYWORD_INSERT: u16 = 5; @@ -409,8 +409,8 @@ pub const KEYWORD_REAL: u16 = 279; pub const KEYWORD_CHAR: u16 = 280; pub const KEYWORD_VARCHAR: u16 = 281; pub const KEYWORD_TIME: u16 = 282; -pub const KEYWORD_TIMESTAMP: u16 = 283; -pub const KEYWORD_TIMESTAMPTZ: u16 = 284; +pub const KEYWORD_TIMESTAMP_BASE: u16 = 283; +pub const KEYWORD_TIMESTAMPTZ_BASE: u16 = 284; pub const DATA_TYPE: u16 = 285; pub const DATA_TYPE_KIND: u16 = 286; pub const ARRAY_SIZE_DEFINITION: u16 = 287; @@ -432,99 +432,101 @@ pub const NCHAR: u16 = 303; pub const NVARCHAR: u16 = 304; pub const DATETIMEOFFSET: u16 = 305; pub const TIME: u16 = 306; -pub const ENUM: u16 = 307; -pub const ARRAY: u16 = 308; -pub const COMMENT: u16 = 309; -pub const MARGINALIA: u16 = 310; -pub const STATEMENT_TRANSACTION: u16 = 311; -pub const BEGIN_TRANSACTION: u16 = 312; -pub const COMMIT_TRANSACTION: u16 = 313; -pub const ROLLBACK_TRANSACTION: u16 = 314; -pub const STATEMENT: u16 = 315; -pub const COPY_STMT: u16 = 316; -pub const COPY_FROM: u16 = 317; -pub const COPY_TO: u16 = 318; -pub const FILE_PATH: u16 = 319; -pub const DDL_STMT: u16 = 320; -pub const DML_WRITE_STMT: u16 = 321; -pub const DML_READ_STMT: u16 = 322; -pub const SELECT_STATEMENT: u16 = 323; -pub const SELECT: u16 = 324; -pub const SELECT_EXPRESSION: u16 = 325; -pub const TERM: u16 = 326; -pub const DELETE_STATEMENT: u16 = 328; -pub const CREATE_TABLE_STATEMENT: u16 = 329; -pub const ALTER_TABLE: u16 = 334; -pub const ADD_COLUMN: u16 = 336; -pub const ADD_CONSTRAINT: u16 = 337; -pub const ALTER_COLUMN: u16 = 338; -pub const MODIFY_COLUMN: u16 = 339; -pub const CHANGE_COLUMN: u16 = 340; -pub const COLUMN_POSITION: u16 = 341; -pub const DROP_COLUMN: u16 = 342; -pub const RENAME_COLUMN: u16 = 343; -pub const ALTER_VIEW: u16 = 344; -pub const ALTER_SCHEMA: u16 = 345; -pub const ALTER_DATABASE: u16 = 346; -pub const ALTER_ROLE: u16 = 347; -pub const SET_CONFIGURATION: u16 = 348; -pub const ALTER_INDEX: u16 = 349; -pub const ALTER_SEQUENCE: u16 = 350; -pub const ALTER_TYPE: u16 = 351; -pub const DROP_STATEMENT: u16 = 353; -pub const DROP_TABLE: u16 = 354; -pub const DROP_VIEW: u16 = 355; -pub const DROP_SCHEMA: u16 = 356; -pub const DROP_DATABASE: u16 = 357; -pub const DROP_ROLE: u16 = 358; -pub const DROP_TYPE: u16 = 359; -pub const DROP_SEQUENCE: u16 = 360; -pub const DROP_INDEX: u16 = 361; -pub const RENAME_OBJECT: u16 = 362; -pub const SET_SCHEMA: u16 = 363; -pub const CHANGE_OWNERSHIP: u16 = 364; -pub const OBJECT_REFERENCE: u16 = 365; -pub const INSERT_STATEMENT: u16 = 366; -pub const INSERT_VALUES: u16 = 367; -pub const TYPED_ROW_VALUE_EXPR_LIST: u16 = 368; -pub const SET_VALUES: u16 = 369; -pub const COLUMN_LIST: u16 = 370; -pub const COLUMN: u16 = 371; -pub const UPDATE_STATEMENT: u16 = 372; -pub const WHEN_CLAUSE: u16 = 374; -pub const ASSIGNMENT: u16 = 381; -pub const TABLE_OPTION: u16 = 382; -pub const COLUMN_DEFINITIONS: u16 = 383; -pub const COLUMN_DEFINITION: u16 = 384; -pub const COLUMN_CONSTRAINT: u16 = 386; -pub const CONSTRAINTS: u16 = 389; -pub const CONSTRAINT: u16 = 390; -pub const PRIMARY_KEY_CONSTRAINT: u16 = 392; -pub const ORDERED_COLUMNS: u16 = 394; -pub const ALL_FIELDS: u16 = 396; -pub const PARAMETER: u16 = 397; -pub const FIELD: u16 = 398; -pub const QUALIFIED_FIELD: u16 = 399; -pub const CAST: u16 = 401; -pub const FILTER_EXPRESSION: u16 = 402; -pub const INVOCATION: u16 = 403; -pub const ALIAS_NAME: u16 = 404; -pub const FROM: u16 = 405; -pub const RELATION: u16 = 406; -pub const WHERE: u16 = 407; -pub const ORDER_BY: u16 = 408; -pub const ORDER_TARGET: u16 = 409; -pub const LIMIT: u16 = 410; -pub const OFFSET: u16 = 411; -pub const EXPRESSION: u16 = 412; -pub const BINARY_EXPRESSION: u16 = 413; -pub const UNARY_EXPRESSION: u16 = 414; -pub const BETWEEN_EXPRESSION: u16 = 415; -pub const NOT_IN: u16 = 416; -pub const SUBQUERY: u16 = 417; -pub const LIST: u16 = 418; -pub const LITERAL: u16 = 419; -pub const LITERAL_STRING: u16 = 422; -pub const INTEGER: u16 = 423; -pub const DECIMAL_NUMBER: u16 = 424; -pub const IDENTIFIER: u16 = 425; +pub const TIMESTAMP: u16 = 307; +pub const TIMESTAMPTZ: u16 = 308; +pub const ENUM: u16 = 309; +pub const ARRAY: u16 = 310; +pub const COMMENT: u16 = 311; +pub const MARGINALIA: u16 = 312; +pub const STATEMENT_TRANSACTION: u16 = 313; +pub const BEGIN_TRANSACTION: u16 = 314; +pub const COMMIT_TRANSACTION: u16 = 315; +pub const ROLLBACK_TRANSACTION: u16 = 316; +pub const STATEMENT: u16 = 317; +pub const COPY_STMT: u16 = 318; +pub const COPY_FROM: u16 = 319; +pub const COPY_TO: u16 = 320; +pub const FILE_PATH: u16 = 321; +pub const DDL_STMT: u16 = 322; +pub const DML_WRITE_STMT: u16 = 323; +pub const DML_READ_STMT: u16 = 324; +pub const SELECT_STATEMENT: u16 = 325; +pub const SELECT: u16 = 326; +pub const SELECT_EXPRESSION: u16 = 327; +pub const TERM: u16 = 328; +pub const DELETE_STATEMENT: u16 = 330; +pub const CREATE_TABLE_STATEMENT: u16 = 331; +pub const ALTER_TABLE: u16 = 336; +pub const ADD_COLUMN: u16 = 338; +pub const ADD_CONSTRAINT: u16 = 339; +pub const ALTER_COLUMN: u16 = 340; +pub const MODIFY_COLUMN: u16 = 341; +pub const CHANGE_COLUMN: u16 = 342; +pub const COLUMN_POSITION: u16 = 343; +pub const DROP_COLUMN: u16 = 344; +pub const RENAME_COLUMN: u16 = 345; +pub const ALTER_VIEW: u16 = 346; +pub const ALTER_SCHEMA: u16 = 347; +pub const ALTER_DATABASE: u16 = 348; +pub const ALTER_ROLE: u16 = 349; +pub const SET_CONFIGURATION: u16 = 350; +pub const ALTER_INDEX: u16 = 351; +pub const ALTER_SEQUENCE: u16 = 352; +pub const ALTER_TYPE: u16 = 353; +pub const DROP_STATEMENT: u16 = 355; +pub const DROP_TABLE: u16 = 356; +pub const DROP_VIEW: u16 = 357; +pub const DROP_SCHEMA: u16 = 358; +pub const DROP_DATABASE: u16 = 359; +pub const DROP_ROLE: u16 = 360; +pub const DROP_TYPE: u16 = 361; +pub const DROP_SEQUENCE: u16 = 362; +pub const DROP_INDEX: u16 = 363; +pub const RENAME_OBJECT: u16 = 364; +pub const SET_SCHEMA: u16 = 365; +pub const CHANGE_OWNERSHIP: u16 = 366; +pub const OBJECT_REFERENCE: u16 = 367; +pub const INSERT_STATEMENT: u16 = 368; +pub const INSERT_VALUES: u16 = 369; +pub const TYPED_ROW_VALUE_EXPR_LIST: u16 = 370; +pub const SET_VALUES: u16 = 371; +pub const COLUMN_LIST: u16 = 372; +pub const COLUMN: u16 = 373; +pub const UPDATE_STATEMENT: u16 = 374; +pub const WHEN_CLAUSE: u16 = 376; +pub const ASSIGNMENT: u16 = 383; +pub const TABLE_OPTION: u16 = 384; +pub const COLUMN_DEFINITIONS: u16 = 385; +pub const COLUMN_DEFINITION: u16 = 386; +pub const COLUMN_CONSTRAINT: u16 = 388; +pub const CONSTRAINTS: u16 = 391; +pub const CONSTRAINT: u16 = 392; +pub const PRIMARY_KEY_CONSTRAINT: u16 = 394; +pub const ORDERED_COLUMNS: u16 = 396; +pub const ALL_FIELDS: u16 = 398; +pub const PARAMETER: u16 = 399; +pub const FIELD: u16 = 400; +pub const QUALIFIED_FIELD: u16 = 401; +pub const CAST: u16 = 403; +pub const FILTER_EXPRESSION: u16 = 404; +pub const INVOCATION: u16 = 405; +pub const ALIAS_NAME: u16 = 406; +pub const FROM: u16 = 407; +pub const RELATION: u16 = 408; +pub const WHERE: u16 = 409; +pub const ORDER_BY: u16 = 410; +pub const ORDER_TARGET: u16 = 411; +pub const LIMIT: u16 = 412; +pub const OFFSET: u16 = 413; +pub const EXPRESSION: u16 = 414; +pub const BINARY_EXPRESSION: u16 = 415; +pub const UNARY_EXPRESSION: u16 = 416; +pub const BETWEEN_EXPRESSION: u16 = 417; +pub const NOT_IN: u16 = 418; +pub const SUBQUERY: u16 = 419; +pub const LIST: u16 = 420; +pub const LITERAL: u16 = 421; +pub const LITERAL_STRING: u16 = 424; +pub const INTEGER: u16 = 425; +pub const DECIMAL_NUMBER: u16 = 426; +pub const IDENTIFIER: u16 = 427; diff --git a/sql_parser/src/ts_const/ts_kind_name.rs b/sql_parser/src/ts_const/ts_kind_name.rs index 1d7b077..f2301dc 100644 --- a/sql_parser/src/ts_const/ts_kind_name.rs +++ b/sql_parser/src/ts_const/ts_kind_name.rs @@ -5,203 +5,203 @@ // kind name of Node -pub const S__OPTIMIZE_TABLE: &str = "_optimize_table"; -pub const S_KEYWORD_RECURSIVE: &str = "keyword_recursive"; +pub const S_KEYWORD_REPLACE: &str = "keyword_replace"; +pub const S_KEYWORD_AVG: &str = "keyword_avg"; +pub const S_KEYWORD_TRIGGER: &str = "keyword_trigger"; +pub const S_INDEX_HINT: &str = "index_hint"; +pub const S_ROW_FORMAT: &str = "row_format"; +pub const S_KEYWORD_TERMINATED: &str = "keyword_terminated"; +pub const S_KEYWORD_ROW: &str = "keyword_row"; +pub const S__NOT_NULL: &str = "_not_null"; +pub const S__CONSTRAINT_LITERAL: &str = "_constraint_literal"; +pub const S_KEYWORD_RESTRICTED: &str = "keyword_restricted"; +pub const S_KEYWORD_TEXTFILE: &str = "keyword_textfile"; +pub const S_TABLE_SORT: &str = "table_sort"; +pub const S_KEYWORD_RETURN: &str = "keyword_return"; +pub const S_FRAME_DEFINITION: &str = "frame_definition"; +pub const S_CREATE_MATERIALIZED_VIEW: &str = "create_materialized_view"; +pub const S_KEYWORD_UNBOUNDED: &str = "keyword_unbounded"; +pub const S__IF_NOT_EXISTS: &str = "_if_not_exists"; +pub const S_CASE: &str = "case"; +pub const S_KEYWORD_REPLICATION: &str = "keyword_replication"; +pub const S_KEYWORD_OVERWRITE: &str = "keyword_overwrite"; +pub const S_KEYWORD_ROWS: &str = "keyword_rows"; +pub const S_WINDOW_SPECIFICATION: &str = "window_specification"; +pub const S_KEYWORD_BRIN: &str = "keyword_brin"; +pub const S__TRUNCATE_STATEMENT: &str = "_truncate_statement"; +pub const S_WINDOW_FUNCTION: &str = "window_function"; +pub const S_STORED_AS: &str = "stored_as"; pub const S_INTERVAL: &str = "interval"; +pub const S_CREATE_INDEX: &str = "create_index"; +pub const S_CREATE_FUNCTION: &str = "create_function"; +pub const S_FUNCTION_DECLARATION: &str = "function_declaration"; pub const S_KEYWORD_FIELDS: &str = "keyword_fields"; +pub const S__INNER_DEFAULT_EXPRESSION: &str = "_inner_default_expression"; +pub const S_CREATE_QUERY: &str = "create_query"; +pub const S_KEYWORD_VOLATILE: &str = "keyword_volatile"; +pub const S__RENAME_TABLE_NAMES: &str = "_rename_table_names"; +pub const S_KEYWORD_UNSAFE: &str = "keyword_unsafe"; +pub const S_KEYWORD_INTERSECT: &str = "keyword_intersect"; pub const S_KEYWORD_INPUT: &str = "keyword_input"; -pub const S_FUNCTION_VOLATILITY: &str = "function_volatility"; -pub const S_KEYWORD_LEAKPROOF: &str = "keyword_leakproof"; -pub const S_KEYWORD_COST: &str = "keyword_cost"; -pub const S_CASE: &str = "case"; -pub const S__DROP_BEHAVIOR: &str = "_drop_behavior"; -pub const S__INTERVAL_DEFINITION: &str = "_interval_definition"; -pub const S_KEYWORD_UNION: &str = "keyword_union"; +pub const S_KEYWORD_RCFILE: &str = "keyword_rcfile"; +pub const S__CURRENT_ROW: &str = "_current_row"; +pub const S_KEYWORD_PARQUET: &str = "keyword_parquet"; pub const S_WINDOW_FRAME: &str = "window_frame"; -pub const S_STORED_AS: &str = "stored_as"; -pub const S_KEYWORD_ADMIN: &str = "keyword_admin"; -pub const S_KEYWORD_WINDOW: &str = "keyword_window"; -pub const S__MERGE_STATEMENT: &str = "_merge_statement"; -pub const S_KEYWORD_RANGE: &str = "keyword_range"; -pub const S__PARTITION_SPEC: &str = "_partition_spec"; -pub const S_KEYWORD_IMMUTABLE: &str = "keyword_immutable"; -pub const S_KEYWORD_RETURNS: &str = "keyword_returns"; -pub const S_CREATE_QUERY: &str = "create_query"; -pub const S_KEYWORD_GROUPS: &str = "keyword_groups"; +pub const S__IDENTIFIER: &str = "_identifier"; +pub const S_KEYWORD_NOTHING: &str = "keyword_nothing"; +pub const S_FUNCTION_VOLATILITY: &str = "function_volatility"; +pub const S__USER_ACCESS_ROLE_CONFIG: &str = "_user_access_role_config"; +pub const S_FUNCTION_LANGUAGE: &str = "function_language"; +pub const S_KEYWORD_STORED: &str = "keyword_stored"; +pub const S__VACUUM_TABLE: &str = "_vacuum_table"; pub const S_KEYWORD_OPTION: &str = "keyword_option"; -pub const S_LATERAL_CROSS_JOIN: &str = "lateral_cross_join"; -pub const S_KEYWORD_SPGIST: &str = "keyword_spgist"; -pub const S_DELETE: &str = "delete"; -pub const S__HAVING: &str = "_having"; -pub const S_FRAME_DEFINITION: &str = "frame_definition"; +pub const S_KEYWORD_LEAKPROOF: &str = "keyword_leakproof"; pub const S__TEMPORARY: &str = "_temporary"; -pub const S_KEYWORD_PARTITIONED: &str = "keyword_partitioned"; -pub const S_ORDERED_COLUMN: &str = "ordered_column"; -pub const S__MYSQL_UPDATE_STATEMENT: &str = "_mysql_update_statement"; -pub const S_KEYWORD_TIES: &str = "keyword_ties"; -pub const S_KEYWORD_PLPGSQL: &str = "keyword_plpgsql"; -pub const S_KEYWORD_TRIGGER: &str = "keyword_trigger"; -pub const S_WINDOW_CLAUSE: &str = "window_clause"; -pub const S_CREATE_MATERIALIZED_VIEW: &str = "create_materialized_view"; -pub const S_KEYWORD_UNSAFE: &str = "keyword_unsafe"; -pub const S_CTE: &str = "cte"; -pub const S_FUNCTION_BODY: &str = "function_body"; -pub const S_CREATE_FUNCTION: &str = "create_function"; -pub const S_KEYWORD_AUTHORIZATION: &str = "keyword_authorization"; -pub const S_KEYWORD_CROSS: &str = "keyword_cross"; -pub const S_KEYWORD_LOCATION: &str = "keyword_location"; -pub const S_KEYWORD_GIST: &str = "keyword_gist"; -pub const S_CROSS_JOIN: &str = "cross_join"; -pub const S__POSTGRES_UPDATE_STATEMENT: &str = "_postgres_update_statement"; -pub const S_KEYWORD_RCFILE: &str = "keyword_rcfile"; -pub const S__OR_REPLACE: &str = "_or_replace"; pub const S_KEYWORD_EXCEPT: &str = "keyword_except"; -pub const S_KEYWORD_STORED: &str = "keyword_stored"; +pub const S__HAVING: &str = "_having"; pub const S_INTERVAL_DEFINITIONS: &str = "interval_definitions"; +pub const S__DEFAULT_EXPRESSION: &str = "_default_expression"; +pub const S_KEYWORD_LANGUAGE: &str = "keyword_language"; +pub const S_KEYWORD_BTREE: &str = "keyword_btree"; +pub const S_FUNCTION_SUPPORT: &str = "function_support"; +pub const S__ALTER_SPECIFICATIONS: &str = "_alter_specifications"; +pub const S__CHECK_OPTION: &str = "_check_option"; +pub const S_KEYWORD_ATOMIC: &str = "keyword_atomic"; +pub const S_KEYWORD_CASE: &str = "keyword_case"; +pub const S_KEYWORD_OVER: &str = "keyword_over"; +pub const S_KEYWORD_LOW_PRIORITY: &str = "keyword_low_priority"; +pub const S_KEYWORD_ELSE: &str = "keyword_else"; pub const S_CREATE_SCHEMA: &str = "create_schema"; -pub const S_KEYWORD_ROW: &str = "keyword_row"; -pub const S_KEYWORD_USE: &str = "keyword_use"; -pub const S__NOT_NULL: &str = "_not_null"; -pub const S_KEYWORD_NOTHING: &str = "keyword_nothing"; -pub const S_IMPLICIT_CAST: &str = "implicit_cast"; -pub const S_ROW_FORMAT: &str = "row_format"; -pub const S_KEYWORD_OVERWRITE: &str = "keyword_overwrite"; -pub const S_KEYWORD_OUTER: &str = "keyword_outer"; -pub const S_KEYWORD_UNBOUNDED: &str = "keyword_unbounded"; -pub const S__TRUNCATE_STATEMENT: &str = "_truncate_statement"; +pub const S_KEYWORD_HAVING: &str = "keyword_having"; pub const S_KEYWORD_OTHERS: &str = "keyword_others"; -pub const S_KEYWORD_CASE: &str = "keyword_case"; -pub const S_KEYWORD_TEXTFILE: &str = "keyword_textfile"; -pub const S_KEYWORD_REPLACE: &str = "keyword_replace"; -pub const S__EXCLUDE_TIES: &str = "_exclude_ties"; -pub const S_KEYWORD_TERMINATED: &str = "keyword_terminated"; -pub const S_KEYWORD_MATERIALIZED: &str = "keyword_materialized"; -pub const S_KEYWORD_CALLED: &str = "keyword_called"; -pub const S_PARTITION_BY: &str = "partition_by"; +pub const S_KEYWORD_ESCAPED: &str = "keyword_escaped"; +pub const S_DELETE: &str = "delete"; +pub const S__ROLE_OPTIONS: &str = "_role_options"; +pub const S_FUNCTION_SAFETY: &str = "function_safety"; +pub const S_KEYWORD_AVRO: &str = "keyword_avro"; pub const S__OPTIMIZE_STATEMENT: &str = "_optimize_statement"; -pub const S__CREATE_STATEMENT: &str = "_create_statement"; -pub const S__IF_EXISTS: &str = "_if_exists"; -pub const S_KEYWORD_HAVING: &str = "keyword_having"; +pub const S_KEYWORD_PRESERVE: &str = "keyword_preserve"; +pub const S__RENAME_STATEMENT: &str = "_rename_statement"; +pub const S_KEYWORD_RIGHT: &str = "keyword_right"; +pub const S_KEYWORD_HASH: &str = "keyword_hash"; +pub const S_KEYWORD_TBLPROPERTIES: &str = "keyword_tblproperties"; +pub const S_KEYWORD_INNER: &str = "keyword_inner"; +pub const S_KEYWORD_PLPGSQL: &str = "keyword_plpgsql"; +pub const S_ORDERED_COLUMN: &str = "ordered_column"; pub const S_CREATE_ROLE: &str = "create_role"; -pub const S_VALUES: &str = "values"; -pub const S_FUNCTION_ROWS: &str = "function_rows"; -pub const S_KEYWORD_SORT: &str = "keyword_sort"; -pub const S_WINDOW_SPECIFICATION: &str = "window_specification"; -pub const S__VACUUM_OPTION: &str = "_vacuum_option"; -pub const S__EXCLUDE_CURRENT_ROW: &str = "_exclude_current_row"; -pub const S_KEYWORD_RESTRICTED: &str = "keyword_restricted"; -pub const S_KEYWORD_SUPPORT: &str = "keyword_support"; -pub const S_KEYWORD_SETOF: &str = "keyword_setof"; -pub const S_KEYWORD_DELIMITED: &str = "keyword_delimited"; -pub const S_KEYWORD_INTERSECT: &str = "keyword_intersect"; -pub const S__CURRENT_ROW: &str = "_current_row"; -pub const S_FUNCTION_LEAKPROOF: &str = "function_leakproof"; -pub const S_JOIN: &str = "join"; -pub const S__COMPUTE_STATS: &str = "_compute_stats"; -pub const S_KEYWORD_RETURNING: &str = "keyword_returning"; -pub const S_KEYWORD_PARQUET: &str = "keyword_parquet"; -pub const S__WITH_SETTINGS: &str = "_with_settings"; -pub const S__USER_ACCESS_ROLE_CONFIG: &str = "_user_access_role_config"; -pub const S_KEYWORD_OPTIONS: &str = "keyword_options"; +pub const S_TABLE_PARTITION: &str = "table_partition"; +pub const S_KEYWORD_CROSS: &str = "keyword_cross"; +pub const S_KEYWORD_CONFLICT: &str = "keyword_conflict"; pub const S_SET_OPERATION: &str = "set_operation"; -pub const S__SINGLE_QUOTE_STRING: &str = "_single_quote_string"; -pub const S_KEYWORD_DELAYED: &str = "keyword_delayed"; -pub const S_DOLLAR_QUOTE: &str = "dollar_quote"; -pub const S_KEYWORD_CACHED: &str = "keyword_cached"; -pub const S_KEYWORD_EXCLUDE: &str = "keyword_exclude"; -pub const S__FUNCTION_RETURN: &str = "_function_return"; -pub const S__KEY_CONSTRAINT: &str = "_key_constraint"; -pub const S_KEYWORD_OVER: &str = "keyword_over"; +pub const S_KEYWORD_GIN: &str = "keyword_gin"; +pub const S_CTE: &str = "cte"; +pub const S__DROP_BEHAVIOR: &str = "_drop_behavior"; +pub const S__TABLE_SETTINGS: &str = "_table_settings"; +pub const S_KEYWORD_LATERAL: &str = "keyword_lateral"; +pub const S_CREATE_DATABASE: &str = "create_database"; +pub const S_RETURNING: &str = "returning"; +pub const S_KEYWORD_RETURNS: &str = "keyword_returns"; +pub const S_KEYWORD_CALLED: &str = "keyword_called"; pub const S_KEYWORD_CASCADED: &str = "keyword_cascaded"; +pub const S_KEYWORD_DELIMITED: &str = "keyword_delimited"; +pub const S_KEYWORD_COST: &str = "keyword_cost"; +pub const S_KEYWORD_SAFE: &str = "keyword_safe"; +pub const S_CROSS_JOIN: &str = "cross_join"; +pub const S_KEYWORD_LEFT: &str = "keyword_left"; +pub const S_GROUP_BY: &str = "group_by"; +pub const S_KEYWORD_SEQUENCEFILE: &str = "keyword_sequencefile"; +pub const S__INTERVAL_DEFINITION: &str = "_interval_definition"; +pub const S_KEYWORD_EXCLUDE: &str = "keyword_exclude"; +pub const S__EXCLUDE_NO_OTHERS: &str = "_exclude_no_others"; +pub const S_ENUM_ELEMENTS: &str = "enum_elements"; +pub const S__DEFAULT_NULL: &str = "_default_null"; +pub const S_LATERAL_JOIN: &str = "lateral_join"; +pub const S_KEYWORD_DELAYED: &str = "keyword_delayed"; pub const S__FUNCTION_BODY_STATEMENT: &str = "_function_body_statement"; -pub const S_EXISTS: &str = "exists"; -pub const S_KEYWORD_STABLE: &str = "keyword_stable"; -pub const S_FUNCTION_LANGUAGE: &str = "function_language"; -pub const S_KEYWORD_ROWS: &str = "keyword_rows"; +pub const S__ALTER_STATEMENT: &str = "_alter_statement"; +pub const S_FUNCTION_BODY: &str = "function_body"; +pub const S_KEYWORD_FUNCTION: &str = "keyword_function"; +pub const S__EXCLUDE_GROUP: &str = "_exclude_group"; +pub const S_KEYWORD_UNCACHED: &str = "keyword_uncached"; pub const S_CREATE_SEQUENCE: &str = "create_sequence"; -pub const S_KEYWORD_END: &str = "keyword_end"; -pub const S__VACUUM_TABLE: &str = "_vacuum_table"; -pub const S_KEYWORD_DO: &str = "keyword_do"; -pub const S_KEYWORD_AVRO: &str = "keyword_avro"; -pub const S__TABLE_SETTINGS: &str = "_table_settings"; -pub const S_KEYWORD_STRICT: &str = "keyword_strict"; +pub const S_KEYWORD_CSV: &str = "keyword_csv"; +pub const S_KEYWORD_MAX: &str = "keyword_max"; +pub const S_KEYWORD_SUPPORT: &str = "keyword_support"; pub const S_FUNCTION_COST: &str = "function_cost"; -pub const S_KEYWORD_LANGUAGE: &str = "keyword_language"; +pub const S_KEYWORD_LINES: &str = "keyword_lines"; +pub const S_FUNCTION_LEAKPROOF: &str = "function_leakproof"; +pub const S__KEY_VALUE_PAIR: &str = "_key_value_pair"; +pub const S_KEYWORD_GROUPS: &str = "keyword_groups"; +pub const S__VACUUM_OPTION: &str = "_vacuum_option"; +pub const S_KEYWORD_USE: &str = "keyword_use"; +pub const S__COMPUTE_STATS: &str = "_compute_stats"; +pub const S__EXCLUDE_TIES: &str = "_exclude_ties"; pub const S_KEYWORD_SQL: &str = "keyword_sql"; +pub const S_FUNCTION_ROWS: &str = "function_rows"; +pub const S_CREATE_TYPE: &str = "create_type"; +pub const S__POSTGRES_UPDATE_STATEMENT: &str = "_postgres_update_statement"; +pub const S_KEYWORD_CHECK: &str = "keyword_check"; +pub const S_KEYWORD_IGNORE: &str = "keyword_ignore"; +pub const S__MYSQL_UPDATE_STATEMENT: &str = "_mysql_update_statement"; +pub const S_KEYWORD_LOCATION: &str = "keyword_location"; +pub const S_KEYWORD_OUTER: &str = "keyword_outer"; +pub const S_KEYWORD_TIES: &str = "keyword_ties"; +pub const S_KEYWORD_ADMIN: &str = "keyword_admin"; +pub const S__OPTIMIZE_TABLE: &str = "_optimize_table"; +pub const S__KEY_CONSTRAINT: &str = "_key_constraint"; +pub const S_KEYWORD_DO: &str = "keyword_do"; +pub const S_KEYWORD_OPTIONS: &str = "keyword_options"; +pub const S_KEYWORD_UNION: &str = "keyword_union"; +pub const S_KEYWORD_HIGH_PRIORITY: &str = "keyword_high_priority"; +pub const S__EXCLUDE_CURRENT_ROW: &str = "_exclude_current_row"; pub const S__CTE: &str = "_cte"; -pub const S_KEYWORD_MIN: &str = "keyword_min"; +pub const S__OR_REPLACE: &str = "_or_replace"; +pub const S__ARRAY_SIZE_DEFINITION: &str = "_array_size_definition"; +pub const S_STORAGE_LOCATION: &str = "storage_location"; +pub const S_IMPLICIT_CAST: &str = "implicit_cast"; +pub const S_VALUES: &str = "values"; +pub const S_KEYWORD_END: &str = "keyword_end"; +pub const S_LATERAL_CROSS_JOIN: &str = "lateral_cross_join"; +pub const S__WITH_SETTINGS: &str = "_with_settings"; +pub const S_JOIN: &str = "join"; pub const S_KEYWORD_ORC: &str = "keyword_orc"; -pub const S__ROLE_OPTIONS: &str = "_role_options"; +pub const S_KEYWORD_JOIN: &str = "keyword_join"; +pub const S_KEYWORD_FOLLOWING: &str = "keyword_following"; +pub const S__SINGLE_QUOTE_STRING: &str = "_single_quote_string"; +pub const S__MERGE_STATEMENT: &str = "_merge_statement"; +pub const S_KEYWORD_DECLARE: &str = "keyword_declare"; +pub const S_KEYWORD_RETURNING: &str = "keyword_returning"; +pub const S_KEYWORD_MATERIALIZED: &str = "keyword_materialized"; pub const S_CREATE_VIEW: &str = "create_view"; -pub const S_CREATE_DATABASE: &str = "create_database"; -pub const S_TABLE_PARTITION: &str = "table_partition"; -pub const S_KEYWORD_HIGH_PRIORITY: &str = "keyword_high_priority"; -pub const S_KEYWORD_ELSE: &str = "keyword_else"; -pub const S_KEYWORD_BRIN: &str = "keyword_brin"; -pub const S_KEYWORD_UNCACHED: &str = "keyword_uncached"; -pub const S__RENAME_STATEMENT: &str = "_rename_statement"; -pub const S_LATERAL_JOIN: &str = "lateral_join"; -pub const S_RETURNING: &str = "returning"; -pub const S_FUNCTION_DECLARATION: &str = "function_declaration"; -pub const S__IDENTIFIER: &str = "_identifier"; -pub const S_KEYWORD_LOW_PRIORITY: &str = "keyword_low_priority"; +pub const S_KEYWORD_FORMAT: &str = "keyword_format"; +pub const S__CREATE_STATEMENT: &str = "_create_statement"; +pub const S_DOLLAR_QUOTE: &str = "dollar_quote"; +pub const S__PARTITION_SPEC: &str = "_partition_spec"; +pub const S_KEYWORD_AUTHORIZATION: &str = "keyword_authorization"; +pub const S_FUNCTION_STRICTNESS: &str = "function_strictness"; +pub const S_KEYWORD_STRICT: &str = "keyword_strict"; +pub const S_KEYWORD_SPGIST: &str = "keyword_spgist"; +pub const S_EXISTS: &str = "exists"; +pub const S_WINDOW_CLAUSE: &str = "window_clause"; +pub const S_KEYWORD_CACHED: &str = "keyword_cached"; +pub const S_KEYWORD_RECURSIVE: &str = "keyword_recursive"; +pub const S_KEYWORD_SETOF: &str = "keyword_setof"; +pub const S_KEYWORD_RANGE: &str = "keyword_range"; pub const S__DOUBLE_QUOTE_STRING: &str = "_double_quote_string"; -pub const S_FUNCTION_SUPPORT: &str = "function_support"; -pub const S__ALTER_STATEMENT: &str = "_alter_statement"; -pub const S__KEY_VALUE_PAIR: &str = "_key_value_pair"; -pub const S_KEYWORD_DECLARE: &str = "keyword_declare"; -pub const S_KEYWORD_LINES: &str = "keyword_lines"; -pub const S_KEYWORD_FUNCTION: &str = "keyword_function"; -pub const S_KEYWORD_PRECEDING: &str = "keyword_preceding"; -pub const S_KEYWORD_HASH: &str = "keyword_hash"; -pub const S__DEFAULT_NULL: &str = "_default_null"; -pub const S_CREATE_INDEX: &str = "create_index"; -pub const S_KEYWORD_FOLLOWING: &str = "keyword_following"; -pub const S_KEYWORD_LEFT: &str = "keyword_left"; +pub const S_KEYWORD_MIN: &str = "keyword_min"; pub const S__PRIMARY_KEY: &str = "_primary_key"; -pub const S_KEYWORD_SAFE: &str = "keyword_safe"; -pub const S_KEYWORD_CSV: &str = "keyword_csv"; -pub const S__COLUMN_COMMENT: &str = "_column_comment"; -pub const S_FUNCTION_STRICTNESS: &str = "function_strictness"; -pub const S_KEYWORD_JOIN: &str = "keyword_join"; -pub const S_KEYWORD_ESCAPED: &str = "keyword_escaped"; -pub const S__ALTER_SPECIFICATIONS: &str = "_alter_specifications"; -pub const S_KEYWORD_FORMAT: &str = "keyword_format"; -pub const S__INNER_DEFAULT_EXPRESSION: &str = "_inner_default_expression"; -pub const S_GROUP_BY: &str = "group_by"; -pub const S_KEYWORD_VOLATILE: &str = "keyword_volatile"; -pub const S__EXCLUDE_NO_OTHERS: &str = "_exclude_no_others"; -pub const S_KEYWORD_REPLICATION: &str = "keyword_replication"; -pub const S_INDEX_HINT: &str = "index_hint"; -pub const S_KEYWORD_ATOMIC: &str = "keyword_atomic"; -pub const S_FUNCTION_SAFETY: &str = "function_safety"; -pub const S_KEYWORD_CONFLICT: &str = "keyword_conflict"; -pub const S_TABLE_SORT: &str = "table_sort"; -pub const S__IF_NOT_EXISTS: &str = "_if_not_exists"; -pub const S_KEYWORD_PRESERVE: &str = "keyword_preserve"; -pub const S_KEYWORD_MAX: &str = "keyword_max"; +pub const S_PARTITION_BY: &str = "partition_by"; +pub const S_KEYWORD_STABLE: &str = "keyword_stable"; +pub const S_KEYWORD_WINDOW: &str = "keyword_window"; +pub const S_KEYWORD_IMMUTABLE: &str = "keyword_immutable"; +pub const S__FUNCTION_RETURN: &str = "_function_return"; pub const S_KEYWORD_JSONFILE: &str = "keyword_jsonfile"; -pub const S__RENAME_TABLE_NAMES: &str = "_rename_table_names"; -pub const S__EXCLUDE_GROUP: &str = "_exclude_group"; -pub const S_KEYWORD_INNER: &str = "keyword_inner"; -pub const S_ENUM_ELEMENTS: &str = "enum_elements"; -pub const S_KEYWORD_GIN: &str = "keyword_gin"; -pub const S_KEYWORD_IGNORE: &str = "keyword_ignore"; -pub const S_KEYWORD_CHECK: &str = "keyword_check"; -pub const S_KEYWORD_LATERAL: &str = "keyword_lateral"; -pub const S_KEYWORD_AVG: &str = "keyword_avg"; -pub const S_KEYWORD_RETURN: &str = "keyword_return"; -pub const S__CONSTRAINT_LITERAL: &str = "_constraint_literal"; -pub const S_KEYWORD_TBLPROPERTIES: &str = "keyword_tblproperties"; -pub const S_KEYWORD_RIGHT: &str = "keyword_right"; -pub const S__DEFAULT_EXPRESSION: &str = "_default_expression"; -pub const S_KEYWORD_BTREE: &str = "keyword_btree"; -pub const S_KEYWORD_SEQUENCEFILE: &str = "keyword_sequencefile"; -pub const S__CHECK_OPTION: &str = "_check_option"; -pub const S__ARRAY_SIZE_DEFINITION: &str = "_array_size_definition"; -pub const S_STORAGE_LOCATION: &str = "storage_location"; -pub const S_CREATE_TYPE: &str = "create_type"; -pub const S_WINDOW_FUNCTION: &str = "window_function"; +pub const S_KEYWORD_PARTITIONED: &str = "keyword_partitioned"; +pub const S_KEYWORD_SORT: &str = "keyword_sort"; +pub const S__COLUMN_COMMENT: &str = "_column_comment"; +pub const S_KEYWORD_PRECEDING: &str = "keyword_preceding"; +pub const S__IF_EXISTS: &str = "_if_exists"; +pub const S_KEYWORD_GIST: &str = "keyword_gist"; pub const S_KEYWORD_SELECT: &str = "keyword_select"; pub const S_KEYWORD_DELETE: &str = "keyword_delete"; pub const S_KEYWORD_INSERT: &str = "keyword_insert"; @@ -409,8 +409,8 @@ pub const S_KEYWORD_REAL: &str = "keyword_real"; pub const S_KEYWORD_CHAR: &str = "keyword_char"; pub const S_KEYWORD_VARCHAR: &str = "keyword_varchar"; pub const S_KEYWORD_TIME: &str = "keyword_time"; -pub const S_KEYWORD_TIMESTAMP: &str = "keyword_timestamp"; -pub const S_KEYWORD_TIMESTAMPTZ: &str = "keyword_timestamptz"; +pub const S_KEYWORD_TIMESTAMP_BASE: &str = "keyword_timestamp_base"; +pub const S_KEYWORD_TIMESTAMPTZ_BASE: &str = "keyword_timestamptz_base"; pub const S_DATA_TYPE: &str = "data_type"; pub const S_DATA_TYPE_KIND: &str = "data_type_kind"; pub const S_ARRAY_SIZE_DEFINITION: &str = "array_size_definition"; @@ -432,6 +432,8 @@ pub const S_NCHAR: &str = "nchar"; pub const S_NVARCHAR: &str = "nvarchar"; pub const S_DATETIMEOFFSET: &str = "datetimeoffset"; pub const S_TIME: &str = "time"; +pub const S_TIMESTAMP: &str = "timestamp"; +pub const S_TIMESTAMPTZ: &str = "timestamptz"; pub const S_ENUM: &str = "enum"; pub const S_ARRAY: &str = "array"; pub const S_COMMENT: &str = "comment"; diff --git a/sql_parser/src/ts_const/ts_seq_index.rs b/sql_parser/src/ts_const/ts_seq_index.rs index c8284e9..06ce59d 100644 --- a/sql_parser/src/ts_const/ts_seq_index.rs +++ b/sql_parser/src/ts_const/ts_seq_index.rs @@ -897,15 +897,15 @@ pub const JOIN_SEQ_CHOICE_SEQ_FIELD: usize = 1; pub const JOIN_SEQ_CHOICE_SEQ_SYMBOL: usize = 0; pub const JOIN_SEQ_SYMBOL_1: usize = 1; pub const JOIN_SEQ_SYMBOL_2: usize = 2; -pub const KEYWORD_TIMESTAMP_PREC_RIGHT_SEQ_CHOICE: usize = 1; -pub const KEYWORD_TIMESTAMP_PREC_RIGHT_SEQ_CHOICE_SEQ_PATTERN_0: usize = 0; -pub const KEYWORD_TIMESTAMP_PREC_RIGHT_SEQ_CHOICE_SEQ_PATTERN_1: usize = 1; -pub const KEYWORD_TIMESTAMP_PREC_RIGHT_SEQ_CHOICE_SEQ_PATTERN_2: usize = 2; -pub const KEYWORD_TIMESTAMP_PREC_RIGHT_SEQ_PATTERN: usize = 0; -pub const KEYWORD_TIMESTAMPTZ_CHOICE_SEQ_PATTERN_0: usize = 0; -pub const KEYWORD_TIMESTAMPTZ_CHOICE_SEQ_PATTERN_1: usize = 1; -pub const KEYWORD_TIMESTAMPTZ_CHOICE_SEQ_PATTERN_2: usize = 2; -pub const KEYWORD_TIMESTAMPTZ_CHOICE_SEQ_PATTERN_3: usize = 3; +pub const KEYWORD_TIMESTAMP_BA_PREC_RIGHT_SEQ_CHOICE: usize = 1; +pub const KEYWORD_TIMESTAMP_BA_PREC_RIGHT_SEQ_CHOICE_SEQ_PATTERN_0: usize = 0; +pub const KEYWORD_TIMESTAMP_BA_PREC_RIGHT_SEQ_CHOICE_SEQ_PATTERN_1: usize = 1; +pub const KEYWORD_TIMESTAMP_BA_PREC_RIGHT_SEQ_CHOICE_SEQ_PATTERN_2: usize = 2; +pub const KEYWORD_TIMESTAMP_BA_PREC_RIGHT_SEQ_PATTERN: usize = 0; +pub const KEYWORD_TIMESTAMPTZ__CHOICE_SEQ_PATTERN_0: usize = 0; +pub const KEYWORD_TIMESTAMPTZ__CHOICE_SEQ_PATTERN_1: usize = 1; +pub const KEYWORD_TIMESTAMPTZ__CHOICE_SEQ_PATTERN_2: usize = 2; +pub const KEYWORD_TIMESTAMPTZ__CHOICE_SEQ_PATTERN_3: usize = 3; pub const KEYWORD_VARCHAR_CHOICE_SEQ_PATTERN: usize = 0; pub const KEYWORD_VARCHAR_CHOICE_SEQ_SYMBOL: usize = 1; pub const LATERAL_CROSS_JOIN_SEQ_CHOICE_3: usize = 3; @@ -1143,6 +1143,18 @@ pub const TIME_PREC_RIGHT_CHOICE_SEQ_SEQ_SEQ_FIELD: usize = 0; pub const TIME_PREC_RIGHT_CHOICE_SEQ_SEQ_STRING_0: usize = 0; pub const TIME_PREC_RIGHT_CHOICE_SEQ_SEQ_STRING_2: usize = 2; pub const TIME_PREC_RIGHT_CHOICE_SEQ_SYMBOL: usize = 0; +pub const TIMESTAMP_PREC_RIGHT_CHOICE_SEQ_SEQ: usize = 1; +pub const TIMESTAMP_PREC_RIGHT_CHOICE_SEQ_SEQ_SEQ: usize = 1; +pub const TIMESTAMP_PREC_RIGHT_CHOICE_SEQ_SEQ_SEQ_FIELD: usize = 0; +pub const TIMESTAMP_PREC_RIGHT_CHOICE_SEQ_SEQ_STRING_0: usize = 0; +pub const TIMESTAMP_PREC_RIGHT_CHOICE_SEQ_SEQ_STRING_2: usize = 2; +pub const TIMESTAMP_PREC_RIGHT_CHOICE_SEQ_SYMBOL: usize = 0; +pub const TIMESTAMPTZ_PREC_RIGHT_CHOICE_SEQ_SEQ: usize = 1; +pub const TIMESTAMPTZ_PREC_RIGHT_CHOICE_SEQ_SEQ_SEQ: usize = 1; +pub const TIMESTAMPTZ_PREC_RIGHT_CHOICE_SEQ_SEQ_SEQ_FIELD: usize = 0; +pub const TIMESTAMPTZ_PREC_RIGHT_CHOICE_SEQ_SEQ_STRING_0: usize = 0; +pub const TIMESTAMPTZ_PREC_RIGHT_CHOICE_SEQ_SEQ_STRING_2: usize = 2; +pub const TIMESTAMPTZ_PREC_RIGHT_CHOICE_SEQ_SYMBOL: usize = 0; pub const TYPED_ROW_VALUE_EXPR_SEQ_FIELD: usize = 0; pub const TYPED_ROW_VALUE_EXPR_SEQ_REPEAT: usize = 1; pub const TYPED_ROW_VALUE_EXPR_SEQ_REPEAT_SEQ_FIELD: usize = 1; diff --git a/sql_parser/ts_const_gen/grammar.md5.txt b/sql_parser/ts_const_gen/grammar.md5.txt index 26ea37d..686fbc5 100644 --- a/sql_parser/ts_const_gen/grammar.md5.txt +++ b/sql_parser/ts_const_gen/grammar.md5.txt @@ -1 +1 @@ -e5bfe66b90c5e50ab4fd94f715c610d3 \ No newline at end of file +6178c6346dc9e7347e9d620a5f2d5517 \ No newline at end of file diff --git a/testing/Cargo.toml b/testing/Cargo.toml index f02f9f1..c474d3c 100644 --- a/testing/Cargo.toml +++ b/testing/Cargo.toml @@ -15,5 +15,4 @@ tokio = { workspace = true } reqwest = { workspace = true } serde_json = { workspace = true } base64 = { workspace = true } -libsql = { version = "0.9.24" } tracing = { workspace = true } diff --git a/testing/mpk/wallet.mpk b/testing/mpk/wallet.mpk index eabf87a..5858a2a 100644 Binary files a/testing/mpk/wallet.mpk and b/testing/mpk/wallet.mpk differ diff --git a/testing/src/lib.rs b/testing/src/lib.rs index f75e390..41859fa 100644 --- a/testing/src/lib.rs +++ b/testing/src/lib.rs @@ -28,7 +28,7 @@ pub fn wait_until_port_ready(port: u16, service_name: &str) -> RS<()> { if TcpStream::connect(("127.0.0.1", port)).is_ok() { return Ok(()); } - mudu_sys::task::sleep_blocking(Duration::from_millis(25)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(25)); } Err(mudu::m_error!( mudu::error::ec::EC::NetErr, @@ -47,7 +47,7 @@ pub fn connect_sync_client_with_retry(port: u16) -> RS { Ok(client) => return Ok(client), Err(err) => { last_err = Some(err); - mudu_sys::task::sleep_blocking(Duration::from_millis(50)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(50)); } } } diff --git a/testing/tests/linux/test_tpcc_concurrent_procedure.rs b/testing/tests/linux/test_tpcc_concurrent_procedure.rs index e04264c..cc56e53 100644 --- a/testing/tests/linux/test_tpcc_concurrent_procedure.rs +++ b/testing/tests/linux/test_tpcc_concurrent_procedure.rs @@ -10,30 +10,67 @@ use mudu_contract::tuple::tuple_datum::TupleDatum; use mudu_runtime::backend::backend::Backend; use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, RoutingMode, ServerMode}; use mudu_runtime::service::runtime_opt::ComponentTarget; -use mudu_utils::log::log_setup; -use mudu_utils::notifier::{Notifier, notify_wait}; +use mudu_utils::debug::debug_serve; +use mudu_utils::log::log_setup_ex; +use mudu_utils::notifier::{Notifier, NotifyWait, Waiter, notify_wait}; use std::fs; use std::path::{Path, PathBuf}; +use std::sync::{LazyLock, Mutex, Once}; use std::thread::{self, JoinHandle}; use std::time::Instant; use testing::{reserve_port, wait_until_port_ready}; use tokio::sync::mpsc; use tokio::time::{Duration, timeout}; use tracing::{debug, info}; -use mudu_utils::debug::debug_serve; + +static TPCC_BENCH_TEST_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); +static TPCC_DEBUG_SERVER_ONCE: Once = Once::new(); + +fn setup_tpcc_test_log(level: &str) { + let parse = std::env::var("TPCC_TEST_LOG_FILTER").unwrap_or_else(|_| { + "testing=trace,mudu=trace,mudu_api=trace,mudu_binding=trace,mudu_cli=trace,mudu_contract=trace,mudu_kernel=trace,mudu_runtime=trace,mudu_sys=trace,mudu_utils=trace".to_string() + }); + log_setup_ex(level, &parse, false); +} + +fn ensure_tpcc_debug_server() { + let port = read_env_u16("TPCC_DEBUG_PORT", 1801); + TPCC_DEBUG_SERVER_ONCE.call_once(|| { + let _ = thread::spawn(move || { + debug_serve( + NotifyWait::new_with_name("tpcc-debug-server".to_string()), + port, + ); + }); + }); + info!(port, "tpcc debug server available"); +} #[test] fn tpcc_procedure_concurrent_terminals_metrics() -> RS<()> { let log_level = std::env::var("TPCC_TEST_LOG_LEVEL").unwrap_or_else(|_| "info".to_string()); - log_setup(&log_level); - if !mudu_sys::io_uring_available() { + setup_tpcc_test_log(&log_level); + if !supports_server_mode(ServerMode::IOUring) { info!("skip tpcc concurrent test: io_uring unavailable"); return Ok(()); } info!("enable tpcc concurrent test: io_uring available"); - let _ = thread::spawn(move || { - debug_serve(Default::default(), 1801); - }); + run_tpcc_procedure_concurrent_terminals_metrics(ServerMode::IOUring) +} + +#[test] +fn tpcc_procedure_concurrent_terminals_metrics_tokio() -> RS<()> { + let log_level = std::env::var("TPCC_TEST_LOG_LEVEL").unwrap_or_else(|_| "info".to_string()); + setup_tpcc_test_log(&log_level); + run_tpcc_procedure_concurrent_terminals_metrics(ServerMode::Tokio) +} + +fn run_tpcc_procedure_concurrent_terminals_metrics(server_mode: ServerMode) -> RS<()> { + let _guard = TPCC_BENCH_TEST_LOCK + .lock() + .expect("tpcc benchmark test lock poisoned"); + let log_level = std::env::var("TPCC_TEST_LOG_LEVEL").unwrap_or_else(|_| "info".to_string()); + ensure_tpcc_debug_server(); info!(log_level = %log_level, "starting tpcc concurrent procedure test"); @@ -60,18 +97,27 @@ fn tpcc_procedure_concurrent_terminals_metrics() -> RS<()> { }; debug!(mpk_path = %mpk_path.display(), "resolved tpcc mpk path"); - let Some(ctx) = TestContext::new(ServerMode::IOUring)? else { + let Some(ctx) = TestContext::new(server_mode)? else { eprintln!("skip tpcc concurrent test: local TCP/HTTP bind is not permitted"); return Ok(()); }; - let _server = ctx.start_server()?; + let server = ctx.start_server()?; let runtime = tokio::runtime::Builder::new_current_thread() .enable_all() .build() .map_err(|e| m_error!(mudu::error::ec::EC::IOErr, "build tokio runtime error", e))?; - runtime.block_on(run_benchmark(&ctx, &cfg, &mpk_path)) + let result = runtime.block_on(run_benchmark(&ctx, &cfg, &mpk_path)); + drop(server); + result +} + +fn supports_server_mode(server_mode: ServerMode) -> bool { + match server_mode { + ServerMode::IOUring => mudu_sys::io_uring_available(), + ServerMode::Legacy | ServerMode::Tokio => true, + } } async fn run_benchmark(ctx: &TestContext, cfg: &TpccBenchCfg, mpk_path: &Path) -> RS<()> { @@ -176,9 +222,11 @@ async fn run_benchmark(ctx: &TestContext, cfg: &TpccBenchCfg, mpk_path: &Path) - let mut latency_us = Vec::with_capacity(total_ops); let mut committed = 0usize; let mut new_order_committed = 0usize; + let mut aborted = 0usize; for report in reports { committed += report.committed; new_order_committed += report.new_order_committed; + aborted += report.aborted; latency_us.extend(report.latency_us); } @@ -189,16 +237,35 @@ async fn run_benchmark(ctx: &TestContext, cfg: &TpccBenchCfg, mpk_path: &Path) - } else { 0.0 }; + let tps = if elapsed_secs > 0.0 { + committed as f64 / elapsed_secs + } else { + 0.0 + }; let tpmc = if elapsed_secs > 0.0 { new_order_committed as f64 * 60.0 / elapsed_secs } else { 0.0 }; + let tpsc = if elapsed_secs > 0.0 { + new_order_committed as f64 / elapsed_secs + } else { + 0.0 + }; let p99_ms = percentile_ms(&mut latency_us, 99.0); println!( - "tpcc concurrent benchmark: terminals={} ops_per_terminal={} total_committed={} elapsed={:.3}s tpm={:.2} tpmc={:.2} p99_latency_ms={:.3}", - cfg.terminals, cfg.operations_per_terminal, committed, elapsed_secs, tpm, tpmc, p99_ms + "tpcc concurrent benchmark: terminals={} ops_per_terminal={} total_committed={} total_aborted={} elapsed={:.3}s tps={:.2} tpsc={:.2} tpm={:.2} tpmc={:.2} p99_latency_ms={:.3}", + cfg.terminals, + cfg.operations_per_terminal, + committed, + aborted, + elapsed_secs, + tps, + tpsc, + tpm, + tpmc, + p99_ms ); Ok(()) @@ -206,6 +273,7 @@ async fn run_benchmark(ctx: &TestContext, cfg: &TpccBenchCfg, mpk_path: &Path) - async fn seed_tpcc(ctx: &TestContext, cfg: &TpccBenchCfg) -> RS<()> { let addr = format!("127.0.0.1:{}", ctx.client_port()); + info!(addr = %addr, "tpcc seed connecting client"); let mut client = timeout( Duration::from_millis(cfg.invoke_timeout_ms), AsyncClientImpl::connect(&addr), @@ -218,6 +286,7 @@ async fn seed_tpcc(ctx: &TestContext, cfg: &TpccBenchCfg) -> RS<()> { ) })? .map_err(|e| m_error!(mudu::error::ec::EC::NetErr, "connect seed client error", e))?; + info!("tpcc seed client connected"); let session_id = timeout( Duration::from_millis(cfg.invoke_timeout_ms), client.create_session(mudu_contract::protocol::SessionCreateRequest::new(None)), @@ -226,8 +295,9 @@ async fn seed_tpcc(ctx: &TestContext, cfg: &TpccBenchCfg) -> RS<()> { .map_err(|_| m_error!(mudu::error::ec::EC::NetErr, "seed create_session timeout"))? .map_err(|e| m_error!(mudu::error::ec::EC::NetErr, "create seed session error", e))? .session_id(); - debug!(session_id = %session_id, "seed session created"); + info!(session_id = %session_id, "tpcc seed session created"); + info!("tpcc seed invoke begin"); invoke_void( &mut client, session_id, @@ -241,12 +311,14 @@ async fn seed_tpcc(ctx: &TestContext, cfg: &TpccBenchCfg) -> RS<()> { ), ) .await?; + info!("tpcc seed invoke finished"); let _ = client .close_session(mudu_contract::protocol::SessionCloseRequest::new( session_id, )) .await; + info!(session_id = %session_id, "tpcc seed session closed"); Ok(()) } @@ -298,6 +370,7 @@ async fn run_terminal( let mut report = TerminalReport { committed: 0, new_order_committed: 0, + aborted: 0, latency_us: Vec::with_capacity(cfg.operations_per_terminal), }; @@ -321,11 +394,11 @@ async fn run_terminal( ); } - match op { + let op_result: RS<()> = match op { TpccOp::NewOrder => { let (item_ids, supplier_warehouse_ids, quantities) = new_order_lines(global_idx, warehouse_id, cfg.warehouses, cfg.items); - let _: String = timeout( + let invoke_result = timeout( Duration::from_millis(cfg.invoke_timeout_ms), invoke_typed( &mut client, @@ -350,11 +423,14 @@ async fn run_terminal( terminal_id, op_idx, global_idx ) ) - })??; - report.new_order_committed += 1; + })?; + if invoke_result.is_ok() { + report.new_order_committed += 1; + } + invoke_result.map(|_: String| ()) } TpccOp::Payment => { - let _: i32 = timeout( + let invoke_result = timeout( Duration::from_millis(cfg.invoke_timeout_ms), invoke_typed( &mut client, @@ -372,10 +448,11 @@ async fn run_terminal( terminal_id, op_idx, global_idx ) ) - })??; + })?; + invoke_result.map(|_: i32| ()) } TpccOp::OrderStatus => { - let _: String = timeout( + let invoke_result = timeout( Duration::from_millis(cfg.invoke_timeout_ms), invoke_typed( &mut client, @@ -393,10 +470,11 @@ async fn run_terminal( terminal_id, op_idx, global_idx ) ) - })??; + })?; + invoke_result.map(|_: String| ()) } TpccOp::Delivery => { - let _: String = timeout( + let invoke_result = timeout( Duration::from_millis(cfg.invoke_timeout_ms), invoke_typed( &mut client, @@ -414,10 +492,11 @@ async fn run_terminal( terminal_id, op_idx, global_idx ) ) - })??; + })?; + invoke_result.map(|_: String| ()) } TpccOp::StockLevel => { - let _: i32 = timeout( + let invoke_result = timeout( Duration::from_millis(cfg.invoke_timeout_ms), invoke_typed( &mut client, @@ -435,8 +514,27 @@ async fn run_terminal( terminal_id, op_idx, global_idx ) ) - })??; + })?; + invoke_result.map(|_: i32| ()) } + }; + + if let Err(err) = op_result { + if is_retryable_abort(&err) { + report.aborted += 1; + if cfg.trace_ops { + debug!( + terminal_id, + op_idx, + global_idx, + op = op_name(op), + err = %err, + "invoke aborted" + ); + } + continue; + } + return Err(err); } report.committed += 1; @@ -549,7 +647,7 @@ impl TpccBenchCfg { fn from_env() -> Self { Self { terminals: read_env_usize("TPCC_TERMINALS", 2), - operations_per_terminal: read_env_usize("TPCC_OPS_PER_TERMINAL", 20), + operations_per_terminal: read_env_usize("TPCC_OPS_PER_TERMINAL", 2), warehouses: read_env_i32("TPCC_WAREHOUSES", 1), districts_per_warehouse: read_env_i32("TPCC_DISTRICTS_PER_WAREHOUSE", 2), customers_per_district: read_env_i32("TPCC_CUSTOMERS_PER_DISTRICT", 20), @@ -688,6 +786,14 @@ fn read_env_u64(key: &str, default: u64) -> u64 { .unwrap_or(default) } +fn read_env_u16(key: &str, default: u16) -> u16 { + std::env::var(key) + .ok() + .and_then(|v| v.parse::().ok()) + .filter(|v| *v > 0) + .unwrap_or(default) +} + fn read_env_bool(key: &str, default: bool) -> bool { std::env::var(key) .ok() @@ -699,9 +805,21 @@ fn read_env_bool(key: &str, default: bool) -> bool { .unwrap_or(default) } +fn is_retryable_abort(err: &mudu::error::err::MError) -> bool { + if err.ec() == mudu::error::ec::EC::TxErr && err.message().contains("write-write conflict") { + return true; + } + match err.err_src() { + mudu::error::err::ErrorSource::MError(src) => is_retryable_abort(&src), + mudu::error::err::ErrorSource::Other(msg) => msg.contains("write-write conflict"), + mudu::error::err::ErrorSource::None => false, + } +} + struct TerminalReport { committed: usize, new_order_committed: usize, + aborted: usize, latency_us: Vec, } @@ -712,6 +830,7 @@ struct RunningServer { impl Drop for RunningServer { fn drop(&mut self) { + info!("tpcc test dropping running server"); self.stop.notify_all(); if let Some(handle) = self.handle.take() { let join_result = handle.join().expect("join io_uring server thread"); @@ -719,6 +838,7 @@ impl Drop for RunningServer { panic!("io_uring server stopped with error: {err}"); } } + info!("tpcc test dropped running server"); } } @@ -769,11 +889,15 @@ impl TestContext { fn start_server(&self) -> RS { let cfg = self.build_cfg(); let (stop, waiter) = notify_wait(); - let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); + let (ready, ready_waiter) = notify_wait(); + let handle = thread::spawn(move || { + Backend::sync_serve_with_stop_and_ready(cfg, waiter, Some(ready)) + }); wait_until_port_ready(self.http_port, "HTTP")?; - if self.server_mode == ServerMode::IOUring { + if matches!(self.server_mode, ServerMode::IOUring | ServerMode::Tokio) { wait_until_port_ready(self.tcp_port, "TCP")?; } + wait_until_backend_ready(ready_waiter, "backend")?; Ok(RunningServer { stop, handle: Some(handle), @@ -804,7 +928,7 @@ impl TestContext { fn client_port(&self) -> u16 { match self.server_mode { ServerMode::Legacy => self.pg_port, - ServerMode::IOUring => self.tcp_port, + ServerMode::IOUring | ServerMode::Tokio => self.tcp_port, } } } @@ -821,3 +945,25 @@ fn workspace_root() -> PathBuf { .expect("testing crate has workspace root parent") .to_path_buf() } + +fn wait_until_backend_ready(waiter: Waiter, service_name: &str) -> RS<()> { + // Benchmarks should not start until the backend reports logical readiness; + // a live listener can still be ahead of worker recovery in io_uring mode. + let result = mudu_sys::task_async::block_on_tokio_current_thread(async move { + tokio::time::timeout(Duration::from_secs(10), waiter.wait()).await + }) + .map_err(|e| { + m_error!( + mudu::error::ec::EC::TokioErr, + format!("wait for {} ready barrier runtime error", service_name), + e + ) + })?; + result.map_err(|_| { + m_error!( + mudu::error::ec::EC::TokioErr, + format!("{} ready barrier timed out", service_name) + ) + })?; + Ok(()) +} diff --git a/testing/tests/linux/wallet_mpk.rs b/testing/tests/linux/wallet_mpk.rs index bc55e42..c192337 100644 --- a/testing/tests/linux/wallet_mpk.rs +++ b/testing/tests/linux/wallet_mpk.rs @@ -1,10 +1,10 @@ #![cfg(target_os = "linux")] use base64::Engine; -use libsql::{Builder, Value as LibsqlValue, params}; use mudu::common::result::RS; use mudu_binding::procedure::procedure_invoke; use mudu_cli::client::async_client::{AsyncClient, AsyncClientImpl}; +use mudu_cli::client::client::SyncClient; use mudu_cli::management::{fetch_server_topology, install_app_package}; use mudu_contract::procedure::procedure_param::ProcedureParam; use mudu_contract::tuple::tuple_datum::TupleDatum; @@ -12,21 +12,36 @@ use mudu_runtime::backend::backend::Backend; use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, RoutingMode, ServerMode}; use mudu_runtime::service::runtime_opt::ComponentTarget; use mudu_utils::log::log_setup; -use mudu_utils::notifier::{Notifier, notify_wait}; +use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use serde_json::{Value, json}; use std::fs; use std::path::{Path, PathBuf}; +use std::sync::{LazyLock, Mutex}; use std::thread::{self, JoinHandle}; use testing::{reserve_port, wait_until_port_ready}; use tracing::info; +static WALLET_MPK_TEST_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + #[test] fn wallet_mpk_http_end_to_end() -> RS<()> { - let Some(ctx) = TestContext::new(ServerMode::Legacy)? else { + run_wallet_mpk_http_end_to_end(ServerMode::Legacy) +} + +#[test] +fn wallet_mpk_http_end_to_end_tokio() -> RS<()> { + run_wallet_mpk_http_end_to_end(ServerMode::Tokio) +} + +fn run_wallet_mpk_http_end_to_end(server_mode: ServerMode) -> RS<()> { + let _guard = WALLET_MPK_TEST_LOCK + .lock() + .expect("wallet mpk test lock poisoned"); + let Some(ctx) = TestContext::new(server_mode)? else { eprintln!("skip wallet HTTP io_uring test: local TCP/HTTP bind is not permitted"); return Ok(()); }; - let _server = ctx.start_server()?; + let server = ctx.start_server()?; let mpk_binary = fs::read(ctx.wallet_mpk_path()).expect("read wallet.mpk"); let install_response = ctx.post_json( @@ -86,52 +101,48 @@ fn wallet_mpk_http_end_to_end() -> RS<()> { )?; assert_eq!(transfer, json!({ "return_list": [] })); - assert_eq!( - ctx.query_i64("SELECT COUNT(*) FROM users WHERE user_id = 3")?, - 1 - ); - assert_eq!( - ctx.query_string("SELECT name FROM users WHERE user_id = 3")?, - "Carol" - ); - assert_eq!( - ctx.query_i64("SELECT balance FROM wallets WHERE user_id = 1")?, - 9750 - ); - assert_eq!( - ctx.query_i64("SELECT balance FROM wallets WHERE user_id = 2")?, - 10500 - ); - assert_eq!( - ctx.query_i64( - "SELECT COUNT(*) FROM transactions WHERE trans_type = 'DEPOSIT' AND to_user = 1 AND amount = 250" - )?, - 1 - ); - assert_eq!( - ctx.query_i64( - "SELECT COUNT(*) FROM transactions WHERE from_user = 1 AND to_user = 2 AND amount = 500" - )?, - 1 - ); + if matches!(server_mode, ServerMode::Legacy) { + drop(server); + return Ok(()); + } + assert!(ctx.user_exists("wallet", 3)?); + assert_eq!(ctx.user_name("wallet", 3)?, "Carol"); + assert_eq!(ctx.wallet_balance("wallet", 1)?, 9750); + assert_eq!(ctx.wallet_balance("wallet", 2)?, 10500); + assert_eq!(ctx.deposit_transaction_count("wallet", 1, 250)?, 1); + assert_eq!(ctx.transfer_transaction_count("wallet", 1, 2, 500)?, 1); + + drop(server); Ok(()) } #[test] fn wallet_mpk_via_mudu_cli_library() -> RS<()> { log_setup("info"); - if !mudu_sys::io_uring_available() { + if !supports_server_mode(ServerMode::IOUring) { info!("skip wallet mudu_cli io_uring test: io_uring unavailable"); return Ok(()); } info!("enable wallet mudu_cli io_uring test: io_uring available"); + run_wallet_mpk_via_mudu_cli_library_for_mode(ServerMode::IOUring) +} + +#[test] +fn wallet_mpk_via_mudu_cli_library_tokio() -> RS<()> { + log_setup("info"); + run_wallet_mpk_via_mudu_cli_library_for_mode(ServerMode::Tokio) +} - let Some(ctx) = TestContext::new(ServerMode::IOUring)? else { +fn run_wallet_mpk_via_mudu_cli_library_for_mode(server_mode: ServerMode) -> RS<()> { + let _guard = WALLET_MPK_TEST_LOCK + .lock() + .expect("wallet mpk test lock poisoned"); + let Some(ctx) = TestContext::new(server_mode)? else { eprintln!("skip wallet mudu_cli io_uring test: local TCP/HTTP bind is not permitted"); return Ok(()); }; - let _server = ctx.start_server()?; + let server = ctx.start_server()?; let runtime = tokio::runtime::Builder::new_current_thread() .enable_all() @@ -185,49 +196,27 @@ fn wallet_mpk_via_mudu_cli_library() -> RS<()> { "wallet/wallet/delete_user", (4i32,), )?; + assert!(!user_exists_via_client(&runtime, &mut client, "wallet", 4)?); + assert!(!wallet_exists_via_client( + &runtime, + &mut client, + "wallet", + 4 + )?); + assert!(user_exists_via_client(&runtime, &mut client, "wallet", 1)?); assert_eq!( - query_row_count_via_client( - &runtime, - &mut client, - "wallet", - "SELECT user_id FROM users WHERE user_id = 4", - )?, - 0 - ); - assert_eq!( - query_row_count_via_client( - &runtime, - &mut client, - "wallet", - "SELECT user_id FROM wallets WHERE user_id = 4", - )?, - 0 - ); - assert_eq!( - query_row_count_via_client( - &runtime, - &mut client, - "wallet", - "SELECT user_id FROM users WHERE user_id = 1", - )?, - 1 - ); - assert_eq!( - query_i64_via_client( - &runtime, - &mut client, - "wallet", - "SELECT balance FROM wallets WHERE user_id = 1", - )?, + wallet_balance_via_client(&runtime, &mut client, "wallet", 1)?, 10000 ); assert_eq!( - query_row_count_via_client( + query_backend_via_client( &runtime, &mut client, "wallet", "SELECT trans_id FROM transactions" - )?, + )? + .rows() + .len(), 0 ); assert!( @@ -241,9 +230,17 @@ fn wallet_mpk_via_mudu_cli_library() -> RS<()> { .closed() ); + drop(server); Ok(()) } +fn supports_server_mode(server_mode: ServerMode) -> bool { + match server_mode { + ServerMode::IOUring => mudu_sys::io_uring_available(), + ServerMode::Legacy | ServerMode::Tokio => true, + } +} + fn invoke_void( runtime: &tokio::runtime::Runtime, client: &mut AsyncClientImpl, @@ -267,50 +264,70 @@ fn invoke_void( Ok(()) } -fn query_i64_via_client( +fn query_backend_via_client( runtime: &tokio::runtime::Runtime, client: &mut AsyncClientImpl, app_name: &str, sql: &str, -) -> RS { - let response = runtime +) -> RS { + runtime .block_on(client.query(mudu_contract::protocol::ClientRequest::new( app_name.to_string(), sql.to_string(), ))) - .map_err(|e| to_mudu_error(e.to_string()))?; - let value = response + .map_err(|e| to_mudu_error(e.to_string())) +} + +fn user_exists_via_client( + runtime: &tokio::runtime::Runtime, + client: &mut AsyncClientImpl, + app_name: &str, + user_id: i32, +) -> RS { + let response = + query_backend_via_client(runtime, client, app_name, "SELECT user_id FROM users")?; + Ok(response .rows() - .first() - .and_then(|row| row.values().first()) - .ok_or_else(|| to_mudu_error("query returned no rows".to_string()))?; - if let Some(v) = value.as_i64() { - Ok(*v) - } else if let Some(v) = value.as_i32() { - Ok(*v as i64) - } else if let Some(v) = value.as_string() { - v.parse::() - .map_err(|e| to_mudu_error(format!("parse integer result error: {e}"))) - } else { - Err(to_mudu_error( - "query returned non-integer value".to_string(), - )) - } + .iter() + .filter(|row| row_i32(row, 0) == Some(user_id)) + .count() + > 0) } -fn query_row_count_via_client( +fn wallet_exists_via_client( runtime: &tokio::runtime::Runtime, client: &mut AsyncClientImpl, app_name: &str, - sql: &str, -) -> RS { - let response = runtime - .block_on(client.query(mudu_contract::protocol::ClientRequest::new( - app_name.to_string(), - sql.to_string(), - ))) - .map_err(|e| to_mudu_error(e.to_string()))?; - Ok(response.rows().len()) + user_id: i32, +) -> RS { + let response = + query_backend_via_client(runtime, client, app_name, "SELECT user_id FROM wallets")?; + Ok(response + .rows() + .iter() + .filter(|row| row_i32(row, 0) == Some(user_id)) + .count() + > 0) +} + +fn wallet_balance_via_client( + runtime: &tokio::runtime::Runtime, + client: &mut AsyncClientImpl, + app_name: &str, + user_id: i32, +) -> RS { + let response = query_backend_via_client( + runtime, + client, + app_name, + "SELECT user_id, balance FROM wallets", + )?; + response + .rows() + .iter() + .find(|row| row_i32(row, 0) == Some(user_id)) + .and_then(|row| row_i64(row, 1)) + .ok_or_else(|| to_mudu_error(format!("wallet balance not found for user_id={user_id}"))) } fn serialize_param(tuple: T) -> RS> { @@ -323,6 +340,32 @@ fn to_mudu_error(message: String) -> mudu::error::err::MError { mudu::m_error!(mudu::error::ec::EC::MuduError, message) } +fn row_i32(row: &mudu_contract::tuple::tuple_value::TupleValue, index: usize) -> Option { + row.values().get(index).and_then(|value| { + value + .as_i32() + .copied() + .or_else(|| value.as_i64().map(|v| *v as i32)) + .or_else(|| value.as_string().and_then(|v| v.parse::().ok())) + }) +} + +fn row_i64(row: &mudu_contract::tuple::tuple_value::TupleValue, index: usize) -> Option { + row.values().get(index).and_then(|value| { + value + .as_i64() + .copied() + .or_else(|| value.as_i32().map(|v| *v as i64)) + .or_else(|| value.as_string().and_then(|v| v.parse::().ok())) + }) +} + +fn row_string(row: &mudu_contract::tuple::tuple_value::TupleValue, index: usize) -> Option { + row.values() + .get(index) + .and_then(|value| value.as_string().map(|v| v.to_string())) +} + struct RunningServer { stop: Notifier, handle: Option>>, @@ -385,11 +428,15 @@ impl TestContext { fn start_server(&self) -> RS { let cfg = self.build_cfg(); let (stop, waiter) = notify_wait(); - let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); + let (ready, ready_waiter) = notify_wait(); + let handle = thread::spawn(move || { + Backend::sync_serve_with_stop_and_ready(cfg, waiter, Some(ready)) + }); wait_until_port_ready(self.http_port, "HTTP")?; - if self.server_mode == ServerMode::IOUring { + if matches!(self.server_mode, ServerMode::IOUring | ServerMode::Tokio) { wait_until_port_ready(self.tcp_port, "TCP")?; } + wait_until_backend_ready(ready_waiter, "backend")?; Ok(RunningServer { stop, handle: Some(handle), @@ -427,80 +474,95 @@ impl TestContext { fn client_port(&self) -> u16 { match self.server_mode { ServerMode::Legacy => self.pg_port, - ServerMode::IOUring => self.tcp_port, - } - } - - fn wallet_db_path(&self) -> PathBuf { - self.data_dir.join("wallet") - } - - fn query_i64(&self, sql: &str) -> RS { - let value = self.query_first_value(sql)?; - match value { - LibsqlValue::Integer(value) => Ok(value), - other => Err(mudu::m_error!( - mudu::error::ec::EC::TypeErr, - format!("expected integer result, got {:?}", other) - )), + ServerMode::IOUring | ServerMode::Tokio => self.tcp_port, } } - fn query_string(&self, sql: &str) -> RS { - let value = self.query_first_value(sql)?; - match value { - LibsqlValue::Text(value) => Ok(value), - other => Err(mudu::m_error!( - mudu::error::ec::EC::TypeErr, - format!("expected text result, got {:?}", other) - )), - } + fn user_exists(&self, app_name: &str, user_id: i32) -> RS { + let response = self.query_backend(app_name, "SELECT user_id FROM users")?; + Ok(response + .rows() + .iter() + .filter(|row| row_i32(row, 0) == Some(user_id)) + .count() + > 0) } - fn query_first_value(&self, sql: &str) -> RS { - let db_path = self.wallet_db_path(); - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .expect("build tokio runtime"); - runtime.block_on(async move { - let db = Builder::new_local(db_path).build().await.map_err(|e| { - mudu::m_error!(mudu::error::ec::EC::IOErr, "open wallet libsql db error", e) - })?; - let conn = db.connect().map_err(|e| { - mudu::m_error!( - mudu::error::ec::EC::IOErr, - "connect wallet libsql db error", - e - ) - })?; - let stmt = conn.prepare(sql).await.map_err(|e| { - mudu::m_error!( - mudu::error::ec::EC::MuduError, - "prepare wallet query error", - e - ) - })?; - let mut rows = stmt.query(params!()).await.map_err(|e| { + fn user_name(&self, app_name: &str, user_id: i32) -> RS { + let response = self.query_backend(app_name, "SELECT user_id, name FROM users")?; + response + .rows() + .iter() + .find(|row| row_i32(row, 0) == Some(user_id)) + .and_then(|row| row_string(row, 1)) + .ok_or_else(|| { mudu::m_error!( - mudu::error::ec::EC::MuduError, - "execute wallet query error", - e + mudu::error::ec::EC::NoSuchElement, + format!("user name not found for user_id={user_id}") ) - })?; - let row = rows.next().await.map_err(|e| { - mudu::m_error!(mudu::error::ec::EC::MuduError, "fetch wallet row error", e) - })?; - let row = row.ok_or_else(|| { + }) + } + + fn wallet_balance(&self, app_name: &str, user_id: i32) -> RS { + let response = self.query_backend(app_name, "SELECT user_id, balance FROM wallets")?; + response + .rows() + .iter() + .find(|row| row_i32(row, 0) == Some(user_id)) + .and_then(|row| row_i64(row, 1)) + .ok_or_else(|| { mudu::m_error!( mudu::error::ec::EC::NoSuchElement, - "wallet query returned no rows" + format!("wallet balance not found for user_id={user_id}") ) - })?; - row.get_value(0).map_err(|e| { - mudu::m_error!(mudu::error::ec::EC::MuduError, "read wallet value error", e) }) - }) + } + + fn deposit_transaction_count(&self, app_name: &str, to_user: i32, amount: i32) -> RS { + let response = self.query_backend( + app_name, + "SELECT trans_type, to_user, amount FROM transactions", + )?; + Ok(response + .rows() + .iter() + .filter(|row| { + row_string(row, 0).as_deref() == Some("DEPOSIT") + && row_i32(row, 1) == Some(to_user) + && row_i32(row, 2) == Some(amount) + }) + .count()) + } + + fn transfer_transaction_count( + &self, + app_name: &str, + from_user: i32, + to_user: i32, + amount: i32, + ) -> RS { + let response = self.query_backend( + app_name, + "SELECT from_user, to_user, amount FROM transactions", + )?; + Ok(response + .rows() + .iter() + .filter(|row| { + row_i32(row, 0) == Some(from_user) + && row_i32(row, 1) == Some(to_user) + && row_i32(row, 2) == Some(amount) + }) + .count()) + } + + fn query_backend( + &self, + app_name: &str, + sql: &str, + ) -> RS { + let mut client = SyncClient::connect(("127.0.0.1", self.client_port()))?; + client.query(app_name.to_string(), sql.to_string()) } fn get_json(&self, path: &str) -> RS { @@ -592,3 +654,26 @@ fn workspace_root() -> PathBuf { .expect("testing crate has workspace root parent") .to_path_buf() } + +fn wait_until_backend_ready(waiter: Waiter, service_name: &str) -> RS<()> { + // Wallet end-to-end tests exercise the service immediately after startup, + // so they must wait for logical readiness instead of only for a bound + // socket. + let result = mudu_sys::task_async::block_on_tokio_current_thread(async move{ + tokio::time::timeout(std::time::Duration::from_secs(10), waiter.wait()).await + }) + .map_err(|e| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("wait for {} ready barrier runtime error", service_name), + e + ) + })?; + result.map_err(|_| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("{} ready barrier timed out", service_name) + ) + })?; + Ok(()) +} diff --git a/testing/tests/test_copy_roundtrip.rs b/testing/tests/test_copy_roundtrip.rs index 61bd076..2ea3c3f 100644 --- a/testing/tests/test_copy_roundtrip.rs +++ b/testing/tests/test_copy_roundtrip.rs @@ -5,39 +5,52 @@ use mudu_runtime::backend::mududb_cfg::ServerMode; use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, RoutingMode}; use mudu_runtime::service::runtime_opt::ComponentTarget; use mudu_utils::log::log_setup; -use mudu_utils::notifier::{Notifier, notify_wait}; +use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use serde_json::{Value, json}; use std::fs; use std::net::{TcpListener, TcpStream}; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; +use std::sync::mpsc; use std::thread::{self, JoinHandle}; use std::time::Duration; use tracing::{debug, info}; +const BACKEND_STARTUP_TIMEOUT: Duration = Duration::from_secs(30); + #[test] fn copy_from_to_roundtrip_iouring() -> RS<()> { - log_setup("debug"); - if !mudu_sys::io_uring_available() { + log_setup("info"); + if !supports_server_mode(ServerMode::IOUring) { info!("skip copy roundtrip iouring test: io_uring unavailable"); return Ok(()); } info!("enable copy roundtrip iouring test: io_uring available"); - let Some(ctx) = TestContext::new(ServerMode::IOUring)? else { + run_copy_from_to_roundtrip(ServerMode::IOUring) +} + +#[test] +fn copy_from_to_roundtrip_tokio() -> RS<()> { + log_setup("info"); + run_copy_from_to_roundtrip(ServerMode::Tokio) +} + +fn run_copy_from_to_roundtrip(server_mode: ServerMode) -> RS<()> { + let Some(ctx) = TestContext::new(server_mode)? else { eprintln!("skip copy roundtrip test: local TCP/HTTP bind is not permitted"); return Ok(()); }; - let _server = ctx.start_server()?; - let _cwd_guard = CwdGuard::change_to(&ctx.base_dir)?; + let server = ctx.start_server()?; let suffix = mudu_sys::random::uuid_v4(); - // Parser currently keeps quote chars in file path, so commands use paths containing `'`. - let copy_from_file = format!("'copy_from_{suffix}.csv'"); - let copy_to_file = format!("'copy_to_{suffix}.csv'"); + let copy_from_path = ctx.base_dir.join(format!("copy_from_{suffix}.csv")); + let copy_to_path = ctx.base_dir.join(format!("copy_to_{suffix}.csv")); + let copy_from_file = format!("'{}'", copy_from_path.display()); + let copy_to_file = format!("'{}'", copy_to_path.display()); let input_csv = "id,name\n1,Alice\n2,Bob\n"; - fs::write(©_from_file, input_csv).map_err(|e| { + fs::write(©_from_path, input_csv).map_err(|e| { mudu::m_error!( mudu::error::ec::EC::IOErr, - format!("write input csv {} error", copy_from_file), + format!("write input csv {} error", copy_from_path.display()), e ) })?; @@ -66,10 +79,10 @@ fn copy_from_to_roundtrip_iouring() -> RS<()> { output_text ); - let exported = fs::read_to_string(©_to_file).map_err(|e| { + let exported = fs::read_to_string(©_to_path).map_err(|e| { mudu::m_error!( mudu::error::ec::EC::IOErr, - format!("read exported csv {} error", copy_to_file), + format!("read exported csv {} error", copy_to_path.display()), e ) })?; @@ -84,38 +97,16 @@ fn copy_from_to_roundtrip_iouring() -> RS<()> { exported ); - let _ = fs::remove_file(©_from_file); - let _ = fs::remove_file(©_to_file); + let _ = fs::remove_file(©_from_path); + let _ = fs::remove_file(©_to_path); + drop(server); Ok(()) } -struct CwdGuard { - old: PathBuf, -} - -impl CwdGuard { - fn change_to(target: &Path) -> RS { - let old = std::env::current_dir().map_err(|e| { - mudu::m_error!( - mudu::error::ec::EC::IOErr, - "read current working directory error", - e - ) - })?; - std::env::set_current_dir(target).map_err(|e| { - mudu::m_error!( - mudu::error::ec::EC::IOErr, - format!("change current working directory to {} error", target.display()), - e - ) - })?; - Ok(Self { old }) - } -} - -impl Drop for CwdGuard { - fn drop(&mut self) { - let _ = std::env::set_current_dir(&self.old); +fn supports_server_mode(server_mode: ServerMode) -> bool { + match server_mode { + ServerMode::IOUring => mudu_sys::io_uring_available(), + ServerMode::Legacy | ServerMode::Tokio => true, } } @@ -242,6 +233,7 @@ struct RunningServer { impl Drop for RunningServer { fn drop(&mut self) { + debug!("test copy_roundtrip dropping running server"); self.stop.notify_all(); if let Some(handle) = self.handle.take() { let join_result = handle.join().expect("join server thread"); @@ -249,6 +241,7 @@ impl Drop for RunningServer { panic!("server stopped with error: {err}"); } } + debug!("test copy_roundtrip dropped running server"); } } @@ -304,11 +297,18 @@ impl TestContext { "starting backend server" ); let (stop, waiter) = notify_wait(); - let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); - wait_until_port_ready(self.http_port, "HTTP")?; - if self.server_mode == ServerMode::IOUring { - wait_until_port_ready(self.tcp_port, "TCP")?; + let (ready, ready_waiter) = notify_wait(); + let (exit_tx, exit_rx) = mpsc::channel(); + let handle = thread::spawn(move || { + let result = Backend::sync_serve_with_stop_and_ready(cfg, waiter, Some(ready)); + let _ = exit_tx.send(result.clone()); + result + }); + wait_until_port_ready(self.http_port, "HTTP", BACKEND_STARTUP_TIMEOUT)?; + if matches!(self.server_mode, ServerMode::IOUring | ServerMode::Tokio) { + wait_until_port_ready(self.tcp_port, "TCP", BACKEND_STARTUP_TIMEOUT)?; } + wait_until_backend_ready(ready_waiter, &exit_rx, "backend", BACKEND_STARTUP_TIMEOUT)?; debug!("backend server ready"); Ok(RunningServer { stop, @@ -336,7 +336,7 @@ impl TestContext { fn client_port(&self) -> u16 { match self.server_mode { ServerMode::Legacy => self.pg_port, - ServerMode::IOUring => self.tcp_port, + ServerMode::IOUring | ServerMode::Tokio => self.tcp_port, } } } @@ -366,19 +366,79 @@ fn reserve_port() -> RS> { } } -fn wait_until_port_ready(port: u16, service_name: &str) -> RS<()> { - let deadline = mudu_sys::time::instant_now() + Duration::from_secs(10); +fn wait_until_port_ready(port: u16, service_name: &str, timeout: Duration) -> RS<()> { + let deadline = mudu_sys::time::instant_now() + timeout; while mudu_sys::time::instant_now() < deadline { if TcpStream::connect(("127.0.0.1", port)).is_ok() { return Ok(()); } - mudu_sys::task::sleep_blocking(Duration::from_millis(25)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(25)); } Err(mudu::m_error!( mudu::error::ec::EC::NetErr, format!( - "{} server did not become ready on port {}", - service_name, port + "{} server did not become ready on port {} within {:?}", + service_name, port, timeout + ) + )) +} + +fn wait_until_backend_ready( + waiter: Waiter, + exit_rx: &mpsc::Receiver>, + service_name: &str, + timeout: Duration, +) -> RS<()> { + // The ready barrier keeps tests from racing startup with the later point + // where the backend can actually serve requests. Poll the barrier in small + // slices so an early server-thread failure surfaces immediately instead of + // degenerating into a generic timeout. + let deadline = mudu_sys::time::instant_now() + timeout; + while mudu_sys::time::instant_now() < deadline { + match exit_rx.try_recv() { + Ok(Ok(())) => { + return Err(mudu::m_error!( + mudu::error::ec::EC::ThreadErr, + format!("{service_name} stopped before publishing ready barrier") + )); + } + Ok(Err(err)) => { + return Err(mudu::m_error!( + mudu::error::ec::EC::ThreadErr, + format!("{service_name} exited before publishing ready barrier"), + err + )); + } + Err(mpsc::TryRecvError::Disconnected) => { + return Err(mudu::m_error!( + mudu::error::ec::EC::ThreadErr, + format!("{service_name} startup monitor disconnected") + )); + } + Err(mpsc::TryRecvError::Empty) => {} + } + + let result = mudu_sys::task_async::block_on_tokio_current_thread({ + let waiter = waiter.clone(); + async move { tokio::time::timeout(Duration::from_millis(100), waiter.wait()).await } + }) + .map_err(|e| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("wait for {} ready barrier runtime error", service_name), + e + ) + })?; + if result.is_ok() { + return Ok(()); + } + } + + Err(mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!( + "{} ready barrier timed out after {:?}", + service_name, timeout ) )) } diff --git a/testing/tests/test_interactive.rs b/testing/tests/test_interactive.rs index a90b986..4aae267 100644 --- a/testing/tests/test_interactive.rs +++ b/testing/tests/test_interactive.rs @@ -6,7 +6,7 @@ use mudu_runtime::backend::mududb_cfg::ServerMode; use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, RoutingMode}; use mudu_runtime::service::runtime_opt::ComponentTarget; use mudu_utils::log::log_setup; -use mudu_utils::notifier::{Notifier, notify_wait}; +use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use serde_json::{Value, json}; use std::fs; use std::net::{TcpListener, TcpStream}; @@ -18,38 +18,57 @@ use tracing::info; #[test] fn interactive_mcli_shell_io_uring() -> RS<()> { log_setup("info"); - if !mudu_sys::io_uring_available() { + if !supports_server_mode(ServerMode::IOUring) { info!("skip interactive mcli io_uring test: io_uring unavailable"); return Ok(()); } info!("enable interactive mcli io_uring test: io_uring available"); - let Some(ctx) = TestContext::new(ServerMode::IOUring)? else { - eprintln!("skip interactive mcli io_uring test: local TCP/HTTP bind is not permitted"); - return Ok(()); - }; - let _server = ctx.start_server()?; - - let shell_output = run_interactive_mcli_shell(&ctx, "demo", crud_script())?; - - assert!(shell_output.contains("'Eve'")); - assert!(shell_output.contains("'Eva'")); + run_interactive_mcli_shell_test(ServerMode::IOUring) +} - Ok(()) +#[test] +fn interactive_mcli_shell_tokio() -> RS<()> { + log_setup("info"); + run_interactive_mcli_shell_test(ServerMode::Tokio) } #[test] fn interactive_mcli_shell_io_uring_tui() -> RS<()> { log_setup("info"); - if !mudu_sys::io_uring_available() { + if !supports_server_mode(ServerMode::IOUring) { info!("skip interactive mcli io_uring tui test: io_uring unavailable"); return Ok(()); } info!("enable interactive mcli io_uring tui test: io_uring available"); - let Some(ctx) = TestContext::new(ServerMode::IOUring)? else { - eprintln!("skip interactive mcli io_uring tui test: local TCP/HTTP bind is not permitted"); + run_interactive_mcli_tui_test(ServerMode::IOUring) +} + +#[test] +fn interactive_mcli_shell_tokio_tui() -> RS<()> { + log_setup("info"); + run_interactive_mcli_tui_test(ServerMode::Tokio) +} + +fn run_interactive_mcli_shell_test(server_mode: ServerMode) -> RS<()> { + let Some(ctx) = TestContext::new(server_mode)? else { + eprintln!("skip interactive mcli test: local TCP/HTTP bind is not permitted"); return Ok(()); }; - let _server = ctx.start_server()?; + let server = ctx.start_server()?; + + let shell_output = run_interactive_mcli_shell(&ctx, "demo", crud_script())?; + assert!(shell_output.contains("'Eve'")); + assert!(shell_output.contains("'Eva'")); + drop(server); + Ok(()) +} + +fn run_interactive_mcli_tui_test(server_mode: ServerMode) -> RS<()> { + let Some(ctx) = TestContext::new(server_mode)? else { + eprintln!("skip interactive mcli tui test: local TCP/HTTP bind is not permitted"); + return Ok(()); + }; + let server = ctx.start_server()?; let outputs = run_shell_script_outputs(&ctx, "demo", tui_script())?; let table = outputs @@ -74,9 +93,17 @@ fn interactive_mcli_shell_io_uring_tui() -> RS<()> { assert!(snapshot.contains("Query Result")); assert!(snapshot.contains("name")); assert!(snapshot.contains("Eva") || snapshot.contains("'Eva'")); + drop(server); Ok(()) } +fn supports_server_mode(server_mode: ServerMode) -> bool { + match server_mode { + ServerMode::IOUring => mudu_sys::io_uring_available(), + ServerMode::Legacy | ServerMode::Tokio => true, + } +} + fn crud_script() -> &'static str { concat!( "DROP TABLE IF EXISTS t_crud;\n", @@ -289,11 +316,15 @@ impl TestContext { fn start_server(&self) -> RS { let cfg = self.build_cfg(); let (stop, waiter) = notify_wait(); - let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); + let (ready, ready_waiter) = notify_wait(); + let handle = thread::spawn(move || { + Backend::sync_serve_with_stop_and_ready(cfg, waiter, Some(ready)) + }); wait_until_port_ready(self.http_port, "HTTP")?; - if self.server_mode == ServerMode::IOUring { + if matches!(self.server_mode, ServerMode::IOUring | ServerMode::Tokio) { wait_until_port_ready(self.tcp_port, "TCP")?; } + wait_until_backend_ready(ready_waiter, "backend")?; Ok(RunningServer { stop, handle: Some(handle), @@ -320,7 +351,7 @@ impl TestContext { fn client_port(&self) -> u16 { match self.server_mode { ServerMode::Legacy => self.pg_port, - ServerMode::IOUring => self.tcp_port, + ServerMode::IOUring | ServerMode::Tokio => self.tcp_port, } } } @@ -356,7 +387,7 @@ fn wait_until_port_ready(port: u16, service_name: &str) -> RS<()> { if TcpStream::connect(("127.0.0.1", port)).is_ok() { return Ok(()); } - mudu_sys::task::sleep_blocking(Duration::from_millis(25)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(25)); } Err(mudu::m_error!( mudu::error::ec::EC::NetErr, @@ -366,3 +397,25 @@ fn wait_until_port_ready(port: u16, service_name: &str) -> RS<()> { ) )) } + +fn wait_until_backend_ready(waiter: Waiter, service_name: &str) -> RS<()> { + // Listener readiness is not enough for io_uring mode because worker + // recovery continues after the port starts accepting connections. + let result = mudu_sys::task_async::block_on_tokio_current_thread(async move{ + tokio::time::timeout(Duration::from_secs(10), waiter.wait()).await + }) + .map_err(|e| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("wait for {} ready barrier runtime error", service_name), + e + ) + })?; + result.map_err(|_| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("{} ready barrier timed out", service_name) + ) + })?; + Ok(()) +} diff --git a/testing/tests/test_restart.rs b/testing/tests/test_restart.rs index a3cc43a..823de88 100644 --- a/testing/tests/test_restart.rs +++ b/testing/tests/test_restart.rs @@ -5,7 +5,7 @@ use mudu_runtime::backend::mududb_cfg::ServerMode; use mudu_runtime::backend::mududb_cfg::{MuduDBCfg, RoutingMode}; use mudu_runtime::service::runtime_opt::ComponentTarget; use mudu_utils::log::log_setup; -use mudu_utils::notifier::{Notifier, notify_wait}; +use mudu_utils::notifier::{Notifier, Waiter, notify_wait}; use serde_json::{Value, json}; use std::fs; use std::net::{TcpListener, TcpStream}; @@ -17,19 +17,29 @@ use tracing::info; #[test] fn test_mudud_restart_persistence_iouring() -> RS<()> { log_setup("info"); - if !mudu_sys::io_uring_available() { + if !supports_server_mode(ServerMode::IOUring) { info!("skip restart persistence iouring test: io_uring unavailable"); return Ok(()); } info!("enable restart persistence iouring test: io_uring available"); - let Some(ctx) = TestContext::new(ServerMode::IOUring)? else { + run_restart_persistence(ServerMode::IOUring) +} + +#[test] +fn test_mudud_restart_persistence_tokio() -> RS<()> { + log_setup("info"); + run_restart_persistence(ServerMode::Tokio) +} + +fn run_restart_persistence(server_mode: ServerMode) -> RS<()> { + let Some(ctx) = TestContext::new(server_mode)? else { eprintln!("skip test: local TCP/HTTP bind is not permitted"); return Ok(()); }; - println!("Step 1: Start mudud (io_uring mode)"); + println!("Step 1: Start mudud ({server_mode:?} mode)"); { - let _server = ctx.start_server()?; + let server = ctx.start_server()?; println!("Step 2: mcli connect and perform CRUD"); let script = concat!( @@ -40,6 +50,7 @@ fn test_mudud_restart_persistence_iouring() -> RS<()> { let _ = run_shell_script_outputs(&ctx, "demo", script)?; println!("Step 3: Stop mudud"); + drop(server); } // _server dropped here, stopping the server // Give it a small moment to ensure ports are released @@ -47,7 +58,7 @@ fn test_mudud_restart_persistence_iouring() -> RS<()> { println!("Step 4: Restart mudud"); { - let _server = ctx.start_server()?; + let server = ctx.start_server()?; println!("Step 5: mcli reconnect and verify data"); let script = "SELECT name FROM t_restart WHERE id = 100;\n\\q\n"; @@ -61,11 +72,19 @@ fn test_mudud_restart_persistence_iouring() -> RS<()> { ); println!("Step 6: Final stop"); + drop(server); } Ok(()) } +fn supports_server_mode(server_mode: ServerMode) -> bool { + match server_mode { + ServerMode::IOUring => mudu_sys::io_uring_available(), + ServerMode::Legacy | ServerMode::Tokio => true, + } +} + // Helpers adapted from test_interactive.rs fn run_shell_script_outputs(ctx: &TestContext, app: &str, input: &str) -> RS> { @@ -131,7 +150,14 @@ fn run_shell_script_outputs(ctx: &TestContext, app: &str, input: &str) -> RS RS { let cfg = self.build_cfg(); let (stop, waiter) = notify_wait(); + let (ready, ready_waiter) = notify_wait(); println!(" [server] Spawning server thread..."); - let handle = thread::spawn(move || Backend::sync_serve_with_stop(cfg, waiter)); + let handle = thread::spawn(move || { + Backend::sync_serve_with_stop_and_ready(cfg, waiter, Some(ready)) + }); println!(" [server] Waiting for HTTP port {}...", self.http_port); wait_until_port_ready(self.http_port, "HTTP")?; - if self.server_mode == ServerMode::IOUring { + if matches!(self.server_mode, ServerMode::IOUring | ServerMode::Tokio) { println!(" [server] Waiting for TCP port {}...", self.tcp_port); wait_until_port_ready(self.tcp_port, "TCP")?; } + wait_until_backend_ready(ready_waiter, "backend")?; println!(" [server] Server ready."); Ok(RunningServer { stop, @@ -283,7 +313,7 @@ impl TestContext { fn client_port(&self) -> u16 { match self.server_mode { ServerMode::Legacy => self.pg_port, - ServerMode::IOUring => self.tcp_port, + ServerMode::IOUring | ServerMode::Tokio => self.tcp_port, } } } @@ -319,7 +349,7 @@ fn wait_until_port_ready(port: u16, service_name: &str) -> RS<()> { if TcpStream::connect(("127.0.0.1", port)).is_ok() { return Ok(()); } - mudu_sys::task::sleep_blocking(Duration::from_millis(25)); + mudu_sys::task_sync::sleep_blocking(Duration::from_millis(25)); } Err(mudu::m_error!( mudu::error::ec::EC::NetErr, @@ -329,3 +359,26 @@ fn wait_until_port_ready(port: u16, service_name: &str) -> RS<()> { ) )) } + +fn wait_until_backend_ready(waiter: Waiter, service_name: &str) -> RS<()> { + // A listening socket only proves that bind/listen completed. In io_uring + // mode the workers may still be replaying WAL, so tests must also wait for + // the backend's logical readiness barrier before issuing requests. + let result = mudu_sys::task_async::block_on_tokio_current_thread(async move{ + tokio::time::timeout(Duration::from_secs(10), waiter.wait()).await + }) + .map_err(|e| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("wait for {} ready barrier runtime error", service_name), + e + ) + })?; + result.map_err(|_| { + mudu::m_error!( + mudu::error::ec::EC::TokioErr, + format!("{} ready barrier timed out", service_name) + ) + })?; + Ok(()) +} diff --git a/tree-sitter-sql/grammar.js b/tree-sitter-sql/grammar.js index 1abe979..a437ebb 100644 --- a/tree-sitter-sql/grammar.js +++ b/tree-sitter-sql/grammar.js @@ -378,7 +378,7 @@ module.exports = grammar({ keyword_smalldatetime: _ => make_keyword("smalldatetime"), keyword_datetimeoffset: _ => make_keyword("datetimeoffset"), keyword_time: _ => make_keyword("time"), - keyword_timestamp: _ => prec.right( + keyword_timestamp_base: _ => prec.right( seq( make_keyword("timestamp"), optional( @@ -390,7 +390,7 @@ module.exports = grammar({ ), ), ), - keyword_timestamptz: _ => choice( + keyword_timestamptz_base: _ => choice( make_keyword('timestamptz'), seq( make_keyword("timestamp"), @@ -467,8 +467,8 @@ module.exports = grammar({ $.datetimeoffset, $.keyword_smalldatetime, $.time, - $.keyword_timestamp, - $.keyword_timestamptz, + $.timestamp, + $.timestamptz, $.keyword_interval, $.keyword_geometry, @@ -544,7 +544,9 @@ module.exports = grammar({ nvarchar: $ => parametric_type($, $.keyword_nvarchar), datetimeoffset: $ => parametric_type($, $.keyword_datetimeoffset), - time: $ => parametric_type($, $.keyword_time), + time: $ => parametric_type($, $.keyword_time, ['precision']), + timestamp: $ => parametric_type($, $.keyword_timestamp_base, ['precision']), + timestamptz: $ => parametric_type($, $.keyword_timestamptz_base, ['precision']), enum: $ => seq( $.keyword_enum, diff --git a/tree-sitter-sql/package-lock.json b/tree-sitter-sql/package-lock.json new file mode 100644 index 0000000..9b0b84d --- /dev/null +++ b/tree-sitter-sql/package-lock.json @@ -0,0 +1,369 @@ +{ + "name": "tree-sitter-sql", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tree-sitter-sql", + "version": "0.1.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + }, + "devDependencies": { + "prebuildify": "^6.0.1", + "tree-sitter-cli": "^0.25.4" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", + "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuildify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz", + "integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "mkdirp-classic": "^0.5.3", + "node-abi": "^3.3.0", + "npm-run-path": "^3.1.0", + "pump": "^3.0.0", + "tar-fs": "^2.1.0" + }, + "bin": { + "prebuildify": "bin.js" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-sitter-cli": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.25.10.tgz", + "integrity": "sha512-KoebQguKMCIghisEOdA372TIbrUl0kdnfZ9YQIBRAeOvNSKe85XbU4LuFW7hduRUwJj0rAG7pX5wo9sZhbBF1g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "tree-sitter": "cli.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/tree-sitter-sql/src/grammar.json b/tree-sitter-sql/src/grammar.json index 15fc889..00ae52b 100644 --- a/tree-sitter-sql/src/grammar.json +++ b/tree-sitter-sql/src/grammar.json @@ -1577,7 +1577,7 @@ "type": "PATTERN", "value": "[tT][iI][mM][eE]" }, - "keyword_timestamp": { + "keyword_timestamp_base": { "type": "PREC_RIGHT", "value": 0, "content": { @@ -1615,7 +1615,7 @@ ] } }, - "keyword_timestamptz": { + "keyword_timestamptz_base": { "type": "CHOICE", "members": [ { @@ -1879,11 +1879,11 @@ }, { "type": "SYMBOL", - "name": "keyword_timestamp" + "name": "timestamp" }, { "type": "SYMBOL", - "name": "keyword_timestamptz" + "name": "timestamptz" }, { "type": "SYMBOL", @@ -3648,7 +3648,113 @@ "members": [ { "type": "FIELD", - "name": "size", + "name": "precision", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "natural_number" + }, + "named": true, + "value": "literal" + } + } + ] + }, + { + "type": "STRING", + "value": ")" + } + ] + } + ] + } + ] + } + }, + "timestamp": { + "type": "PREC_RIGHT", + "value": 1, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "keyword_timestamp_base" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "keyword_timestamp_base" + }, + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "(" + }, + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "precision", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "natural_number" + }, + "named": true, + "value": "literal" + } + } + ] + }, + { + "type": "STRING", + "value": ")" + } + ] + } + ] + } + ] + } + }, + "timestamptz": { + "type": "PREC_RIGHT", + "value": 1, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "keyword_timestamptz_base" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "keyword_timestamptz_base" + }, + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "(" + }, + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "precision", "content": { "type": "ALIAS", "content": { diff --git a/tree-sitter-sql/src/node-types.json b/tree-sitter-sql/src/node-types.json index 802c1d0..a78b4f8 100644 --- a/tree-sitter-sql/src/node-types.json +++ b/tree-sitter-sql/src/node-types.json @@ -2080,14 +2080,6 @@ "type": "keyword_text", "named": true }, - { - "type": "keyword_timestamp", - "named": true - }, - { - "type": "keyword_timestamptz", - "named": true - }, { "type": "keyword_uuid", "named": true @@ -2120,6 +2112,14 @@ "type": "time", "named": true }, + { + "type": "timestamp", + "named": true + }, + { + "type": "timestamptz", + "named": true + }, { "type": "tinyint", "named": true @@ -3536,12 +3536,12 @@ "fields": {} }, { - "type": "keyword_timestamp", + "type": "keyword_timestamp_base", "named": true, "fields": {} }, { - "type": "keyword_timestamptz", + "type": "keyword_timestamptz_base", "named": true, "fields": {} }, @@ -4643,7 +4643,7 @@ "type": "time", "named": true, "fields": { - "size": { + "precision": { "multiple": false, "required": false, "types": [ @@ -4665,6 +4665,58 @@ ] } }, + { + "type": "timestamp", + "named": true, + "fields": { + "precision": { + "multiple": false, + "required": false, + "types": [ + { + "type": "literal", + "named": true + } + ] + } + }, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "keyword_timestamp_base", + "named": true + } + ] + } + }, + { + "type": "timestamptz", + "named": true, + "fields": { + "precision": { + "multiple": false, + "required": false, + "types": [ + { + "type": "literal", + "named": true + } + ] + } + }, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "keyword_timestamptz_base", + "named": true + } + ] + } + }, { "type": "tinyint", "named": true, diff --git a/tree-sitter-sql/src/parser.c b/tree-sitter-sql/src/parser.c index e51f1c4..9a53488 100644 --- a/tree-sitter-sql/src/parser.c +++ b/tree-sitter-sql/src/parser.c @@ -1,4 +1,4 @@ -/* Automatically @generated by tree-sitter */ +/* Automatically @generated by tree-sitter v0.25.10 */ #include "tree_sitter/parser.h" @@ -7,9 +7,9 @@ #endif #define LANGUAGE_VERSION 15 -#define STATE_COUNT 1611 +#define STATE_COUNT 1627 #define LARGE_STATE_COUNT 22 -#define SYMBOL_COUNT 453 +#define SYMBOL_COUNT 455 #define ALIAS_COUNT 0 #define TOKEN_COUNT 255 #define EXTERNAL_TOKEN_COUNT 0 @@ -218,10 +218,10 @@ enum ts_symbol_identifiers { sym_keyword_smalldatetime = 196, sym_keyword_datetimeoffset = 197, aux_sym_keyword_time_token1 = 198, - aux_sym_keyword_timestamp_token1 = 199, - aux_sym_keyword_timestamp_token2 = 200, - aux_sym_keyword_timestamp_token3 = 201, - aux_sym_keyword_timestamptz_token1 = 202, + aux_sym_keyword_timestamp_base_token1 = 199, + aux_sym_keyword_timestamp_base_token2 = 200, + aux_sym_keyword_timestamp_base_token3 = 201, + aux_sym_keyword_timestamptz_base_token1 = 202, sym_keyword_interval = 203, sym_keyword_geometry = 204, sym_keyword_geography = 205, @@ -302,8 +302,8 @@ enum ts_symbol_identifiers { sym_keyword_char = 280, sym_keyword_varchar = 281, sym_keyword_time = 282, - sym_keyword_timestamp = 283, - sym_keyword_timestamptz = 284, + sym_keyword_timestamp_base = 283, + sym_keyword_timestamptz_base = 284, sym_data_type = 285, sym_data_type_kind = 286, sym_array_size_definition = 287, @@ -326,152 +326,154 @@ enum ts_symbol_identifiers { sym_nvarchar = 304, sym_datetimeoffset = 305, sym_time = 306, - sym_enum = 307, - sym_array = 308, - sym_comment = 309, - sym_marginalia = 310, - sym_statement_transaction = 311, - sym_begin_transaction = 312, - sym_commit_transaction = 313, - sym_rollback_transaction = 314, - sym_statement = 315, - sym_copy_stmt = 316, - sym_copy_from = 317, - sym_copy_to = 318, - sym_file_path = 319, - sym_ddl_stmt = 320, - sym_dml_write_stmt = 321, - sym_dml_read_stmt = 322, - sym_select_statement = 323, - sym_select = 324, - sym_select_expression = 325, - sym_term = 326, - sym__truncate_statement = 327, - sym_delete_statement = 328, - sym_create_table_statement = 329, - sym__role_options = 330, - sym__alter_statement = 331, - sym__rename_statement = 332, - sym__rename_table_names = 333, - sym_alter_table = 334, - sym__alter_specifications = 335, - sym_add_column = 336, - sym_add_constraint = 337, - sym_alter_column = 338, - sym_modify_column = 339, - sym_change_column = 340, - sym_column_position = 341, - sym_drop_column = 342, - sym_rename_column = 343, - sym_alter_view = 344, - sym_alter_schema = 345, - sym_alter_database = 346, - sym_alter_role = 347, - sym_set_configuration = 348, - sym_alter_index = 349, - sym_alter_sequence = 350, - sym_alter_type = 351, - sym__drop_behavior = 352, - sym_drop_statement = 353, - sym_drop_table = 354, - sym_drop_view = 355, - sym_drop_schema = 356, - sym_drop_database = 357, - sym_drop_role = 358, - sym_drop_type = 359, - sym_drop_sequence = 360, - sym_drop_index = 361, - sym_rename_object = 362, - sym_set_schema = 363, - sym_change_ownership = 364, - sym_object_reference = 365, - sym_insert_statement = 366, - sym_insert_values = 367, - sym_typed_row_value_expr_list = 368, - sym_set_values = 369, - sym_column_list = 370, - sym_column = 371, - sym_update_statement = 372, - sym__merge_statement = 373, - sym_when_clause = 374, - sym__optimize_statement = 375, - sym__compute_stats = 376, - sym__optimize_table = 377, - sym__vacuum_table = 378, - sym__vacuum_option = 379, - sym__partition_spec = 380, - sym_assignment = 381, - sym_table_option = 382, - sym_column_definitions = 383, - sym_column_definition = 384, - sym__column_comment = 385, - sym_column_constraint = 386, - sym__default_expression = 387, - sym__inner_default_expression = 388, - sym_constraints = 389, - sym_constraint = 390, - sym__constraint_literal = 391, - sym_primary_key_constraint = 392, - sym__key_constraint = 393, - sym_ordered_columns = 394, - sym_ordered_column = 395, - sym_all_fields = 396, - sym_parameter = 397, - sym_field = 398, - sym_qualified_field = 399, - sym_implicit_cast = 400, - sym_cast = 401, - sym_filter_expression = 402, - sym_invocation = 403, - sym_alias_name = 404, - sym_from = 405, - sym_relation = 406, - sym_where = 407, - sym_order_by = 408, - sym_order_target = 409, - sym_limit = 410, - sym_offset = 411, - sym_expression = 412, - sym_binary_expression = 413, - sym_unary_expression = 414, - sym_between_expression = 415, - sym_not_in = 416, - sym_subquery = 417, - sym_list = 418, - sym_literal = 419, - sym__double_quote_string = 420, - sym__single_quote_string = 421, - sym_literal_string = 422, - sym_integer = 423, - sym_decimal_number = 424, - sym_identifier = 425, - aux_sym_program_repeat1 = 426, - aux_sym_array_size_definition_repeat1 = 427, - aux_sym_enum_repeat1 = 428, - aux_sym_array_repeat1 = 429, - aux_sym_select_expression_repeat1 = 430, - aux_sym__truncate_statement_repeat1 = 431, - aux_sym__rename_statement_repeat1 = 432, - aux_sym_alter_table_repeat1 = 433, - aux_sym_alter_role_repeat1 = 434, - aux_sym_alter_index_repeat1 = 435, - aux_sym_alter_index_repeat2 = 436, - aux_sym_alter_sequence_repeat1 = 437, - aux_sym_typed_row_value_expr_list_repeat1 = 438, - aux_sym_set_values_repeat1 = 439, - aux_sym_column_list_repeat1 = 440, - aux_sym__merge_statement_repeat1 = 441, - aux_sym__compute_stats_repeat1 = 442, - aux_sym__compute_stats_repeat2 = 443, - aux_sym__vacuum_table_repeat1 = 444, - aux_sym__partition_spec_repeat1 = 445, - aux_sym_column_definitions_repeat1 = 446, - aux_sym_column_definition_repeat1 = 447, - aux_sym_constraints_repeat1 = 448, - aux_sym_ordered_columns_repeat1 = 449, - aux_sym_invocation_repeat1 = 450, - aux_sym_order_by_repeat1 = 451, - aux_sym_list_repeat1 = 452, + sym_timestamp = 307, + sym_timestamptz = 308, + sym_enum = 309, + sym_array = 310, + sym_comment = 311, + sym_marginalia = 312, + sym_statement_transaction = 313, + sym_begin_transaction = 314, + sym_commit_transaction = 315, + sym_rollback_transaction = 316, + sym_statement = 317, + sym_copy_stmt = 318, + sym_copy_from = 319, + sym_copy_to = 320, + sym_file_path = 321, + sym_ddl_stmt = 322, + sym_dml_write_stmt = 323, + sym_dml_read_stmt = 324, + sym_select_statement = 325, + sym_select = 326, + sym_select_expression = 327, + sym_term = 328, + sym__truncate_statement = 329, + sym_delete_statement = 330, + sym_create_table_statement = 331, + sym__role_options = 332, + sym__alter_statement = 333, + sym__rename_statement = 334, + sym__rename_table_names = 335, + sym_alter_table = 336, + sym__alter_specifications = 337, + sym_add_column = 338, + sym_add_constraint = 339, + sym_alter_column = 340, + sym_modify_column = 341, + sym_change_column = 342, + sym_column_position = 343, + sym_drop_column = 344, + sym_rename_column = 345, + sym_alter_view = 346, + sym_alter_schema = 347, + sym_alter_database = 348, + sym_alter_role = 349, + sym_set_configuration = 350, + sym_alter_index = 351, + sym_alter_sequence = 352, + sym_alter_type = 353, + sym__drop_behavior = 354, + sym_drop_statement = 355, + sym_drop_table = 356, + sym_drop_view = 357, + sym_drop_schema = 358, + sym_drop_database = 359, + sym_drop_role = 360, + sym_drop_type = 361, + sym_drop_sequence = 362, + sym_drop_index = 363, + sym_rename_object = 364, + sym_set_schema = 365, + sym_change_ownership = 366, + sym_object_reference = 367, + sym_insert_statement = 368, + sym_insert_values = 369, + sym_typed_row_value_expr_list = 370, + sym_set_values = 371, + sym_column_list = 372, + sym_column = 373, + sym_update_statement = 374, + sym__merge_statement = 375, + sym_when_clause = 376, + sym__optimize_statement = 377, + sym__compute_stats = 378, + sym__optimize_table = 379, + sym__vacuum_table = 380, + sym__vacuum_option = 381, + sym__partition_spec = 382, + sym_assignment = 383, + sym_table_option = 384, + sym_column_definitions = 385, + sym_column_definition = 386, + sym__column_comment = 387, + sym_column_constraint = 388, + sym__default_expression = 389, + sym__inner_default_expression = 390, + sym_constraints = 391, + sym_constraint = 392, + sym__constraint_literal = 393, + sym_primary_key_constraint = 394, + sym__key_constraint = 395, + sym_ordered_columns = 396, + sym_ordered_column = 397, + sym_all_fields = 398, + sym_parameter = 399, + sym_field = 400, + sym_qualified_field = 401, + sym_implicit_cast = 402, + sym_cast = 403, + sym_filter_expression = 404, + sym_invocation = 405, + sym_alias_name = 406, + sym_from = 407, + sym_relation = 408, + sym_where = 409, + sym_order_by = 410, + sym_order_target = 411, + sym_limit = 412, + sym_offset = 413, + sym_expression = 414, + sym_binary_expression = 415, + sym_unary_expression = 416, + sym_between_expression = 417, + sym_not_in = 418, + sym_subquery = 419, + sym_list = 420, + sym_literal = 421, + sym__double_quote_string = 422, + sym__single_quote_string = 423, + sym_literal_string = 424, + sym_integer = 425, + sym_decimal_number = 426, + sym_identifier = 427, + aux_sym_program_repeat1 = 428, + aux_sym_array_size_definition_repeat1 = 429, + aux_sym_enum_repeat1 = 430, + aux_sym_array_repeat1 = 431, + aux_sym_select_expression_repeat1 = 432, + aux_sym__truncate_statement_repeat1 = 433, + aux_sym__rename_statement_repeat1 = 434, + aux_sym_alter_table_repeat1 = 435, + aux_sym_alter_role_repeat1 = 436, + aux_sym_alter_index_repeat1 = 437, + aux_sym_alter_index_repeat2 = 438, + aux_sym_alter_sequence_repeat1 = 439, + aux_sym_typed_row_value_expr_list_repeat1 = 440, + aux_sym_set_values_repeat1 = 441, + aux_sym_column_list_repeat1 = 442, + aux_sym__merge_statement_repeat1 = 443, + aux_sym__compute_stats_repeat1 = 444, + aux_sym__compute_stats_repeat2 = 445, + aux_sym__vacuum_table_repeat1 = 446, + aux_sym__partition_spec_repeat1 = 447, + aux_sym_column_definitions_repeat1 = 448, + aux_sym_column_definition_repeat1 = 449, + aux_sym_constraints_repeat1 = 450, + aux_sym_ordered_columns_repeat1 = 451, + aux_sym_invocation_repeat1 = 452, + aux_sym_order_by_repeat1 = 453, + aux_sym_list_repeat1 = 454, }; static const char * const ts_symbol_names[] = { @@ -674,10 +676,10 @@ static const char * const ts_symbol_names[] = { [sym_keyword_smalldatetime] = "keyword_smalldatetime", [sym_keyword_datetimeoffset] = "keyword_datetimeoffset", [aux_sym_keyword_time_token1] = "keyword_time_token1", - [aux_sym_keyword_timestamp_token1] = "keyword_timestamp_token1", - [aux_sym_keyword_timestamp_token2] = "keyword_timestamp_token2", - [aux_sym_keyword_timestamp_token3] = "keyword_timestamp_token3", - [aux_sym_keyword_timestamptz_token1] = "keyword_timestamptz_token1", + [aux_sym_keyword_timestamp_base_token1] = "keyword_timestamp_base_token1", + [aux_sym_keyword_timestamp_base_token2] = "keyword_timestamp_base_token2", + [aux_sym_keyword_timestamp_base_token3] = "keyword_timestamp_base_token3", + [aux_sym_keyword_timestamptz_base_token1] = "keyword_timestamptz_base_token1", [sym_keyword_interval] = "keyword_interval", [sym_keyword_geometry] = "keyword_geometry", [sym_keyword_geography] = "keyword_geography", @@ -758,8 +760,8 @@ static const char * const ts_symbol_names[] = { [sym_keyword_char] = "keyword_char", [sym_keyword_varchar] = "keyword_varchar", [sym_keyword_time] = "keyword_time", - [sym_keyword_timestamp] = "keyword_timestamp", - [sym_keyword_timestamptz] = "keyword_timestamptz", + [sym_keyword_timestamp_base] = "keyword_timestamp_base", + [sym_keyword_timestamptz_base] = "keyword_timestamptz_base", [sym_data_type] = "data_type", [sym_data_type_kind] = "data_type_kind", [sym_array_size_definition] = "array_size_definition", @@ -782,6 +784,8 @@ static const char * const ts_symbol_names[] = { [sym_nvarchar] = "nvarchar", [sym_datetimeoffset] = "datetimeoffset", [sym_time] = "time", + [sym_timestamp] = "timestamp", + [sym_timestamptz] = "timestamptz", [sym_enum] = "enum", [sym_array] = "array", [sym_comment] = "comment", @@ -1130,10 +1134,10 @@ static const TSSymbol ts_symbol_map[] = { [sym_keyword_smalldatetime] = sym_keyword_smalldatetime, [sym_keyword_datetimeoffset] = sym_keyword_datetimeoffset, [aux_sym_keyword_time_token1] = aux_sym_keyword_time_token1, - [aux_sym_keyword_timestamp_token1] = aux_sym_keyword_timestamp_token1, - [aux_sym_keyword_timestamp_token2] = aux_sym_keyword_timestamp_token2, - [aux_sym_keyword_timestamp_token3] = aux_sym_keyword_timestamp_token3, - [aux_sym_keyword_timestamptz_token1] = aux_sym_keyword_timestamptz_token1, + [aux_sym_keyword_timestamp_base_token1] = aux_sym_keyword_timestamp_base_token1, + [aux_sym_keyword_timestamp_base_token2] = aux_sym_keyword_timestamp_base_token2, + [aux_sym_keyword_timestamp_base_token3] = aux_sym_keyword_timestamp_base_token3, + [aux_sym_keyword_timestamptz_base_token1] = aux_sym_keyword_timestamptz_base_token1, [sym_keyword_interval] = sym_keyword_interval, [sym_keyword_geometry] = sym_keyword_geometry, [sym_keyword_geography] = sym_keyword_geography, @@ -1214,8 +1218,8 @@ static const TSSymbol ts_symbol_map[] = { [sym_keyword_char] = sym_keyword_char, [sym_keyword_varchar] = sym_keyword_varchar, [sym_keyword_time] = sym_keyword_time, - [sym_keyword_timestamp] = sym_keyword_timestamp, - [sym_keyword_timestamptz] = sym_keyword_timestamptz, + [sym_keyword_timestamp_base] = sym_keyword_timestamp_base, + [sym_keyword_timestamptz_base] = sym_keyword_timestamptz_base, [sym_data_type] = sym_data_type, [sym_data_type_kind] = sym_data_type_kind, [sym_array_size_definition] = sym_array_size_definition, @@ -1238,6 +1242,8 @@ static const TSSymbol ts_symbol_map[] = { [sym_nvarchar] = sym_nvarchar, [sym_datetimeoffset] = sym_datetimeoffset, [sym_time] = sym_time, + [sym_timestamp] = sym_timestamp, + [sym_timestamptz] = sym_timestamptz, [sym_enum] = sym_enum, [sym_array] = sym_array, [sym_comment] = sym_comment, @@ -2183,19 +2189,19 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = false, .named = false, }, - [aux_sym_keyword_timestamp_token1] = { + [aux_sym_keyword_timestamp_base_token1] = { .visible = false, .named = false, }, - [aux_sym_keyword_timestamp_token2] = { + [aux_sym_keyword_timestamp_base_token2] = { .visible = false, .named = false, }, - [aux_sym_keyword_timestamp_token3] = { + [aux_sym_keyword_timestamp_base_token3] = { .visible = false, .named = false, }, - [aux_sym_keyword_timestamptz_token1] = { + [aux_sym_keyword_timestamptz_base_token1] = { .visible = false, .named = false, }, @@ -2519,11 +2525,11 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, - [sym_keyword_timestamp] = { + [sym_keyword_timestamp_base] = { .visible = true, .named = true, }, - [sym_keyword_timestamptz] = { + [sym_keyword_timestamptz_base] = { .visible = true, .named = true, }, @@ -2615,6 +2621,14 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, + [sym_timestamp] = { + .visible = true, + .named = true, + }, + [sym_timestamptz] = { + .visible = true, + .named = true, + }, [sym_enum] = { .visible = true, .named = true, @@ -4097,9 +4111,9 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [14] = 14, [15] = 15, [16] = 16, - [17] = 4, + [17] = 3, [18] = 2, - [19] = 3, + [19] = 4, [20] = 20, [21] = 21, [22] = 22, @@ -4131,91 +4145,91 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [48] = 48, [49] = 49, [50] = 50, - [51] = 37, + [51] = 32, [52] = 26, [53] = 30, - [54] = 31, - [55] = 35, - [56] = 56, - [57] = 27, - [58] = 32, - [59] = 36, - [60] = 34, - [61] = 33, - [62] = 2, - [63] = 29, - [64] = 23, - [65] = 3, - [66] = 25, - [67] = 41, - [68] = 68, + [54] = 33, + [55] = 34, + [56] = 37, + [57] = 36, + [58] = 29, + [59] = 28, + [60] = 31, + [61] = 2, + [62] = 35, + [63] = 63, + [64] = 41, + [65] = 24, + [66] = 42, + [67] = 67, + [68] = 3, [69] = 69, [70] = 4, - [71] = 40, - [72] = 44, + [71] = 25, + [72] = 72, [73] = 73, [74] = 74, [75] = 75, - [76] = 48, + [76] = 76, [77] = 77, [78] = 78, - [79] = 79, - [80] = 80, - [81] = 81, - [82] = 82, - [83] = 83, - [84] = 84, + [79] = 23, + [80] = 47, + [81] = 49, + [82] = 48, + [83] = 44, + [84] = 45, [85] = 85, [86] = 86, [87] = 87, - [88] = 24, + [88] = 88, [89] = 89, - [90] = 45, - [91] = 43, - [92] = 46, - [93] = 22, - [94] = 49, - [95] = 47, - [96] = 30, - [97] = 31, - [98] = 29, - [99] = 34, - [100] = 32, - [101] = 33, - [102] = 35, - [103] = 36, - [104] = 26, - [105] = 37, - [106] = 27, - [107] = 68, - [108] = 69, + [90] = 90, + [91] = 91, + [92] = 92, + [93] = 46, + [94] = 43, + [95] = 22, + [96] = 29, + [97] = 37, + [98] = 69, + [99] = 28, + [100] = 35, + [101] = 30, + [102] = 31, + [103] = 32, + [104] = 33, + [105] = 34, + [106] = 26, + [107] = 36, + [108] = 63, [109] = 109, [110] = 110, - [111] = 56, - [112] = 112, + [111] = 111, + [112] = 67, [113] = 113, - [114] = 86, + [114] = 114, [115] = 115, [116] = 116, - [117] = 117, - [118] = 78, - [119] = 77, - [120] = 79, + [117] = 87, + [118] = 72, + [119] = 78, + [120] = 90, [121] = 85, - [122] = 83, - [123] = 87, - [124] = 124, - [125] = 84, - [126] = 80, - [127] = 74, - [128] = 81, - [129] = 75, - [130] = 89, - [131] = 73, - [132] = 82, + [122] = 73, + [123] = 86, + [124] = 76, + [125] = 88, + [126] = 74, + [127] = 127, + [128] = 75, + [129] = 91, + [130] = 92, + [131] = 89, + [132] = 77, [133] = 133, [134] = 134, - [135] = 34, + [135] = 32, [136] = 136, [137] = 137, [138] = 138, @@ -4224,109 +4238,109 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [141] = 141, [142] = 142, [143] = 143, - [144] = 144, - [145] = 137, - [146] = 36, - [147] = 35, - [148] = 30, - [149] = 31, - [150] = 29, - [151] = 33, - [152] = 32, - [153] = 26, - [154] = 37, - [155] = 27, + [144] = 29, + [145] = 30, + [146] = 28, + [147] = 147, + [148] = 33, + [149] = 34, + [150] = 35, + [151] = 31, + [152] = 26, + [153] = 137, + [154] = 36, + [155] = 37, [156] = 137, - [157] = 40, - [158] = 23, - [159] = 69, - [160] = 41, - [161] = 25, - [162] = 56, - [163] = 163, - [164] = 3, - [165] = 2, - [166] = 166, - [167] = 4, - [168] = 78, + [157] = 4, + [158] = 2, + [159] = 159, + [160] = 160, + [161] = 24, + [162] = 63, + [163] = 42, + [164] = 67, + [165] = 25, + [166] = 41, + [167] = 3, + [168] = 47, [169] = 169, [170] = 170, [171] = 50, - [172] = 48, + [172] = 49, [173] = 44, - [174] = 46, - [175] = 73, + [174] = 43, + [175] = 78, [176] = 176, - [177] = 77, - [178] = 80, - [179] = 81, - [180] = 82, - [181] = 181, - [182] = 24, - [183] = 45, - [184] = 49, - [185] = 47, - [186] = 79, - [187] = 187, - [188] = 83, - [189] = 43, - [190] = 22, - [191] = 75, - [192] = 169, - [193] = 193, - [194] = 194, - [195] = 195, - [196] = 196, - [197] = 84, - [198] = 85, - [199] = 86, - [200] = 87, - [201] = 89, - [202] = 169, - [203] = 203, + [177] = 177, + [178] = 90, + [179] = 91, + [180] = 73, + [181] = 76, + [182] = 77, + [183] = 183, + [184] = 23, + [185] = 185, + [186] = 186, + [187] = 48, + [188] = 188, + [189] = 45, + [190] = 89, + [191] = 191, + [192] = 192, + [193] = 92, + [194] = 46, + [195] = 22, + [196] = 74, + [197] = 75, + [198] = 198, + [199] = 85, + [200] = 86, + [201] = 87, + [202] = 88, + [203] = 72, [204] = 204, - [205] = 205, + [205] = 170, [206] = 206, - [207] = 138, - [208] = 208, - [209] = 74, + [207] = 141, + [208] = 170, + [209] = 209, [210] = 210, - [211] = 210, - [212] = 212, - [213] = 212, + [211] = 211, + [212] = 211, + [213] = 210, [214] = 210, - [215] = 212, - [216] = 212, - [217] = 210, + [215] = 211, + [216] = 210, + [217] = 211, [218] = 218, [219] = 219, - [220] = 219, - [221] = 219, - [222] = 222, + [220] = 218, + [221] = 221, + [222] = 218, [223] = 223, - [224] = 224, - [225] = 112, + [224] = 111, + [225] = 225, [226] = 226, - [227] = 113, + [227] = 109, [228] = 228, - [229] = 229, + [229] = 110, [230] = 230, [231] = 231, [232] = 232, - [233] = 110, + [233] = 233, [234] = 234, [235] = 235, [236] = 236, [237] = 237, [238] = 238, [239] = 239, - [240] = 238, - [241] = 238, - [242] = 238, + [240] = 239, + [241] = 241, + [242] = 239, [243] = 243, [244] = 244, [245] = 245, - [246] = 246, + [246] = 239, [247] = 247, [248] = 248, [249] = 249, @@ -4337,7 +4351,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [254] = 254, [255] = 255, [256] = 256, - [257] = 257, + [257] = 255, [258] = 258, [259] = 259, [260] = 260, @@ -4348,65 +4362,65 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [265] = 265, [266] = 266, [267] = 267, - [268] = 252, + [268] = 268, [269] = 269, [270] = 270, [271] = 271, - [272] = 272, + [272] = 265, [273] = 273, - [274] = 274, - [275] = 275, + [274] = 266, + [275] = 267, [276] = 276, - [277] = 258, - [278] = 260, - [279] = 267, - [280] = 252, - [281] = 270, - [282] = 271, - [283] = 272, - [284] = 274, - [285] = 275, - [286] = 273, - [287] = 257, - [288] = 288, - [289] = 289, - [290] = 290, - [291] = 291, - [292] = 258, - [293] = 260, - [294] = 267, - [295] = 252, - [296] = 270, + [277] = 254, + [278] = 268, + [279] = 253, + [280] = 280, + [281] = 263, + [282] = 282, + [283] = 283, + [284] = 264, + [285] = 285, + [286] = 286, + [287] = 264, + [288] = 254, + [289] = 265, + [290] = 266, + [291] = 267, + [292] = 268, + [293] = 269, + [294] = 270, + [295] = 263, + [296] = 264, [297] = 271, - [298] = 272, - [299] = 274, - [300] = 275, - [301] = 273, - [302] = 290, - [303] = 303, - [304] = 258, - [305] = 260, - [306] = 267, - [307] = 270, - [308] = 271, - [309] = 272, - [310] = 274, - [311] = 275, - [312] = 312, + [298] = 265, + [299] = 266, + [300] = 267, + [301] = 268, + [302] = 269, + [303] = 270, + [304] = 271, + [305] = 286, + [306] = 306, + [307] = 307, + [308] = 286, + [309] = 309, + [310] = 273, + [311] = 286, + [312] = 254, [313] = 313, - [314] = 314, - [315] = 262, - [316] = 288, - [317] = 273, - [318] = 290, - [319] = 303, - [320] = 261, - [321] = 257, - [322] = 303, - [323] = 261, - [324] = 257, - [325] = 261, - [326] = 290, + [314] = 269, + [315] = 270, + [316] = 316, + [317] = 317, + [318] = 309, + [319] = 253, + [320] = 271, + [321] = 317, + [322] = 317, + [323] = 309, + [324] = 253, + [325] = 309, + [326] = 263, [327] = 327, [328] = 328, [329] = 329, @@ -4509,7 +4523,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [426] = 426, [427] = 427, [428] = 428, - [429] = 327, + [429] = 429, [430] = 430, [431] = 431, [432] = 432, @@ -4519,21 +4533,21 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [436] = 436, [437] = 437, [438] = 438, - [439] = 439, + [439] = 327, [440] = 440, [441] = 441, - [442] = 330, - [443] = 329, - [444] = 332, - [445] = 331, + [442] = 442, + [443] = 443, + [444] = 444, + [445] = 445, [446] = 446, [447] = 447, - [448] = 328, - [449] = 449, - [450] = 450, - [451] = 334, - [452] = 337, - [453] = 338, + [448] = 332, + [449] = 331, + [450] = 328, + [451] = 330, + [452] = 333, + [453] = 329, [454] = 454, [455] = 455, [456] = 456, @@ -4544,23 +4558,23 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [461] = 461, [462] = 462, [463] = 463, - [464] = 464, + [464] = 337, [465] = 465, [466] = 466, [467] = 467, [468] = 468, [469] = 469, [470] = 470, - [471] = 471, + [471] = 336, [472] = 472, - [473] = 473, + [473] = 338, [474] = 474, - [475] = 475, + [475] = 340, [476] = 476, [477] = 477, [478] = 478, [479] = 479, - [480] = 336, + [480] = 480, [481] = 481, [482] = 482, [483] = 483, @@ -4571,106 +4585,106 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [488] = 488, [489] = 489, [490] = 490, - [491] = 341, + [491] = 491, [492] = 492, - [493] = 340, - [494] = 349, - [495] = 358, + [493] = 493, + [494] = 494, + [495] = 495, [496] = 496, - [497] = 497, - [498] = 344, - [499] = 345, + [497] = 334, + [498] = 353, + [499] = 362, [500] = 500, - [501] = 343, - [502] = 346, - [503] = 353, - [504] = 354, - [505] = 355, - [506] = 357, - [507] = 350, - [508] = 351, - [509] = 360, - [510] = 361, - [511] = 352, - [512] = 362, - [513] = 359, - [514] = 356, - [515] = 342, - [516] = 347, - [517] = 348, - [518] = 378, - [519] = 519, - [520] = 390, - [521] = 391, - [522] = 392, - [523] = 395, - [524] = 399, - [525] = 401, - [526] = 402, - [527] = 404, - [528] = 406, - [529] = 407, - [530] = 410, - [531] = 388, - [532] = 364, - [533] = 365, - [534] = 367, - [535] = 368, - [536] = 536, - [537] = 379, - [538] = 413, - [539] = 389, - [540] = 397, - [541] = 398, - [542] = 400, - [543] = 403, - [544] = 408, - [545] = 409, - [546] = 546, - [547] = 412, - [548] = 366, - [549] = 369, - [550] = 370, - [551] = 371, + [501] = 501, + [502] = 502, + [503] = 364, + [504] = 352, + [505] = 365, + [506] = 358, + [507] = 366, + [508] = 367, + [509] = 343, + [510] = 357, + [511] = 349, + [512] = 361, + [513] = 345, + [514] = 355, + [515] = 363, + [516] = 344, + [517] = 346, + [518] = 342, + [519] = 354, + [520] = 347, + [521] = 348, + [522] = 350, + [523] = 359, + [524] = 351, + [525] = 356, + [526] = 360, + [527] = 391, + [528] = 409, + [529] = 410, + [530] = 411, + [531] = 400, + [532] = 401, + [533] = 533, + [534] = 402, + [535] = 403, + [536] = 404, + [537] = 537, + [538] = 412, + [539] = 396, + [540] = 413, + [541] = 414, + [542] = 542, + [543] = 543, + [544] = 415, + [545] = 416, + [546] = 397, + [547] = 398, + [548] = 369, + [549] = 370, + [550] = 371, + [551] = 417, [552] = 372, [553] = 373, [554] = 374, [555] = 555, - [556] = 375, - [557] = 376, - [558] = 377, - [559] = 559, - [560] = 380, - [561] = 381, - [562] = 382, - [563] = 383, - [564] = 384, - [565] = 385, - [566] = 386, - [567] = 387, - [568] = 568, - [569] = 393, - [570] = 570, - [571] = 394, - [572] = 396, - [573] = 363, - [574] = 405, - [575] = 411, - [576] = 576, - [577] = 577, - [578] = 414, - [579] = 579, - [580] = 580, - [581] = 415, + [556] = 376, + [557] = 377, + [558] = 378, + [559] = 399, + [560] = 405, + [561] = 379, + [562] = 380, + [563] = 381, + [564] = 382, + [565] = 383, + [566] = 384, + [567] = 385, + [568] = 386, + [569] = 387, + [570] = 388, + [571] = 389, + [572] = 406, + [573] = 390, + [574] = 407, + [575] = 575, + [576] = 368, + [577] = 392, + [578] = 408, + [579] = 393, + [580] = 394, + [581] = 395, [582] = 582, - [583] = 583, + [583] = 375, [584] = 584, [585] = 585, [586] = 586, - [587] = 587, - [588] = 588, - [589] = 418, - [590] = 590, + [587] = 422, + [588] = 419, + [589] = 589, + [590] = 420, [591] = 591, [592] = 592, [593] = 593, @@ -4684,15 +4698,15 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [601] = 601, [602] = 602, [603] = 603, - [604] = 420, - [605] = 419, + [604] = 604, + [605] = 605, [606] = 606, - [607] = 607, + [607] = 424, [608] = 608, [609] = 609, [610] = 610, [611] = 611, - [612] = 612, + [612] = 423, [613] = 613, [614] = 614, [615] = 615, @@ -4736,7 +4750,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [653] = 653, [654] = 654, [655] = 655, - [656] = 656, + [656] = 654, [657] = 657, [658] = 658, [659] = 659, @@ -4745,7 +4759,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [662] = 662, [663] = 663, [664] = 664, - [665] = 635, + [665] = 665, [666] = 666, [667] = 667, [668] = 668, @@ -4777,11 +4791,11 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [694] = 694, [695] = 695, [696] = 696, - [697] = 697, + [697] = 678, [698] = 698, [699] = 699, [700] = 700, - [701] = 670, + [701] = 701, [702] = 702, [703] = 703, [704] = 704, @@ -4830,9 +4844,9 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [747] = 747, [748] = 748, [749] = 749, - [750] = 748, + [750] = 750, [751] = 751, - [752] = 745, + [752] = 752, [753] = 753, [754] = 754, [755] = 755, @@ -4842,7 +4856,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [759] = 759, [760] = 760, [761] = 761, - [762] = 762, + [762] = 759, [763] = 763, [764] = 764, [765] = 765, @@ -4880,19 +4894,19 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [797] = 797, [798] = 798, [799] = 799, - [800] = 745, + [800] = 800, [801] = 801, [802] = 802, - [803] = 745, + [803] = 803, [804] = 804, [805] = 805, [806] = 806, [807] = 807, - [808] = 808, + [808] = 796, [809] = 809, [810] = 810, - [811] = 811, - [812] = 812, + [811] = 796, + [812] = 796, [813] = 813, [814] = 814, [815] = 815, @@ -4904,7 +4918,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [821] = 821, [822] = 822, [823] = 823, - [824] = 822, + [824] = 824, [825] = 825, [826] = 826, [827] = 827, @@ -4932,7 +4946,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [849] = 849, [850] = 850, [851] = 851, - [852] = 469, + [852] = 852, [853] = 853, [854] = 854, [855] = 855, @@ -4973,11 +4987,11 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [890] = 890, [891] = 891, [892] = 892, - [893] = 893, - [894] = 894, + [893] = 868, + [894] = 861, [895] = 895, - [896] = 834, - [897] = 897, + [896] = 896, + [897] = 819, [898] = 898, [899] = 899, [900] = 900, @@ -4985,21 +4999,21 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [902] = 902, [903] = 903, [904] = 904, - [905] = 905, - [906] = 906, - [907] = 806, + [905] = 815, + [906] = 481, + [907] = 907, [908] = 908, [909] = 909, - [910] = 829, + [910] = 910, [911] = 911, - [912] = 828, - [913] = 834, + [912] = 912, + [913] = 913, [914] = 914, [915] = 915, [916] = 916, [917] = 917, [918] = 918, - [919] = 828, + [919] = 919, [920] = 920, [921] = 921, [922] = 922, @@ -5009,9 +5023,9 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [926] = 926, [927] = 927, [928] = 928, - [929] = 929, - [930] = 930, - [931] = 931, + [929] = 858, + [930] = 861, + [931] = 819, [932] = 932, [933] = 933, [934] = 934, @@ -5065,7 +5079,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [982] = 982, [983] = 983, [984] = 984, - [985] = 955, + [985] = 985, [986] = 986, [987] = 987, [988] = 988, @@ -5074,7 +5088,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [991] = 991, [992] = 992, [993] = 993, - [994] = 994, + [994] = 981, [995] = 995, [996] = 996, [997] = 997, @@ -5189,7 +5203,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1106] = 1106, [1107] = 1107, [1108] = 1108, - [1109] = 1031, + [1109] = 1109, [1110] = 1110, [1111] = 1111, [1112] = 1112, @@ -5197,30 +5211,30 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1114] = 1114, [1115] = 1115, [1116] = 1116, - [1117] = 938, - [1118] = 1118, + [1117] = 1117, + [1118] = 1016, [1119] = 1119, - [1120] = 1071, + [1120] = 1120, [1121] = 1121, [1122] = 1122, [1123] = 1123, - [1124] = 989, + [1124] = 1124, [1125] = 1125, - [1126] = 1031, - [1127] = 1127, - [1128] = 1071, - [1129] = 1129, + [1126] = 1126, + [1127] = 990, + [1128] = 1128, + [1129] = 1029, [1130] = 1130, - [1131] = 927, - [1132] = 1132, - [1133] = 1123, + [1131] = 1126, + [1132] = 1097, + [1133] = 1133, [1134] = 1134, - [1135] = 1135, + [1135] = 1016, [1136] = 1136, - [1137] = 1137, + [1137] = 1029, [1138] = 1138, [1139] = 1139, - [1140] = 1140, + [1140] = 963, [1141] = 1141, [1142] = 1142, [1143] = 1143, @@ -5351,7 +5365,7 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1268] = 1268, [1269] = 1269, [1270] = 1270, - [1271] = 1247, + [1271] = 1271, [1272] = 1272, [1273] = 1273, [1274] = 1274, @@ -5370,14 +5384,14 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1287] = 1287, [1288] = 1288, [1289] = 1289, - [1290] = 1285, + [1290] = 1290, [1291] = 1291, [1292] = 1292, [1293] = 1293, - [1294] = 1294, - [1295] = 1291, + [1294] = 1272, + [1295] = 1295, [1296] = 1296, - [1297] = 1247, + [1297] = 1297, [1298] = 1298, [1299] = 1299, [1300] = 1300, @@ -5385,29 +5399,29 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1302] = 1302, [1303] = 1303, [1304] = 1304, - [1305] = 1139, - [1306] = 1292, + [1305] = 1305, + [1306] = 1306, [1307] = 1307, [1308] = 1308, [1309] = 1309, - [1310] = 1310, - [1311] = 1311, - [1312] = 1312, - [1313] = 1139, + [1310] = 1300, + [1311] = 1301, + [1312] = 1303, + [1313] = 1313, [1314] = 1314, - [1315] = 1315, + [1315] = 1272, [1316] = 1316, [1317] = 1317, - [1318] = 1318, + [1318] = 1232, [1319] = 1319, - [1320] = 1249, + [1320] = 1320, [1321] = 1321, [1322] = 1322, - [1323] = 1323, + [1323] = 1232, [1324] = 1324, [1325] = 1325, [1326] = 1326, - [1327] = 1327, + [1327] = 1280, [1328] = 1328, [1329] = 1329, [1330] = 1330, @@ -5532,29 +5546,29 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1449] = 1449, [1450] = 1450, [1451] = 1451, - [1452] = 1452, - [1453] = 1352, - [1454] = 1385, + [1452] = 1359, + [1453] = 1453, + [1454] = 1454, [1455] = 1455, [1456] = 1456, [1457] = 1457, - [1458] = 1384, - [1459] = 1406, - [1460] = 1412, - [1461] = 1419, + [1458] = 1458, + [1459] = 1459, + [1460] = 1460, + [1461] = 1461, [1462] = 1462, - [1463] = 1322, + [1463] = 1463, [1464] = 1464, - [1465] = 1465, - [1466] = 1466, + [1465] = 1358, + [1466] = 1374, [1467] = 1467, - [1468] = 1468, + [1468] = 1335, [1469] = 1469, - [1470] = 1470, - [1471] = 1471, - [1472] = 1472, - [1473] = 1473, - [1474] = 1329, + [1470] = 1412, + [1471] = 1419, + [1472] = 1421, + [1473] = 1426, + [1474] = 1474, [1475] = 1475, [1476] = 1476, [1477] = 1477, @@ -5565,132 +5579,148 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [1482] = 1482, [1483] = 1483, [1484] = 1484, - [1485] = 1485, - [1486] = 1335, + [1485] = 1461, + [1486] = 1486, [1487] = 1487, - [1488] = 1456, + [1488] = 1488, [1489] = 1489, [1490] = 1490, [1491] = 1491, [1492] = 1492, [1493] = 1493, - [1494] = 1494, + [1494] = 1330, [1495] = 1495, [1496] = 1496, - [1497] = 1496, + [1497] = 1497, [1498] = 1498, - [1499] = 1499, + [1499] = 1478, [1500] = 1500, [1501] = 1501, [1502] = 1502, - [1503] = 1359, - [1504] = 1361, + [1503] = 1503, + [1504] = 1504, [1505] = 1505, - [1506] = 1364, - [1507] = 1366, - [1508] = 1373, - [1509] = 1378, - [1510] = 1380, - [1511] = 1387, - [1512] = 1512, - [1513] = 1392, + [1506] = 1506, + [1507] = 1507, + [1508] = 1508, + [1509] = 1509, + [1510] = 1483, + [1511] = 1484, + [1512] = 1486, + [1513] = 1513, [1514] = 1514, - [1515] = 1423, - [1516] = 1424, - [1517] = 1426, - [1518] = 1428, - [1519] = 1331, - [1520] = 1333, - [1521] = 1344, - [1522] = 1405, - [1523] = 1512, - [1524] = 1329, - [1525] = 1525, - [1526] = 1352, - [1527] = 1385, - [1528] = 1528, + [1515] = 1515, + [1516] = 1495, + [1517] = 1496, + [1518] = 1518, + [1519] = 1500, + [1520] = 1501, + [1521] = 1502, + [1522] = 1503, + [1523] = 1506, + [1524] = 1507, + [1525] = 1509, + [1526] = 1526, + [1527] = 1527, + [1528] = 1458, [1529] = 1529, - [1530] = 1384, - [1531] = 1406, - [1532] = 1412, - [1533] = 1419, - [1534] = 1498, - [1535] = 1472, - [1536] = 1536, - [1537] = 1537, - [1538] = 1335, - [1539] = 1499, + [1530] = 1443, + [1531] = 1446, + [1532] = 1459, + [1533] = 1497, + [1534] = 1463, + [1535] = 1469, + [1536] = 1489, + [1537] = 1408, + [1538] = 1538, + [1539] = 1359, [1540] = 1540, - [1541] = 1541, - [1542] = 1406, - [1543] = 1419, - [1544] = 1544, - [1545] = 1462, - [1546] = 1546, - [1547] = 1470, - [1548] = 1548, + [1541] = 1358, + [1542] = 1374, + [1543] = 1543, + [1544] = 1526, + [1545] = 1412, + [1546] = 1419, + [1547] = 1421, + [1548] = 1426, [1549] = 1549, - [1550] = 1550, + [1550] = 1461, [1551] = 1551, - [1552] = 1472, - [1553] = 1553, + [1552] = 1552, + [1553] = 1478, [1554] = 1554, - [1555] = 1465, - [1556] = 1466, - [1557] = 1467, - [1558] = 1468, - [1559] = 1469, - [1560] = 1471, - [1561] = 1477, - [1562] = 1478, + [1555] = 1555, + [1556] = 1556, + [1557] = 1419, + [1558] = 1426, + [1559] = 1559, + [1560] = 1422, + [1561] = 1423, + [1562] = 1562, [1563] = 1563, [1564] = 1564, - [1565] = 1481, - [1566] = 1482, - [1567] = 1483, - [1568] = 1484, - [1569] = 1487, - [1570] = 1489, - [1571] = 1400, - [1572] = 1402, - [1573] = 1408, - [1574] = 1422, - [1575] = 1418, - [1576] = 1421, - [1577] = 1427, - [1578] = 1332, - [1579] = 1579, - [1580] = 1462, - [1581] = 1322, - [1582] = 1470, - [1583] = 1583, - [1584] = 1584, - [1585] = 1585, - [1586] = 1462, - [1587] = 1470, - [1588] = 1588, - [1589] = 1589, - [1590] = 1590, - [1591] = 1591, - [1592] = 1525, - [1593] = 1553, - [1594] = 1554, - [1595] = 1356, - [1596] = 1389, - [1597] = 1391, - [1598] = 1411, - [1599] = 1420, + [1565] = 1565, + [1566] = 1566, + [1567] = 1567, + [1568] = 1568, + [1569] = 1569, + [1570] = 1570, + [1571] = 1493, + [1572] = 1331, + [1573] = 1332, + [1574] = 1333, + [1575] = 1336, + [1576] = 1341, + [1577] = 1342, + [1578] = 1344, + [1579] = 1345, + [1580] = 1346, + [1581] = 1347, + [1582] = 1348, + [1583] = 1349, + [1584] = 1351, + [1585] = 1352, + [1586] = 1482, + [1587] = 1505, + [1588] = 1538, + [1589] = 1566, + [1590] = 1515, + [1591] = 1392, + [1592] = 1435, + [1593] = 1492, + [1594] = 1467, + [1595] = 1595, + [1596] = 1422, + [1597] = 1423, + [1598] = 1562, + [1599] = 1599, [1600] = 1600, [1601] = 1601, - [1602] = 1602, - [1603] = 1476, - [1604] = 1452, - [1605] = 1457, - [1606] = 1354, - [1607] = 1390, - [1608] = 1564, - [1609] = 1609, - [1610] = 1610, + [1602] = 1422, + [1603] = 1562, + [1604] = 1604, + [1605] = 1605, + [1606] = 1562, + [1607] = 1607, + [1608] = 1383, + [1609] = 1444, + [1610] = 1453, + [1611] = 1611, + [1612] = 1454, + [1613] = 1457, + [1614] = 1339, + [1615] = 1416, + [1616] = 1527, + [1617] = 1617, + [1618] = 1570, + [1619] = 1340, + [1620] = 1479, + [1621] = 1481, + [1622] = 1622, + [1623] = 1456, + [1624] = 1622, + [1625] = 1625, + [1626] = 1626, }; static bool ts_lex(TSLexer *lexer, TSStateId state) { @@ -8216,7 +8246,7 @@ static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) { lookahead == 'f') ADVANCE(549); END_STATE(); case 415: - ACCEPT_TOKEN(aux_sym_keyword_timestamp_token3); + ACCEPT_TOKEN(aux_sym_keyword_timestamp_base_token3); END_STATE(); case 416: ACCEPT_TOKEN(sym_keyword_after); @@ -9409,7 +9439,7 @@ static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) { ACCEPT_TOKEN(sym_keyword_verbose); END_STATE(); case 732: - ACCEPT_TOKEN(aux_sym_keyword_timestamp_token2); + ACCEPT_TOKEN(aux_sym_keyword_timestamp_base_token2); END_STATE(); case 733: if (lookahead == 'L' || @@ -9689,7 +9719,7 @@ static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) { ACCEPT_TOKEN(sym_keyword_temporary); END_STATE(); case 810: - ACCEPT_TOKEN(aux_sym_keyword_timestamp_token1); + ACCEPT_TOKEN(aux_sym_keyword_timestamp_base_token1); if (lookahead == 'T' || lookahead == 't') ADVANCE(827); END_STATE(); @@ -9789,7 +9819,7 @@ static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) { ACCEPT_TOKEN(aux_sym_keyword_smallserial_token1); END_STATE(); case 837: - ACCEPT_TOKEN(aux_sym_keyword_timestamptz_token1); + ACCEPT_TOKEN(aux_sym_keyword_timestamptz_base_token1); END_STATE(); case 838: ACCEPT_TOKEN(sym_keyword_transaction); @@ -9885,8 +9915,8 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [24] = {.lex_state = 15}, [25] = {.lex_state = 15}, [26] = {.lex_state = 15}, - [27] = {.lex_state = 15}, - [28] = {.lex_state = 0}, + [27] = {.lex_state = 0}, + [28] = {.lex_state = 15}, [29] = {.lex_state = 15}, [30] = {.lex_state = 15}, [31] = {.lex_state = 15}, @@ -9898,9 +9928,9 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [37] = {.lex_state = 15}, [38] = {.lex_state = 0}, [39] = {.lex_state = 0}, - [40] = {.lex_state = 15}, + [40] = {.lex_state = 0}, [41] = {.lex_state = 15}, - [42] = {.lex_state = 0}, + [42] = {.lex_state = 15}, [43] = {.lex_state = 15}, [44] = {.lex_state = 15}, [45] = {.lex_state = 15}, @@ -9972,20 +10002,20 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [111] = {.lex_state = 15}, [112] = {.lex_state = 15}, [113] = {.lex_state = 15}, - [114] = {.lex_state = 15}, + [114] = {.lex_state = 1}, [115] = {.lex_state = 0}, [116] = {.lex_state = 0}, - [117] = {.lex_state = 1}, + [117] = {.lex_state = 15}, [118] = {.lex_state = 15}, [119] = {.lex_state = 15}, [120] = {.lex_state = 15}, [121] = {.lex_state = 15}, [122] = {.lex_state = 15}, [123] = {.lex_state = 15}, - [124] = {.lex_state = 1}, + [124] = {.lex_state = 15}, [125] = {.lex_state = 15}, [126] = {.lex_state = 15}, - [127] = {.lex_state = 15}, + [127] = {.lex_state = 1}, [128] = {.lex_state = 15}, [129] = {.lex_state = 15}, [130] = {.lex_state = 15}, @@ -10096,14 +10126,14 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [235] = {.lex_state = 15}, [236] = {.lex_state = 15}, [237] = {.lex_state = 15}, - [238] = {.lex_state = 15}, - [239] = {.lex_state = 0}, + [238] = {.lex_state = 0}, + [239] = {.lex_state = 15}, [240] = {.lex_state = 15}, [241] = {.lex_state = 15}, [242] = {.lex_state = 15}, [243] = {.lex_state = 0}, - [244] = {.lex_state = 0}, - [245] = {.lex_state = 15}, + [244] = {.lex_state = 15}, + [245] = {.lex_state = 0}, [246] = {.lex_state = 15}, [247] = {.lex_state = 15}, [248] = {.lex_state = 15}, @@ -10296,9 +10326,9 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [435] = {.lex_state = 0}, [436] = {.lex_state = 0}, [437] = {.lex_state = 0}, - [438] = {.lex_state = 15}, + [438] = {.lex_state = 0}, [439] = {.lex_state = 0}, - [440] = {.lex_state = 0}, + [440] = {.lex_state = 15}, [441] = {.lex_state = 0}, [442] = {.lex_state = 0}, [443] = {.lex_state = 0}, @@ -10313,10 +10343,10 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [452] = {.lex_state = 0}, [453] = {.lex_state = 0}, [454] = {.lex_state = 0}, - [455] = {.lex_state = 0}, + [455] = {.lex_state = 15}, [456] = {.lex_state = 0}, [457] = {.lex_state = 0}, - [458] = {.lex_state = 15}, + [458] = {.lex_state = 0}, [459] = {.lex_state = 0}, [460] = {.lex_state = 0}, [461] = {.lex_state = 0}, @@ -10354,13 +10384,13 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [493] = {.lex_state = 0}, [494] = {.lex_state = 0}, [495] = {.lex_state = 0}, - [496] = {.lex_state = 15}, - [497] = {.lex_state = 15}, + [496] = {.lex_state = 0}, + [497] = {.lex_state = 0}, [498] = {.lex_state = 0}, [499] = {.lex_state = 0}, [500] = {.lex_state = 15}, - [501] = {.lex_state = 0}, - [502] = {.lex_state = 0}, + [501] = {.lex_state = 15}, + [502] = {.lex_state = 15}, [503] = {.lex_state = 0}, [504] = {.lex_state = 0}, [505] = {.lex_state = 0}, @@ -10377,7 +10407,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [516] = {.lex_state = 0}, [517] = {.lex_state = 0}, [518] = {.lex_state = 0}, - [519] = {.lex_state = 15}, + [519] = {.lex_state = 0}, [520] = {.lex_state = 0}, [521] = {.lex_state = 0}, [522] = {.lex_state = 0}, @@ -10391,20 +10421,20 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [530] = {.lex_state = 0}, [531] = {.lex_state = 0}, [532] = {.lex_state = 0}, - [533] = {.lex_state = 0}, + [533] = {.lex_state = 15}, [534] = {.lex_state = 0}, [535] = {.lex_state = 0}, - [536] = {.lex_state = 15}, - [537] = {.lex_state = 0}, + [536] = {.lex_state = 0}, + [537] = {.lex_state = 15}, [538] = {.lex_state = 0}, [539] = {.lex_state = 0}, [540] = {.lex_state = 0}, [541] = {.lex_state = 0}, - [542] = {.lex_state = 0}, - [543] = {.lex_state = 0}, + [542] = {.lex_state = 15}, + [543] = {.lex_state = 15}, [544] = {.lex_state = 0}, [545] = {.lex_state = 0}, - [546] = {.lex_state = 15}, + [546] = {.lex_state = 0}, [547] = {.lex_state = 0}, [548] = {.lex_state = 0}, [549] = {.lex_state = 0}, @@ -10417,7 +10447,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [556] = {.lex_state = 0}, [557] = {.lex_state = 0}, [558] = {.lex_state = 0}, - [559] = {.lex_state = 15}, + [559] = {.lex_state = 0}, [560] = {.lex_state = 0}, [561] = {.lex_state = 0}, [562] = {.lex_state = 0}, @@ -10426,39 +10456,39 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [565] = {.lex_state = 0}, [566] = {.lex_state = 0}, [567] = {.lex_state = 0}, - [568] = {.lex_state = 15}, + [568] = {.lex_state = 0}, [569] = {.lex_state = 0}, - [570] = {.lex_state = 15}, + [570] = {.lex_state = 0}, [571] = {.lex_state = 0}, [572] = {.lex_state = 0}, [573] = {.lex_state = 0}, [574] = {.lex_state = 0}, - [575] = {.lex_state = 0}, - [576] = {.lex_state = 15}, + [575] = {.lex_state = 15}, + [576] = {.lex_state = 0}, [577] = {.lex_state = 0}, [578] = {.lex_state = 0}, - [579] = {.lex_state = 15}, - [580] = {.lex_state = 15}, + [579] = {.lex_state = 0}, + [580] = {.lex_state = 0}, [581] = {.lex_state = 0}, - [582] = {.lex_state = 0}, + [582] = {.lex_state = 15}, [583] = {.lex_state = 0}, [584] = {.lex_state = 0}, - [585] = {.lex_state = 15}, + [585] = {.lex_state = 0}, [586] = {.lex_state = 0}, - [587] = {.lex_state = 15}, + [587] = {.lex_state = 0}, [588] = {.lex_state = 0}, [589] = {.lex_state = 0}, [590] = {.lex_state = 0}, [591] = {.lex_state = 0}, - [592] = {.lex_state = 15}, + [592] = {.lex_state = 0}, [593] = {.lex_state = 0}, - [594] = {.lex_state = 0}, - [595] = {.lex_state = 0}, + [594] = {.lex_state = 15}, + [595] = {.lex_state = 15}, [596] = {.lex_state = 0}, - [597] = {.lex_state = 0}, - [598] = {.lex_state = 0}, - [599] = {.lex_state = 0}, - [600] = {.lex_state = 0}, + [597] = {.lex_state = 15}, + [598] = {.lex_state = 15}, + [599] = {.lex_state = 15}, + [600] = {.lex_state = 15}, [601] = {.lex_state = 0}, [602] = {.lex_state = 0}, [603] = {.lex_state = 0}, @@ -10698,8 +10728,8 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [837] = {.lex_state = 0}, [838] = {.lex_state = 0}, [839] = {.lex_state = 0}, - [840] = {.lex_state = 15}, - [841] = {.lex_state = 15}, + [840] = {.lex_state = 0}, + [841] = {.lex_state = 0}, [842] = {.lex_state = 0}, [843] = {.lex_state = 0}, [844] = {.lex_state = 0}, @@ -10767,8 +10797,8 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [906] = {.lex_state = 0}, [907] = {.lex_state = 0}, [908] = {.lex_state = 0}, - [909] = {.lex_state = 0}, - [910] = {.lex_state = 0}, + [909] = {.lex_state = 15}, + [910] = {.lex_state = 15}, [911] = {.lex_state = 0}, [912] = {.lex_state = 0}, [913] = {.lex_state = 0}, @@ -10813,7 +10843,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [952] = {.lex_state = 0}, [953] = {.lex_state = 0}, [954] = {.lex_state = 0}, - [955] = {.lex_state = 15}, + [955] = {.lex_state = 0}, [956] = {.lex_state = 0}, [957] = {.lex_state = 0}, [958] = {.lex_state = 0}, @@ -10839,11 +10869,11 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [978] = {.lex_state = 0}, [979] = {.lex_state = 0}, [980] = {.lex_state = 0}, - [981] = {.lex_state = 0}, + [981] = {.lex_state = 15}, [982] = {.lex_state = 0}, [983] = {.lex_state = 0}, [984] = {.lex_state = 0}, - [985] = {.lex_state = 15}, + [985] = {.lex_state = 0}, [986] = {.lex_state = 0}, [987] = {.lex_state = 0}, [988] = {.lex_state = 0}, @@ -10852,7 +10882,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [991] = {.lex_state = 0}, [992] = {.lex_state = 0}, [993] = {.lex_state = 0}, - [994] = {.lex_state = 0}, + [994] = {.lex_state = 15}, [995] = {.lex_state = 0}, [996] = {.lex_state = 0}, [997] = {.lex_state = 0}, @@ -10872,8 +10902,8 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1011] = {.lex_state = 0}, [1012] = {.lex_state = 0}, [1013] = {.lex_state = 0}, - [1014] = {.lex_state = 15}, - [1015] = {.lex_state = 15}, + [1014] = {.lex_state = 0}, + [1015] = {.lex_state = 0}, [1016] = {.lex_state = 0}, [1017] = {.lex_state = 0}, [1018] = {.lex_state = 0}, @@ -10907,12 +10937,12 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1046] = {.lex_state = 0}, [1047] = {.lex_state = 15}, [1048] = {.lex_state = 0}, - [1049] = {.lex_state = 15}, + [1049] = {.lex_state = 0}, [1050] = {.lex_state = 0}, [1051] = {.lex_state = 0}, [1052] = {.lex_state = 0}, [1053] = {.lex_state = 0}, - [1054] = {.lex_state = 0}, + [1054] = {.lex_state = 15}, [1055] = {.lex_state = 0}, [1056] = {.lex_state = 0}, [1057] = {.lex_state = 0}, @@ -10937,7 +10967,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1076] = {.lex_state = 0}, [1077] = {.lex_state = 0}, [1078] = {.lex_state = 0}, - [1079] = {.lex_state = 0}, + [1079] = {.lex_state = 15}, [1080] = {.lex_state = 0}, [1081] = {.lex_state = 0}, [1082] = {.lex_state = 0}, @@ -10971,7 +11001,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1110] = {.lex_state = 0}, [1111] = {.lex_state = 0}, [1112] = {.lex_state = 0}, - [1113] = {.lex_state = 0}, + [1113] = {.lex_state = 15}, [1114] = {.lex_state = 0}, [1115] = {.lex_state = 0}, [1116] = {.lex_state = 0}, @@ -11009,12 +11039,12 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1148] = {.lex_state = 0}, [1149] = {.lex_state = 0}, [1150] = {.lex_state = 0}, - [1151] = {.lex_state = 0}, + [1151] = {.lex_state = 15}, [1152] = {.lex_state = 0}, [1153] = {.lex_state = 0}, [1154] = {.lex_state = 0}, [1155] = {.lex_state = 0}, - [1156] = {.lex_state = 15}, + [1156] = {.lex_state = 0}, [1157] = {.lex_state = 0}, [1158] = {.lex_state = 0}, [1159] = {.lex_state = 0}, @@ -11022,7 +11052,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1161] = {.lex_state = 0}, [1162] = {.lex_state = 0}, [1163] = {.lex_state = 0}, - [1164] = {.lex_state = 15}, + [1164] = {.lex_state = 0}, [1165] = {.lex_state = 0}, [1166] = {.lex_state = 0}, [1167] = {.lex_state = 0}, @@ -11105,7 +11135,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1244] = {.lex_state = 0}, [1245] = {.lex_state = 0}, [1246] = {.lex_state = 0}, - [1247] = {.lex_state = 15}, + [1247] = {.lex_state = 0}, [1248] = {.lex_state = 0}, [1249] = {.lex_state = 0}, [1250] = {.lex_state = 0}, @@ -11113,7 +11143,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1252] = {.lex_state = 0}, [1253] = {.lex_state = 0}, [1254] = {.lex_state = 0}, - [1255] = {.lex_state = 0}, + [1255] = {.lex_state = 15}, [1256] = {.lex_state = 0}, [1257] = {.lex_state = 0}, [1258] = {.lex_state = 0}, @@ -11129,8 +11159,8 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1268] = {.lex_state = 0}, [1269] = {.lex_state = 0}, [1270] = {.lex_state = 0}, - [1271] = {.lex_state = 15}, - [1272] = {.lex_state = 0}, + [1271] = {.lex_state = 0}, + [1272] = {.lex_state = 15}, [1273] = {.lex_state = 0}, [1274] = {.lex_state = 0}, [1275] = {.lex_state = 0}, @@ -11152,10 +11182,10 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1291] = {.lex_state = 0}, [1292] = {.lex_state = 0}, [1293] = {.lex_state = 0}, - [1294] = {.lex_state = 0}, + [1294] = {.lex_state = 15}, [1295] = {.lex_state = 0}, [1296] = {.lex_state = 0}, - [1297] = {.lex_state = 15}, + [1297] = {.lex_state = 0}, [1298] = {.lex_state = 0}, [1299] = {.lex_state = 0}, [1300] = {.lex_state = 0}, @@ -11173,50 +11203,50 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1312] = {.lex_state = 0}, [1313] = {.lex_state = 0}, [1314] = {.lex_state = 0}, - [1315] = {.lex_state = 0}, + [1315] = {.lex_state = 15}, [1316] = {.lex_state = 0}, [1317] = {.lex_state = 0}, [1318] = {.lex_state = 0}, [1319] = {.lex_state = 0}, [1320] = {.lex_state = 0}, [1321] = {.lex_state = 0}, - [1322] = {.lex_state = 69}, + [1322] = {.lex_state = 0}, [1323] = {.lex_state = 0}, - [1324] = {.lex_state = 15}, - [1325] = {.lex_state = 15}, + [1324] = {.lex_state = 0}, + [1325] = {.lex_state = 0}, [1326] = {.lex_state = 0}, [1327] = {.lex_state = 0}, [1328] = {.lex_state = 0}, [1329] = {.lex_state = 0}, [1330] = {.lex_state = 0}, - [1331] = {.lex_state = 0}, + [1331] = {.lex_state = 15}, [1332] = {.lex_state = 15}, - [1333] = {.lex_state = 0}, + [1333] = {.lex_state = 15}, [1334] = {.lex_state = 0}, [1335] = {.lex_state = 0}, - [1336] = {.lex_state = 0}, + [1336] = {.lex_state = 15}, [1337] = {.lex_state = 0}, - [1338] = {.lex_state = 15}, + [1338] = {.lex_state = 0}, [1339] = {.lex_state = 0}, - [1340] = {.lex_state = 0}, - [1341] = {.lex_state = 0}, - [1342] = {.lex_state = 0}, + [1340] = {.lex_state = 15}, + [1341] = {.lex_state = 15}, + [1342] = {.lex_state = 15}, [1343] = {.lex_state = 0}, - [1344] = {.lex_state = 0}, + [1344] = {.lex_state = 15}, [1345] = {.lex_state = 0}, [1346] = {.lex_state = 0}, - [1347] = {.lex_state = 0}, - [1348] = {.lex_state = 0}, - [1349] = {.lex_state = 0}, + [1347] = {.lex_state = 15}, + [1348] = {.lex_state = 15}, + [1349] = {.lex_state = 15}, [1350] = {.lex_state = 0}, - [1351] = {.lex_state = 0}, + [1351] = {.lex_state = 15}, [1352] = {.lex_state = 15}, [1353] = {.lex_state = 0}, - [1354] = {.lex_state = 15}, + [1354] = {.lex_state = 0}, [1355] = {.lex_state = 0}, [1356] = {.lex_state = 0}, - [1357] = {.lex_state = 29}, - [1358] = {.lex_state = 0}, + [1357] = {.lex_state = 0}, + [1358] = {.lex_state = 15}, [1359] = {.lex_state = 0}, [1360] = {.lex_state = 0}, [1361] = {.lex_state = 0}, @@ -11232,8 +11262,8 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1371] = {.lex_state = 0}, [1372] = {.lex_state = 0}, [1373] = {.lex_state = 0}, - [1374] = {.lex_state = 0}, - [1375] = {.lex_state = 0}, + [1374] = {.lex_state = 9}, + [1375] = {.lex_state = 15}, [1376] = {.lex_state = 0}, [1377] = {.lex_state = 0}, [1378] = {.lex_state = 0}, @@ -11242,50 +11272,50 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1381] = {.lex_state = 0}, [1382] = {.lex_state = 0}, [1383] = {.lex_state = 0}, - [1384] = {.lex_state = 15}, - [1385] = {.lex_state = 9}, + [1384] = {.lex_state = 0}, + [1385] = {.lex_state = 0}, [1386] = {.lex_state = 0}, [1387] = {.lex_state = 0}, [1388] = {.lex_state = 0}, [1389] = {.lex_state = 0}, - [1390] = {.lex_state = 15}, + [1390] = {.lex_state = 0}, [1391] = {.lex_state = 0}, - [1392] = {.lex_state = 0}, + [1392] = {.lex_state = 15}, [1393] = {.lex_state = 0}, [1394] = {.lex_state = 0}, [1395] = {.lex_state = 0}, - [1396] = {.lex_state = 0}, + [1396] = {.lex_state = 4}, [1397] = {.lex_state = 0}, [1398] = {.lex_state = 0}, [1399] = {.lex_state = 0}, - [1400] = {.lex_state = 15}, + [1400] = {.lex_state = 0}, [1401] = {.lex_state = 0}, - [1402] = {.lex_state = 15}, + [1402] = {.lex_state = 0}, [1403] = {.lex_state = 0}, [1404] = {.lex_state = 0}, [1405] = {.lex_state = 0}, [1406] = {.lex_state = 0}, - [1407] = {.lex_state = 0}, - [1408] = {.lex_state = 15}, + [1407] = {.lex_state = 15}, + [1408] = {.lex_state = 0}, [1409] = {.lex_state = 0}, [1410] = {.lex_state = 0}, [1411] = {.lex_state = 0}, - [1412] = {.lex_state = 0}, + [1412] = {.lex_state = 15}, [1413] = {.lex_state = 0}, [1414] = {.lex_state = 0}, [1415] = {.lex_state = 0}, [1416] = {.lex_state = 0}, [1417] = {.lex_state = 0}, - [1418] = {.lex_state = 15}, + [1418] = {.lex_state = 0}, [1419] = {.lex_state = 0}, [1420] = {.lex_state = 0}, - [1421] = {.lex_state = 15}, - [1422] = {.lex_state = 15}, - [1423] = {.lex_state = 0}, + [1421] = {.lex_state = 0}, + [1422] = {.lex_state = 64}, + [1423] = {.lex_state = 69}, [1424] = {.lex_state = 0}, [1425] = {.lex_state = 0}, [1426] = {.lex_state = 0}, - [1427] = {.lex_state = 15}, + [1427] = {.lex_state = 0}, [1428] = {.lex_state = 0}, [1429] = {.lex_state = 0}, [1430] = {.lex_state = 0}, @@ -11293,13 +11323,13 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1432] = {.lex_state = 0}, [1433] = {.lex_state = 0}, [1434] = {.lex_state = 0}, - [1435] = {.lex_state = 0}, + [1435] = {.lex_state = 15}, [1436] = {.lex_state = 0}, [1437] = {.lex_state = 0}, [1438] = {.lex_state = 0}, [1439] = {.lex_state = 0}, [1440] = {.lex_state = 0}, - [1441] = {.lex_state = 4}, + [1441] = {.lex_state = 0}, [1442] = {.lex_state = 0}, [1443] = {.lex_state = 0}, [1444] = {.lex_state = 0}, @@ -11307,63 +11337,63 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1446] = {.lex_state = 0}, [1447] = {.lex_state = 0}, [1448] = {.lex_state = 0}, - [1449] = {.lex_state = 15}, - [1450] = {.lex_state = 0}, + [1449] = {.lex_state = 0}, + [1450] = {.lex_state = 15}, [1451] = {.lex_state = 0}, - [1452] = {.lex_state = 15}, - [1453] = {.lex_state = 15}, - [1454] = {.lex_state = 9}, + [1452] = {.lex_state = 0}, + [1453] = {.lex_state = 0}, + [1454] = {.lex_state = 0}, [1455] = {.lex_state = 0}, - [1456] = {.lex_state = 0}, - [1457] = {.lex_state = 15}, - [1458] = {.lex_state = 15}, + [1456] = {.lex_state = 15}, + [1457] = {.lex_state = 0}, + [1458] = {.lex_state = 0}, [1459] = {.lex_state = 0}, [1460] = {.lex_state = 0}, [1461] = {.lex_state = 0}, - [1462] = {.lex_state = 64}, - [1463] = {.lex_state = 69}, + [1462] = {.lex_state = 0}, + [1463] = {.lex_state = 0}, [1464] = {.lex_state = 0}, [1465] = {.lex_state = 15}, - [1466] = {.lex_state = 15}, + [1466] = {.lex_state = 9}, [1467] = {.lex_state = 15}, - [1468] = {.lex_state = 15}, - [1469] = {.lex_state = 15}, - [1470] = {.lex_state = 0}, - [1471] = {.lex_state = 15}, + [1468] = {.lex_state = 0}, + [1469] = {.lex_state = 0}, + [1470] = {.lex_state = 15}, + [1471] = {.lex_state = 0}, [1472] = {.lex_state = 0}, [1473] = {.lex_state = 0}, - [1474] = {.lex_state = 0}, + [1474] = {.lex_state = 15}, [1475] = {.lex_state = 0}, - [1476] = {.lex_state = 15}, - [1477] = {.lex_state = 15}, - [1478] = {.lex_state = 15}, - [1479] = {.lex_state = 0}, + [1476] = {.lex_state = 0}, + [1477] = {.lex_state = 0}, + [1478] = {.lex_state = 0}, + [1479] = {.lex_state = 15}, [1480] = {.lex_state = 0}, - [1481] = {.lex_state = 0}, - [1482] = {.lex_state = 0}, - [1483] = {.lex_state = 15}, - [1484] = {.lex_state = 15}, + [1481] = {.lex_state = 15}, + [1482] = {.lex_state = 15}, + [1483] = {.lex_state = 0}, + [1484] = {.lex_state = 0}, [1485] = {.lex_state = 0}, [1486] = {.lex_state = 0}, - [1487] = {.lex_state = 15}, + [1487] = {.lex_state = 29}, [1488] = {.lex_state = 0}, - [1489] = {.lex_state = 15}, + [1489] = {.lex_state = 0}, [1490] = {.lex_state = 0}, [1491] = {.lex_state = 0}, - [1492] = {.lex_state = 0}, - [1493] = {.lex_state = 0}, + [1492] = {.lex_state = 15}, + [1493] = {.lex_state = 15}, [1494] = {.lex_state = 0}, [1495] = {.lex_state = 0}, [1496] = {.lex_state = 0}, [1497] = {.lex_state = 0}, - [1498] = {.lex_state = 0}, + [1498] = {.lex_state = 15}, [1499] = {.lex_state = 0}, [1500] = {.lex_state = 0}, - [1501] = {.lex_state = 15}, + [1501] = {.lex_state = 0}, [1502] = {.lex_state = 0}, [1503] = {.lex_state = 0}, [1504] = {.lex_state = 0}, - [1505] = {.lex_state = 0}, + [1505] = {.lex_state = 15}, [1506] = {.lex_state = 0}, [1507] = {.lex_state = 0}, [1508] = {.lex_state = 0}, @@ -11373,7 +11403,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1512] = {.lex_state = 0}, [1513] = {.lex_state = 0}, [1514] = {.lex_state = 0}, - [1515] = {.lex_state = 0}, + [1515] = {.lex_state = 15}, [1516] = {.lex_state = 0}, [1517] = {.lex_state = 0}, [1518] = {.lex_state = 0}, @@ -11384,11 +11414,11 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1523] = {.lex_state = 0}, [1524] = {.lex_state = 0}, [1525] = {.lex_state = 0}, - [1526] = {.lex_state = 15}, - [1527] = {.lex_state = 9}, - [1528] = {.lex_state = 15}, + [1526] = {.lex_state = 0}, + [1527] = {.lex_state = 0}, + [1528] = {.lex_state = 0}, [1529] = {.lex_state = 0}, - [1530] = {.lex_state = 15}, + [1530] = {.lex_state = 0}, [1531] = {.lex_state = 0}, [1532] = {.lex_state = 0}, [1533] = {.lex_state = 0}, @@ -11396,15 +11426,15 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1535] = {.lex_state = 0}, [1536] = {.lex_state = 0}, [1537] = {.lex_state = 0}, - [1538] = {.lex_state = 0}, + [1538] = {.lex_state = 15}, [1539] = {.lex_state = 0}, [1540] = {.lex_state = 0}, - [1541] = {.lex_state = 0}, - [1542] = {.lex_state = 0}, + [1541] = {.lex_state = 15}, + [1542] = {.lex_state = 9}, [1543] = {.lex_state = 0}, [1544] = {.lex_state = 0}, - [1545] = {.lex_state = 64}, - [1546] = {.lex_state = 15}, + [1545] = {.lex_state = 15}, + [1546] = {.lex_state = 0}, [1547] = {.lex_state = 0}, [1548] = {.lex_state = 0}, [1549] = {.lex_state = 0}, @@ -11413,21 +11443,21 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1552] = {.lex_state = 0}, [1553] = {.lex_state = 0}, [1554] = {.lex_state = 0}, - [1555] = {.lex_state = 15}, - [1556] = {.lex_state = 15}, - [1557] = {.lex_state = 15}, - [1558] = {.lex_state = 15}, - [1559] = {.lex_state = 15}, - [1560] = {.lex_state = 15}, - [1561] = {.lex_state = 15}, - [1562] = {.lex_state = 15}, + [1555] = {.lex_state = 0}, + [1556] = {.lex_state = 0}, + [1557] = {.lex_state = 0}, + [1558] = {.lex_state = 0}, + [1559] = {.lex_state = 0}, + [1560] = {.lex_state = 64}, + [1561] = {.lex_state = 69}, + [1562] = {.lex_state = 0}, [1563] = {.lex_state = 0}, - [1564] = {.lex_state = 15}, + [1564] = {.lex_state = 0}, [1565] = {.lex_state = 0}, - [1566] = {.lex_state = 0}, - [1567] = {.lex_state = 15}, - [1568] = {.lex_state = 15}, - [1569] = {.lex_state = 15}, + [1566] = {.lex_state = 15}, + [1567] = {.lex_state = 0}, + [1568] = {.lex_state = 0}, + [1569] = {.lex_state = 0}, [1570] = {.lex_state = 15}, [1571] = {.lex_state = 15}, [1572] = {.lex_state = 15}, @@ -11438,37 +11468,53 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [1577] = {.lex_state = 15}, [1578] = {.lex_state = 15}, [1579] = {.lex_state = 0}, - [1580] = {.lex_state = 64}, - [1581] = {.lex_state = 69}, - [1582] = {.lex_state = 0}, - [1583] = {.lex_state = 0}, - [1584] = {.lex_state = 0}, - [1585] = {.lex_state = 0}, - [1586] = {.lex_state = 64}, - [1587] = {.lex_state = 0}, - [1588] = {.lex_state = 0}, - [1589] = {.lex_state = 0}, - [1590] = {.lex_state = 0}, - [1591] = {.lex_state = 0}, - [1592] = {.lex_state = 0}, - [1593] = {.lex_state = 0}, - [1594] = {.lex_state = 0}, + [1580] = {.lex_state = 0}, + [1581] = {.lex_state = 15}, + [1582] = {.lex_state = 15}, + [1583] = {.lex_state = 15}, + [1584] = {.lex_state = 15}, + [1585] = {.lex_state = 15}, + [1586] = {.lex_state = 15}, + [1587] = {.lex_state = 15}, + [1588] = {.lex_state = 15}, + [1589] = {.lex_state = 15}, + [1590] = {.lex_state = 15}, + [1591] = {.lex_state = 15}, + [1592] = {.lex_state = 15}, + [1593] = {.lex_state = 15}, + [1594] = {.lex_state = 15}, [1595] = {.lex_state = 0}, - [1596] = {.lex_state = 0}, - [1597] = {.lex_state = 0}, + [1596] = {.lex_state = 64}, + [1597] = {.lex_state = 69}, [1598] = {.lex_state = 0}, [1599] = {.lex_state = 0}, - [1600] = {.lex_state = 0}, + [1600] = {.lex_state = 15}, [1601] = {.lex_state = 0}, - [1602] = {.lex_state = 0}, - [1603] = {.lex_state = 15}, - [1604] = {.lex_state = 15}, + [1602] = {.lex_state = 64}, + [1603] = {.lex_state = 0}, + [1604] = {.lex_state = 0}, [1605] = {.lex_state = 15}, - [1606] = {.lex_state = 15}, - [1607] = {.lex_state = 15}, - [1608] = {.lex_state = 15}, - [1609] = {(TSStateId)(-1),}, - [1610] = {(TSStateId)(-1),}, + [1606] = {.lex_state = 0}, + [1607] = {.lex_state = 0}, + [1608] = {.lex_state = 0}, + [1609] = {.lex_state = 0}, + [1610] = {.lex_state = 0}, + [1611] = {.lex_state = 0}, + [1612] = {.lex_state = 0}, + [1613] = {.lex_state = 0}, + [1614] = {.lex_state = 0}, + [1615] = {.lex_state = 0}, + [1616] = {.lex_state = 0}, + [1617] = {.lex_state = 0}, + [1618] = {.lex_state = 15}, + [1619] = {.lex_state = 15}, + [1620] = {.lex_state = 15}, + [1621] = {.lex_state = 15}, + [1622] = {.lex_state = 15}, + [1623] = {.lex_state = 15}, + [1624] = {.lex_state = 15}, + [1625] = {(TSStateId)(-1),}, + [1626] = {(TSStateId)(-1),}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { @@ -11674,10 +11720,10 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(1), [sym_keyword_datetimeoffset] = ACTIONS(1), [aux_sym_keyword_time_token1] = ACTIONS(1), - [aux_sym_keyword_timestamp_token1] = ACTIONS(1), - [aux_sym_keyword_timestamp_token2] = ACTIONS(1), - [aux_sym_keyword_timestamp_token3] = ACTIONS(1), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(1), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(1), + [aux_sym_keyword_timestamp_base_token2] = ACTIONS(1), + [aux_sym_keyword_timestamp_base_token3] = ACTIONS(1), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(1), [sym_keyword_interval] = ACTIONS(1), [sym_keyword_geometry] = ACTIONS(1), [sym_keyword_geography] = ACTIONS(1), @@ -11728,52 +11774,52 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_BQUOTE] = ACTIONS(1), }, [STATE(1)] = { - [sym_program] = STATE(1536), + [sym_program] = STATE(1436), [sym_comment] = STATE(1), [sym_marginalia] = STATE(1), - [sym_statement_transaction] = STATE(1140), - [sym_begin_transaction] = STATE(1145), - [sym_commit_transaction] = STATE(1149), - [sym_rollback_transaction] = STATE(1155), - [sym_statement] = STATE(1162), - [sym_copy_stmt] = STATE(1205), - [sym_copy_from] = STATE(1315), - [sym_copy_to] = STATE(1315), - [sym_ddl_stmt] = STATE(1205), - [sym_dml_write_stmt] = STATE(1205), - [sym_dml_read_stmt] = STATE(1205), - [sym_select_statement] = STATE(1097), - [sym_select] = STATE(1249), - [sym__truncate_statement] = STATE(1302), - [sym_delete_statement] = STATE(1302), - [sym_create_table_statement] = STATE(1221), - [sym__alter_statement] = STATE(1221), - [sym__rename_statement] = STATE(1280), - [sym_alter_table] = STATE(1153), - [sym_alter_view] = STATE(1153), - [sym_alter_schema] = STATE(1153), - [sym_alter_database] = STATE(1153), - [sym_alter_role] = STATE(1153), - [sym_alter_index] = STATE(1153), - [sym_alter_sequence] = STATE(1153), - [sym_alter_type] = STATE(1153), - [sym_drop_statement] = STATE(1221), - [sym_drop_table] = STATE(1157), - [sym_drop_view] = STATE(1157), - [sym_drop_schema] = STATE(1157), - [sym_drop_database] = STATE(1157), - [sym_drop_role] = STATE(1157), - [sym_drop_type] = STATE(1157), - [sym_drop_sequence] = STATE(1157), - [sym_drop_index] = STATE(1157), - [sym_insert_statement] = STATE(1302), - [sym_update_statement] = STATE(1302), - [sym__merge_statement] = STATE(1227), - [sym__optimize_statement] = STATE(1221), - [sym__compute_stats] = STATE(1319), - [sym__optimize_table] = STATE(1319), - [sym__vacuum_table] = STATE(1319), - [aux_sym_program_repeat1] = STATE(21), + [sym_statement_transaction] = STATE(1224), + [sym_begin_transaction] = STATE(1227), + [sym_commit_transaction] = STATE(1231), + [sym_rollback_transaction] = STATE(1249), + [sym_statement] = STATE(1251), + [sym_copy_stmt] = STATE(1262), + [sym_copy_from] = STATE(1270), + [sym_copy_to] = STATE(1270), + [sym_ddl_stmt] = STATE(1262), + [sym_dml_write_stmt] = STATE(1262), + [sym_dml_read_stmt] = STATE(1262), + [sym_select_statement] = STATE(998), + [sym_select] = STATE(1280), + [sym__truncate_statement] = STATE(1290), + [sym_delete_statement] = STATE(1290), + [sym_create_table_statement] = STATE(1292), + [sym__alter_statement] = STATE(1292), + [sym__rename_statement] = STATE(1296), + [sym_alter_table] = STATE(1314), + [sym_alter_view] = STATE(1314), + [sym_alter_schema] = STATE(1314), + [sym_alter_database] = STATE(1314), + [sym_alter_role] = STATE(1314), + [sym_alter_index] = STATE(1314), + [sym_alter_sequence] = STATE(1314), + [sym_alter_type] = STATE(1314), + [sym_drop_statement] = STATE(1292), + [sym_drop_table] = STATE(1164), + [sym_drop_view] = STATE(1164), + [sym_drop_schema] = STATE(1164), + [sym_drop_database] = STATE(1164), + [sym_drop_role] = STATE(1164), + [sym_drop_type] = STATE(1164), + [sym_drop_sequence] = STATE(1164), + [sym_drop_index] = STATE(1164), + [sym_insert_statement] = STATE(1290), + [sym_update_statement] = STATE(1290), + [sym__merge_statement] = STATE(1177), + [sym__optimize_statement] = STATE(1292), + [sym__compute_stats] = STATE(1199), + [sym__optimize_table] = STATE(1199), + [sym__vacuum_table] = STATE(1199), + [aux_sym_program_repeat1] = STATE(20), [ts_builtin_sym_end] = ACTIONS(7), [sym_keyword_select] = ACTIONS(9), [sym_keyword_delete] = ACTIONS(11), @@ -11910,8 +11956,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(49), [sym_keyword_datetimeoffset] = ACTIONS(49), [aux_sym_keyword_time_token1] = ACTIONS(49), - [aux_sym_keyword_timestamp_token1] = ACTIONS(49), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(49), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(49), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(49), [sym_keyword_interval] = ACTIONS(49), [sym_keyword_geometry] = ACTIONS(49), [sym_keyword_geography] = ACTIONS(49), @@ -12064,8 +12110,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(53), [sym_keyword_datetimeoffset] = ACTIONS(53), [aux_sym_keyword_time_token1] = ACTIONS(53), - [aux_sym_keyword_timestamp_token1] = ACTIONS(53), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(53), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(53), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(53), [sym_keyword_interval] = ACTIONS(53), [sym_keyword_geometry] = ACTIONS(53), [sym_keyword_geography] = ACTIONS(53), @@ -12218,8 +12264,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(57), [sym_keyword_datetimeoffset] = ACTIONS(57), [aux_sym_keyword_time_token1] = ACTIONS(57), - [aux_sym_keyword_timestamp_token1] = ACTIONS(57), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(57), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(57), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(57), [sym_keyword_interval] = ACTIONS(57), [sym_keyword_geometry] = ACTIONS(57), [sym_keyword_geography] = ACTIONS(57), @@ -12262,48 +12308,50 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_BQUOTE] = ACTIONS(55), }, [STATE(5)] = { - [sym__primary_key] = STATE(1260), - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(335), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym__primary_key] = STATE(1229), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(341), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(5), [sym_marginalia] = STATE(5), - [sym_constraint] = STATE(1100), - [sym__constraint_literal] = STATE(978), - [sym_primary_key_constraint] = STATE(979), - [sym__key_constraint] = STATE(980), + [sym_constraint] = STATE(1053), + [sym__constraint_literal] = STATE(975), + [sym_primary_key_constraint] = STATE(976), + [sym__key_constraint] = STATE(977), [sym__identifier] = ACTIONS(59), [sym_keyword_primary] = ACTIONS(61), [sym_keyword_key] = ACTIONS(63), @@ -12362,8 +12410,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -12380,150 +12428,45 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(6)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(335), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(539), + [sym_keyword_serial] = STATE(539), + [sym_keyword_bigserial] = STATE(539), + [sym_keyword_tinyint] = STATE(574), + [sym_keyword_smallint] = STATE(578), + [sym_keyword_mediumint] = STATE(528), + [sym_keyword_int] = STATE(529), + [sym_keyword_bigint] = STATE(530), + [sym_keyword_real] = STATE(451), + [sym_keyword_char] = STATE(1609), + [sym_keyword_varchar] = STATE(1610), + [sym_keyword_time] = STATE(498), + [sym_keyword_timestamp_base] = STATE(512), + [sym_keyword_timestamptz_base] = STATE(513), + [sym_data_type] = STATE(604), + [sym_data_type_kind] = STATE(452), + [sym_tinyint] = STATE(539), + [sym_smallint] = STATE(539), + [sym_mediumint] = STATE(539), + [sym_int] = STATE(539), + [sym_bigint] = STATE(539), + [sym_bit] = STATE(539), + [sym_binary] = STATE(539), + [sym_varbinary] = STATE(539), + [sym_float] = STATE(539), + [sym_double] = STATE(539), + [sym_decimal] = STATE(539), + [sym_numeric] = STATE(539), + [sym_char] = STATE(539), + [sym_varchar] = STATE(539), + [sym_nchar] = STATE(539), + [sym_nvarchar] = STATE(539), + [sym_datetimeoffset] = STATE(539), + [sym_time] = STATE(539), + [sym_timestamp] = STATE(539), + [sym_timestamptz] = STATE(539), + [sym_enum] = STATE(539), [sym_comment] = STATE(6), [sym_marginalia] = STATE(6), - [sym__identifier] = ACTIONS(59), - [aux_sym_keyword_character_token1] = ACTIONS(67), - [sym_keyword_unsigned] = ACTIONS(71), - [sym_keyword_boolean] = ACTIONS(73), - [sym_keyword_bit] = ACTIONS(75), - [sym_keyword_binary] = ACTIONS(77), - [sym_keyword_varbinary] = ACTIONS(79), - [sym_keyword_image] = ACTIONS(73), - [aux_sym_keyword_smallserial_token1] = ACTIONS(81), - [aux_sym_keyword_smallserial_token2] = ACTIONS(81), - [aux_sym_keyword_serial_token1] = ACTIONS(83), - [aux_sym_keyword_serial_token2] = ACTIONS(83), - [aux_sym_keyword_bigserial_token1] = ACTIONS(85), - [aux_sym_keyword_bigserial_token2] = ACTIONS(85), - [aux_sym_keyword_tinyint_token1] = ACTIONS(87), - [aux_sym_keyword_tinyint_token2] = ACTIONS(87), - [aux_sym_keyword_smallint_token1] = ACTIONS(89), - [aux_sym_keyword_smallint_token2] = ACTIONS(89), - [aux_sym_keyword_mediumint_token1] = ACTIONS(91), - [aux_sym_keyword_mediumint_token2] = ACTIONS(91), - [aux_sym_keyword_int_token1] = ACTIONS(93), - [aux_sym_keyword_int_token2] = ACTIONS(93), - [aux_sym_keyword_int_token3] = ACTIONS(93), - [aux_sym_keyword_bigint_token1] = ACTIONS(95), - [aux_sym_keyword_bigint_token2] = ACTIONS(95), - [sym_keyword_decimal] = ACTIONS(97), - [sym_keyword_numeric] = ACTIONS(99), - [aux_sym_keyword_real_token1] = ACTIONS(101), - [aux_sym_keyword_real_token2] = ACTIONS(101), - [sym_keyword_float] = ACTIONS(103), - [sym_keyword_double] = ACTIONS(105), - [sym_keyword_inet] = ACTIONS(73), - [sym_keyword_money] = ACTIONS(73), - [sym_keyword_smallmoney] = ACTIONS(73), - [aux_sym_keyword_char_token1] = ACTIONS(107), - [sym_keyword_nchar] = ACTIONS(109), - [aux_sym_keyword_varchar_token1] = ACTIONS(111), - [sym_keyword_nvarchar] = ACTIONS(113), - [sym_keyword_text] = ACTIONS(73), - [sym_keyword_string] = ACTIONS(73), - [sym_keyword_uuid] = ACTIONS(73), - [sym_keyword_json] = ACTIONS(73), - [sym_keyword_jsonb] = ACTIONS(73), - [sym_keyword_xml] = ACTIONS(73), - [sym_keyword_bytea] = ACTIONS(73), - [sym_keyword_enum] = ACTIONS(115), - [sym_keyword_date] = ACTIONS(73), - [sym_keyword_datetime] = ACTIONS(73), - [sym_keyword_datetime2] = ACTIONS(73), - [sym_keyword_smalldatetime] = ACTIONS(73), - [sym_keyword_datetimeoffset] = ACTIONS(117), - [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), - [sym_keyword_interval] = ACTIONS(73), - [sym_keyword_geometry] = ACTIONS(73), - [sym_keyword_geography] = ACTIONS(73), - [sym_keyword_box2d] = ACTIONS(73), - [sym_keyword_box3d] = ACTIONS(73), - [sym_keyword_oid] = ACTIONS(73), - [sym_keyword_name] = ACTIONS(73), - [sym_keyword_regclass] = ACTIONS(73), - [sym_keyword_regnamespace] = ACTIONS(73), - [sym_keyword_regproc] = ACTIONS(73), - [sym_keyword_regtype] = ACTIONS(73), - [aux_sym_double_token1] = ACTIONS(125), - [anon_sym_DASH_DASH] = ACTIONS(3), - [anon_sym_SLASH_STAR] = ACTIONS(5), - }, - [STATE(7)] = { - [sym_keyword_smallserial] = STATE(549), - [sym_keyword_serial] = STATE(549), - [sym_keyword_bigserial] = STATE(549), - [sym_keyword_tinyint] = STATE(563), - [sym_keyword_smallint] = STATE(564), - [sym_keyword_mediumint] = STATE(565), - [sym_keyword_int] = STATE(566), - [sym_keyword_bigint] = STATE(567), - [sym_keyword_real] = STATE(443), - [sym_keyword_char] = STATE(1593), - [sym_keyword_varchar] = STATE(1594), - [sym_keyword_time] = STATE(502), - [sym_keyword_timestamp] = STATE(549), - [sym_keyword_timestamptz] = STATE(549), - [sym_data_type] = STATE(603), - [sym_data_type_kind] = STATE(442), - [sym_tinyint] = STATE(549), - [sym_smallint] = STATE(549), - [sym_mediumint] = STATE(549), - [sym_int] = STATE(549), - [sym_bigint] = STATE(549), - [sym_bit] = STATE(549), - [sym_binary] = STATE(549), - [sym_varbinary] = STATE(549), - [sym_float] = STATE(549), - [sym_double] = STATE(549), - [sym_decimal] = STATE(549), - [sym_numeric] = STATE(549), - [sym_char] = STATE(549), - [sym_varchar] = STATE(549), - [sym_nchar] = STATE(549), - [sym_nvarchar] = STATE(549), - [sym_datetimeoffset] = STATE(549), - [sym_time] = STATE(549), - [sym_enum] = STATE(549), - [sym_comment] = STATE(7), - [sym_marginalia] = STATE(7), [sym__identifier] = ACTIONS(127), [aux_sym_keyword_character_token1] = ACTIONS(67), [sym_keyword_unsigned] = ACTIONS(129), @@ -12576,8 +12519,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(131), [sym_keyword_datetimeoffset] = ACTIONS(171), [aux_sym_keyword_time_token1] = ACTIONS(173), - [aux_sym_keyword_timestamp_token1] = ACTIONS(175), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(177), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(175), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(177), [sym_keyword_interval] = ACTIONS(131), [sym_keyword_geometry] = ACTIONS(131), [sym_keyword_geography] = ACTIONS(131), @@ -12593,42 +12536,153 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_DASH_DASH] = ACTIONS(3), [anon_sym_SLASH_STAR] = ACTIONS(5), }, + [STATE(7)] = { + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(1108), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), + [sym_comment] = STATE(7), + [sym_marginalia] = STATE(7), + [sym__identifier] = ACTIONS(59), + [aux_sym_keyword_character_token1] = ACTIONS(67), + [sym_keyword_unsigned] = ACTIONS(71), + [sym_keyword_boolean] = ACTIONS(73), + [sym_keyword_bit] = ACTIONS(75), + [sym_keyword_binary] = ACTIONS(77), + [sym_keyword_varbinary] = ACTIONS(79), + [sym_keyword_image] = ACTIONS(73), + [aux_sym_keyword_smallserial_token1] = ACTIONS(81), + [aux_sym_keyword_smallserial_token2] = ACTIONS(81), + [aux_sym_keyword_serial_token1] = ACTIONS(83), + [aux_sym_keyword_serial_token2] = ACTIONS(83), + [aux_sym_keyword_bigserial_token1] = ACTIONS(85), + [aux_sym_keyword_bigserial_token2] = ACTIONS(85), + [aux_sym_keyword_tinyint_token1] = ACTIONS(87), + [aux_sym_keyword_tinyint_token2] = ACTIONS(87), + [aux_sym_keyword_smallint_token1] = ACTIONS(89), + [aux_sym_keyword_smallint_token2] = ACTIONS(89), + [aux_sym_keyword_mediumint_token1] = ACTIONS(91), + [aux_sym_keyword_mediumint_token2] = ACTIONS(91), + [aux_sym_keyword_int_token1] = ACTIONS(93), + [aux_sym_keyword_int_token2] = ACTIONS(93), + [aux_sym_keyword_int_token3] = ACTIONS(93), + [aux_sym_keyword_bigint_token1] = ACTIONS(95), + [aux_sym_keyword_bigint_token2] = ACTIONS(95), + [sym_keyword_decimal] = ACTIONS(97), + [sym_keyword_numeric] = ACTIONS(99), + [aux_sym_keyword_real_token1] = ACTIONS(101), + [aux_sym_keyword_real_token2] = ACTIONS(101), + [sym_keyword_float] = ACTIONS(103), + [sym_keyword_double] = ACTIONS(105), + [sym_keyword_inet] = ACTIONS(73), + [sym_keyword_money] = ACTIONS(73), + [sym_keyword_smallmoney] = ACTIONS(73), + [aux_sym_keyword_char_token1] = ACTIONS(107), + [sym_keyword_nchar] = ACTIONS(109), + [aux_sym_keyword_varchar_token1] = ACTIONS(111), + [sym_keyword_nvarchar] = ACTIONS(113), + [sym_keyword_text] = ACTIONS(73), + [sym_keyword_string] = ACTIONS(73), + [sym_keyword_uuid] = ACTIONS(73), + [sym_keyword_json] = ACTIONS(73), + [sym_keyword_jsonb] = ACTIONS(73), + [sym_keyword_xml] = ACTIONS(73), + [sym_keyword_bytea] = ACTIONS(73), + [sym_keyword_enum] = ACTIONS(115), + [sym_keyword_date] = ACTIONS(73), + [sym_keyword_datetime] = ACTIONS(73), + [sym_keyword_datetime2] = ACTIONS(73), + [sym_keyword_smalldatetime] = ACTIONS(73), + [sym_keyword_datetimeoffset] = ACTIONS(117), + [aux_sym_keyword_time_token1] = ACTIONS(119), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), + [sym_keyword_interval] = ACTIONS(73), + [sym_keyword_geometry] = ACTIONS(73), + [sym_keyword_geography] = ACTIONS(73), + [sym_keyword_box2d] = ACTIONS(73), + [sym_keyword_box3d] = ACTIONS(73), + [sym_keyword_oid] = ACTIONS(73), + [sym_keyword_name] = ACTIONS(73), + [sym_keyword_regclass] = ACTIONS(73), + [sym_keyword_regnamespace] = ACTIONS(73), + [sym_keyword_regproc] = ACTIONS(73), + [sym_keyword_regtype] = ACTIONS(73), + [aux_sym_double_token1] = ACTIONS(125), + [anon_sym_DASH_DASH] = ACTIONS(3), + [anon_sym_SLASH_STAR] = ACTIONS(5), + }, [STATE(8)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(1057), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(341), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(8), [sym_marginalia] = STATE(8), [sym__identifier] = ACTIONS(59), @@ -12683,8 +12737,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -12701,41 +12755,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(9)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(762), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(810), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(9), [sym_marginalia] = STATE(9), [sym__identifier] = ACTIONS(59), @@ -12790,8 +12846,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -12808,41 +12864,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(10)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(1022), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(1067), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(10), [sym_marginalia] = STATE(10), [sym__identifier] = ACTIONS(59), @@ -12897,8 +12955,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -12915,41 +12973,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(11)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(709), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(459), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(11), [sym_marginalia] = STATE(11), [sym__identifier] = ACTIONS(59), @@ -13004,8 +13064,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -13022,41 +13082,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(12)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(1090), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(1077), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(12), [sym_marginalia] = STATE(12), [sym__identifier] = ACTIONS(59), @@ -13111,8 +13173,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -13129,41 +13191,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(13)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(490), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(1039), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(13), [sym_marginalia] = STATE(13), [sym__identifier] = ACTIONS(59), @@ -13218,8 +13282,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -13236,41 +13300,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(14)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(1086), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(804), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(14), [sym_marginalia] = STATE(14), [sym__identifier] = ACTIONS(59), @@ -13325,8 +13391,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -13343,41 +13409,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(15)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(728), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(1424), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(15), [sym_marginalia] = STATE(15), [sym__identifier] = ACTIONS(59), @@ -13432,8 +13500,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -13450,41 +13518,43 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(16)] = { - [sym_keyword_smallserial] = STATE(369), - [sym_keyword_serial] = STATE(369), - [sym_keyword_bigserial] = STATE(369), - [sym_keyword_tinyint] = STATE(383), - [sym_keyword_smallint] = STATE(384), - [sym_keyword_mediumint] = STATE(385), - [sym_keyword_int] = STATE(386), - [sym_keyword_bigint] = STATE(387), - [sym_keyword_real] = STATE(329), - [sym_keyword_char] = STATE(1553), - [sym_keyword_varchar] = STATE(1554), - [sym_keyword_time] = STATE(346), - [sym_keyword_timestamp] = STATE(369), - [sym_keyword_timestamptz] = STATE(369), - [sym_data_type] = STATE(1416), - [sym_data_type_kind] = STATE(330), - [sym_tinyint] = STATE(369), - [sym_smallint] = STATE(369), - [sym_mediumint] = STATE(369), - [sym_int] = STATE(369), - [sym_bigint] = STATE(369), - [sym_bit] = STATE(369), - [sym_binary] = STATE(369), - [sym_varbinary] = STATE(369), - [sym_float] = STATE(369), - [sym_double] = STATE(369), - [sym_decimal] = STATE(369), - [sym_numeric] = STATE(369), - [sym_char] = STATE(369), - [sym_varchar] = STATE(369), - [sym_nchar] = STATE(369), - [sym_nvarchar] = STATE(369), - [sym_datetimeoffset] = STATE(369), - [sym_time] = STATE(369), - [sym_enum] = STATE(369), + [sym_keyword_smallserial] = STATE(396), + [sym_keyword_serial] = STATE(396), + [sym_keyword_bigserial] = STATE(396), + [sym_keyword_tinyint] = STATE(407), + [sym_keyword_smallint] = STATE(408), + [sym_keyword_mediumint] = STATE(409), + [sym_keyword_int] = STATE(410), + [sym_keyword_bigint] = STATE(411), + [sym_keyword_real] = STATE(330), + [sym_keyword_char] = STATE(1444), + [sym_keyword_varchar] = STATE(1453), + [sym_keyword_time] = STATE(353), + [sym_keyword_timestamp_base] = STATE(361), + [sym_keyword_timestamptz_base] = STATE(345), + [sym_data_type] = STATE(765), + [sym_data_type_kind] = STATE(333), + [sym_tinyint] = STATE(396), + [sym_smallint] = STATE(396), + [sym_mediumint] = STATE(396), + [sym_int] = STATE(396), + [sym_bigint] = STATE(396), + [sym_bit] = STATE(396), + [sym_binary] = STATE(396), + [sym_varbinary] = STATE(396), + [sym_float] = STATE(396), + [sym_double] = STATE(396), + [sym_decimal] = STATE(396), + [sym_numeric] = STATE(396), + [sym_char] = STATE(396), + [sym_varchar] = STATE(396), + [sym_nchar] = STATE(396), + [sym_nvarchar] = STATE(396), + [sym_datetimeoffset] = STATE(396), + [sym_time] = STATE(396), + [sym_timestamp] = STATE(396), + [sym_timestamptz] = STATE(396), + [sym_enum] = STATE(396), [sym_comment] = STATE(16), [sym_marginalia] = STATE(16), [sym__identifier] = ACTIONS(59), @@ -13539,8 +13609,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(73), [sym_keyword_datetimeoffset] = ACTIONS(117), [aux_sym_keyword_time_token1] = ACTIONS(119), - [aux_sym_keyword_timestamp_token1] = ACTIONS(121), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(123), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(121), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(123), [sym_keyword_interval] = ACTIONS(73), [sym_keyword_geometry] = ACTIONS(73), [sym_keyword_geography] = ACTIONS(73), @@ -13559,96 +13629,96 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [STATE(17)] = { [sym_comment] = STATE(17), [sym_marginalia] = STATE(17), - [ts_builtin_sym_end] = ACTIONS(55), - [sym__identifier] = ACTIONS(57), - [anon_sym_SEMI] = ACTIONS(55), - [sym_keyword_order] = ACTIONS(57), - [sym_keyword_desc] = ACTIONS(57), - [sym_keyword_asc] = ACTIONS(57), - [sym_keyword_limit] = ACTIONS(57), - [sym_keyword_primary] = ACTIONS(57), - [sym_keyword_key] = ACTIONS(57), - [sym_keyword_as] = ACTIONS(57), - [sym_keyword_constraint] = ACTIONS(57), - [sym_keyword_separator] = ACTIONS(57), - [sym_keyword_not] = ACTIONS(57), - [sym_keyword_index] = ACTIONS(57), - [sym_keyword_auto_increment] = ACTIONS(57), - [sym_keyword_generated] = ACTIONS(57), - [aux_sym_keyword_character_token1] = ACTIONS(57), - [sym_keyword_default] = ACTIONS(57), - [sym_keyword_first] = ACTIONS(57), - [sym_keyword_after] = ACTIONS(57), - [sym_keyword_unique] = ACTIONS(57), - [sym_keyword_foreign] = ACTIONS(57), - [sym_keyword_unsigned] = ACTIONS(57), - [sym_keyword_comment] = ACTIONS(57), - [sym_keyword_null] = ACTIONS(57), - [sym_keyword_boolean] = ACTIONS(57), - [sym_keyword_bit] = ACTIONS(57), - [sym_keyword_binary] = ACTIONS(57), - [sym_keyword_varbinary] = ACTIONS(57), - [sym_keyword_image] = ACTIONS(57), - [aux_sym_keyword_smallserial_token1] = ACTIONS(57), - [aux_sym_keyword_smallserial_token2] = ACTIONS(57), - [aux_sym_keyword_serial_token1] = ACTIONS(57), - [aux_sym_keyword_serial_token2] = ACTIONS(57), - [aux_sym_keyword_bigserial_token1] = ACTIONS(57), - [aux_sym_keyword_bigserial_token2] = ACTIONS(57), - [aux_sym_keyword_tinyint_token1] = ACTIONS(57), - [aux_sym_keyword_tinyint_token2] = ACTIONS(57), - [aux_sym_keyword_smallint_token1] = ACTIONS(57), - [aux_sym_keyword_smallint_token2] = ACTIONS(57), - [aux_sym_keyword_mediumint_token1] = ACTIONS(57), - [aux_sym_keyword_mediumint_token2] = ACTIONS(57), - [aux_sym_keyword_int_token1] = ACTIONS(57), - [aux_sym_keyword_int_token2] = ACTIONS(57), - [aux_sym_keyword_int_token3] = ACTIONS(57), - [aux_sym_keyword_bigint_token1] = ACTIONS(57), - [aux_sym_keyword_bigint_token2] = ACTIONS(57), - [sym_keyword_decimal] = ACTIONS(57), - [sym_keyword_numeric] = ACTIONS(57), - [aux_sym_keyword_real_token1] = ACTIONS(57), - [aux_sym_keyword_real_token2] = ACTIONS(57), - [sym_keyword_float] = ACTIONS(57), - [sym_keyword_double] = ACTIONS(57), - [sym_keyword_inet] = ACTIONS(57), - [sym_keyword_money] = ACTIONS(57), - [sym_keyword_smallmoney] = ACTIONS(57), - [aux_sym_keyword_char_token1] = ACTIONS(57), - [sym_keyword_nchar] = ACTIONS(57), - [aux_sym_keyword_varchar_token1] = ACTIONS(57), - [sym_keyword_nvarchar] = ACTIONS(57), - [sym_keyword_text] = ACTIONS(57), - [sym_keyword_string] = ACTIONS(57), - [sym_keyword_uuid] = ACTIONS(57), - [sym_keyword_json] = ACTIONS(57), - [sym_keyword_jsonb] = ACTIONS(57), - [sym_keyword_xml] = ACTIONS(57), - [sym_keyword_bytea] = ACTIONS(57), - [sym_keyword_enum] = ACTIONS(57), - [sym_keyword_date] = ACTIONS(57), - [sym_keyword_datetime] = ACTIONS(57), - [sym_keyword_datetime2] = ACTIONS(57), - [sym_keyword_smalldatetime] = ACTIONS(57), - [sym_keyword_datetimeoffset] = ACTIONS(57), - [aux_sym_keyword_time_token1] = ACTIONS(57), - [aux_sym_keyword_timestamp_token1] = ACTIONS(57), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(57), - [sym_keyword_interval] = ACTIONS(57), - [sym_keyword_geometry] = ACTIONS(57), - [sym_keyword_geography] = ACTIONS(57), - [sym_keyword_box2d] = ACTIONS(57), - [sym_keyword_box3d] = ACTIONS(57), - [sym_keyword_oid] = ACTIONS(57), - [sym_keyword_name] = ACTIONS(57), - [sym_keyword_regclass] = ACTIONS(57), - [sym_keyword_regnamespace] = ACTIONS(57), - [sym_keyword_regproc] = ACTIONS(57), - [sym_keyword_regtype] = ACTIONS(57), - [anon_sym_RPAREN] = ACTIONS(55), - [anon_sym_COMMA] = ACTIONS(55), - [aux_sym_double_token1] = ACTIONS(57), + [ts_builtin_sym_end] = ACTIONS(51), + [sym__identifier] = ACTIONS(53), + [anon_sym_SEMI] = ACTIONS(51), + [sym_keyword_order] = ACTIONS(53), + [sym_keyword_desc] = ACTIONS(53), + [sym_keyword_asc] = ACTIONS(53), + [sym_keyword_limit] = ACTIONS(53), + [sym_keyword_primary] = ACTIONS(53), + [sym_keyword_key] = ACTIONS(53), + [sym_keyword_as] = ACTIONS(53), + [sym_keyword_constraint] = ACTIONS(53), + [sym_keyword_separator] = ACTIONS(53), + [sym_keyword_not] = ACTIONS(53), + [sym_keyword_index] = ACTIONS(53), + [sym_keyword_auto_increment] = ACTIONS(53), + [sym_keyword_generated] = ACTIONS(53), + [aux_sym_keyword_character_token1] = ACTIONS(53), + [sym_keyword_default] = ACTIONS(53), + [sym_keyword_first] = ACTIONS(53), + [sym_keyword_after] = ACTIONS(53), + [sym_keyword_unique] = ACTIONS(53), + [sym_keyword_foreign] = ACTIONS(53), + [sym_keyword_unsigned] = ACTIONS(53), + [sym_keyword_comment] = ACTIONS(53), + [sym_keyword_null] = ACTIONS(53), + [sym_keyword_boolean] = ACTIONS(53), + [sym_keyword_bit] = ACTIONS(53), + [sym_keyword_binary] = ACTIONS(53), + [sym_keyword_varbinary] = ACTIONS(53), + [sym_keyword_image] = ACTIONS(53), + [aux_sym_keyword_smallserial_token1] = ACTIONS(53), + [aux_sym_keyword_smallserial_token2] = ACTIONS(53), + [aux_sym_keyword_serial_token1] = ACTIONS(53), + [aux_sym_keyword_serial_token2] = ACTIONS(53), + [aux_sym_keyword_bigserial_token1] = ACTIONS(53), + [aux_sym_keyword_bigserial_token2] = ACTIONS(53), + [aux_sym_keyword_tinyint_token1] = ACTIONS(53), + [aux_sym_keyword_tinyint_token2] = ACTIONS(53), + [aux_sym_keyword_smallint_token1] = ACTIONS(53), + [aux_sym_keyword_smallint_token2] = ACTIONS(53), + [aux_sym_keyword_mediumint_token1] = ACTIONS(53), + [aux_sym_keyword_mediumint_token2] = ACTIONS(53), + [aux_sym_keyword_int_token1] = ACTIONS(53), + [aux_sym_keyword_int_token2] = ACTIONS(53), + [aux_sym_keyword_int_token3] = ACTIONS(53), + [aux_sym_keyword_bigint_token1] = ACTIONS(53), + [aux_sym_keyword_bigint_token2] = ACTIONS(53), + [sym_keyword_decimal] = ACTIONS(53), + [sym_keyword_numeric] = ACTIONS(53), + [aux_sym_keyword_real_token1] = ACTIONS(53), + [aux_sym_keyword_real_token2] = ACTIONS(53), + [sym_keyword_float] = ACTIONS(53), + [sym_keyword_double] = ACTIONS(53), + [sym_keyword_inet] = ACTIONS(53), + [sym_keyword_money] = ACTIONS(53), + [sym_keyword_smallmoney] = ACTIONS(53), + [aux_sym_keyword_char_token1] = ACTIONS(53), + [sym_keyword_nchar] = ACTIONS(53), + [aux_sym_keyword_varchar_token1] = ACTIONS(53), + [sym_keyword_nvarchar] = ACTIONS(53), + [sym_keyword_text] = ACTIONS(53), + [sym_keyword_string] = ACTIONS(53), + [sym_keyword_uuid] = ACTIONS(53), + [sym_keyword_json] = ACTIONS(53), + [sym_keyword_jsonb] = ACTIONS(53), + [sym_keyword_xml] = ACTIONS(53), + [sym_keyword_bytea] = ACTIONS(53), + [sym_keyword_enum] = ACTIONS(53), + [sym_keyword_date] = ACTIONS(53), + [sym_keyword_datetime] = ACTIONS(53), + [sym_keyword_datetime2] = ACTIONS(53), + [sym_keyword_smalldatetime] = ACTIONS(53), + [sym_keyword_datetimeoffset] = ACTIONS(53), + [aux_sym_keyword_time_token1] = ACTIONS(53), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(53), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(53), + [sym_keyword_interval] = ACTIONS(53), + [sym_keyword_geometry] = ACTIONS(53), + [sym_keyword_geography] = ACTIONS(53), + [sym_keyword_box2d] = ACTIONS(53), + [sym_keyword_box3d] = ACTIONS(53), + [sym_keyword_oid] = ACTIONS(53), + [sym_keyword_name] = ACTIONS(53), + [sym_keyword_regclass] = ACTIONS(53), + [sym_keyword_regnamespace] = ACTIONS(53), + [sym_keyword_regproc] = ACTIONS(53), + [sym_keyword_regtype] = ACTIONS(53), + [anon_sym_RPAREN] = ACTIONS(51), + [anon_sym_COMMA] = ACTIONS(51), + [aux_sym_double_token1] = ACTIONS(53), [anon_sym_DASH_DASH] = ACTIONS(3), [anon_sym_SLASH_STAR] = ACTIONS(5), }, @@ -13729,8 +13799,8 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_keyword_smalldatetime] = ACTIONS(49), [sym_keyword_datetimeoffset] = ACTIONS(49), [aux_sym_keyword_time_token1] = ACTIONS(49), - [aux_sym_keyword_timestamp_token1] = ACTIONS(49), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(49), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(49), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(49), [sym_keyword_interval] = ACTIONS(49), [sym_keyword_geometry] = ACTIONS(49), [sym_keyword_geography] = ACTIONS(49), @@ -13751,215 +13821,146 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [STATE(19)] = { [sym_comment] = STATE(19), [sym_marginalia] = STATE(19), - [ts_builtin_sym_end] = ACTIONS(51), - [sym__identifier] = ACTIONS(53), - [anon_sym_SEMI] = ACTIONS(51), - [sym_keyword_order] = ACTIONS(53), - [sym_keyword_desc] = ACTIONS(53), - [sym_keyword_asc] = ACTIONS(53), - [sym_keyword_limit] = ACTIONS(53), - [sym_keyword_primary] = ACTIONS(53), - [sym_keyword_key] = ACTIONS(53), - [sym_keyword_as] = ACTIONS(53), - [sym_keyword_constraint] = ACTIONS(53), - [sym_keyword_separator] = ACTIONS(53), - [sym_keyword_not] = ACTIONS(53), - [sym_keyword_index] = ACTIONS(53), - [sym_keyword_auto_increment] = ACTIONS(53), - [sym_keyword_generated] = ACTIONS(53), - [aux_sym_keyword_character_token1] = ACTIONS(53), - [sym_keyword_default] = ACTIONS(53), - [sym_keyword_first] = ACTIONS(53), - [sym_keyword_after] = ACTIONS(53), - [sym_keyword_unique] = ACTIONS(53), - [sym_keyword_foreign] = ACTIONS(53), - [sym_keyword_unsigned] = ACTIONS(53), - [sym_keyword_comment] = ACTIONS(53), - [sym_keyword_null] = ACTIONS(53), - [sym_keyword_boolean] = ACTIONS(53), - [sym_keyword_bit] = ACTIONS(53), - [sym_keyword_binary] = ACTIONS(53), - [sym_keyword_varbinary] = ACTIONS(53), - [sym_keyword_image] = ACTIONS(53), - [aux_sym_keyword_smallserial_token1] = ACTIONS(53), - [aux_sym_keyword_smallserial_token2] = ACTIONS(53), - [aux_sym_keyword_serial_token1] = ACTIONS(53), - [aux_sym_keyword_serial_token2] = ACTIONS(53), - [aux_sym_keyword_bigserial_token1] = ACTIONS(53), - [aux_sym_keyword_bigserial_token2] = ACTIONS(53), - [aux_sym_keyword_tinyint_token1] = ACTIONS(53), - [aux_sym_keyword_tinyint_token2] = ACTIONS(53), - [aux_sym_keyword_smallint_token1] = ACTIONS(53), - [aux_sym_keyword_smallint_token2] = ACTIONS(53), - [aux_sym_keyword_mediumint_token1] = ACTIONS(53), - [aux_sym_keyword_mediumint_token2] = ACTIONS(53), - [aux_sym_keyword_int_token1] = ACTIONS(53), - [aux_sym_keyword_int_token2] = ACTIONS(53), - [aux_sym_keyword_int_token3] = ACTIONS(53), - [aux_sym_keyword_bigint_token1] = ACTIONS(53), - [aux_sym_keyword_bigint_token2] = ACTIONS(53), - [sym_keyword_decimal] = ACTIONS(53), - [sym_keyword_numeric] = ACTIONS(53), - [aux_sym_keyword_real_token1] = ACTIONS(53), - [aux_sym_keyword_real_token2] = ACTIONS(53), - [sym_keyword_float] = ACTIONS(53), - [sym_keyword_double] = ACTIONS(53), - [sym_keyword_inet] = ACTIONS(53), - [sym_keyword_money] = ACTIONS(53), - [sym_keyword_smallmoney] = ACTIONS(53), - [aux_sym_keyword_char_token1] = ACTIONS(53), - [sym_keyword_nchar] = ACTIONS(53), - [aux_sym_keyword_varchar_token1] = ACTIONS(53), - [sym_keyword_nvarchar] = ACTIONS(53), - [sym_keyword_text] = ACTIONS(53), - [sym_keyword_string] = ACTIONS(53), - [sym_keyword_uuid] = ACTIONS(53), - [sym_keyword_json] = ACTIONS(53), - [sym_keyword_jsonb] = ACTIONS(53), - [sym_keyword_xml] = ACTIONS(53), - [sym_keyword_bytea] = ACTIONS(53), - [sym_keyword_enum] = ACTIONS(53), - [sym_keyword_date] = ACTIONS(53), - [sym_keyword_datetime] = ACTIONS(53), - [sym_keyword_datetime2] = ACTIONS(53), - [sym_keyword_smalldatetime] = ACTIONS(53), - [sym_keyword_datetimeoffset] = ACTIONS(53), - [aux_sym_keyword_time_token1] = ACTIONS(53), - [aux_sym_keyword_timestamp_token1] = ACTIONS(53), - [aux_sym_keyword_timestamptz_token1] = ACTIONS(53), - [sym_keyword_interval] = ACTIONS(53), - [sym_keyword_geometry] = ACTIONS(53), - [sym_keyword_geography] = ACTIONS(53), - [sym_keyword_box2d] = ACTIONS(53), - [sym_keyword_box3d] = ACTIONS(53), - [sym_keyword_oid] = ACTIONS(53), - [sym_keyword_name] = ACTIONS(53), - [sym_keyword_regclass] = ACTIONS(53), - [sym_keyword_regnamespace] = ACTIONS(53), - [sym_keyword_regproc] = ACTIONS(53), - [sym_keyword_regtype] = ACTIONS(53), - [anon_sym_RPAREN] = ACTIONS(51), - [anon_sym_COMMA] = ACTIONS(51), - [aux_sym_double_token1] = ACTIONS(53), + [ts_builtin_sym_end] = ACTIONS(55), + [sym__identifier] = ACTIONS(57), + [anon_sym_SEMI] = ACTIONS(55), + [sym_keyword_order] = ACTIONS(57), + [sym_keyword_desc] = ACTIONS(57), + [sym_keyword_asc] = ACTIONS(57), + [sym_keyword_limit] = ACTIONS(57), + [sym_keyword_primary] = ACTIONS(57), + [sym_keyword_key] = ACTIONS(57), + [sym_keyword_as] = ACTIONS(57), + [sym_keyword_constraint] = ACTIONS(57), + [sym_keyword_separator] = ACTIONS(57), + [sym_keyword_not] = ACTIONS(57), + [sym_keyword_index] = ACTIONS(57), + [sym_keyword_auto_increment] = ACTIONS(57), + [sym_keyword_generated] = ACTIONS(57), + [aux_sym_keyword_character_token1] = ACTIONS(57), + [sym_keyword_default] = ACTIONS(57), + [sym_keyword_first] = ACTIONS(57), + [sym_keyword_after] = ACTIONS(57), + [sym_keyword_unique] = ACTIONS(57), + [sym_keyword_foreign] = ACTIONS(57), + [sym_keyword_unsigned] = ACTIONS(57), + [sym_keyword_comment] = ACTIONS(57), + [sym_keyword_null] = ACTIONS(57), + [sym_keyword_boolean] = ACTIONS(57), + [sym_keyword_bit] = ACTIONS(57), + [sym_keyword_binary] = ACTIONS(57), + [sym_keyword_varbinary] = ACTIONS(57), + [sym_keyword_image] = ACTIONS(57), + [aux_sym_keyword_smallserial_token1] = ACTIONS(57), + [aux_sym_keyword_smallserial_token2] = ACTIONS(57), + [aux_sym_keyword_serial_token1] = ACTIONS(57), + [aux_sym_keyword_serial_token2] = ACTIONS(57), + [aux_sym_keyword_bigserial_token1] = ACTIONS(57), + [aux_sym_keyword_bigserial_token2] = ACTIONS(57), + [aux_sym_keyword_tinyint_token1] = ACTIONS(57), + [aux_sym_keyword_tinyint_token2] = ACTIONS(57), + [aux_sym_keyword_smallint_token1] = ACTIONS(57), + [aux_sym_keyword_smallint_token2] = ACTIONS(57), + [aux_sym_keyword_mediumint_token1] = ACTIONS(57), + [aux_sym_keyword_mediumint_token2] = ACTIONS(57), + [aux_sym_keyword_int_token1] = ACTIONS(57), + [aux_sym_keyword_int_token2] = ACTIONS(57), + [aux_sym_keyword_int_token3] = ACTIONS(57), + [aux_sym_keyword_bigint_token1] = ACTIONS(57), + [aux_sym_keyword_bigint_token2] = ACTIONS(57), + [sym_keyword_decimal] = ACTIONS(57), + [sym_keyword_numeric] = ACTIONS(57), + [aux_sym_keyword_real_token1] = ACTIONS(57), + [aux_sym_keyword_real_token2] = ACTIONS(57), + [sym_keyword_float] = ACTIONS(57), + [sym_keyword_double] = ACTIONS(57), + [sym_keyword_inet] = ACTIONS(57), + [sym_keyword_money] = ACTIONS(57), + [sym_keyword_smallmoney] = ACTIONS(57), + [aux_sym_keyword_char_token1] = ACTIONS(57), + [sym_keyword_nchar] = ACTIONS(57), + [aux_sym_keyword_varchar_token1] = ACTIONS(57), + [sym_keyword_nvarchar] = ACTIONS(57), + [sym_keyword_text] = ACTIONS(57), + [sym_keyword_string] = ACTIONS(57), + [sym_keyword_uuid] = ACTIONS(57), + [sym_keyword_json] = ACTIONS(57), + [sym_keyword_jsonb] = ACTIONS(57), + [sym_keyword_xml] = ACTIONS(57), + [sym_keyword_bytea] = ACTIONS(57), + [sym_keyword_enum] = ACTIONS(57), + [sym_keyword_date] = ACTIONS(57), + [sym_keyword_datetime] = ACTIONS(57), + [sym_keyword_datetime2] = ACTIONS(57), + [sym_keyword_smalldatetime] = ACTIONS(57), + [sym_keyword_datetimeoffset] = ACTIONS(57), + [aux_sym_keyword_time_token1] = ACTIONS(57), + [aux_sym_keyword_timestamp_base_token1] = ACTIONS(57), + [aux_sym_keyword_timestamptz_base_token1] = ACTIONS(57), + [sym_keyword_interval] = ACTIONS(57), + [sym_keyword_geometry] = ACTIONS(57), + [sym_keyword_geography] = ACTIONS(57), + [sym_keyword_box2d] = ACTIONS(57), + [sym_keyword_box3d] = ACTIONS(57), + [sym_keyword_oid] = ACTIONS(57), + [sym_keyword_name] = ACTIONS(57), + [sym_keyword_regclass] = ACTIONS(57), + [sym_keyword_regnamespace] = ACTIONS(57), + [sym_keyword_regproc] = ACTIONS(57), + [sym_keyword_regtype] = ACTIONS(57), + [anon_sym_RPAREN] = ACTIONS(55), + [anon_sym_COMMA] = ACTIONS(55), + [aux_sym_double_token1] = ACTIONS(57), [anon_sym_DASH_DASH] = ACTIONS(3), [anon_sym_SLASH_STAR] = ACTIONS(5), }, [STATE(20)] = { [sym_comment] = STATE(20), [sym_marginalia] = STATE(20), - [sym_statement_transaction] = STATE(1340), - [sym_begin_transaction] = STATE(1145), - [sym_commit_transaction] = STATE(1149), - [sym_rollback_transaction] = STATE(1155), - [sym_statement] = STATE(1162), - [sym_copy_stmt] = STATE(1205), - [sym_copy_from] = STATE(1315), - [sym_copy_to] = STATE(1315), - [sym_ddl_stmt] = STATE(1205), - [sym_dml_write_stmt] = STATE(1205), - [sym_dml_read_stmt] = STATE(1205), - [sym_select_statement] = STATE(1097), - [sym_select] = STATE(1249), - [sym__truncate_statement] = STATE(1302), - [sym_delete_statement] = STATE(1302), - [sym_create_table_statement] = STATE(1221), - [sym__alter_statement] = STATE(1221), - [sym__rename_statement] = STATE(1280), - [sym_alter_table] = STATE(1153), - [sym_alter_view] = STATE(1153), - [sym_alter_schema] = STATE(1153), - [sym_alter_database] = STATE(1153), - [sym_alter_role] = STATE(1153), - [sym_alter_index] = STATE(1153), - [sym_alter_sequence] = STATE(1153), - [sym_alter_type] = STATE(1153), - [sym_drop_statement] = STATE(1221), - [sym_drop_table] = STATE(1157), - [sym_drop_view] = STATE(1157), - [sym_drop_schema] = STATE(1157), - [sym_drop_database] = STATE(1157), - [sym_drop_role] = STATE(1157), - [sym_drop_type] = STATE(1157), - [sym_drop_sequence] = STATE(1157), - [sym_drop_index] = STATE(1157), - [sym_insert_statement] = STATE(1302), - [sym_update_statement] = STATE(1302), - [sym__merge_statement] = STATE(1227), - [sym__optimize_statement] = STATE(1221), - [sym__compute_stats] = STATE(1319), - [sym__optimize_table] = STATE(1319), - [sym__vacuum_table] = STATE(1319), - [aux_sym_program_repeat1] = STATE(20), + [sym_statement_transaction] = STATE(1563), + [sym_begin_transaction] = STATE(1227), + [sym_commit_transaction] = STATE(1231), + [sym_rollback_transaction] = STATE(1249), + [sym_statement] = STATE(1251), + [sym_copy_stmt] = STATE(1262), + [sym_copy_from] = STATE(1270), + [sym_copy_to] = STATE(1270), + [sym_ddl_stmt] = STATE(1262), + [sym_dml_write_stmt] = STATE(1262), + [sym_dml_read_stmt] = STATE(1262), + [sym_select_statement] = STATE(998), + [sym_select] = STATE(1280), + [sym__truncate_statement] = STATE(1290), + [sym_delete_statement] = STATE(1290), + [sym_create_table_statement] = STATE(1292), + [sym__alter_statement] = STATE(1292), + [sym__rename_statement] = STATE(1296), + [sym_alter_table] = STATE(1314), + [sym_alter_view] = STATE(1314), + [sym_alter_schema] = STATE(1314), + [sym_alter_database] = STATE(1314), + [sym_alter_role] = STATE(1314), + [sym_alter_index] = STATE(1314), + [sym_alter_sequence] = STATE(1314), + [sym_alter_type] = STATE(1314), + [sym_drop_statement] = STATE(1292), + [sym_drop_table] = STATE(1164), + [sym_drop_view] = STATE(1164), + [sym_drop_schema] = STATE(1164), + [sym_drop_database] = STATE(1164), + [sym_drop_role] = STATE(1164), + [sym_drop_type] = STATE(1164), + [sym_drop_sequence] = STATE(1164), + [sym_drop_index] = STATE(1164), + [sym_insert_statement] = STATE(1290), + [sym_update_statement] = STATE(1290), + [sym__merge_statement] = STATE(1177), + [sym__optimize_statement] = STATE(1292), + [sym__compute_stats] = STATE(1199), + [sym__optimize_table] = STATE(1199), + [sym__vacuum_table] = STATE(1199), + [aux_sym_program_repeat1] = STATE(21), [ts_builtin_sym_end] = ACTIONS(181), - [sym_keyword_select] = ACTIONS(183), - [sym_keyword_delete] = ACTIONS(186), - [sym_keyword_insert] = ACTIONS(189), - [sym_keyword_copy] = ACTIONS(192), - [sym_keyword_update] = ACTIONS(195), - [sym_keyword_truncate] = ACTIONS(198), - [sym_keyword_merge] = ACTIONS(201), - [sym_keyword_create] = ACTIONS(204), - [sym_keyword_alter] = ACTIONS(207), - [sym_keyword_analyze] = ACTIONS(210), - [sym_keyword_explain] = ACTIONS(213), - [sym_keyword_drop] = ACTIONS(216), - [sym_keyword_rename] = ACTIONS(219), - [sym_keyword_begin] = ACTIONS(222), - [sym_keyword_commit] = ACTIONS(225), - [sym_keyword_rollback] = ACTIONS(228), - [sym_keyword_vacuum] = ACTIONS(231), - [sym_keyword_compute] = ACTIONS(234), - [sym_keyword_optimize] = ACTIONS(237), - [anon_sym_DASH_DASH] = ACTIONS(3), - [anon_sym_SLASH_STAR] = ACTIONS(5), - }, - [STATE(21)] = { - [sym_comment] = STATE(21), - [sym_marginalia] = STATE(21), - [sym_statement_transaction] = STATE(1340), - [sym_begin_transaction] = STATE(1145), - [sym_commit_transaction] = STATE(1149), - [sym_rollback_transaction] = STATE(1155), - [sym_statement] = STATE(1162), - [sym_copy_stmt] = STATE(1205), - [sym_copy_from] = STATE(1315), - [sym_copy_to] = STATE(1315), - [sym_ddl_stmt] = STATE(1205), - [sym_dml_write_stmt] = STATE(1205), - [sym_dml_read_stmt] = STATE(1205), - [sym_select_statement] = STATE(1097), - [sym_select] = STATE(1249), - [sym__truncate_statement] = STATE(1302), - [sym_delete_statement] = STATE(1302), - [sym_create_table_statement] = STATE(1221), - [sym__alter_statement] = STATE(1221), - [sym__rename_statement] = STATE(1280), - [sym_alter_table] = STATE(1153), - [sym_alter_view] = STATE(1153), - [sym_alter_schema] = STATE(1153), - [sym_alter_database] = STATE(1153), - [sym_alter_role] = STATE(1153), - [sym_alter_index] = STATE(1153), - [sym_alter_sequence] = STATE(1153), - [sym_alter_type] = STATE(1153), - [sym_drop_statement] = STATE(1221), - [sym_drop_table] = STATE(1157), - [sym_drop_view] = STATE(1157), - [sym_drop_schema] = STATE(1157), - [sym_drop_database] = STATE(1157), - [sym_drop_role] = STATE(1157), - [sym_drop_type] = STATE(1157), - [sym_drop_sequence] = STATE(1157), - [sym_drop_index] = STATE(1157), - [sym_insert_statement] = STATE(1302), - [sym_update_statement] = STATE(1302), - [sym__merge_statement] = STATE(1227), - [sym__optimize_statement] = STATE(1221), - [sym__compute_stats] = STATE(1319), - [sym__optimize_table] = STATE(1319), - [sym__vacuum_table] = STATE(1319), - [aux_sym_program_repeat1] = STATE(20), - [ts_builtin_sym_end] = ACTIONS(240), [sym_keyword_select] = ACTIONS(9), [sym_keyword_delete] = ACTIONS(11), [sym_keyword_insert] = ACTIONS(13), @@ -13982,6 +13983,75 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_DASH_DASH] = ACTIONS(3), [anon_sym_SLASH_STAR] = ACTIONS(5), }, + [STATE(21)] = { + [sym_comment] = STATE(21), + [sym_marginalia] = STATE(21), + [sym_statement_transaction] = STATE(1563), + [sym_begin_transaction] = STATE(1227), + [sym_commit_transaction] = STATE(1231), + [sym_rollback_transaction] = STATE(1249), + [sym_statement] = STATE(1251), + [sym_copy_stmt] = STATE(1262), + [sym_copy_from] = STATE(1270), + [sym_copy_to] = STATE(1270), + [sym_ddl_stmt] = STATE(1262), + [sym_dml_write_stmt] = STATE(1262), + [sym_dml_read_stmt] = STATE(1262), + [sym_select_statement] = STATE(998), + [sym_select] = STATE(1280), + [sym__truncate_statement] = STATE(1290), + [sym_delete_statement] = STATE(1290), + [sym_create_table_statement] = STATE(1292), + [sym__alter_statement] = STATE(1292), + [sym__rename_statement] = STATE(1296), + [sym_alter_table] = STATE(1314), + [sym_alter_view] = STATE(1314), + [sym_alter_schema] = STATE(1314), + [sym_alter_database] = STATE(1314), + [sym_alter_role] = STATE(1314), + [sym_alter_index] = STATE(1314), + [sym_alter_sequence] = STATE(1314), + [sym_alter_type] = STATE(1314), + [sym_drop_statement] = STATE(1292), + [sym_drop_table] = STATE(1164), + [sym_drop_view] = STATE(1164), + [sym_drop_schema] = STATE(1164), + [sym_drop_database] = STATE(1164), + [sym_drop_role] = STATE(1164), + [sym_drop_type] = STATE(1164), + [sym_drop_sequence] = STATE(1164), + [sym_drop_index] = STATE(1164), + [sym_insert_statement] = STATE(1290), + [sym_update_statement] = STATE(1290), + [sym__merge_statement] = STATE(1177), + [sym__optimize_statement] = STATE(1292), + [sym__compute_stats] = STATE(1199), + [sym__optimize_table] = STATE(1199), + [sym__vacuum_table] = STATE(1199), + [aux_sym_program_repeat1] = STATE(21), + [ts_builtin_sym_end] = ACTIONS(183), + [sym_keyword_select] = ACTIONS(185), + [sym_keyword_delete] = ACTIONS(188), + [sym_keyword_insert] = ACTIONS(191), + [sym_keyword_copy] = ACTIONS(194), + [sym_keyword_update] = ACTIONS(197), + [sym_keyword_truncate] = ACTIONS(200), + [sym_keyword_merge] = ACTIONS(203), + [sym_keyword_create] = ACTIONS(206), + [sym_keyword_alter] = ACTIONS(209), + [sym_keyword_analyze] = ACTIONS(212), + [sym_keyword_explain] = ACTIONS(215), + [sym_keyword_drop] = ACTIONS(218), + [sym_keyword_rename] = ACTIONS(221), + [sym_keyword_begin] = ACTIONS(224), + [sym_keyword_commit] = ACTIONS(227), + [sym_keyword_rollback] = ACTIONS(230), + [sym_keyword_vacuum] = ACTIONS(233), + [sym_keyword_compute] = ACTIONS(236), + [sym_keyword_optimize] = ACTIONS(239), + [anon_sym_DASH_DASH] = ACTIONS(3), + [anon_sym_SLASH_STAR] = ACTIONS(5), + }, }; static const uint16_t ts_small_parse_table[] = { @@ -14062,14 +14132,13 @@ static const uint16_t ts_small_parse_table[] = { STATE(23), 2, sym_comment, sym_marginalia, - ACTIONS(246), 21, + ACTIONS(246), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_DOT, anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, @@ -14084,9 +14153,10 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(248), 35, + ACTIONS(248), 36, sym_keyword_from, sym_keyword_where, + sym_keyword_limit, sym_keyword_offset, sym_keyword_increment, sym_keyword_minvalue, @@ -14128,13 +14198,14 @@ static const uint16_t ts_small_parse_table[] = { STATE(24), 2, sym_comment, sym_marginalia, - ACTIONS(250), 20, + ACTIONS(250), 21, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_DOT, anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, @@ -14149,10 +14220,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(252), 36, + ACTIONS(252), 35, sym_keyword_from, sym_keyword_where, - sym_keyword_limit, sym_keyword_offset, sym_keyword_increment, sym_keyword_minvalue, @@ -14275,7 +14345,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(283), 1, anon_sym_PIPE_PIPE, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, @@ -14283,7 +14353,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(26), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -14292,7 +14362,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -14330,87 +14400,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_COLON_COLON, - [384] = 21, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(262), 1, - sym_keyword_in, - ACTIONS(264), 1, - sym_keyword_is, - ACTIONS(269), 1, - anon_sym_SLASH, - ACTIONS(277), 1, - anon_sym_PLUS, - ACTIONS(279), 1, - anon_sym_DASH, - ACTIONS(281), 1, - anon_sym_CARET, - ACTIONS(283), 1, - anon_sym_PIPE_PIPE, - ACTIONS(287), 1, - sym_keyword_as, - ACTIONS(289), 1, - sym_keyword_not, - ACTIONS(293), 1, - sym_keyword_similar, - STATE(1109), 1, - sym_not_in, - ACTIONS(273), 2, - anon_sym_STAR, - anon_sym_PERCENT, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - STATE(27), 2, - sym_comment, - sym_marginalia, - STATE(285), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(275), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(284), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(271), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - ACTIONS(285), 21, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_limit, - sym_keyword_primary, - sym_keyword_separator, - sym_keyword_and, - sym_keyword_or, - sym_keyword_using, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_default, - sym_keyword_first, - sym_keyword_after, - sym_keyword_between, - sym_keyword_comment, - sym_keyword_null, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_COLON_COLON, - [485] = 31, + [384] = 31, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -14445,53 +14435,44 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_compute, ACTIONS(45), 1, sym_keyword_optimize, - ACTIONS(295), 1, + ACTIONS(285), 1, sym_keyword_verbose, - ACTIONS(297), 1, + ACTIONS(287), 1, sym_keyword_table, - STATE(1097), 1, + STATE(998), 1, sym_select_statement, - STATE(1227), 1, + STATE(1177), 1, sym__merge_statement, - STATE(1249), 1, - sym_select, STATE(1280), 1, + sym_select, + STATE(1296), 1, sym__rename_statement, - STATE(28), 2, + STATE(27), 2, sym_comment, sym_marginalia, - STATE(1315), 2, + STATE(1270), 2, sym_copy_from, sym_copy_to, - STATE(1319), 3, + STATE(1199), 3, sym__compute_stats, sym__optimize_table, sym__vacuum_table, - STATE(1213), 4, + STATE(1157), 4, sym_copy_stmt, sym_ddl_stmt, sym_dml_write_stmt, sym_dml_read_stmt, - STATE(1221), 4, - sym_create_table_statement, - sym__alter_statement, - sym_drop_statement, - sym__optimize_statement, - STATE(1302), 4, + STATE(1290), 4, sym__truncate_statement, sym_delete_statement, sym_insert_statement, sym_update_statement, - STATE(1153), 8, - sym_alter_table, - sym_alter_view, - sym_alter_schema, - sym_alter_database, - sym_alter_role, - sym_alter_index, - sym_alter_sequence, - sym_alter_type, - STATE(1157), 8, + STATE(1292), 4, + sym_create_table_statement, + sym__alter_statement, + sym_drop_statement, + sym__optimize_statement, + STATE(1164), 8, sym_drop_table, sym_drop_view, sym_drop_schema, @@ -14500,21 +14481,30 @@ static const uint16_t ts_small_parse_table[] = { sym_drop_type, sym_drop_sequence, sym_drop_index, - [606] = 8, + STATE(1314), 8, + sym_alter_table, + sym_alter_view, + sym_alter_schema, + sym_alter_database, + sym_alter_role, + sym_alter_index, + sym_alter_sequence, + sym_alter_type, + [505] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, - STATE(29), 2, + STATE(28), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -14567,7 +14557,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [681] = 22, + [580] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -14590,22 +14580,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(289), 1, sym_keyword_not, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(299), 1, + ACTIONS(291), 1, sym_keyword_between, - STATE(1109), 1, + ACTIONS(295), 1, + sym_keyword_similar, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - STATE(30), 2, + STATE(29), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -14614,7 +14604,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -14648,7 +14638,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_COLON_COLON, - [784] = 23, + [683] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -14671,24 +14661,24 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(289), 1, sym_keyword_not, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(299), 1, + ACTIONS(291), 1, sym_keyword_between, - ACTIONS(301), 1, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(297), 1, sym_keyword_and, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - STATE(31), 2, + STATE(30), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -14697,7 +14687,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -14730,11 +14720,13 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_COLON_COLON, - [889] = 16, + [788] = 18, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(260), 1, + sym_keyword_as, ACTIONS(262), 1, sym_keyword_in, ACTIONS(264), 1, @@ -14749,30 +14741,94 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, ACTIONS(281), 1, anon_sym_CARET, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, + STATE(31), 2, + sym_comment, + sym_marginalia, + STATE(297), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(275), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(294), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(271), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + ACTIONS(258), 25, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_limit, + sym_keyword_primary, + sym_keyword_separator, + sym_keyword_and, + sym_keyword_or, + sym_keyword_using, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_COLON_COLON, + anon_sym_PIPE_PIPE, + [883] = 10, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(264), 1, + sym_keyword_is, + ACTIONS(281), 1, + anon_sym_CARET, + STATE(1118), 1, + sym_not_in, STATE(32), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(260), 5, + ACTIONS(260), 7, sym_keyword_as, + anon_sym_SLASH, anon_sym_LT, anon_sym_GT, + anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 32, + ACTIONS(258), 37, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -14780,8 +14836,10 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_limit, sym_keyword_primary, sym_keyword_separator, + sym_keyword_in, sym_keyword_and, sym_keyword_or, + sym_keyword_not, sym_keyword_using, sym_keyword_auto_increment, sym_keyword_generated, @@ -14797,26 +14855,37 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [980] = 12, + [962] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(262), 1, + sym_keyword_in, ACTIONS(264), 1, sym_keyword_is, + ACTIONS(266), 1, + sym_keyword_not, ACTIONS(269), 1, anon_sym_SLASH, + ACTIONS(277), 1, + anon_sym_PLUS, + ACTIONS(279), 1, + anon_sym_DASH, ACTIONS(281), 1, anon_sym_CARET, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, @@ -14824,23 +14893,22 @@ static const uint16_t ts_small_parse_table[] = { STATE(33), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(260), 6, + ACTIONS(260), 5, sym_keyword_as, anon_sym_LT, anon_sym_GT, - anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 35, + ACTIONS(258), 32, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -14848,10 +14916,8 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_limit, sym_keyword_primary, sym_keyword_separator, - sym_keyword_in, sym_keyword_and, sym_keyword_or, - sym_keyword_not, sym_keyword_using, sym_keyword_auto_increment, sym_keyword_generated, @@ -14870,44 +14936,47 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [1063] = 10, + [1053] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(264), 1, sym_keyword_is, + ACTIONS(269), 1, + anon_sym_SLASH, ACTIONS(281), 1, anon_sym_CARET, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, + ACTIONS(273), 2, + anon_sym_STAR, + anon_sym_PERCENT, STATE(34), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(260), 7, + ACTIONS(260), 6, sym_keyword_as, - anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 37, + ACTIONS(258), 35, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -14934,34 +15003,32 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, - anon_sym_PERCENT, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [1142] = 9, + [1136] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(264), 1, sym_keyword_is, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, STATE(35), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -15013,19 +15080,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [1219] = 18, + [1213] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(260), 1, - sym_keyword_as, ACTIONS(262), 1, sym_keyword_in, ACTIONS(264), 1, sym_keyword_is, - ACTIONS(266), 1, - sym_keyword_not, ACTIONS(269), 1, anon_sym_SLASH, ACTIONS(277), 1, @@ -15034,15 +15097,26 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, ACTIONS(281), 1, anon_sym_CARET, - STATE(1109), 1, + ACTIONS(283), 1, + anon_sym_PIPE_PIPE, + ACTIONS(289), 1, + sym_keyword_not, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(301), 1, + sym_keyword_as, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, STATE(36), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -15051,7 +15125,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -15064,7 +15138,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(258), 25, + ACTIONS(299), 21, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -15081,15 +15155,11 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_first, sym_keyword_after, sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, sym_keyword_comment, sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_COLON_COLON, - anon_sym_PIPE_PIPE, [1314] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, @@ -15111,22 +15181,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(289), 1, sym_keyword_not, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(305), 1, sym_keyword_as, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, STATE(37), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -15135,7 +15205,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -15207,49 +15277,40 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_analyze, ACTIONS(309), 1, sym_keyword_verbose, - STATE(1097), 1, + STATE(998), 1, sym_select_statement, - STATE(1227), 1, + STATE(1177), 1, sym__merge_statement, - STATE(1249), 1, - sym_select, STATE(1280), 1, + sym_select, + STATE(1296), 1, sym__rename_statement, STATE(38), 2, sym_comment, sym_marginalia, - STATE(1315), 2, + STATE(1270), 2, sym_copy_from, sym_copy_to, - STATE(1319), 3, + STATE(1199), 3, sym__compute_stats, sym__optimize_table, sym__vacuum_table, - STATE(1221), 4, - sym_create_table_statement, - sym__alter_statement, - sym_drop_statement, - sym__optimize_statement, - STATE(1222), 4, + STATE(1247), 4, sym_copy_stmt, sym_ddl_stmt, sym_dml_write_stmt, sym_dml_read_stmt, - STATE(1302), 4, + STATE(1290), 4, sym__truncate_statement, sym_delete_statement, sym_insert_statement, sym_update_statement, - STATE(1153), 8, - sym_alter_table, - sym_alter_view, - sym_alter_schema, - sym_alter_database, - sym_alter_role, - sym_alter_index, - sym_alter_sequence, - sym_alter_type, - STATE(1157), 8, + STATE(1292), 4, + sym_create_table_statement, + sym__alter_statement, + sym_drop_statement, + sym__optimize_statement, + STATE(1164), 8, sym_drop_table, sym_drop_view, sym_drop_schema, @@ -15258,6 +15319,15 @@ static const uint16_t ts_small_parse_table[] = { sym_drop_type, sym_drop_sequence, sym_drop_index, + STATE(1314), 8, + sym_alter_table, + sym_alter_view, + sym_alter_schema, + sym_alter_database, + sym_alter_role, + sym_alter_index, + sym_alter_sequence, + sym_alter_type, [1533] = 29, ACTIONS(3), 1, anon_sym_DASH_DASH, @@ -15293,40 +15363,49 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_compute, ACTIONS(45), 1, sym_keyword_optimize, - STATE(1097), 1, + STATE(998), 1, sym_select_statement, - STATE(1227), 1, + STATE(1177), 1, sym__merge_statement, - STATE(1249), 1, - sym_select, STATE(1280), 1, + sym_select, + STATE(1296), 1, sym__rename_statement, STATE(39), 2, sym_comment, sym_marginalia, - STATE(1315), 2, + STATE(1270), 2, sym_copy_from, sym_copy_to, - STATE(1319), 3, + STATE(1199), 3, sym__compute_stats, sym__optimize_table, sym__vacuum_table, - STATE(1213), 4, + STATE(1157), 4, sym_copy_stmt, sym_ddl_stmt, sym_dml_write_stmt, sym_dml_read_stmt, - STATE(1221), 4, - sym_create_table_statement, - sym__alter_statement, - sym_drop_statement, - sym__optimize_statement, - STATE(1302), 4, + STATE(1290), 4, sym__truncate_statement, sym_delete_statement, sym_insert_statement, sym_update_statement, - STATE(1153), 8, + STATE(1292), 4, + sym_create_table_statement, + sym__alter_statement, + sym_drop_statement, + sym__optimize_statement, + STATE(1164), 8, + sym_drop_table, + sym_drop_view, + sym_drop_schema, + sym_drop_database, + sym_drop_role, + sym_drop_type, + sym_drop_sequence, + sym_drop_index, + STATE(1314), 8, sym_alter_table, sym_alter_view, sym_alter_schema, @@ -15335,7 +15414,75 @@ static const uint16_t ts_small_parse_table[] = { sym_alter_index, sym_alter_sequence, sym_alter_type, - STATE(1157), 8, + [1648] = 29, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(9), 1, + sym_keyword_select, + ACTIONS(11), 1, + sym_keyword_delete, + ACTIONS(13), 1, + sym_keyword_insert, + ACTIONS(15), 1, + sym_keyword_copy, + ACTIONS(17), 1, + sym_keyword_update, + ACTIONS(19), 1, + sym_keyword_truncate, + ACTIONS(21), 1, + sym_keyword_merge, + ACTIONS(23), 1, + sym_keyword_create, + ACTIONS(25), 1, + sym_keyword_alter, + ACTIONS(27), 1, + sym_keyword_analyze, + ACTIONS(31), 1, + sym_keyword_drop, + ACTIONS(33), 1, + sym_keyword_rename, + ACTIONS(41), 1, + sym_keyword_vacuum, + ACTIONS(43), 1, + sym_keyword_compute, + ACTIONS(45), 1, + sym_keyword_optimize, + STATE(998), 1, + sym_select_statement, + STATE(1177), 1, + sym__merge_statement, + STATE(1280), 1, + sym_select, + STATE(1296), 1, + sym__rename_statement, + STATE(40), 2, + sym_comment, + sym_marginalia, + STATE(1270), 2, + sym_copy_from, + sym_copy_to, + STATE(1199), 3, + sym__compute_stats, + sym__optimize_table, + sym__vacuum_table, + STATE(1283), 4, + sym_copy_stmt, + sym_ddl_stmt, + sym_dml_write_stmt, + sym_dml_read_stmt, + STATE(1290), 4, + sym__truncate_statement, + sym_delete_statement, + sym_insert_statement, + sym_update_statement, + STATE(1292), 4, + sym_create_table_statement, + sym__alter_statement, + sym_drop_statement, + sym__optimize_statement, + STATE(1164), 8, sym_drop_table, sym_drop_view, sym_drop_schema, @@ -15344,14 +15491,23 @@ static const uint16_t ts_small_parse_table[] = { sym_drop_type, sym_drop_sequence, sym_drop_index, - [1648] = 6, + STATE(1314), 8, + sym_alter_table, + sym_alter_view, + sym_alter_schema, + sym_alter_database, + sym_alter_role, + sym_alter_index, + sym_alter_sequence, + sym_alter_type, + [1763] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(315), 1, - anon_sym_DOT, - STATE(40), 2, + sym_natural_number, + STATE(41), 2, sym_comment, sym_marginalia, ACTIONS(311), 20, @@ -15407,14 +15563,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [1717] = 6, + [1832] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(321), 1, - sym_natural_number, - STATE(41), 2, + anon_sym_DOT, + STATE(42), 2, sym_comment, sym_marginalia, ACTIONS(317), 20, @@ -15470,92 +15626,6 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [1786] = 29, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(9), 1, - sym_keyword_select, - ACTIONS(11), 1, - sym_keyword_delete, - ACTIONS(13), 1, - sym_keyword_insert, - ACTIONS(15), 1, - sym_keyword_copy, - ACTIONS(17), 1, - sym_keyword_update, - ACTIONS(19), 1, - sym_keyword_truncate, - ACTIONS(21), 1, - sym_keyword_merge, - ACTIONS(23), 1, - sym_keyword_create, - ACTIONS(25), 1, - sym_keyword_alter, - ACTIONS(27), 1, - sym_keyword_analyze, - ACTIONS(31), 1, - sym_keyword_drop, - ACTIONS(33), 1, - sym_keyword_rename, - ACTIONS(41), 1, - sym_keyword_vacuum, - ACTIONS(43), 1, - sym_keyword_compute, - ACTIONS(45), 1, - sym_keyword_optimize, - STATE(1097), 1, - sym_select_statement, - STATE(1227), 1, - sym__merge_statement, - STATE(1249), 1, - sym_select, - STATE(1280), 1, - sym__rename_statement, - STATE(42), 2, - sym_comment, - sym_marginalia, - STATE(1315), 2, - sym_copy_from, - sym_copy_to, - STATE(1319), 3, - sym__compute_stats, - sym__optimize_table, - sym__vacuum_table, - STATE(1221), 4, - sym_create_table_statement, - sym__alter_statement, - sym_drop_statement, - sym__optimize_statement, - STATE(1284), 4, - sym_copy_stmt, - sym_ddl_stmt, - sym_dml_write_stmt, - sym_dml_read_stmt, - STATE(1302), 4, - sym__truncate_statement, - sym_delete_statement, - sym_insert_statement, - sym_update_statement, - STATE(1153), 8, - sym_alter_table, - sym_alter_view, - sym_alter_schema, - sym_alter_database, - sym_alter_role, - sym_alter_index, - sym_alter_sequence, - sym_alter_type, - STATE(1157), 8, - sym_drop_table, - sym_drop_view, - sym_drop_schema, - sym_drop_database, - sym_drop_role, - sym_drop_type, - sym_drop_sequence, - sym_drop_index, [1901] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, @@ -15686,7 +15756,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(45), 2, sym_comment, sym_marginalia, - ACTIONS(331), 20, + ACTIONS(311), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -15707,7 +15777,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(333), 31, + ACTIONS(313), 31, sym_keyword_from, sym_keyword_where, sym_keyword_offset, @@ -15747,7 +15817,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(46), 2, sym_comment, sym_marginalia, - ACTIONS(335), 20, + ACTIONS(331), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -15768,7 +15838,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(337), 31, + ACTIONS(333), 31, sym_keyword_from, sym_keyword_where, sym_keyword_offset, @@ -15808,7 +15878,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(47), 2, sym_comment, sym_marginalia, - ACTIONS(317), 20, + ACTIONS(335), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -15829,7 +15899,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(319), 31, + ACTIONS(337), 31, sym_keyword_from, sym_keyword_where, sym_keyword_offset, @@ -16002,28 +16072,28 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(283), 1, anon_sym_PIPE_PIPE, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(299), 1, + ACTIONS(291), 1, sym_keyword_between, - ACTIONS(301), 1, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(297), 1, sym_keyword_and, ACTIONS(349), 1, sym_keyword_as, ACTIONS(351), 1, sym_keyword_or, - STATE(1109), 1, + STATE(1118), 1, sym_not_in, ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, STATE(50), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -16032,7 +16102,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -16061,275 +16131,189 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [2464] = 21, + [2464] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, sym_keyword_is, - ACTIONS(357), 1, - sym_keyword_not, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, + ACTIONS(355), 1, anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(367), 2, - anon_sym_STAR, - anon_sym_PERCENT, STATE(51), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(303), 7, + ACTIONS(258), 18, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, anon_sym_COMMA, - anon_sym_COLON_COLON, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(365), 7, anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - ACTIONS(305), 9, - sym_keyword_from, - sym_keyword_where, - sym_keyword_as, - sym_keyword_when, - sym_keyword_then, - sym_keyword_and, - sym_keyword_or, - sym_keyword_between, - sym__identifier, - [2559] = 19, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, - sym_keyword_is, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, - ACTIONS(379), 1, - sym_keyword_not, - STATE(1031), 1, - sym_not_in, - ACTIONS(367), 2, anon_sym_STAR, - anon_sym_PERCENT, - STATE(52), 2, - sym_comment, - sym_marginalia, - STATE(275), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(369), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(274), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(258), 7, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RBRACK, - anon_sym_COMMA, anon_sym_COLON_COLON, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(365), 7, - anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(260), 12, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(260), 20, sym_keyword_from, sym_keyword_where, sym_keyword_as, sym_keyword_when, sym_keyword_then, + sym_keyword_in, sym_keyword_and, sym_keyword_or, + sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, - sym__identifier, - [2650] = 22, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, - sym_keyword_is, - ACTIONS(357), 1, - sym_keyword_not, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(363), 1, anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, - ACTIONS(382), 1, - sym_keyword_between, - STATE(1031), 1, - sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(367), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(53), 2, - sym_comment, - sym_marginalia, - STATE(275), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(369), 4, anon_sym_LT, anon_sym_GT, + anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(258), 7, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RBRACK, - anon_sym_COMMA, - anon_sym_COLON_COLON, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(365), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - ACTIONS(260), 8, - sym_keyword_from, - sym_keyword_where, - sym_keyword_as, - sym_keyword_when, - sym_keyword_then, - sym_keyword_and, - sym_keyword_or, sym__identifier, - [2747] = 23, + [2537] = 19, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, sym_keyword_is, + ACTIONS(355), 1, + anon_sym_CARET, ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(359), 1, sym_keyword_not, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, - ACTIONS(382), 1, - sym_keyword_between, - ACTIONS(384), 1, - sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(54), 2, + STATE(52), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(258), 7, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RBRACK, + anon_sym_COMMA, + anon_sym_COLON_COLON, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(364), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + ACTIONS(260), 12, + sym_keyword_from, + sym_keyword_where, + sym_keyword_as, + sym_keyword_when, + sym_keyword_then, + sym_keyword_and, + sym_keyword_or, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + sym__identifier, + [2628] = 23, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(353), 1, + sym_keyword_is, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, + ACTIONS(376), 1, + sym_keyword_and, + ACTIONS(378), 1, + sym_keyword_not, + ACTIONS(380), 1, + sym_keyword_between, + ACTIONS(384), 1, + sym_keyword_similar, + STATE(1016), 1, + sym_not_in, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + ACTIONS(382), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(53), 2, + sym_comment, + sym_marginalia, + STATE(320), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(368), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -16350,7 +16334,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_then, sym_keyword_or, sym__identifier, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -16358,40 +16342,51 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [2846] = 9, + [2727] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(355), 1, + ACTIONS(353), 1, sym_keyword_is, - STATE(1031), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(359), 1, + sym_keyword_not, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + STATE(1016), 1, sym_not_in, - STATE(55), 2, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(54), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 19, + ACTIONS(258), 15, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, anon_sym_COMMA, anon_sym_EQ, - anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, @@ -16399,135 +16394,137 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 20, + ACTIONS(260), 16, sym_keyword_from, sym_keyword_where, sym_keyword_as, sym_keyword_when, sym_keyword_then, - sym_keyword_in, sym_keyword_and, sym_keyword_or, - sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, - anon_sym_SLASH, anon_sym_LT, anon_sym_GT, - anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [2917] = 6, + [2812] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(55), 2, - anon_sym_LPAREN, - anon_sym_DOT, - STATE(56), 2, + ACTIONS(353), 1, + sym_keyword_is, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, + anon_sym_SLASH, + STATE(1016), 1, + sym_not_in, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(55), 2, sym_comment, sym_marginalia, - ACTIONS(252), 7, - sym_keyword_as, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - ACTIONS(250), 39, + STATE(320), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + STATE(315), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(258), 16, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_limit, - sym_keyword_primary, - sym_keyword_separator, - sym_keyword_in, - sym_keyword_and, - sym_keyword_or, - sym_keyword_is, - sym_keyword_not, - sym_keyword_using, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_default, - sym_keyword_first, - sym_keyword_after, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - sym_keyword_comment, - sym_keyword_null, - anon_sym_RPAREN, + anon_sym_RBRACK, anon_sym_COMMA, anon_sym_EQ, - anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [2982] = 21, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(260), 19, + sym_keyword_from, + sym_keyword_where, + sym_keyword_as, + sym_keyword_when, + sym_keyword_then, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_not, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + sym__identifier, + [2889] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, sym_keyword_is, + ACTIONS(355), 1, + anon_sym_CARET, ACTIONS(357), 1, - sym_keyword_not, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(363), 1, + sym_keyword_in, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, - STATE(1031), 1, + ACTIONS(378), 1, + sym_keyword_not, + ACTIONS(384), 1, + sym_keyword_similar, + STATE(1016), 1, sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(57), 2, + ACTIONS(382), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(56), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(285), 7, + ACTIONS(303), 7, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -16535,7 +16532,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_COLON_COLON, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -16543,7 +16540,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(287), 9, + ACTIONS(305), 9, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -16553,59 +16550,71 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_or, sym_keyword_between, sym__identifier, - [3077] = 16, + [2984] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, sym_keyword_is, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(379), 1, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, + ACTIONS(378), 1, sym_keyword_not, - STATE(1031), 1, + ACTIONS(384), 1, + sym_keyword_similar, + STATE(1016), 1, sym_not_in, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(58), 2, + ACTIONS(382), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(57), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(274), 4, + ACTIONS(368), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 15, + ACTIONS(299), 7, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, anon_sym_COMMA, - anon_sym_EQ, anon_sym_COLON_COLON, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(364), 7, + anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(260), 16, + ACTIONS(301), 9, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -16614,73 +16623,74 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_and, sym_keyword_or, sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, sym__identifier, - [3162] = 18, + [3079] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, sym_keyword_is, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(379), 1, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, + ACTIONS(378), 1, sym_keyword_not, - STATE(1031), 1, + ACTIONS(380), 1, + sym_keyword_between, + ACTIONS(384), 1, + sym_keyword_similar, + STATE(1016), 1, sym_not_in, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(59), 2, + ACTIONS(382), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(58), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - ACTIONS(258), 8, + ACTIONS(258), 7, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, anon_sym_COMMA, anon_sym_COLON_COLON, - anon_sym_PIPE_PIPE, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 12, + ACTIONS(364), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + ACTIONS(260), 8, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -16688,35 +16698,27 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_then, sym_keyword_and, sym_keyword_or, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, sym__identifier, - [3251] = 10, + [3176] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(355), 1, - sym_keyword_is, - ACTIONS(375), 1, - anon_sym_CARET, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - STATE(60), 2, + STATE(59), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 18, + ACTIONS(258), 19, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -16728,6 +16730,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT_EQ, anon_sym_PLUS, anon_sym_PERCENT, + anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, @@ -16735,7 +16738,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 20, + ACTIONS(260), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -16744,6 +16747,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_in, sym_keyword_and, sym_keyword_or, + sym_keyword_is, sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, @@ -16756,77 +16760,83 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [3324] = 12, + [3245] = 18, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(355), 1, + ACTIONS(353), 1, sym_keyword_is, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(375), 1, + ACTIONS(355), 1, anon_sym_CARET, - STATE(1031), 1, + ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(359), 1, + sym_keyword_not, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + STATE(1016), 1, sym_not_in, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(61), 2, + STATE(60), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(274), 4, + ACTIONS(368), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 16, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RBRACK, - anon_sym_COMMA, + ACTIONS(364), 7, anon_sym_EQ, - anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, + ACTIONS(258), 8, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RBRACK, + anon_sym_COMMA, + anon_sym_COLON_COLON, + anon_sym_PIPE_PIPE, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 19, + ACTIONS(260), 12, sym_keyword_from, sym_keyword_where, sym_keyword_as, sym_keyword_when, sym_keyword_then, - sym_keyword_in, sym_keyword_and, sym_keyword_or, - sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, sym__identifier, - [3401] = 5, + [3334] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(62), 2, + STATE(61), 2, sym_comment, sym_marginalia, ACTIONS(49), 7, @@ -16879,21 +16889,23 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [3464] = 8, + [3397] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1031), 1, + ACTIONS(353), 1, + sym_keyword_is, + STATE(1016), 1, sym_not_in, - STATE(63), 2, + STATE(62), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -16918,7 +16930,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 21, + ACTIONS(260), 20, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -16927,7 +16939,6 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_in, sym_keyword_and, sym_keyword_or, - sym_keyword_is, sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, @@ -16940,12 +16951,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [3533] = 5, + [3468] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(64), 2, + ACTIONS(51), 2, + anon_sym_LPAREN, + anon_sym_DOT, + STATE(63), 2, sym_comment, sym_marginalia, ACTIONS(248), 7, @@ -16956,7 +16970,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(246), 40, + ACTIONS(246), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -16984,7 +16998,6 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_DOT, anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, @@ -16997,15 +17010,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [3595] = 5, + [3533] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(65), 2, + ACTIONS(386), 1, + sym_natural_number, + STATE(64), 2, sym_comment, sym_marginalia, - ACTIONS(53), 7, + ACTIONS(313), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17013,7 +17028,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(51), 40, + ACTIONS(311), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17041,7 +17056,6 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_DOT, anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, @@ -17054,15 +17068,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [3657] = 5, + [3597] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(66), 2, + STATE(65), 2, sym_comment, sym_marginalia, - ACTIONS(256), 7, + ACTIONS(252), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17070,7 +17084,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(254), 40, + ACTIONS(250), 40, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17111,14 +17125,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [3719] = 6, + [3659] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(386), 1, - sym_natural_number, - STATE(67), 2, + ACTIONS(388), 1, + anon_sym_DOT, + STATE(66), 2, sym_comment, sym_marginalia, ACTIONS(319), 7, @@ -17169,100 +17183,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [3783] = 31, + [3723] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(388), 1, - sym__identifier, - ACTIONS(392), 1, - sym_keyword_as, ACTIONS(394), 1, - sym_keyword_in, - ACTIONS(396), 1, - sym_keyword_and, - ACTIONS(398), 1, - sym_keyword_or, - ACTIONS(400), 1, - sym_keyword_is, - ACTIONS(402), 1, - sym_keyword_not, - ACTIONS(404), 1, - sym_keyword_between, - ACTIONS(408), 1, - anon_sym_SLASH, - ACTIONS(416), 1, - anon_sym_PLUS, - ACTIONS(418), 1, - anon_sym_DASH, - ACTIONS(420), 1, - anon_sym_CARET, - ACTIONS(422), 1, - anon_sym_PIPE_PIPE, - ACTIONS(424), 1, - anon_sym_DQUOTE, - ACTIONS(426), 1, - anon_sym_BQUOTE, - STATE(17), 1, - sym__double_quote_string, - STATE(631), 1, - sym_identifier, - STATE(755), 1, - sym_alias_name, - STATE(1126), 1, - sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(406), 2, - anon_sym_RPAREN, - anon_sym_COMMA, - ACTIONS(412), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(68), 2, - sym_comment, - sym_marginalia, - ACTIONS(390), 3, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_separator, - STATE(300), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(414), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(299), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(410), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [3897] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(432), 1, anon_sym_DOT, - STATE(69), 2, + STATE(67), 2, sym_comment, sym_marginalia, - ACTIONS(430), 7, + ACTIONS(392), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17270,7 +17201,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(428), 39, + ACTIONS(390), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17310,15 +17241,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [3961] = 5, + [3787] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(70), 2, + STATE(68), 2, sym_comment, sym_marginalia, - ACTIONS(57), 7, + ACTIONS(53), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17326,7 +17257,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(55), 40, + ACTIONS(51), 40, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17367,73 +17298,98 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4023] = 6, + [3849] = 31, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(435), 1, - anon_sym_DOT, - STATE(71), 2, - sym_comment, - sym_marginalia, - ACTIONS(313), 7, + ACTIONS(384), 1, + sym_keyword_similar, + ACTIONS(397), 1, + sym__identifier, + ACTIONS(401), 1, sym_keyword_as, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - ACTIONS(311), 39, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_limit, - sym_keyword_primary, - sym_keyword_separator, + ACTIONS(403), 1, sym_keyword_in, + ACTIONS(405), 1, sym_keyword_and, + ACTIONS(407), 1, sym_keyword_or, + ACTIONS(409), 1, sym_keyword_is, + ACTIONS(411), 1, sym_keyword_not, - sym_keyword_using, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_default, - sym_keyword_first, - sym_keyword_after, + ACTIONS(413), 1, sym_keyword_between, + ACTIONS(417), 1, + anon_sym_SLASH, + ACTIONS(425), 1, + anon_sym_PLUS, + ACTIONS(427), 1, + anon_sym_DASH, + ACTIONS(429), 1, + anon_sym_CARET, + ACTIONS(431), 1, + anon_sym_PIPE_PIPE, + ACTIONS(433), 1, + anon_sym_DQUOTE, + ACTIONS(435), 1, + anon_sym_BQUOTE, + STATE(17), 1, + sym__double_quote_string, + STATE(642), 1, + sym_identifier, + STATE(747), 1, + sym_alias_name, + STATE(1135), 1, + sym_not_in, + ACTIONS(382), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - sym_keyword_similar, - sym_keyword_comment, - sym_keyword_null, + ACTIONS(415), 2, anon_sym_RPAREN, anon_sym_COMMA, - anon_sym_EQ, + ACTIONS(421), 2, anon_sym_STAR, - anon_sym_COLON_COLON, + anon_sym_PERCENT, + STATE(69), 2, + sym_comment, + sym_marginalia, + ACTIONS(399), 3, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_separator, + STATE(271), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(423), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(270), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(419), 7, + anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4087] = 5, + [3963] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(72), 2, + STATE(70), 2, sym_comment, sym_marginalia, - ACTIONS(329), 7, + ACTIONS(57), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17441,7 +17397,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(327), 39, + ACTIONS(55), 40, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17469,6 +17425,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_DOT, anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, @@ -17481,15 +17438,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4148] = 5, + [4025] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(73), 2, + STATE(71), 2, sym_comment, sym_marginalia, - ACTIONS(439), 7, + ACTIONS(256), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17497,7 +17454,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(437), 39, + ACTIONS(254), 40, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17525,6 +17482,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_DOT, anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, @@ -17537,15 +17495,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4209] = 5, + [4087] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(74), 2, + STATE(72), 2, sym_comment, sym_marginalia, - ACTIONS(443), 7, + ACTIONS(439), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17553,7 +17511,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(441), 39, + ACTIONS(437), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17593,15 +17551,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4270] = 5, + [4148] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(75), 2, + STATE(73), 2, sym_comment, sym_marginalia, - ACTIONS(260), 7, + ACTIONS(443), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17609,7 +17567,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 39, + ACTIONS(441), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17649,15 +17607,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4331] = 5, + [4209] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(76), 2, + STATE(74), 2, sym_comment, sym_marginalia, - ACTIONS(341), 7, + ACTIONS(447), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17665,7 +17623,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(339), 39, + ACTIONS(445), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17705,15 +17663,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4392] = 5, + [4270] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(77), 2, + STATE(75), 2, sym_comment, sym_marginalia, - ACTIONS(447), 7, + ACTIONS(260), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17721,7 +17679,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(445), 39, + ACTIONS(258), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17761,12 +17719,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4453] = 5, + [4331] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(78), 2, + STATE(76), 2, sym_comment, sym_marginalia, ACTIONS(451), 7, @@ -17817,12 +17775,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4514] = 5, + [4392] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(79), 2, + STATE(77), 2, sym_comment, sym_marginalia, ACTIONS(455), 7, @@ -17873,12 +17831,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4575] = 5, + [4453] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(80), 2, + STATE(78), 2, sym_comment, sym_marginalia, ACTIONS(459), 7, @@ -17929,15 +17887,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4636] = 5, + [4514] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(81), 2, + STATE(79), 2, sym_comment, sym_marginalia, - ACTIONS(463), 7, + ACTIONS(248), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -17945,7 +17903,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(461), 39, + ACTIONS(246), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -17985,15 +17943,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4697] = 5, + [4575] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(82), 2, + STATE(80), 2, sym_comment, sym_marginalia, - ACTIONS(467), 7, + ACTIONS(337), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18001,7 +17959,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(465), 39, + ACTIONS(335), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18041,15 +17999,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4758] = 5, + [4636] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(83), 2, + STATE(81), 2, sym_comment, sym_marginalia, - ACTIONS(471), 7, + ACTIONS(345), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18057,7 +18015,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(469), 39, + ACTIONS(343), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18097,15 +18055,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4819] = 5, + [4697] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(84), 2, + STATE(82), 2, sym_comment, sym_marginalia, - ACTIONS(475), 7, + ACTIONS(341), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18113,7 +18071,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(473), 39, + ACTIONS(339), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18153,15 +18111,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4880] = 5, + [4758] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(85), 2, + STATE(83), 2, sym_comment, sym_marginalia, - ACTIONS(479), 7, + ACTIONS(329), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18169,7 +18127,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(477), 39, + ACTIONS(327), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18209,15 +18167,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [4941] = 5, + [4819] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(86), 2, + STATE(84), 2, sym_comment, sym_marginalia, - ACTIONS(483), 7, + ACTIONS(313), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18225,7 +18183,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(481), 39, + ACTIONS(311), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18265,15 +18223,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [5002] = 5, + [4880] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(87), 2, + STATE(85), 2, sym_comment, sym_marginalia, - ACTIONS(487), 7, + ACTIONS(463), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18281,7 +18239,119 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(485), 39, + ACTIONS(461), 39, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_limit, + sym_keyword_primary, + sym_keyword_separator, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_using, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_COLON_COLON, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [4941] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(86), 2, + sym_comment, + sym_marginalia, + ACTIONS(467), 7, + sym_keyword_as, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + ACTIONS(465), 39, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_limit, + sym_keyword_primary, + sym_keyword_separator, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_using, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_COLON_COLON, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [5002] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(87), 2, + sym_comment, + sym_marginalia, + ACTIONS(471), 7, + sym_keyword_as, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + ACTIONS(469), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18329,7 +18399,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(88), 2, sym_comment, sym_marginalia, - ACTIONS(252), 7, + ACTIONS(475), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18337,7 +18407,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(250), 39, + ACTIONS(473), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18385,7 +18455,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(89), 2, sym_comment, sym_marginalia, - ACTIONS(491), 7, + ACTIONS(479), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18393,7 +18463,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(489), 39, + ACTIONS(477), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18441,7 +18511,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(90), 2, sym_comment, sym_marginalia, - ACTIONS(333), 7, + ACTIONS(483), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18449,7 +18519,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(331), 39, + ACTIONS(481), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18497,7 +18567,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(91), 2, sym_comment, sym_marginalia, - ACTIONS(325), 7, + ACTIONS(487), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18505,7 +18575,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(323), 39, + ACTIONS(485), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18553,7 +18623,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(92), 2, sym_comment, sym_marginalia, - ACTIONS(337), 7, + ACTIONS(491), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18561,7 +18631,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(335), 39, + ACTIONS(489), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18609,7 +18679,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(93), 2, sym_comment, sym_marginalia, - ACTIONS(244), 7, + ACTIONS(333), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18617,7 +18687,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(242), 39, + ACTIONS(331), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18665,7 +18735,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(94), 2, sym_comment, sym_marginalia, - ACTIONS(345), 7, + ACTIONS(325), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18673,7 +18743,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(343), 39, + ACTIONS(323), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18721,7 +18791,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(95), 2, sym_comment, sym_marginalia, - ACTIONS(319), 7, + ACTIONS(244), 7, sym_keyword_as, anon_sym_SLASH, anon_sym_LT, @@ -18729,7 +18799,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(317), 39, + ACTIONS(242), 39, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -18774,38 +18844,38 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(361), 1, + ACTIONS(384), 1, sym_keyword_similar, - ACTIONS(394), 1, + ACTIONS(403), 1, sym_keyword_in, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(402), 1, + ACTIONS(411), 1, sym_keyword_not, - ACTIONS(404), 1, + ACTIONS(413), 1, sym_keyword_between, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, + ACTIONS(425), 1, anon_sym_PLUS, - ACTIONS(418), 1, + ACTIONS(427), 1, anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(422), 1, + ACTIONS(431), 1, anon_sym_PIPE_PIPE, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - ACTIONS(359), 2, + ACTIONS(382), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(96), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -18814,12 +18884,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_COMMA, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(414), 4, + ACTIONS(423), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -18832,7 +18902,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_and, sym_keyword_or, sym__identifier, - ACTIONS(410), 7, + ACTIONS(419), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -18840,71 +18910,149 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [5644] = 23, + [5644] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(361), 1, + ACTIONS(384), 1, sym_keyword_similar, - ACTIONS(394), 1, + ACTIONS(403), 1, sym_keyword_in, - ACTIONS(396), 1, - sym_keyword_and, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(402), 1, + ACTIONS(411), 1, sym_keyword_not, - ACTIONS(404), 1, - sym_keyword_between, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, + ACTIONS(425), 1, anon_sym_PLUS, - ACTIONS(418), 1, + ACTIONS(427), 1, anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(422), 1, + ACTIONS(431), 1, anon_sym_PIPE_PIPE, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - ACTIONS(359), 2, + ACTIONS(382), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(97), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(258), 4, + ACTIONS(303), 4, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(414), 4, + ACTIONS(423), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(260), 6, + ACTIONS(419), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + ACTIONS(305), 8, sym_keyword_order, sym_keyword_limit, sym_keyword_as, sym_keyword_separator, + sym_keyword_and, sym_keyword_or, + sym_keyword_between, sym__identifier, - ACTIONS(410), 7, + [5735] = 31, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(353), 1, + sym_keyword_is, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(357), 1, + sym_keyword_in, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, + ACTIONS(376), 1, + sym_keyword_and, + ACTIONS(378), 1, + sym_keyword_not, + ACTIONS(380), 1, + sym_keyword_between, + ACTIONS(384), 1, + sym_keyword_similar, + ACTIONS(399), 1, + sym_keyword_from, + ACTIONS(415), 1, + anon_sym_COMMA, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(495), 1, + sym_keyword_as, + ACTIONS(497), 1, + sym_keyword_or, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + STATE(3), 1, + sym__double_quote_string, + STATE(642), 1, + sym_identifier, + STATE(747), 1, + sym_alias_name, + STATE(1016), 1, + sym_not_in, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + ACTIONS(382), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(98), 2, + sym_comment, + sym_marginalia, + STATE(320), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(368), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(315), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -18912,21 +19060,21 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [5739] = 8, + [5846] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - STATE(98), 2, + STATE(99), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -18969,30 +19117,28 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [5804] = 10, + [5911] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(420), 1, - anon_sym_CARET, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - STATE(99), 2, + STATE(100), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 15, + ACTIONS(258), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -19001,6 +19147,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT_EQ, anon_sym_PLUS, anon_sym_PERCENT, + anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, @@ -19028,154 +19175,169 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [5873] = 16, + [5978] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(394), 1, + ACTIONS(384), 1, + sym_keyword_similar, + ACTIONS(403), 1, sym_keyword_in, - ACTIONS(400), 1, + ACTIONS(405), 1, + sym_keyword_and, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(408), 1, + ACTIONS(411), 1, + sym_keyword_not, + ACTIONS(413), 1, + sym_keyword_between, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, + ACTIONS(425), 1, anon_sym_PLUS, - ACTIONS(418), 1, + ACTIONS(427), 1, anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(493), 1, - sym_keyword_not, - STATE(1126), 1, + ACTIONS(431), 1, + anon_sym_PIPE_PIPE, + STATE(1135), 1, sym_not_in, - ACTIONS(412), 2, + ACTIONS(382), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(100), 2, + STATE(101), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(299), 4, + ACTIONS(258), 4, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(423), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 12, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(260), 6, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_as, + sym_keyword_separator, + sym_keyword_or, + sym__identifier, + ACTIONS(419), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(260), 15, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, - sym_keyword_and, - sym_keyword_or, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - sym__identifier, - [5954] = 12, + [6073] = 18, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(400), 1, + ACTIONS(403), 1, + sym_keyword_in, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(420), 1, + ACTIONS(425), 1, + anon_sym_PLUS, + ACTIONS(427), 1, + anon_sym_DASH, + ACTIONS(429), 1, anon_sym_CARET, - STATE(1126), 1, + ACTIONS(503), 1, + sym_keyword_not, + STATE(1135), 1, sym_not_in, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(101), 2, + STATE(102), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(299), 4, + ACTIONS(423), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 13, + ACTIONS(258), 5, anon_sym_RPAREN, anon_sym_COMMA, + anon_sym_PIPE_PIPE, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(419), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(260), 18, + ACTIONS(260), 11, sym_keyword_order, sym_keyword_limit, sym_keyword_as, sym_keyword_separator, - sym_keyword_in, sym_keyword_and, sym_keyword_or, - sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, sym__identifier, - [6027] = 9, + [6158] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - STATE(1126), 1, + ACTIONS(429), 1, + anon_sym_CARET, + STATE(1135), 1, sym_not_in, - STATE(102), 2, + STATE(103), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 16, + ACTIONS(258), 15, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -19184,7 +19346,6 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT_EQ, anon_sym_PLUS, anon_sym_PERCENT, - anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, @@ -19212,62 +19373,56 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [6094] = 18, + [6227] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(394), 1, + ACTIONS(403), 1, sym_keyword_in, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, + ACTIONS(425), 1, anon_sym_PLUS, - ACTIONS(418), 1, + ACTIONS(427), 1, anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(493), 1, + ACTIONS(503), 1, sym_keyword_not, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(103), 2, + STATE(104), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(414), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 5, + ACTIONS(258), 12, anon_sym_RPAREN, anon_sym_COMMA, - anon_sym_PIPE_PIPE, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(410), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(260), 11, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(260), 15, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -19278,129 +19433,121 @@ static const uint16_t ts_small_parse_table[] = { aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, sym__identifier, - [6179] = 19, + [6308] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(394), 1, - sym_keyword_in, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, - anon_sym_PLUS, - ACTIONS(418), 1, - anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(422), 1, - anon_sym_PIPE_PIPE, - ACTIONS(493), 1, - sym_keyword_not, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(104), 2, + STATE(105), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(258), 4, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(414), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(410), 7, + ACTIONS(258), 13, + anon_sym_RPAREN, + anon_sym_COMMA, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(260), 11, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(260), 18, sym_keyword_order, sym_keyword_limit, sym_keyword_as, sym_keyword_separator, + sym_keyword_in, sym_keyword_and, sym_keyword_or, + sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, sym__identifier, - [6266] = 21, + [6381] = 19, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(394), 1, + ACTIONS(403), 1, sym_keyword_in, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(402), 1, - sym_keyword_not, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, + ACTIONS(425), 1, anon_sym_PLUS, - ACTIONS(418), 1, + ACTIONS(427), 1, anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(422), 1, + ACTIONS(431), 1, anon_sym_PIPE_PIPE, - STATE(1126), 1, + ACTIONS(503), 1, + sym_keyword_not, + STATE(1135), 1, sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(105), 2, + STATE(106), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(303), 4, + ACTIONS(258), 4, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(414), 4, + ACTIONS(423), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(410), 7, + ACTIONS(419), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -19408,7 +19555,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(305), 8, + ACTIONS(260), 11, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -19416,61 +19563,64 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_and, sym_keyword_or, sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, sym__identifier, - [6357] = 21, + [6468] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(361), 1, + ACTIONS(384), 1, sym_keyword_similar, - ACTIONS(394), 1, + ACTIONS(403), 1, sym_keyword_in, - ACTIONS(400), 1, + ACTIONS(409), 1, sym_keyword_is, - ACTIONS(402), 1, + ACTIONS(411), 1, sym_keyword_not, - ACTIONS(408), 1, + ACTIONS(417), 1, anon_sym_SLASH, - ACTIONS(416), 1, + ACTIONS(425), 1, anon_sym_PLUS, - ACTIONS(418), 1, + ACTIONS(427), 1, anon_sym_DASH, - ACTIONS(420), 1, + ACTIONS(429), 1, anon_sym_CARET, - ACTIONS(422), 1, + ACTIONS(431), 1, anon_sym_PIPE_PIPE, - STATE(1126), 1, + STATE(1135), 1, sym_not_in, - ACTIONS(359), 2, + ACTIONS(382), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(412), 2, + ACTIONS(421), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(106), 2, + STATE(107), 2, sym_comment, sym_marginalia, - STATE(300), 3, + STATE(271), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(285), 4, + ACTIONS(299), 4, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(414), 4, + ACTIONS(423), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(299), 4, + STATE(270), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(410), 7, + ACTIONS(419), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -19478,7 +19628,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(287), 8, + ACTIONS(301), 8, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -19487,104 +19637,22 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_or, sym_keyword_between, sym__identifier, - [6448] = 31, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(353), 1, - sym_keyword_in, - ACTIONS(355), 1, - sym_keyword_is, - ACTIONS(357), 1, - sym_keyword_not, - ACTIONS(361), 1, - sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, - ACTIONS(382), 1, - sym_keyword_between, - ACTIONS(384), 1, - sym_keyword_and, - ACTIONS(390), 1, - sym_keyword_from, - ACTIONS(406), 1, - anon_sym_COMMA, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(498), 1, - sym_keyword_as, - ACTIONS(500), 1, - sym_keyword_or, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - STATE(4), 1, - sym__double_quote_string, - STATE(631), 1, - sym_identifier, - STATE(755), 1, - sym_alias_name, - STATE(1031), 1, - sym_not_in, - ACTIONS(359), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(367), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(107), 2, - sym_comment, - sym_marginalia, - STATE(275), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(369), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(274), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(365), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [6559] = 8, + [6559] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(432), 1, - anon_sym_DOT, - ACTIONS(506), 1, + ACTIONS(51), 2, anon_sym_LPAREN, - ACTIONS(508), 1, - anon_sym_RPAREN, + anon_sym_DOT, STATE(108), 2, sym_comment, sym_marginalia, - ACTIONS(428), 19, + ACTIONS(246), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, + anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, anon_sym_STAR, @@ -19601,7 +19669,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(430), 21, + ACTIONS(248), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -19623,98 +19691,24 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [6623] = 26, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(262), 1, - sym_keyword_in, - ACTIONS(264), 1, - sym_keyword_is, - ACTIONS(269), 1, - anon_sym_SLASH, - ACTIONS(277), 1, - anon_sym_PLUS, - ACTIONS(279), 1, - anon_sym_DASH, - ACTIONS(281), 1, - anon_sym_CARET, - ACTIONS(283), 1, - anon_sym_PIPE_PIPE, - ACTIONS(289), 1, - sym_keyword_not, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(299), 1, - sym_keyword_between, - ACTIONS(301), 1, - sym_keyword_and, - ACTIONS(351), 1, - sym_keyword_or, - ACTIONS(515), 1, - sym_keyword_using, - STATE(915), 1, - sym_direction, - STATE(1109), 1, - sym_not_in, - ACTIONS(273), 2, - anon_sym_STAR, - anon_sym_PERCENT, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(511), 2, - sym_keyword_desc, - sym_keyword_asc, - STATE(109), 2, - sym_comment, - sym_marginalia, - STATE(285), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(275), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - ACTIONS(513), 4, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - STATE(284), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(271), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [6723] = 7, + [6619] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(487), 1, + ACTIONS(508), 1, sym_keyword_as, - STATE(110), 2, + STATE(109), 2, sym_comment, sym_marginalia, - ACTIONS(471), 6, + ACTIONS(443), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(485), 14, + ACTIONS(506), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -19729,7 +19723,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - ACTIONS(469), 22, + ACTIONS(441), 22, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -19752,78 +19746,24 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [6785] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(55), 2, - anon_sym_LPAREN, - anon_sym_DOT, - STATE(111), 2, - sym_comment, - sym_marginalia, - ACTIONS(250), 20, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RBRACK, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_EQ, - anon_sym_STAR, - anon_sym_COLON_COLON, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(252), 21, - sym_keyword_from, - sym_keyword_where, - sym_keyword_as, - sym_keyword_when, - sym_keyword_then, - sym_keyword_in, - sym_keyword_and, - sym_keyword_or, - sym_keyword_is, - sym_keyword_not, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - sym__identifier, - [6845] = 7, + [6681] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(519), 1, + ACTIONS(508), 1, sym_keyword_as, - STATE(112), 2, + STATE(110), 2, sym_comment, sym_marginalia, - ACTIONS(459), 6, + ACTIONS(455), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(517), 14, + ACTIONS(506), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -19838,7 +19778,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - ACTIONS(457), 22, + ACTIONS(453), 22, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -19861,24 +19801,24 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [6907] = 7, + [6743] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(519), 1, + ACTIONS(475), 1, sym_keyword_as, - STATE(113), 2, + STATE(111), 2, sym_comment, sym_marginalia, - ACTIONS(467), 6, + ACTIONS(491), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(517), 14, + ACTIONS(473), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -19893,7 +19833,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - ACTIONS(465), 22, + ACTIONS(489), 22, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -19916,19 +19856,24 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [6969] = 5, + [6805] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(114), 2, + ACTIONS(394), 1, + anon_sym_DOT, + ACTIONS(510), 1, + anon_sym_LPAREN, + ACTIONS(512), 1, + anon_sym_RPAREN, + STATE(112), 2, sym_comment, sym_marginalia, - ACTIONS(481), 20, + ACTIONS(390), 19, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, - anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, anon_sym_STAR, @@ -19945,9 +19890,8 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(483), 22, + ACTIONS(392), 21, sym_keyword_from, - sym_keyword_on, sym_keyword_where, sym_keyword_as, sym_keyword_when, @@ -19968,25 +19912,182 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7026] = 6, + [6869] = 26, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(262), 1, + sym_keyword_in, + ACTIONS(264), 1, + sym_keyword_is, + ACTIONS(269), 1, + anon_sym_SLASH, + ACTIONS(277), 1, + anon_sym_PLUS, + ACTIONS(279), 1, + anon_sym_DASH, + ACTIONS(281), 1, + anon_sym_CARET, + ACTIONS(283), 1, + anon_sym_PIPE_PIPE, + ACTIONS(289), 1, + sym_keyword_not, + ACTIONS(291), 1, + sym_keyword_between, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(297), 1, + sym_keyword_and, + ACTIONS(351), 1, + sym_keyword_or, + ACTIONS(519), 1, + sym_keyword_using, + STATE(884), 1, + sym_direction, + STATE(1118), 1, + sym_not_in, + ACTIONS(273), 2, + anon_sym_STAR, + anon_sym_PERCENT, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + ACTIONS(515), 2, + sym_keyword_desc, + sym_keyword_asc, + STATE(113), 2, + sym_comment, + sym_marginalia, + STATE(297), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(275), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + ACTIONS(517), 4, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + STATE(294), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(271), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [6969] = 37, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(523), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(521), 1, + sym_keyword_cast, + ACTIONS(525), 1, + sym_keyword_current_timestamp, + ACTIONS(527), 1, + sym_keyword_null, + ACTIONS(529), 1, + sym_keyword_true, + ACTIONS(531), 1, + sym_keyword_false, + ACTIONS(533), 1, + sym_keyword_array, + ACTIONS(535), 1, + anon_sym_LPAREN, + ACTIONS(537), 1, + anon_sym_RPAREN, + ACTIONS(539), 1, anon_sym_DOT, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, + anon_sym_DASH, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(551), 1, + sym_bang, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, + sym__double_quote_string, + STATE(112), 1, + sym_identifier, + STATE(120), 1, + sym_parameter, + STATE(124), 1, + sym_between_expression, + STATE(129), 1, + sym_qualified_field, + STATE(134), 1, + sym_expression, + STATE(227), 1, + sym_binary_expression, + STATE(229), 1, + sym_literal, + STATE(1064), 1, + sym_object_reference, + STATE(1365), 1, + sym__inner_default_expression, + STATE(114), 2, + sym_comment, + sym_marginalia, + ACTIONS(523), 4, + sym_keyword_not, + sym_keyword_all, + sym_keyword_any, + sym_keyword_some, + STATE(493), 6, + sym_array, + sym_implicit_cast, + sym_cast, + sym_invocation, + sym_unary_expression, + sym_list, + [7090] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, STATE(115), 2, sym_comment, sym_marginalia, - ACTIONS(506), 7, + ACTIONS(553), 8, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, + anon_sym_DOT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(521), 34, + ACTIONS(555), 34, sym_keyword_values, sym_keyword_set, sym_keyword_from, @@ -20021,24 +20122,25 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_rewrite, sym_keyword_cache, sym__identifier, - [7085] = 5, + [7147] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(559), 1, + anon_sym_DOT, STATE(116), 2, sym_comment, sym_marginalia, - ACTIONS(525), 8, + ACTIONS(510), 7, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - anon_sym_DOT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(527), 34, + ACTIONS(557), 34, sym_keyword_values, sym_keyword_set, sym_keyword_from, @@ -20073,99 +20175,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_rewrite, sym_keyword_cache, sym__identifier, - [7142] = 37, + [7206] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(529), 1, - sym_keyword_cast, - ACTIONS(533), 1, - sym_keyword_current_timestamp, - ACTIONS(535), 1, - sym_keyword_null, - ACTIONS(537), 1, - sym_keyword_true, - ACTIONS(539), 1, - sym_keyword_false, - ACTIONS(541), 1, - sym_keyword_array, - ACTIONS(543), 1, - anon_sym_LPAREN, - ACTIONS(545), 1, - anon_sym_RPAREN, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(559), 1, - sym_bang, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, - sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(128), 1, - sym_between_expression, - STATE(134), 1, - sym_expression, - STATE(225), 1, - sym_binary_expression, - STATE(227), 1, - sym_literal, - STATE(1050), 1, - sym_object_reference, - STATE(1464), 1, - sym__inner_default_expression, STATE(117), 2, sym_comment, sym_marginalia, - ACTIONS(531), 4, - sym_keyword_not, - sym_keyword_all, - sym_keyword_any, - sym_keyword_some, - STATE(485), 6, - sym_array, - sym_implicit_cast, - sym_cast, - sym_invocation, - sym_unary_expression, - sym_list, - [7263] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(118), 2, - sym_comment, - sym_marginalia, - ACTIONS(449), 20, + ACTIONS(469), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20186,8 +20204,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(451), 21, + ACTIONS(471), 22, sym_keyword_from, + sym_keyword_on, sym_keyword_where, sym_keyword_as, sym_keyword_when, @@ -20208,15 +20227,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7319] = 5, + [7263] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(119), 2, + STATE(118), 2, sym_comment, sym_marginalia, - ACTIONS(445), 20, + ACTIONS(437), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20237,7 +20256,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(447), 21, + ACTIONS(439), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20259,15 +20278,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7375] = 5, + [7319] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(120), 2, + STATE(119), 2, sym_comment, sym_marginalia, - ACTIONS(453), 20, + ACTIONS(457), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20288,7 +20307,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(455), 21, + ACTIONS(459), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20310,15 +20329,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7431] = 5, + [7375] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(121), 2, + STATE(120), 2, sym_comment, sym_marginalia, - ACTIONS(477), 20, + ACTIONS(481), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20339,7 +20358,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(479), 21, + ACTIONS(483), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20361,15 +20380,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7487] = 5, + [7431] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(122), 2, + STATE(121), 2, sym_comment, sym_marginalia, - ACTIONS(469), 20, + ACTIONS(461), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20390,7 +20409,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(471), 21, + ACTIONS(463), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20412,15 +20431,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7543] = 5, + [7487] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(123), 2, + STATE(122), 2, sym_comment, sym_marginalia, - ACTIONS(485), 20, + ACTIONS(441), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20441,7 +20460,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(487), 21, + ACTIONS(443), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20463,97 +20482,66 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7599] = 36, + [7543] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(529), 1, - sym_keyword_cast, - ACTIONS(533), 1, - sym_keyword_current_timestamp, - ACTIONS(541), 1, - sym_keyword_array, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(563), 1, - sym_keyword_null, - ACTIONS(565), 1, - sym_keyword_true, - ACTIONS(567), 1, - sym_keyword_false, - ACTIONS(569), 1, - anon_sym_LPAREN, - ACTIONS(571), 1, - anon_sym_DOT, - ACTIONS(573), 1, - anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, - anon_sym_SQUOTE, - ACTIONS(579), 1, - sym_natural_number, - ACTIONS(581), 1, - sym_bang, - STATE(56), 1, - sym__double_quote_string, - STATE(71), 1, - sym_integer, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(108), 1, - sym_identifier, - STATE(112), 1, - sym_binary_expression, - STATE(113), 1, - sym_literal, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(128), 1, - sym_between_expression, - STATE(205), 1, - sym_expression, - STATE(486), 1, - sym__inner_default_expression, - STATE(1237), 1, - sym_object_reference, - STATE(124), 2, + STATE(123), 2, sym_comment, sym_marginalia, - ACTIONS(561), 4, + ACTIONS(465), 20, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RBRACK, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_COLON_COLON, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(467), 21, + sym_keyword_from, + sym_keyword_where, + sym_keyword_as, + sym_keyword_when, + sym_keyword_then, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, sym_keyword_not, - sym_keyword_all, - sym_keyword_any, - sym_keyword_some, - STATE(485), 6, - sym_array, - sym_implicit_cast, - sym_cast, - sym_invocation, - sym_unary_expression, - sym_list, - [7717] = 5, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + sym__identifier, + [7599] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(125), 2, + STATE(124), 2, sym_comment, sym_marginalia, - ACTIONS(473), 20, + ACTIONS(449), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20574,7 +20562,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(475), 21, + ACTIONS(451), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20596,15 +20584,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7773] = 5, + [7655] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(126), 2, + STATE(125), 2, sym_comment, sym_marginalia, - ACTIONS(457), 20, + ACTIONS(473), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20625,7 +20613,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(459), 21, + ACTIONS(475), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20647,15 +20635,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [7829] = 5, + [7711] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(127), 2, + STATE(126), 2, sym_comment, sym_marginalia, - ACTIONS(441), 20, + ACTIONS(445), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20676,7 +20664,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(443), 21, + ACTIONS(447), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20698,6 +20686,88 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, + [7767] = 36, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(521), 1, + sym_keyword_cast, + ACTIONS(525), 1, + sym_keyword_current_timestamp, + ACTIONS(533), 1, + sym_keyword_array, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(563), 1, + sym_keyword_null, + ACTIONS(565), 1, + sym_keyword_true, + ACTIONS(567), 1, + sym_keyword_false, + ACTIONS(569), 1, + anon_sym_LPAREN, + ACTIONS(571), 1, + anon_sym_DOT, + ACTIONS(573), 1, + anon_sym_DASH, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, + anon_sym_SQUOTE, + ACTIONS(579), 1, + sym_natural_number, + ACTIONS(581), 1, + sym_bang, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, + sym_integer, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(109), 1, + sym_binary_expression, + STATE(110), 1, + sym_literal, + STATE(112), 1, + sym_identifier, + STATE(120), 1, + sym_parameter, + STATE(124), 1, + sym_between_expression, + STATE(129), 1, + sym_qualified_field, + STATE(177), 1, + sym_expression, + STATE(494), 1, + sym__inner_default_expression, + STATE(1321), 1, + sym_object_reference, + STATE(127), 2, + sym_comment, + sym_marginalia, + ACTIONS(561), 4, + sym_keyword_not, + sym_keyword_all, + sym_keyword_any, + sym_keyword_some, + STATE(493), 6, + sym_array, + sym_implicit_cast, + sym_cast, + sym_invocation, + sym_unary_expression, + sym_list, [7885] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, @@ -20706,7 +20776,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(128), 2, sym_comment, sym_marginalia, - ACTIONS(461), 20, + ACTIONS(258), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20727,7 +20797,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(463), 21, + ACTIONS(260), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20757,7 +20827,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(129), 2, sym_comment, sym_marginalia, - ACTIONS(258), 20, + ACTIONS(485), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20778,7 +20848,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 21, + ACTIONS(487), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20859,7 +20929,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(131), 2, sym_comment, sym_marginalia, - ACTIONS(437), 20, + ACTIONS(477), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20880,7 +20950,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(439), 21, + ACTIONS(479), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20910,7 +20980,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(132), 2, sym_comment, sym_marginalia, - ACTIONS(465), 20, + ACTIONS(453), 20, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RBRACK, @@ -20931,7 +21001,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(467), 21, + ACTIONS(455), 21, sym_keyword_from, sym_keyword_where, sym_keyword_as, @@ -20958,17 +21028,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -20982,27 +21052,27 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(133), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -21013,7 +21083,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_where, sym_keyword_when, anon_sym_COMMA, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21026,7 +21096,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -21056,11 +21126,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - STATE(1120), 1, + STATE(1129), 1, aux_sym_list_repeat1, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -21069,7 +21139,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(134), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -21078,7 +21148,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -21100,16 +21170,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_is, ACTIONS(625), 1, anon_sym_CARET, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, STATE(135), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -21144,22 +21214,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [8415] = 25, + [8415] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -21173,38 +21243,36 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, - ACTIONS(629), 1, - anon_sym_RBRACK, - ACTIONS(631), 1, - anon_sym_COMMA, - STATE(1025), 1, - aux_sym_array_repeat1, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(136), 2, sym_comment, sym_marginalia, - STATE(275), 3, + ACTIONS(629), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21212,12 +21280,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [8508] = 25, + [8504] = 25, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -21243,13 +21311,13 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(633), 1, + ACTIONS(631), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - STATE(1071), 1, + STATE(1029), 1, aux_sym_list_repeat1, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -21258,7 +21326,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(137), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -21267,7 +21335,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -21280,22 +21348,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [8601] = 23, + [8597] = 25, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -21309,36 +21377,38 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, - STATE(1031), 1, + ACTIONS(633), 1, + sym_keyword_when, + STATE(820), 1, + aux_sym__merge_statement_repeat1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + STATE(1139), 1, + sym_when_clause, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(138), 2, sym_comment, sym_marginalia, - ACTIONS(635), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21351,17 +21421,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -21375,38 +21445,38 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, + ACTIONS(635), 1, + anon_sym_RBRACK, ACTIONS(637), 1, - sym_keyword_when, - STATE(847), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - STATE(1031), 1, + anon_sym_COMMA, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + STATE(1119), 1, + aux_sym_array_repeat1, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(139), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21419,62 +21489,62 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(587), 1, + ACTIONS(597), 1, sym_keyword_and, - ACTIONS(589), 1, + ACTIONS(599), 1, sym_keyword_or, - ACTIONS(591), 1, + ACTIONS(601), 1, sym_keyword_is, - ACTIONS(593), 1, + ACTIONS(603), 1, sym_keyword_not, - ACTIONS(595), 1, + ACTIONS(605), 1, sym_keyword_between, - ACTIONS(637), 1, - sym_keyword_when, - STATE(835), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - STATE(1031), 1, + ACTIONS(609), 1, + anon_sym_COMMA, + ACTIONS(611), 1, + anon_sym_SLASH, + ACTIONS(621), 1, + anon_sym_PLUS, + ACTIONS(623), 1, + anon_sym_DASH, + ACTIONS(625), 1, + anon_sym_CARET, + ACTIONS(627), 1, + anon_sym_PIPE_PIPE, + ACTIONS(639), 1, + anon_sym_RPAREN, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + STATE(1029), 1, + aux_sym_list_repeat1, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(140), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(613), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21487,17 +21557,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -21511,36 +21581,36 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(141), 2, sym_comment, sym_marginalia, - ACTIONS(639), 3, + ACTIONS(641), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - STATE(275), 3, + sym_keyword_when, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21553,85 +21623,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(585), 1, - sym_keyword_in, - ACTIONS(597), 1, - sym_keyword_and, - ACTIONS(599), 1, - sym_keyword_or, - ACTIONS(601), 1, - sym_keyword_is, - ACTIONS(603), 1, - sym_keyword_not, - ACTIONS(605), 1, - sym_keyword_between, - ACTIONS(609), 1, - anon_sym_COMMA, - ACTIONS(611), 1, - anon_sym_SLASH, - ACTIONS(621), 1, - anon_sym_PLUS, - ACTIONS(623), 1, - anon_sym_DASH, - ACTIONS(625), 1, + ACTIONS(355), 1, anon_sym_CARET, - ACTIONS(627), 1, - anon_sym_PIPE_PIPE, - ACTIONS(641), 1, - anon_sym_RPAREN, - STATE(1031), 1, - sym_not_in, - STATE(1071), 1, - aux_sym_list_repeat1, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(615), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(142), 2, - sym_comment, - sym_marginalia, - STATE(311), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(619), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(310), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(613), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [9058] = 25, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -21645,38 +21647,38 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, - ACTIONS(637), 1, + ACTIONS(633), 1, sym_keyword_when, - STATE(892), 1, + STATE(845), 1, aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + STATE(1139), 1, + sym_when_clause, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(143), 2, + STATE(142), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21684,22 +21686,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9151] = 23, + [9058] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -21713,36 +21715,36 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, ACTIONS(595), 1, sym_keyword_between, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(144), 2, + STATE(143), 2, sym_comment, sym_marginalia, ACTIONS(643), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21750,27 +21752,21 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9240] = 25, + [9147] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(597), 1, - sym_keyword_and, - ACTIONS(599), 1, - sym_keyword_or, ACTIONS(601), 1, sym_keyword_is, ACTIONS(603), 1, sym_keyword_not, ACTIONS(605), 1, sym_keyword_between, - ACTIONS(609), 1, - anon_sym_COMMA, ACTIONS(611), 1, anon_sym_SLASH, ACTIONS(621), 1, @@ -21781,22 +21777,18 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(645), 1, - anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - STATE(1120), 1, - aux_sym_list_repeat1, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(145), 2, + STATE(144), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -21805,11 +21797,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, + ACTIONS(258), 5, + sym_keyword_and, + sym_keyword_or, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_COLON_COLON, ACTIONS(613), 7, anon_sym_EQ, anon_sym_LT_EQ, @@ -21818,15 +21816,23 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9333] = 17, + [9232] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(295), 1, + sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, + ACTIONS(597), 1, + sym_keyword_and, ACTIONS(601), 1, sym_keyword_is, + ACTIONS(603), 1, + sym_keyword_not, + ACTIONS(605), 1, + sym_keyword_between, ACTIONS(611), 1, anon_sym_SLASH, ACTIONS(621), 1, @@ -21835,26 +21841,34 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, ACTIONS(625), 1, anon_sym_CARET, - ACTIONS(647), 1, - sym_keyword_not, - STATE(1031), 1, + ACTIONS(627), 1, + anon_sym_PIPE_PIPE, + STATE(1016), 1, sym_not_in, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(146), 2, + STATE(145), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, + ACTIONS(258), 4, + sym_keyword_or, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_COLON_COLON, ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -21867,34 +21881,21 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - ACTIONS(258), 10, - sym_keyword_and, - sym_keyword_or, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_COLON_COLON, - anon_sym_PIPE_PIPE, - [9410] = 9, + [9319] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(601), 1, - sym_keyword_is, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - STATE(147), 2, + STATE(146), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -21906,10 +21907,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 23, + ACTIONS(258), 24, sym_keyword_in, sym_keyword_and, sym_keyword_or, + sym_keyword_is, sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, @@ -21930,63 +21932,67 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9471] = 21, + [9378] = 25, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(601), 1, + ACTIONS(587), 1, + sym_keyword_and, + ACTIONS(589), 1, + sym_keyword_or, + ACTIONS(591), 1, sym_keyword_is, - ACTIONS(603), 1, + ACTIONS(593), 1, sym_keyword_not, - ACTIONS(605), 1, + ACTIONS(595), 1, sym_keyword_between, - ACTIONS(611), 1, - anon_sym_SLASH, - ACTIONS(621), 1, - anon_sym_PLUS, - ACTIONS(623), 1, - anon_sym_DASH, - ACTIONS(625), 1, - anon_sym_CARET, - ACTIONS(627), 1, - anon_sym_PIPE_PIPE, - STATE(1031), 1, + ACTIONS(633), 1, + sym_keyword_when, + STATE(859), 1, + aux_sym__merge_statement_repeat1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + STATE(1139), 1, + sym_when_clause, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(615), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(148), 2, + STATE(147), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(619), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 5, - sym_keyword_and, - sym_keyword_or, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_COLON_COLON, - ACTIONS(613), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -21994,23 +22000,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9556] = 22, + [9471] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(597), 1, - sym_keyword_and, ACTIONS(601), 1, sym_keyword_is, - ACTIONS(603), 1, - sym_keyword_not, - ACTIONS(605), 1, - sym_keyword_between, ACTIONS(611), 1, anon_sym_SLASH, ACTIONS(621), 1, @@ -22019,77 +22017,86 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, ACTIONS(625), 1, anon_sym_CARET, - ACTIONS(627), 1, - anon_sym_PIPE_PIPE, - STATE(1031), 1, + ACTIONS(645), 1, + sym_keyword_not, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(149), 2, + STATE(148), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(258), 4, - sym_keyword_or, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_COLON_COLON, - ACTIONS(619), 4, + ACTIONS(260), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(613), 7, + ACTIONS(258), 17, + sym_keyword_and, + sym_keyword_or, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_RPAREN, + anon_sym_COMMA, anon_sym_EQ, + anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9643] = 8, + [9546] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1031), 1, + ACTIONS(601), 1, + sym_keyword_is, + ACTIONS(611), 1, + anon_sym_SLASH, + ACTIONS(625), 1, + anon_sym_CARET, + STATE(1016), 1, sym_not_in, - STATE(150), 2, + ACTIONS(615), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(149), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(260), 6, - anon_sym_SLASH, + ACTIONS(260), 5, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 24, + ACTIONS(258), 20, sym_keyword_in, sym_keyword_and, sym_keyword_or, - sym_keyword_is, sym_keyword_not, sym_keyword_between, aux_sym_keyword_like_token1, @@ -22098,53 +22105,44 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9702] = 12, + [9613] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(601), 1, sym_keyword_is, - ACTIONS(611), 1, - anon_sym_SLASH, - ACTIONS(625), 1, - anon_sym_CARET, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(615), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(151), 2, + STATE(150), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(260), 5, + ACTIONS(260), 6, + anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(258), 20, + ACTIONS(258), 23, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -22156,16 +22154,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_STAR, anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [9769] = 16, + [9674] = 17, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -22182,31 +22183,39 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH, ACTIONS(625), 1, anon_sym_CARET, - ACTIONS(647), 1, + ACTIONS(645), 1, sym_keyword_not, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(152), 2, + STATE(151), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(260), 4, + ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(258), 17, + ACTIONS(613), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + ACTIONS(258), 10, sym_keyword_and, sym_keyword_or, sym_keyword_between, @@ -22215,16 +22224,9 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_similar, anon_sym_RPAREN, anon_sym_COMMA, - anon_sym_EQ, anon_sym_COLON_COLON, - anon_sym_LT_EQ, - anon_sym_GT_EQ, anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [9844] = 18, + [9751] = 18, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -22243,17 +22245,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(647), 1, + ACTIONS(645), 1, sym_keyword_not, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(153), 2, + STATE(152), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -22262,7 +22264,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -22285,12 +22287,80 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RPAREN, anon_sym_COMMA, anon_sym_COLON_COLON, + [9830] = 25, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(585), 1, + sym_keyword_in, + ACTIONS(597), 1, + sym_keyword_and, + ACTIONS(599), 1, + sym_keyword_or, + ACTIONS(601), 1, + sym_keyword_is, + ACTIONS(603), 1, + sym_keyword_not, + ACTIONS(605), 1, + sym_keyword_between, + ACTIONS(609), 1, + anon_sym_COMMA, + ACTIONS(611), 1, + anon_sym_SLASH, + ACTIONS(621), 1, + anon_sym_PLUS, + ACTIONS(623), 1, + anon_sym_DASH, + ACTIONS(625), 1, + anon_sym_CARET, + ACTIONS(627), 1, + anon_sym_PIPE_PIPE, + ACTIONS(648), 1, + anon_sym_RPAREN, + STATE(1016), 1, + sym_not_in, + STATE(1129), 1, + aux_sym_list_repeat1, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + ACTIONS(615), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(153), 2, + sym_comment, + sym_marginalia, + STATE(304), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(619), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(303), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(613), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, [9923] = 20, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -22308,9 +22378,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -22319,7 +22389,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(154), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -22328,12 +22398,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(303), 6, + ACTIONS(299), 6, sym_keyword_and, sym_keyword_or, sym_keyword_between, @@ -22353,7 +22423,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -22371,9 +22441,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -22382,7 +22452,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(155), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -22391,12 +22461,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(285), 6, + ACTIONS(303), 6, sym_keyword_and, sym_keyword_or, sym_keyword_between, @@ -22416,7 +22486,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -22444,11 +22514,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(650), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - STATE(1128), 1, + STATE(1137), 1, aux_sym_list_repeat1, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -22457,7 +22527,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(156), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -22466,7 +22536,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -22479,20 +22549,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [10182] = 6, + [10182] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(652), 1, - anon_sym_DOT, STATE(157), 2, sym_comment, sym_marginalia, - ACTIONS(311), 16, + ACTIONS(55), 17, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_DOT, anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -22506,7 +22575,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(313), 20, + ACTIONS(57), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22527,7 +22596,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10236] = 5, + [10234] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -22535,7 +22604,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(158), 2, sym_comment, sym_marginalia, - ACTIONS(246), 17, + ACTIONS(47), 17, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -22553,7 +22622,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(248), 20, + ACTIONS(49), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22574,68 +22643,149 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10288] = 6, + [10286] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(432), 1, - anon_sym_DOT, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, + ACTIONS(585), 1, + sym_keyword_in, + ACTIONS(587), 1, + sym_keyword_and, + ACTIONS(589), 1, + sym_keyword_or, + ACTIONS(591), 1, + sym_keyword_is, + ACTIONS(593), 1, + sym_keyword_not, + ACTIONS(595), 1, + sym_keyword_between, + STATE(1016), 1, + sym_not_in, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + ACTIONS(652), 2, + anon_sym_RBRACK, + anon_sym_COMMA, STATE(159), 2, sym_comment, sym_marginalia, - ACTIONS(428), 16, - anon_sym_RPAREN, - anon_sym_COMMA, + STATE(320), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(368), 4, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + STATE(315), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(364), 7, anon_sym_EQ, - anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(430), 20, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, + [10374] = 23, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(585), 1, sym_keyword_in, + ACTIONS(597), 1, sym_keyword_and, + ACTIONS(599), 1, sym_keyword_or, + ACTIONS(601), 1, sym_keyword_is, + ACTIONS(603), 1, sym_keyword_not, + ACTIONS(605), 1, sym_keyword_between, + ACTIONS(611), 1, + anon_sym_SLASH, + ACTIONS(621), 1, + anon_sym_PLUS, + ACTIONS(623), 1, + anon_sym_DASH, + ACTIONS(625), 1, + anon_sym_CARET, + ACTIONS(627), 1, + anon_sym_PIPE_PIPE, + STATE(1016), 1, + sym_not_in, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, + ACTIONS(615), 2, + anon_sym_STAR, + anon_sym_PERCENT, + ACTIONS(654), 2, + anon_sym_RPAREN, + anon_sym_COMMA, + STATE(160), 2, + sym_comment, + sym_marginalia, + STATE(304), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, - anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - sym__identifier, - [10342] = 6, + STATE(303), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(613), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [10462] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(654), 1, - sym_natural_number, - STATE(160), 2, + STATE(161), 2, sym_comment, sym_marginalia, - ACTIONS(317), 16, + ACTIONS(250), 17, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, + anon_sym_DOT, anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -22649,7 +22799,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(319), 20, + ACTIONS(252), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22670,19 +22820,20 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10396] = 5, + [10514] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(161), 2, + ACTIONS(51), 1, + anon_sym_DOT, + STATE(162), 2, sym_comment, sym_marginalia, - ACTIONS(254), 17, + ACTIONS(246), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_DOT, anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -22696,7 +22847,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(256), 20, + ACTIONS(248), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22717,17 +22868,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10448] = 6, + [10568] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(55), 1, + ACTIONS(656), 1, anon_sym_DOT, - STATE(162), 2, + STATE(163), 2, sym_comment, sym_marginalia, - ACTIONS(250), 16, + ACTIONS(317), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -22744,7 +22895,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(252), 20, + ACTIONS(319), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22765,84 +22916,20 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10502] = 23, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(585), 1, - sym_keyword_in, - ACTIONS(597), 1, - sym_keyword_and, - ACTIONS(599), 1, - sym_keyword_or, - ACTIONS(601), 1, - sym_keyword_is, - ACTIONS(603), 1, - sym_keyword_not, - ACTIONS(605), 1, - sym_keyword_between, - ACTIONS(611), 1, - anon_sym_SLASH, - ACTIONS(621), 1, - anon_sym_PLUS, - ACTIONS(623), 1, - anon_sym_DASH, - ACTIONS(625), 1, - anon_sym_CARET, - ACTIONS(627), 1, - anon_sym_PIPE_PIPE, - STATE(1031), 1, - sym_not_in, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(615), 2, - anon_sym_STAR, - anon_sym_PERCENT, - ACTIONS(656), 2, - anon_sym_RPAREN, - anon_sym_COMMA, - STATE(163), 2, - sym_comment, - sym_marginalia, - STATE(311), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(619), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(310), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(613), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [10590] = 5, + [10622] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(394), 1, + anon_sym_DOT, STATE(164), 2, sym_comment, sym_marginalia, - ACTIONS(51), 17, + ACTIONS(390), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, - anon_sym_DOT, anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -22856,7 +22943,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(53), 20, + ACTIONS(392), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22877,7 +22964,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10642] = 5, + [10676] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -22885,7 +22972,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(165), 2, sym_comment, sym_marginalia, - ACTIONS(47), 17, + ACTIONS(254), 17, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -22903,7 +22990,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(49), 20, + ACTIONS(256), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -22924,71 +23011,54 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [10694] = 23, + [10728] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(658), 1, + sym_natural_number, + STATE(166), 2, + sym_comment, + sym_marginalia, + ACTIONS(311), 16, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, + anon_sym_PERCENT, anon_sym_CARET, - ACTIONS(377), 1, anon_sym_PIPE_PIPE, - ACTIONS(585), 1, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(313), 20, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_as, + sym_keyword_separator, sym_keyword_in, - ACTIONS(587), 1, sym_keyword_and, - ACTIONS(589), 1, sym_keyword_or, - ACTIONS(591), 1, sym_keyword_is, - ACTIONS(593), 1, sym_keyword_not, - ACTIONS(595), 1, sym_keyword_between, - STATE(1031), 1, - sym_not_in, - ACTIONS(291), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, - anon_sym_STAR, - anon_sym_PERCENT, - ACTIONS(658), 2, - anon_sym_RBRACK, - anon_sym_COMMA, - STATE(166), 2, - sym_comment, - sym_marginalia, - STATE(275), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(369), 4, + sym_keyword_similar, + anon_sym_SLASH, anon_sym_LT, anon_sym_GT, + anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(365), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, + sym__identifier, [10782] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, @@ -22997,7 +23067,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(167), 2, sym_comment, sym_marginalia, - ACTIONS(55), 17, + ACTIONS(51), 17, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23015,7 +23085,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(57), 20, + ACTIONS(53), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23044,7 +23114,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(168), 2, sym_comment, sym_marginalia, - ACTIONS(449), 16, + ACTIONS(335), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23061,7 +23131,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(451), 20, + ACTIONS(337), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23087,58 +23157,58 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(597), 1, + ACTIONS(587), 1, sym_keyword_and, - ACTIONS(599), 1, + ACTIONS(589), 1, sym_keyword_or, - ACTIONS(601), 1, + ACTIONS(591), 1, sym_keyword_is, - ACTIONS(603), 1, + ACTIONS(593), 1, sym_keyword_not, - ACTIONS(605), 1, + ACTIONS(595), 1, sym_keyword_between, - ACTIONS(611), 1, - anon_sym_SLASH, - ACTIONS(621), 1, - anon_sym_PLUS, - ACTIONS(623), 1, - anon_sym_DASH, - ACTIONS(625), 1, - anon_sym_CARET, - ACTIONS(627), 1, - anon_sym_PIPE_PIPE, ACTIONS(660), 1, - anon_sym_RPAREN, - STATE(1031), 1, + sym_keyword_then, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(615), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(169), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(619), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(613), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -23151,58 +23221,58 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(587), 1, + ACTIONS(597), 1, sym_keyword_and, - ACTIONS(589), 1, + ACTIONS(599), 1, sym_keyword_or, - ACTIONS(591), 1, + ACTIONS(601), 1, sym_keyword_is, - ACTIONS(593), 1, + ACTIONS(603), 1, sym_keyword_not, - ACTIONS(595), 1, + ACTIONS(605), 1, sym_keyword_between, + ACTIONS(611), 1, + anon_sym_SLASH, + ACTIONS(621), 1, + anon_sym_PLUS, + ACTIONS(623), 1, + anon_sym_DASH, + ACTIONS(625), 1, + anon_sym_CARET, + ACTIONS(627), 1, + anon_sym_PIPE_PIPE, ACTIONS(662), 1, - sym_keyword_then, - STATE(1031), 1, + anon_sym_RPAREN, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(170), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(613), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -23215,7 +23285,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(347), 1, anon_sym_RPAREN, @@ -23241,9 +23311,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -23252,7 +23322,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(171), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -23261,7 +23331,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -23282,7 +23352,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(172), 2, sym_comment, sym_marginalia, - ACTIONS(339), 16, + ACTIONS(343), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23299,7 +23369,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(341), 20, + ACTIONS(345), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23374,7 +23444,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(174), 2, sym_comment, sym_marginalia, - ACTIONS(335), 16, + ACTIONS(323), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23391,7 +23461,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(337), 20, + ACTIONS(325), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23420,7 +23490,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(175), 2, sym_comment, sym_marginalia, - ACTIONS(437), 16, + ACTIONS(457), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23437,7 +23507,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(439), 20, + ACTIONS(459), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23458,63 +23528,111 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11350] = 23, + [11350] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(585), 1, + ACTIONS(664), 1, + sym_keyword_limit, + STATE(1567), 1, + sym_limit, + STATE(176), 2, + sym_comment, + sym_marginalia, + ACTIONS(335), 16, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(337), 18, + sym_keyword_order, + sym_keyword_as, sym_keyword_in, - ACTIONS(597), 1, sym_keyword_and, - ACTIONS(599), 1, sym_keyword_or, - ACTIONS(601), 1, sym_keyword_is, - ACTIONS(603), 1, sym_keyword_not, - ACTIONS(605), 1, sym_keyword_between, - ACTIONS(611), 1, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, anon_sym_SLASH, - ACTIONS(621), 1, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + sym__identifier, + [11405] = 23, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(262), 1, + sym_keyword_in, + ACTIONS(264), 1, + sym_keyword_is, + ACTIONS(269), 1, + anon_sym_SLASH, + ACTIONS(277), 1, anon_sym_PLUS, - ACTIONS(623), 1, + ACTIONS(279), 1, anon_sym_DASH, - ACTIONS(625), 1, + ACTIONS(281), 1, anon_sym_CARET, - ACTIONS(627), 1, + ACTIONS(283), 1, anon_sym_PIPE_PIPE, - ACTIONS(664), 1, - anon_sym_RPAREN, - STATE(1031), 1, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(297), 1, + sym_keyword_and, + ACTIONS(351), 1, + sym_keyword_or, + ACTIONS(593), 1, + sym_keyword_not, + ACTIONS(595), 1, + sym_keyword_between, + ACTIONS(617), 1, + anon_sym_COLON_COLON, + STATE(1118), 1, sym_not_in, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(615), 2, + ACTIONS(273), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(176), 2, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(177), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(297), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(619), 4, + ACTIONS(275), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(294), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(613), 7, + ACTIONS(271), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -23522,15 +23640,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [11437] = 5, + [11492] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(177), 2, + STATE(178), 2, sym_comment, sym_marginalia, - ACTIONS(445), 16, + ACTIONS(481), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23547,7 +23665,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(447), 20, + ACTIONS(483), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23568,15 +23686,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11488] = 5, + [11543] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(178), 2, + STATE(179), 2, sym_comment, sym_marginalia, - ACTIONS(457), 16, + ACTIONS(485), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23593,7 +23711,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(459), 20, + ACTIONS(487), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23614,15 +23732,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11539] = 5, + [11594] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(179), 2, + STATE(180), 2, sym_comment, sym_marginalia, - ACTIONS(461), 16, + ACTIONS(441), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23639,7 +23757,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(463), 20, + ACTIONS(443), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23660,15 +23778,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11590] = 5, + [11645] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(180), 2, + STATE(181), 2, sym_comment, sym_marginalia, - ACTIONS(465), 16, + ACTIONS(449), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23685,7 +23803,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(467), 20, + ACTIONS(451), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23706,19 +23824,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11641] = 7, + [11696] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(666), 1, - sym_keyword_limit, - STATE(1349), 1, - sym_limit, - STATE(181), 2, + STATE(182), 2, sym_comment, sym_marginalia, - ACTIONS(331), 16, + ACTIONS(453), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23735,9 +23849,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(333), 18, + ACTIONS(455), 20, sym_keyword_order, + sym_keyword_limit, sym_keyword_as, + sym_keyword_separator, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -23754,99 +23870,71 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11696] = 5, + [11747] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(182), 2, - sym_comment, - sym_marginalia, - ACTIONS(250), 16, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_EQ, - anon_sym_STAR, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(252), 20, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(585), 1, sym_keyword_in, + ACTIONS(597), 1, sym_keyword_and, + ACTIONS(599), 1, sym_keyword_or, + ACTIONS(601), 1, sym_keyword_is, + ACTIONS(603), 1, sym_keyword_not, + ACTIONS(605), 1, sym_keyword_between, + ACTIONS(611), 1, + anon_sym_SLASH, + ACTIONS(621), 1, + anon_sym_PLUS, + ACTIONS(623), 1, + anon_sym_DASH, + ACTIONS(625), 1, + anon_sym_CARET, + ACTIONS(627), 1, + anon_sym_PIPE_PIPE, + ACTIONS(666), 1, + anon_sym_RPAREN, + STATE(1016), 1, + sym_not_in, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, + ACTIONS(615), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(183), 2, + sym_comment, + sym_marginalia, + STATE(304), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, - anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - sym__identifier, - [11747] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(183), 2, - sym_comment, - sym_marginalia, - ACTIONS(331), 16, - anon_sym_RPAREN, - anon_sym_COMMA, + STATE(303), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(613), 7, anon_sym_EQ, - anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(333), 20, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, - sym_keyword_in, - sym_keyword_and, - sym_keyword_or, - sym_keyword_is, - sym_keyword_not, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - sym__identifier, - [11798] = 5, + [11834] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -23854,7 +23942,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(184), 2, sym_comment, sym_marginalia, - ACTIONS(343), 16, + ACTIONS(246), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -23871,7 +23959,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(345), 20, + ACTIONS(248), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -23892,111 +23980,143 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [11849] = 5, + [11885] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(185), 2, - sym_comment, - sym_marginalia, - ACTIONS(317), 16, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_EQ, - anon_sym_STAR, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(355), 1, anon_sym_CARET, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(319), 20, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, + ACTIONS(585), 1, sym_keyword_in, + ACTIONS(587), 1, sym_keyword_and, + ACTIONS(589), 1, sym_keyword_or, + ACTIONS(591), 1, sym_keyword_is, + ACTIONS(593), 1, sym_keyword_not, + ACTIONS(595), 1, sym_keyword_between, + ACTIONS(668), 1, + sym_keyword_as, + STATE(1016), 1, + sym_not_in, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(185), 2, + sym_comment, + sym_marginalia, + STATE(320), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, - anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - sym__identifier, - [11900] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(186), 2, - sym_comment, - sym_marginalia, - ACTIONS(453), 16, - anon_sym_RPAREN, - anon_sym_COMMA, + STATE(315), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(364), 7, anon_sym_EQ, - anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(455), 20, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, + [11972] = 23, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(295), 1, + sym_keyword_similar, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, + anon_sym_SLASH, + ACTIONS(370), 1, + anon_sym_PLUS, + ACTIONS(372), 1, + anon_sym_DASH, + ACTIONS(374), 1, + anon_sym_PIPE_PIPE, + ACTIONS(585), 1, sym_keyword_in, + ACTIONS(587), 1, sym_keyword_and, + ACTIONS(589), 1, sym_keyword_or, + ACTIONS(591), 1, sym_keyword_is, + ACTIONS(593), 1, sym_keyword_not, + ACTIONS(595), 1, sym_keyword_between, + ACTIONS(670), 1, + sym_keyword_then, + STATE(1016), 1, + sym_not_in, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, + ACTIONS(366), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(186), 2, + sym_comment, + sym_marginalia, + STATE(320), 3, + sym_is_not, + sym_distinct_from, + sym_not_distinct_from, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, - anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - sym__identifier, - [11951] = 7, + STATE(315), 4, + sym_keyword_like, + sym_not_like, + sym_similar_to, + sym_not_similar_to, + ACTIONS(364), 7, + anon_sym_EQ, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [12059] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(666), 1, - sym_keyword_limit, - STATE(1367), 1, - sym_limit, STATE(187), 2, sym_comment, sym_marginalia, - ACTIONS(331), 16, + ACTIONS(339), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24013,9 +24133,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(333), 18, + ACTIONS(341), 20, sym_keyword_order, + sym_keyword_limit, sym_keyword_as, + sym_keyword_separator, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -24032,15 +24154,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12006] = 5, + [12110] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(664), 1, + sym_keyword_limit, + STATE(1514), 1, + sym_limit, STATE(188), 2, sym_comment, sym_marginalia, - ACTIONS(469), 16, + ACTIONS(335), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24057,11 +24183,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(471), 20, + ACTIONS(337), 18, sym_keyword_order, - sym_keyword_limit, sym_keyword_as, - sym_keyword_separator, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -24078,7 +24202,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12057] = 5, + [12165] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -24086,7 +24210,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(189), 2, sym_comment, sym_marginalia, - ACTIONS(323), 16, + ACTIONS(311), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24103,7 +24227,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(325), 20, + ACTIONS(313), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24124,7 +24248,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12108] = 5, + [12216] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -24132,7 +24256,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(190), 2, sym_comment, sym_marginalia, - ACTIONS(242), 16, + ACTIONS(477), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24149,7 +24273,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(244), 20, + ACTIONS(479), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24170,15 +24294,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12159] = 5, + [12267] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(664), 1, + sym_keyword_limit, + STATE(1390), 1, + sym_limit, STATE(191), 2, sym_comment, sym_marginalia, - ACTIONS(258), 16, + ACTIONS(335), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24195,11 +24323,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(260), 20, + ACTIONS(337), 18, sym_keyword_order, - sym_keyword_limit, sym_keyword_as, - sym_keyword_separator, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -24216,12 +24342,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12210] = 23, + [12322] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -24245,11 +24371,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(668), 1, + ACTIONS(672), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, @@ -24258,7 +24384,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(192), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -24267,7 +24393,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -24280,147 +24406,199 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [12297] = 23, + [12409] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, + STATE(193), 2, + sym_comment, + sym_marginalia, + ACTIONS(489), 16, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, + anon_sym_PERCENT, anon_sym_CARET, - ACTIONS(377), 1, anon_sym_PIPE_PIPE, - ACTIONS(585), 1, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(491), 20, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_as, + sym_keyword_separator, sym_keyword_in, - ACTIONS(587), 1, sym_keyword_and, - ACTIONS(589), 1, sym_keyword_or, - ACTIONS(591), 1, sym_keyword_is, - ACTIONS(593), 1, sym_keyword_not, - ACTIONS(595), 1, sym_keyword_between, - ACTIONS(670), 1, - sym_keyword_as, - STATE(1031), 1, - sym_not_in, - ACTIONS(291), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(193), 2, - sym_comment, - sym_marginalia, - STATE(275), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(369), 4, + sym_keyword_similar, + anon_sym_SLASH, anon_sym_LT, anon_sym_GT, + anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(365), 7, + sym__identifier, + [12460] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(194), 2, + sym_comment, + sym_marginalia, + ACTIONS(331), 16, + anon_sym_RPAREN, + anon_sym_COMMA, anon_sym_EQ, + anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [12384] = 23, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(585), 1, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(333), 20, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_as, + sym_keyword_separator, sym_keyword_in, - ACTIONS(597), 1, sym_keyword_and, - ACTIONS(599), 1, sym_keyword_or, - ACTIONS(601), 1, sym_keyword_is, - ACTIONS(603), 1, sym_keyword_not, - ACTIONS(605), 1, sym_keyword_between, - ACTIONS(611), 1, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, anon_sym_SLASH, - ACTIONS(621), 1, - anon_sym_PLUS, - ACTIONS(623), 1, + anon_sym_LT, + anon_sym_GT, anon_sym_DASH, - ACTIONS(625), 1, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + sym__identifier, + [12511] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(195), 2, + sym_comment, + sym_marginalia, + ACTIONS(242), 16, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, anon_sym_CARET, - ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(672), 1, - anon_sym_RPAREN, - STATE(1031), 1, - sym_not_in, - ACTIONS(291), 2, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(244), 20, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_as, + sym_keyword_separator, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_between, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(615), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(194), 2, - sym_comment, - sym_marginalia, - STATE(311), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(619), 4, + sym_keyword_similar, + anon_sym_SLASH, anon_sym_LT, anon_sym_GT, + anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(613), 7, + sym__identifier, + [12562] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(196), 2, + sym_comment, + sym_marginalia, + ACTIONS(445), 16, + anon_sym_RPAREN, + anon_sym_COMMA, anon_sym_EQ, + anon_sym_STAR, anon_sym_LT_EQ, anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, anon_sym_BANG_EQ, anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [12471] = 7, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(447), 20, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_as, + sym_keyword_separator, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + sym__identifier, + [12613] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(666), 1, - sym_keyword_limit, - STATE(1386), 1, - sym_limit, - STATE(195), 2, + STATE(197), 2, sym_comment, sym_marginalia, - ACTIONS(331), 16, + ACTIONS(258), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24437,9 +24615,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(333), 18, + ACTIONS(260), 20, sym_keyword_order, + sym_keyword_limit, sym_keyword_as, + sym_keyword_separator, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -24456,12 +24636,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12526] = 23, + [12664] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -24487,18 +24667,18 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(674), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(196), 2, + STATE(198), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -24507,7 +24687,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -24520,15 +24700,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [12613] = 5, + [12751] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(197), 2, + STATE(199), 2, sym_comment, sym_marginalia, - ACTIONS(473), 16, + ACTIONS(461), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24545,7 +24725,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(475), 20, + ACTIONS(463), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24566,15 +24746,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12664] = 5, + [12802] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(198), 2, + STATE(200), 2, sym_comment, sym_marginalia, - ACTIONS(477), 16, + ACTIONS(465), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24591,7 +24771,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(479), 20, + ACTIONS(467), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24612,15 +24792,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12715] = 5, + [12853] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(199), 2, + STATE(201), 2, sym_comment, sym_marginalia, - ACTIONS(481), 16, + ACTIONS(469), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24637,7 +24817,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(483), 20, + ACTIONS(471), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24658,15 +24838,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12766] = 5, + [12904] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(200), 2, + STATE(202), 2, sym_comment, sym_marginalia, - ACTIONS(485), 16, + ACTIONS(473), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24683,7 +24863,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(487), 20, + ACTIONS(475), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24704,15 +24884,15 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12817] = 5, + [12955] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(201), 2, + STATE(203), 2, sym_comment, sym_marginalia, - ACTIONS(489), 16, + ACTIONS(437), 16, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_EQ, @@ -24729,7 +24909,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_POUND_GT_GT, anon_sym_DQUOTE, anon_sym_BQUOTE, - ACTIONS(491), 20, + ACTIONS(439), 20, sym_keyword_order, sym_keyword_limit, sym_keyword_as, @@ -24750,12 +24930,60 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_GT, anon_sym_POUND_GT, sym__identifier, - [12868] = 23, + [13006] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(664), 1, + sym_keyword_limit, + STATE(1451), 1, + sym_limit, + STATE(204), 2, + sym_comment, + sym_marginalia, + ACTIONS(335), 16, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(337), 18, + sym_keyword_order, + sym_keyword_as, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + sym__identifier, + [13061] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -24781,18 +25009,18 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(676), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(202), 2, + STATE(205), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -24801,7 +25029,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -24814,175 +25042,63 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [12955] = 23, + [13148] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, - anon_sym_SLASH, - ACTIONS(371), 1, - anon_sym_PLUS, - ACTIONS(373), 1, - anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, - anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, - ACTIONS(587), 1, - sym_keyword_and, - ACTIONS(589), 1, - sym_keyword_or, - ACTIONS(591), 1, - sym_keyword_is, - ACTIONS(593), 1, - sym_keyword_not, - ACTIONS(595), 1, - sym_keyword_between, - ACTIONS(678), 1, - sym_keyword_then, - STATE(1031), 1, - sym_not_in, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - ACTIONS(367), 2, - anon_sym_STAR, - anon_sym_PERCENT, - STATE(203), 2, - sym_comment, - sym_marginalia, - STATE(275), 3, - sym_is_not, - sym_distinct_from, - sym_not_distinct_from, - ACTIONS(369), 4, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - STATE(274), 4, - sym_keyword_like, - sym_not_like, - sym_similar_to, - sym_not_similar_to, - ACTIONS(365), 7, - anon_sym_EQ, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [13042] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(666), 1, - sym_keyword_limit, - STATE(1600), 1, - sym_limit, - STATE(204), 2, - sym_comment, - sym_marginalia, - ACTIONS(331), 16, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_EQ, - anon_sym_STAR, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(333), 18, - sym_keyword_order, - sym_keyword_as, - sym_keyword_in, + ACTIONS(597), 1, sym_keyword_and, + ACTIONS(599), 1, sym_keyword_or, + ACTIONS(601), 1, sym_keyword_is, + ACTIONS(603), 1, sym_keyword_not, + ACTIONS(605), 1, sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - sym__identifier, - [13097] = 23, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(262), 1, - sym_keyword_in, - ACTIONS(264), 1, - sym_keyword_is, - ACTIONS(269), 1, + ACTIONS(611), 1, anon_sym_SLASH, - ACTIONS(277), 1, + ACTIONS(621), 1, anon_sym_PLUS, - ACTIONS(279), 1, + ACTIONS(623), 1, anon_sym_DASH, - ACTIONS(281), 1, + ACTIONS(625), 1, anon_sym_CARET, - ACTIONS(283), 1, + ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(293), 1, - sym_keyword_similar, - ACTIONS(301), 1, - sym_keyword_and, - ACTIONS(351), 1, - sym_keyword_or, - ACTIONS(593), 1, - sym_keyword_not, - ACTIONS(595), 1, - sym_keyword_between, - ACTIONS(617), 1, - anon_sym_COLON_COLON, - STATE(1109), 1, + ACTIONS(678), 1, + anon_sym_RPAREN, + STATE(1016), 1, sym_not_in, - ACTIONS(273), 2, - anon_sym_STAR, - anon_sym_PERCENT, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - STATE(205), 2, + ACTIONS(615), 2, + anon_sym_STAR, + anon_sym_PERCENT, + STATE(206), 2, sym_comment, sym_marginalia, - STATE(285), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(275), 4, + ACTIONS(619), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(284), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(271), 7, + ACTIONS(613), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -24990,12 +25106,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [13184] = 23, + [13235] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -25019,20 +25135,20 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(680), 1, + ACTIONS(641), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(206), 2, + STATE(207), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -25041,7 +25157,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -25054,12 +25170,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [13271] = 23, + [13322] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -25083,20 +25199,20 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_CARET, ACTIONS(627), 1, anon_sym_PIPE_PIPE, - ACTIONS(635), 1, + ACTIONS(680), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(207), 2, + STATE(208), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -25105,7 +25221,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -25118,12 +25234,12 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [13358] = 23, + [13409] = 23, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, ACTIONS(585), 1, sym_keyword_in, @@ -25149,18 +25265,18 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_PIPE_PIPE, ACTIONS(682), 1, anon_sym_RPAREN, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, ACTIONS(615), 2, anon_sym_STAR, anon_sym_PERCENT, - STATE(208), 2, + STATE(209), 2, sym_comment, sym_marginalia, - STATE(311), 3, + STATE(304), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, @@ -25169,7 +25285,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(310), 4, + STATE(303), 4, sym_keyword_like, sym_not_like, sym_similar_to, @@ -25182,68 +25298,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [13445] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(209), 2, - sym_comment, - sym_marginalia, - ACTIONS(441), 16, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_EQ, - anon_sym_STAR, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(443), 20, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_as, - sym_keyword_separator, - sym_keyword_in, - sym_keyword_and, - sym_keyword_or, - sym_keyword_is, - sym_keyword_not, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - sym__identifier, [13496] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25257,32 +25327,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(684), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(210), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25295,17 +25365,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25319,32 +25389,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(686), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(211), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25357,17 +25427,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25381,32 +25451,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(688), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(212), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25419,17 +25489,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25443,32 +25513,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(690), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(213), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25481,17 +25551,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25505,32 +25575,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(692), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(214), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25543,17 +25613,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25567,32 +25637,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(694), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(215), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25605,17 +25675,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25629,32 +25699,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(696), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(216), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25667,17 +25737,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(293), 1, + ACTIONS(295), 1, sym_keyword_similar, - ACTIONS(363), 1, + ACTIONS(355), 1, + anon_sym_CARET, + ACTIONS(362), 1, anon_sym_SLASH, - ACTIONS(371), 1, + ACTIONS(370), 1, anon_sym_PLUS, - ACTIONS(373), 1, + ACTIONS(372), 1, anon_sym_DASH, - ACTIONS(375), 1, - anon_sym_CARET, - ACTIONS(377), 1, + ACTIONS(374), 1, anon_sym_PIPE_PIPE, ACTIONS(585), 1, sym_keyword_in, @@ -25691,32 +25761,32 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_between, ACTIONS(698), 1, sym_keyword_and, - STATE(1031), 1, + STATE(1016), 1, sym_not_in, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - ACTIONS(367), 2, + ACTIONS(366), 2, anon_sym_STAR, anon_sym_PERCENT, STATE(217), 2, sym_comment, sym_marginalia, - STATE(275), 3, + STATE(320), 3, sym_is_not, sym_distinct_from, sym_not_distinct_from, - ACTIONS(369), 4, + ACTIONS(368), 4, anon_sym_LT, anon_sym_GT, anon_sym_DASH_GT, anon_sym_POUND_GT, - STATE(274), 4, + STATE(315), 4, sym_keyword_like, sym_not_like, sym_similar_to, sym_not_similar_to, - ACTIONS(365), 7, + ACTIONS(364), 7, anon_sym_EQ, anon_sym_LT_EQ, anon_sym_GT_EQ, @@ -25729,68 +25799,68 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(700), 1, - sym_keyword_distinct, + sym_keyword_select, ACTIONS(702), 1, anon_sym_LPAREN, ACTIONS(704), 1, - anon_sym_STAR, - STATE(24), 1, + anon_sym_RPAREN, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(107), 1, - sym_expression, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(753), 1, - sym_all_fields, - STATE(1036), 1, - sym_term, - STATE(1479), 1, - sym_select_expression, - STATE(1488), 1, + STATE(156), 1, + sym_expression, + STATE(998), 1, + sym_select_statement, + STATE(1327), 1, + sym_select, + STATE(1359), 1, sym_object_reference, + STATE(1553), 1, + sym_dml_read_stmt, STATE(218), 2, sym_comment, sym_marginalia, @@ -25799,68 +25869,68 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, ACTIONS(706), 1, - sym_keyword_select, + sym_keyword_distinct, ACTIONS(708), 1, - anon_sym_RPAREN, - STATE(24), 1, + anon_sym_STAR, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(98), 1, + sym_expression, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(137), 1, - sym_expression, - STATE(1097), 1, - sym_select_statement, - STATE(1320), 1, - sym_select, - STATE(1329), 1, - sym_object_reference, + STATE(769), 1, + sym_all_fields, + STATE(1049), 1, + sym_term, STATE(1335), 1, - sym_dml_read_stmt, + sym_object_reference, + STATE(1343), 1, + sym_select_expression, STATE(219), 2, sym_comment, sym_marginalia, @@ -25869,363 +25939,269 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - ACTIONS(706), 1, - sym_keyword_select, - ACTIONS(710), 1, - anon_sym_RPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, - sym_binary_expression, - STATE(128), 1, - sym_between_expression, - STATE(132), 1, - sym_literal, - STATE(156), 1, - sym_expression, - STATE(1097), 1, - sym_select_statement, - STATE(1320), 1, - sym_select, - STATE(1329), 1, - sym_object_reference, - STATE(1538), 1, - sym_dml_read_stmt, - STATE(220), 2, - sym_comment, - sym_marginalia, - [14480] = 34, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, - sym_keyword_null, ACTIONS(537), 1, - sym_keyword_true, - ACTIONS(539), 1, - sym_keyword_false, - ACTIONS(545), 1, anon_sym_RPAREN, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, + ACTIONS(700), 1, + sym_keyword_select, ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(706), 1, - sym_keyword_select, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(145), 1, + STATE(153), 1, sym_expression, - STATE(1097), 1, + STATE(998), 1, sym_select_statement, - STATE(1320), 1, + STATE(1327), 1, sym_select, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, - STATE(1486), 1, + STATE(1499), 1, sym_dml_read_stmt, - STATE(221), 2, + STATE(220), 2, sym_comment, sym_marginalia, - [14584] = 34, + [14480] = 34, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, + ACTIONS(708), 1, anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(714), 1, + ACTIONS(712), 1, sym_keyword_distinct, - ACTIONS(716), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(722), 1, + ACTIONS(720), 1, anon_sym_LPAREN, - ACTIONS(724), 1, + ACTIONS(722), 1, anon_sym_RPAREN, - ACTIONS(726), 1, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(738), 1, anon_sym_BQUOTE, - STATE(68), 1, + STATE(69), 1, sym_expression, - STATE(157), 1, - sym_integer, - STATE(159), 1, - sym_identifier, STATE(162), 1, sym__double_quote_string, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, + sym_literal_string, STATE(178), 1, - sym_binary_expression, + sym_parameter, STATE(179), 1, - sym_between_expression, + sym_qualified_field, STATE(180), 1, - sym_literal, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, + sym_literal, STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, sym_decimal_number, - STATE(637), 1, + STATE(655), 1, sym_term, - STATE(753), 1, + STATE(769), 1, sym_all_fields, - STATE(1456), 1, + STATE(1468), 1, sym_object_reference, - STATE(222), 2, + STATE(221), 2, sym_comment, sym_marginalia, - [14688] = 33, + [14584] = 34, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, - anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, + ACTIONS(700), 1, + sym_keyword_select, + ACTIONS(702), 1, + anon_sym_LPAREN, ACTIONS(740), 1, - anon_sym_BQUOTE, - ACTIONS(742), 1, - sym_keyword_distinct, - STATE(68), 1, - sym_expression, - STATE(157), 1, + anon_sym_RPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(753), 1, - sym_all_fields, - STATE(930), 1, - sym_term, - STATE(1456), 1, + STATE(137), 1, + sym_expression, + STATE(998), 1, + sym_select_statement, + STATE(1327), 1, + sym_select, + STATE(1359), 1, sym_object_reference, - STATE(223), 2, + STATE(1478), 1, + sym_dml_read_stmt, + STATE(222), 2, sym_comment, sym_marginalia, - [14789] = 33, + [14688] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, - anon_sym_STAR, - ACTIONS(712), 1, - sym__identifier, - ACTIONS(716), 1, - sym_keyword_null, - ACTIONS(718), 1, - sym_keyword_true, - ACTIONS(720), 1, - sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, - anon_sym_DOT, - ACTIONS(728), 1, - anon_sym_QMARK, - ACTIONS(730), 1, - anon_sym_DOLLAR, - ACTIONS(732), 1, - anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, - anon_sym_SQUOTE, - ACTIONS(738), 1, - sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - ACTIONS(742), 1, - sym_keyword_distinct, - STATE(68), 1, - sym_expression, - STATE(157), 1, - sym_integer, - STATE(159), 1, - sym_identifier, - STATE(162), 1, - sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, - STATE(178), 1, - sym_binary_expression, - STATE(179), 1, - sym_between_expression, - STATE(180), 1, - sym_literal, - STATE(181), 1, - sym_literal_string, - STATE(182), 1, - sym__single_quote_string, - STATE(184), 1, - sym_decimal_number, - STATE(753), 1, - sym_all_fields, - STATE(930), 1, - sym_term, - STATE(1456), 1, - sym_object_reference, - STATE(224), 2, + STATE(864), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + STATE(223), 2, sym_comment, sym_marginalia, - [14890] = 5, + ACTIONS(491), 6, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + ACTIONS(489), 22, + sym_keyword_when, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [14737] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(225), 2, + STATE(224), 2, sym_comment, sym_marginalia, - ACTIONS(459), 6, + ACTIONS(491), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(457), 24, + ACTIONS(489), 24, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -26250,90 +26226,95 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [14935] = 33, + [14782] = 33, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, - anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - ACTIONS(742), 1, - sym_keyword_distinct, - STATE(68), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + ACTIONS(708), 1, + anon_sym_STAR, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, - sym_identifier, - STATE(162), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(98), 1, + sym_expression, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(184), 1, - sym_decimal_number, - STATE(187), 1, - sym_literal_string, - STATE(753), 1, + STATE(769), 1, sym_all_fields, - STATE(930), 1, + STATE(1049), 1, sym_term, - STATE(1456), 1, + STATE(1335), 1, sym_object_reference, - STATE(226), 2, + STATE(1604), 1, + sym_select_expression, + STATE(225), 2, sym_comment, sym_marginalia, - [15036] = 5, + [14883] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(227), 2, + STATE(872), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + STATE(226), 2, sym_comment, sym_marginalia, - ACTIONS(467), 6, + ACTIONS(491), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(465), 24, + ACTIONS(489), 22, + sym_keyword_when, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -26343,11 +26324,8 @@ static const uint16_t ts_small_parse_table[] = { aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, - anon_sym_RPAREN, - anon_sym_COMMA, anon_sym_EQ, anon_sym_STAR, - anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, @@ -26358,27 +26336,22 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [15081] = 7, + [14932] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(849), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - STATE(228), 2, + STATE(227), 2, sym_comment, sym_marginalia, - ACTIONS(471), 6, + ACTIONS(443), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(469), 22, - sym_keyword_when, + ACTIONS(441), 24, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -26388,8 +26361,11 @@ static const uint16_t ts_small_parse_table[] = { aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, + anon_sym_RPAREN, + anon_sym_COMMA, anon_sym_EQ, anon_sym_STAR, + anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, @@ -26400,137 +26376,90 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [15130] = 7, + [14977] = 33, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(831), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - STATE(229), 2, - sym_comment, - sym_marginalia, - ACTIONS(471), 6, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, - anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - ACTIONS(469), 22, - sym_keyword_when, - sym_keyword_in, - sym_keyword_and, - sym_keyword_or, - sym_keyword_is, - sym_keyword_not, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_EQ, + ACTIONS(708), 1, anon_sym_STAR, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, - [15179] = 33, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - ACTIONS(704), 1, - anon_sym_STAR, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(107), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + ACTIONS(742), 1, + sym_keyword_distinct, + STATE(69), 1, sym_expression, - STATE(108), 1, - sym_identifier, - STATE(111), 1, + STATE(162), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(753), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(769), 1, sym_all_fields, - STATE(1036), 1, + STATE(943), 1, sym_term, - STATE(1348), 1, - sym_select_expression, - STATE(1488), 1, + STATE(1468), 1, sym_object_reference, - STATE(230), 2, + STATE(228), 2, sym_comment, sym_marginalia, - [15280] = 7, + [15078] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(885), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - STATE(231), 2, + STATE(229), 2, sym_comment, sym_marginalia, - ACTIONS(471), 6, + ACTIONS(455), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(469), 22, - sym_keyword_when, + ACTIONS(453), 24, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -26540,8 +26469,11 @@ static const uint16_t ts_small_parse_table[] = { aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, + anon_sym_RPAREN, + anon_sym_COMMA, anon_sym_EQ, anon_sym_STAR, + anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, @@ -26552,90 +26484,231 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [15329] = 33, + [15123] = 33, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, + ACTIONS(708), 1, anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(722), 1, + ACTIONS(720), 1, anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(738), 1, anon_sym_BQUOTE, ACTIONS(742), 1, sym_keyword_distinct, - STATE(68), 1, + STATE(69), 1, sym_expression, - STATE(157), 1, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(159), 1, + STATE(164), 1, sym_identifier, + STATE(178), 1, + sym_parameter, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, + STATE(182), 1, + sym_literal, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(188), 1, + sym_literal_string, + STATE(769), 1, + sym_all_fields, + STATE(943), 1, + sym_term, + STATE(1468), 1, + sym_object_reference, + STATE(230), 2, + sym_comment, + sym_marginalia, + [15224] = 33, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(708), 1, + anon_sym_STAR, + ACTIONS(710), 1, + sym__identifier, + ACTIONS(714), 1, + sym_keyword_null, + ACTIONS(716), 1, + sym_keyword_true, + ACTIONS(718), 1, + sym_keyword_false, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, + anon_sym_DOT, + ACTIONS(726), 1, + anon_sym_QMARK, + ACTIONS(728), 1, + anon_sym_DOLLAR, + ACTIONS(730), 1, + anon_sym_DASH, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, + anon_sym_SQUOTE, + ACTIONS(736), 1, + sym_natural_number, + ACTIONS(738), 1, + anon_sym_BQUOTE, + ACTIONS(742), 1, + sym_keyword_distinct, + STATE(69), 1, + sym_expression, STATE(162), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, STATE(178), 1, - sym_binary_expression, + sym_parameter, STATE(179), 1, - sym_between_expression, + sym_qualified_field, STATE(180), 1, - sym_literal, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, STATE(182), 1, - sym__single_quote_string, + sym_literal, STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, sym_decimal_number, - STATE(195), 1, + STATE(204), 1, + sym_literal_string, + STATE(769), 1, + sym_all_fields, + STATE(943), 1, + sym_term, + STATE(1468), 1, + sym_object_reference, + STATE(231), 2, + sym_comment, + sym_marginalia, + [15325] = 33, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(708), 1, + anon_sym_STAR, + ACTIONS(710), 1, + sym__identifier, + ACTIONS(714), 1, + sym_keyword_null, + ACTIONS(716), 1, + sym_keyword_true, + ACTIONS(718), 1, + sym_keyword_false, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, + anon_sym_DOT, + ACTIONS(726), 1, + anon_sym_QMARK, + ACTIONS(728), 1, + anon_sym_DOLLAR, + ACTIONS(730), 1, + anon_sym_DASH, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, + anon_sym_SQUOTE, + ACTIONS(736), 1, + sym_natural_number, + ACTIONS(738), 1, + anon_sym_BQUOTE, + ACTIONS(742), 1, + sym_keyword_distinct, + STATE(69), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, + STATE(176), 1, sym_literal_string, - STATE(753), 1, + STATE(178), 1, + sym_parameter, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, + STATE(182), 1, + sym_literal, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(769), 1, sym_all_fields, - STATE(930), 1, + STATE(943), 1, sym_term, - STATE(1456), 1, + STATE(1468), 1, sym_object_reference, STATE(232), 2, sym_comment, sym_marginalia, - [15430] = 5, + [15426] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + STATE(857), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, STATE(233), 2, sym_comment, sym_marginalia, - ACTIONS(471), 6, + ACTIONS(491), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(469), 24, + ACTIONS(489), 22, + sym_keyword_when, sym_keyword_in, sym_keyword_and, sym_keyword_or, @@ -26645,11 +26718,8 @@ static const uint16_t ts_small_parse_table[] = { aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, sym_keyword_similar, - anon_sym_RPAREN, - anon_sym_COMMA, anon_sym_EQ, anon_sym_STAR, - anon_sym_COLON_COLON, anon_sym_LT_EQ, anon_sym_GT_EQ, anon_sym_PLUS, @@ -26665,65 +26735,65 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, + ACTIONS(708), 1, anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(722), 1, + ACTIONS(720), 1, anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(738), 1, anon_sym_BQUOTE, ACTIONS(742), 1, sym_keyword_distinct, - STATE(68), 1, + STATE(69), 1, sym_expression, - STATE(157), 1, - sym_integer, - STATE(159), 1, - sym_identifier, STATE(162), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, STATE(178), 1, - sym_binary_expression, + sym_parameter, STATE(179), 1, - sym_between_expression, + sym_qualified_field, STATE(180), 1, - sym_literal, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, STATE(182), 1, - sym__single_quote_string, + sym_literal, STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, sym_decimal_number, - STATE(204), 1, + STATE(191), 1, sym_literal_string, - STATE(753), 1, + STATE(769), 1, sym_all_fields, - STATE(930), 1, + STATE(943), 1, sym_term, - STATE(1456), 1, + STATE(1468), 1, sym_object_reference, STATE(234), 2, sym_comment, @@ -26733,63 +26803,63 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(704), 1, + ACTIONS(708), 1, anon_sym_STAR, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(107), 1, + STATE(98), 1, sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(753), 1, + STATE(769), 1, sym_all_fields, - STATE(1308), 1, + STATE(1230), 1, sym_term, - STATE(1488), 1, + STATE(1335), 1, sym_object_reference, STATE(235), 2, sym_comment, @@ -26799,63 +26869,63 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, + ACTIONS(708), 1, anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(722), 1, + ACTIONS(720), 1, anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(738), 1, anon_sym_BQUOTE, - STATE(68), 1, + STATE(69), 1, sym_expression, - STATE(157), 1, - sym_integer, - STATE(159), 1, - sym_identifier, STATE(162), 1, sym__double_quote_string, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, + sym_literal_string, STATE(178), 1, - sym_binary_expression, + sym_parameter, STATE(179), 1, - sym_between_expression, + sym_qualified_field, STATE(180), 1, - sym_literal, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, + sym_literal, STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, sym_decimal_number, - STATE(661), 1, + STATE(640), 1, sym_term, - STATE(753), 1, + STATE(769), 1, sym_all_fields, - STATE(1456), 1, + STATE(1468), 1, sym_object_reference, STATE(236), 2, sym_comment, @@ -26865,176 +26935,112 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(704), 1, + ACTIONS(708), 1, anon_sym_STAR, - ACTIONS(712), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(722), 1, + ACTIONS(720), 1, anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(738), 1, anon_sym_BQUOTE, - STATE(68), 1, + STATE(69), 1, sym_expression, - STATE(157), 1, - sym_integer, - STATE(159), 1, - sym_identifier, STATE(162), 1, sym__double_quote_string, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, + sym_literal_string, STATE(178), 1, - sym_binary_expression, + sym_parameter, STATE(179), 1, - sym_between_expression, + sym_qualified_field, STATE(180), 1, - sym_literal, + sym_binary_expression, + STATE(181), 1, + sym_between_expression, STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, + sym_literal, STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, sym_decimal_number, - STATE(753), 1, + STATE(769), 1, sym_all_fields, - STATE(937), 1, + STATE(948), 1, sym_term, - STATE(1456), 1, + STATE(1468), 1, sym_object_reference, STATE(237), 2, sym_comment, sym_marginalia, - [15870] = 31, + [15870] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, - sym_keyword_null, - ACTIONS(537), 1, - sym_keyword_true, - ACTIONS(539), 1, - sym_keyword_false, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, ACTIONS(744), 1, - sym_keyword_distinct, + sym_keyword_set, ACTIONS(746), 1, - sym_keyword_not, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, - sym_binary_expression, - STATE(128), 1, - sym_between_expression, - STATE(132), 1, - sym_literal, - STATE(150), 1, - sym_expression, - STATE(1329), 1, - sym_object_reference, - STATE(238), 2, - sym_comment, - sym_marginalia, - [15965] = 22, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(748), 1, - sym_keyword_set, - ACTIONS(750), 1, sym_keyword_alter, - ACTIONS(752), 1, + ACTIONS(748), 1, sym_keyword_change, - ACTIONS(754), 1, + ACTIONS(750), 1, sym_keyword_modify, - ACTIONS(756), 1, + ACTIONS(752), 1, sym_keyword_drop, - ACTIONS(758), 1, + ACTIONS(754), 1, sym_keyword_add, - ACTIONS(760), 1, + ACTIONS(756), 1, sym_keyword_column, - ACTIONS(762), 1, + ACTIONS(758), 1, sym_keyword_if, - ACTIONS(764), 1, + ACTIONS(760), 1, sym_keyword_rename, - ACTIONS(766), 1, + ACTIONS(762), 1, sym_keyword_owner, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(719), 1, + STATE(729), 1, sym__if_not_exists, - STATE(720), 1, + STATE(738), 1, sym_column_definition, - STATE(959), 1, + STATE(979), 1, sym__alter_specifications, - STATE(239), 2, + STATE(238), 2, sym_comment, sym_marginalia, - STATE(1116), 10, + STATE(1065), 10, sym_add_column, sym_add_constraint, sym_alter_column, @@ -27045,243 +27051,281 @@ static const uint16_t ts_small_parse_table[] = { sym_rename_object, sym_set_schema, sym_change_ownership, - [16042] = 31, + [15947] = 31, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(744), 1, + ACTIONS(764), 1, sym_keyword_distinct, - ACTIONS(746), 1, + ACTIONS(766), 1, sym_keyword_not, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(63), 1, + STATE(59), 1, sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, - STATE(240), 2, + STATE(239), 2, sym_comment, sym_marginalia, - [16137] = 31, + [16042] = 31, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - ACTIONS(744), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + ACTIONS(764), 1, sym_keyword_distinct, - ACTIONS(746), 1, + ACTIONS(766), 1, sym_keyword_not, - STATE(98), 1, - sym_expression, - STATE(157), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(146), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, + STATE(240), 2, + sym_comment, + sym_marginalia, + [16137] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, STATE(241), 2, sym_comment, sym_marginalia, - [16232] = 31, + ACTIONS(491), 6, + anon_sym_SLASH, + anon_sym_LT, + anon_sym_GT, + anon_sym_DASH, + anon_sym_DASH_GT, + anon_sym_POUND_GT, + ACTIONS(489), 22, + sym_keyword_then, + sym_keyword_in, + sym_keyword_and, + sym_keyword_or, + sym_keyword_is, + sym_keyword_not, + sym_keyword_between, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + sym_keyword_similar, + anon_sym_EQ, + anon_sym_STAR, + anon_sym_LT_EQ, + anon_sym_GT_EQ, + anon_sym_PLUS, + anon_sym_PERCENT, + anon_sym_CARET, + anon_sym_PIPE_PIPE, + anon_sym_BANG_EQ, + anon_sym_LT_GT, + anon_sym_DASH_GT_GT, + anon_sym_POUND_GT_GT, + [16180] = 31, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(710), 1, + sym__identifier, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(726), 1, + anon_sym_QMARK, + ACTIONS(728), 1, + anon_sym_DOLLAR, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(575), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(744), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + ACTIONS(764), 1, sym_keyword_distinct, - ACTIONS(746), 1, + ACTIONS(766), 1, sym_keyword_not, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, - anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(29), 1, + STATE(99), 1, sym_expression, - STATE(56), 1, + STATE(162), 1, sym__double_quote_string, - STATE(69), 1, - sym_identifier, - STATE(71), 1, + STATE(163), 1, sym_integer, - STATE(77), 1, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(78), 1, + STATE(179), 1, sym_qualified_field, - STATE(80), 1, + STATE(180), 1, sym_binary_expression, - STATE(81), 1, + STATE(181), 1, sym_between_expression, - STATE(82), 1, + STATE(182), 1, sym_literal, - STATE(88), 1, + STATE(184), 1, sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, + STATE(187), 1, sym_decimal_number, - STATE(1474), 1, + STATE(1539), 1, sym_object_reference, STATE(242), 2, sym_comment, sym_marginalia, - [16327] = 22, + [16275] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(748), 1, + ACTIONS(744), 1, sym_keyword_set, - ACTIONS(750), 1, + ACTIONS(746), 1, sym_keyword_alter, - ACTIONS(752), 1, + ACTIONS(748), 1, sym_keyword_change, - ACTIONS(754), 1, + ACTIONS(750), 1, sym_keyword_modify, - ACTIONS(756), 1, + ACTIONS(752), 1, sym_keyword_drop, - ACTIONS(758), 1, + ACTIONS(754), 1, sym_keyword_add, - ACTIONS(760), 1, + ACTIONS(756), 1, sym_keyword_column, - ACTIONS(762), 1, + ACTIONS(758), 1, sym_keyword_if, - ACTIONS(764), 1, + ACTIONS(760), 1, sym_keyword_rename, - ACTIONS(766), 1, + ACTIONS(762), 1, sym_keyword_owner, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(719), 1, + STATE(729), 1, sym__if_not_exists, - STATE(720), 1, + STATE(738), 1, sym_column_definition, - STATE(984), 1, + STATE(1059), 1, sym__alter_specifications, STATE(243), 2, sym_comment, sym_marginalia, - STATE(1116), 10, + STATE(1065), 10, sym_add_column, sym_add_constraint, sym_alter_column, @@ -27292,77 +27336,22 @@ static const uint16_t ts_small_parse_table[] = { sym_rename_object, sym_set_schema, sym_change_ownership, - [16404] = 22, + [16352] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(748), 1, - sym_keyword_set, - ACTIONS(750), 1, - sym_keyword_alter, - ACTIONS(752), 1, - sym_keyword_change, - ACTIONS(754), 1, - sym_keyword_modify, - ACTIONS(756), 1, - sym_keyword_drop, - ACTIONS(758), 1, - sym_keyword_add, - ACTIONS(760), 1, - sym_keyword_column, - ACTIONS(762), 1, - sym_keyword_if, - ACTIONS(764), 1, - sym_keyword_rename, - ACTIONS(766), 1, - sym_keyword_owner, - STATE(4), 1, - sym__double_quote_string, - STATE(6), 1, - sym_identifier, - STATE(719), 1, - sym__if_not_exists, - STATE(720), 1, - sym_column_definition, - STATE(1105), 1, - sym__alter_specifications, STATE(244), 2, sym_comment, sym_marginalia, - STATE(1116), 10, - sym_add_column, - sym_add_constraint, - sym_alter_column, - sym_modify_column, - sym_change_column, - sym_drop_column, - sym_rename_column, - sym_rename_object, - sym_set_schema, - sym_change_ownership, - [16481] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(245), 2, - sym_comment, - sym_marginalia, - ACTIONS(471), 6, + ACTIONS(491), 6, anon_sym_SLASH, anon_sym_LT, anon_sym_GT, anon_sym_DASH, anon_sym_DASH_GT, anon_sym_POUND_GT, - ACTIONS(469), 22, + ACTIONS(489), 22, sym_keyword_then, sym_keyword_in, sym_keyword_and, @@ -27385,107 +27374,250 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LT_GT, anon_sym_DASH_GT_GT, anon_sym_POUND_GT_GT, - [16524] = 5, + [16395] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(246), 2, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(744), 1, + sym_keyword_set, + ACTIONS(746), 1, + sym_keyword_alter, + ACTIONS(748), 1, + sym_keyword_change, + ACTIONS(750), 1, + sym_keyword_modify, + ACTIONS(752), 1, + sym_keyword_drop, + ACTIONS(754), 1, + sym_keyword_add, + ACTIONS(756), 1, + sym_keyword_column, + ACTIONS(758), 1, + sym_keyword_if, + ACTIONS(760), 1, + sym_keyword_rename, + ACTIONS(762), 1, + sym_keyword_owner, + STATE(3), 1, + sym__double_quote_string, + STATE(8), 1, + sym_identifier, + STATE(729), 1, + sym__if_not_exists, + STATE(738), 1, + sym_column_definition, + STATE(971), 1, + sym__alter_specifications, + STATE(245), 2, sym_comment, sym_marginalia, - ACTIONS(471), 6, - anon_sym_SLASH, - anon_sym_LT, - anon_sym_GT, + STATE(1065), 10, + sym_add_column, + sym_add_constraint, + sym_alter_column, + sym_modify_column, + sym_change_column, + sym_drop_column, + sym_rename_column, + sym_rename_object, + sym_set_schema, + sym_change_ownership, + [16472] = 31, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(563), 1, + sym_keyword_null, + ACTIONS(565), 1, + sym_keyword_true, + ACTIONS(567), 1, + sym_keyword_false, + ACTIONS(571), 1, + anon_sym_DOT, + ACTIONS(573), 1, anon_sym_DASH, - anon_sym_DASH_GT, - anon_sym_POUND_GT, - ACTIONS(469), 22, - sym_keyword_then, - sym_keyword_in, - sym_keyword_and, - sym_keyword_or, - sym_keyword_is, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, + anon_sym_SQUOTE, + ACTIONS(579), 1, + sym_natural_number, + ACTIONS(764), 1, + sym_keyword_distinct, + ACTIONS(766), 1, sym_keyword_not, - sym_keyword_between, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - sym_keyword_similar, - anon_sym_EQ, - anon_sym_STAR, - anon_sym_LT_EQ, - anon_sym_GT_EQ, - anon_sym_PLUS, - anon_sym_PERCENT, - anon_sym_CARET, - anon_sym_PIPE_PIPE, - anon_sym_BANG_EQ, - anon_sym_LT_GT, - anon_sym_DASH_GT_GT, - anon_sym_POUND_GT_GT, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, + anon_sym_LPAREN, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(28), 1, + sym_expression, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, + sym_integer, + STATE(67), 1, + sym_identifier, + STATE(73), 1, + sym_binary_expression, + STATE(76), 1, + sym_between_expression, + STATE(77), 1, + sym_literal, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, + sym_object_reference, + STATE(246), 2, + sym_comment, + sym_marginalia, [16567] = 30, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(708), 1, + ACTIONS(740), 1, anon_sym_RPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, STATE(137), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(247), 2, sym_comment, sym_marginalia, [16659] = 30, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, + sym_keyword_null, + ACTIONS(529), 1, + sym_keyword_true, + ACTIONS(531), 1, + sym_keyword_false, + ACTIONS(539), 1, + anon_sym_DOT, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, + anon_sym_DASH, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(702), 1, + anon_sym_LPAREN, + ACTIONS(740), 1, + anon_sym_RPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, + sym__double_quote_string, + STATE(112), 1, + sym_identifier, + STATE(120), 1, + sym_parameter, + STATE(122), 1, + sym_binary_expression, + STATE(124), 1, + sym_between_expression, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, + sym_literal, + STATE(140), 1, + sym_expression, + STATE(1232), 1, + sym_object_reference, + STATE(248), 2, + sym_comment, + sym_marginalia, + [16751] = 30, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -27516,38 +27648,38 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DOLLAR, ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(56), 1, + STATE(63), 1, sym__double_quote_string, - STATE(69), 1, - sym_identifier, - STATE(71), 1, + STATE(66), 1, sym_integer, - STATE(77), 1, - sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(67), 1, + sym_identifier, + STATE(73), 1, sym_binary_expression, - STATE(81), 1, + STATE(76), 1, sym_between_expression, - STATE(82), 1, + STATE(77), 1, sym_literal, - STATE(88), 1, + STATE(79), 1, sym__single_quote_string, - STATE(90), 1, + STATE(80), 1, sym_literal_string, - STATE(94), 1, + STATE(82), 1, sym_decimal_number, - STATE(109), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(113), 1, sym_expression, - STATE(893), 1, + STATE(958), 1, sym_order_target, - STATE(1474), 1, + STATE(1452), 1, sym_object_reference, - STATE(248), 2, + STATE(249), 2, sym_comment, sym_marginalia, - [16751] = 30, + [16843] = 30, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -27578,95 +27710,33 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DOLLAR, ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(56), 1, + STATE(63), 1, sym__double_quote_string, - STATE(69), 1, - sym_identifier, - STATE(71), 1, + STATE(66), 1, sym_integer, - STATE(77), 1, - sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(67), 1, + sym_identifier, + STATE(73), 1, sym_binary_expression, - STATE(81), 1, + STATE(76), 1, sym_between_expression, - STATE(82), 1, + STATE(77), 1, sym_literal, - STATE(88), 1, + STATE(79), 1, sym__single_quote_string, - STATE(90), 1, + STATE(80), 1, sym_literal_string, - STATE(94), 1, + STATE(82), 1, sym_decimal_number, - STATE(109), 1, - sym_expression, - STATE(951), 1, - sym_order_target, - STATE(1474), 1, - sym_object_reference, - STATE(249), 2, - sym_comment, - sym_marginalia, - [16843] = 30, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, - sym_keyword_null, - ACTIONS(537), 1, - sym_keyword_true, - ACTIONS(539), 1, - sym_keyword_false, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - ACTIONS(778), 1, - anon_sym_RBRACK, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, - sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(90), 1, sym_parameter, - STATE(126), 1, - sym_binary_expression, - STATE(128), 1, - sym_between_expression, - STATE(132), 1, - sym_literal, - STATE(136), 1, + STATE(91), 1, + sym_qualified_field, + STATE(113), 1, sym_expression, - STATE(1329), 1, + STATE(874), 1, + sym_order_target, + STATE(1452), 1, sym_object_reference, STATE(250), 2, sym_comment, @@ -27676,59 +27746,59 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(708), 1, - anon_sym_RPAREN, - STATE(24), 1, + ACTIONS(778), 1, + anon_sym_RBRACK, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(142), 1, + STATE(139), 1, sym_expression, - STATE(1139), 1, + STATE(1359), 1, sym_object_reference, STATE(251), 2, sym_comment, @@ -27738,57 +27808,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(152), 1, + STATE(198), 1, sym_expression, - STATE(1329), 1, + STATE(1232), 1, sym_object_reference, STATE(252), 2, sym_comment, @@ -27798,57 +27868,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(176), 1, + STATE(217), 1, sym_expression, - STATE(1139), 1, + STATE(1359), 1, sym_object_reference, STATE(253), 2, sym_comment, @@ -27858,57 +27928,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(780), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(37), 1, + sym_expression, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, + STATE(73), 1, sym_binary_expression, - STATE(128), 1, + STATE(76), 1, sym_between_expression, - STATE(132), 1, + STATE(77), 1, sym_literal, - STATE(140), 1, - sym_expression, - STATE(1329), 1, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(254), 2, sym_comment, @@ -27918,57 +27988,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(50), 1, + sym_expression, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, + STATE(73), 1, sym_binary_expression, - STATE(128), 1, + STATE(76), 1, sym_between_expression, - STATE(132), 1, + STATE(77), 1, sym_literal, - STATE(141), 1, - sym_expression, - STATE(1329), 1, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(255), 2, sym_comment, @@ -27978,57 +28048,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(193), 1, + STATE(159), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(256), 2, sym_comment, @@ -28038,57 +28108,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(211), 1, + STATE(171), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(257), 2, sym_comment, @@ -28098,57 +28168,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(53), 1, - sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(192), 1, + sym_expression, + STATE(1232), 1, sym_object_reference, STATE(258), 2, sym_comment, @@ -28158,57 +28228,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(196), 1, + STATE(183), 1, sym_expression, - STATE(1139), 1, + STATE(1232), 1, sym_object_reference, STATE(259), 2, sym_comment, @@ -28218,57 +28288,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(780), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(54), 1, - sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(186), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(260), 2, sym_comment, @@ -28278,57 +28348,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(782), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(216), 1, + STATE(169), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(261), 2, sym_comment, @@ -28338,57 +28408,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(784), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(138), 1, + STATE(142), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(262), 2, sym_comment, @@ -28398,57 +28468,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(782), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(96), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(164), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(203), 1, - sym_expression, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(263), 2, sym_comment, @@ -28458,57 +28528,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(101), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(164), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(166), 1, - sym_expression, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(264), 2, sym_comment, @@ -28518,57 +28588,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(103), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(164), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(208), 1, - sym_expression, - STATE(1139), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(265), 2, sym_comment, @@ -28578,57 +28648,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(784), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(104), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(164), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(170), 1, - sym_expression, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(266), 2, sym_comment, @@ -28638,57 +28708,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(60), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(105), 1, sym_expression, - STATE(108), 1, - sym_identifier, - STATE(111), 1, + STATE(162), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(267), 2, sym_comment, @@ -28698,57 +28768,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(58), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(100), 1, sym_expression, - STATE(108), 1, - sym_identifier, - STATE(111), 1, + STATE(162), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(268), 2, sym_comment, @@ -28758,57 +28828,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(102), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(164), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(194), 1, - sym_expression, - STATE(1139), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(269), 2, sym_comment, @@ -28818,57 +28888,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(61), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(106), 1, sym_expression, - STATE(108), 1, - sym_identifier, - STATE(111), 1, + STATE(162), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(270), 2, sym_comment, @@ -28878,57 +28948,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(55), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(99), 1, sym_expression, - STATE(108), 1, - sym_identifier, - STATE(111), 1, + STATE(162), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(163), 1, + sym_integer, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(271), 2, sym_comment, @@ -28938,57 +29008,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(59), 1, + STATE(51), 1, sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(272), 2, sym_comment, @@ -28998,57 +29068,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(51), 1, - sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(141), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(273), 2, sym_comment, @@ -29058,57 +29128,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(52), 1, + STATE(54), 1, sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(274), 2, sym_comment, @@ -29118,57 +29188,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(63), 1, + STATE(55), 1, sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(275), 2, sym_comment, @@ -29178,57 +29248,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(133), 1, + STATE(160), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(276), 2, sym_comment, @@ -29238,57 +29308,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(30), 1, - sym_expression, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, STATE(56), 1, + sym_expression, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(1359), 1, sym_object_reference, STATE(277), 2, sym_comment, @@ -29298,57 +29368,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(31), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(62), 1, sym_expression, - STATE(56), 1, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(1359), 1, sym_object_reference, STATE(278), 2, sym_comment, @@ -29358,57 +29428,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(34), 1, - sym_expression, - STATE(56), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(212), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(279), 2, sym_comment, @@ -29418,57 +29488,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(32), 1, - sym_expression, - STATE(56), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(206), 1, + sym_expression, + STATE(1232), 1, sym_object_reference, STATE(280), 2, sym_comment, @@ -29478,57 +29548,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(33), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(58), 1, sym_expression, - STATE(56), 1, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(1359), 1, sym_object_reference, STATE(281), 2, sym_comment, @@ -29538,57 +29608,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(786), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(35), 1, - sym_expression, - STATE(56), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(147), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(282), 2, sym_comment, @@ -29598,57 +29668,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(36), 1, - sym_expression, - STATE(56), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(136), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(283), 2, sym_comment, @@ -29658,57 +29728,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(26), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(53), 1, sym_expression, - STATE(56), 1, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(1359), 1, sym_object_reference, STATE(284), 2, sym_comment, @@ -29718,62 +29788,122 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, + ACTIONS(788), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, + sym__double_quote_string, + STATE(112), 1, + sym_identifier, + STATE(120), 1, + sym_parameter, + STATE(122), 1, + sym_binary_expression, + STATE(124), 1, + sym_between_expression, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, + sym_literal, + STATE(138), 1, + sym_expression, + STATE(1359), 1, + sym_object_reference, + STATE(285), 2, + sym_comment, + sym_marginalia, + [20053] = 29, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(710), 1, sym__identifier, - ACTIONS(770), 1, + ACTIONS(714), 1, + sym_keyword_null, + ACTIONS(716), 1, + sym_keyword_true, + ACTIONS(718), 1, + sym_keyword_false, + ACTIONS(720), 1, anon_sym_LPAREN, - ACTIONS(772), 1, + ACTIONS(724), 1, + anon_sym_DOT, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(774), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(776), 1, + ACTIONS(730), 1, + anon_sym_DASH, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, + anon_sym_SQUOTE, + ACTIONS(736), 1, + sym_natural_number, + ACTIONS(738), 1, anon_sym_BQUOTE, - STATE(29), 1, + STATE(107), 1, sym_expression, - STATE(56), 1, + STATE(162), 1, sym__double_quote_string, - STATE(69), 1, - sym_identifier, - STATE(71), 1, + STATE(163), 1, sym_integer, - STATE(77), 1, + STATE(164), 1, + sym_identifier, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(78), 1, + STATE(179), 1, sym_qualified_field, - STATE(80), 1, + STATE(180), 1, sym_binary_expression, - STATE(81), 1, + STATE(181), 1, sym_between_expression, - STATE(82), 1, + STATE(182), 1, sym_literal, - STATE(88), 1, + STATE(184), 1, sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, + STATE(187), 1, sym_decimal_number, - STATE(1474), 1, + STATE(1539), 1, sym_object_reference, - STATE(285), 2, + STATE(286), 2, sym_comment, sym_marginalia, - [20053] = 29, + [20142] = 29, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -29804,91 +29934,31 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DOLLAR, ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(37), 1, + STATE(30), 1, sym_expression, - STATE(56), 1, + STATE(63), 1, sym__double_quote_string, - STATE(69), 1, - sym_identifier, - STATE(71), 1, + STATE(66), 1, sym_integer, - STATE(77), 1, - sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(67), 1, + sym_identifier, + STATE(73), 1, sym_binary_expression, - STATE(81), 1, + STATE(76), 1, sym_between_expression, - STATE(82), 1, + STATE(77), 1, sym_literal, - STATE(88), 1, + STATE(79), 1, sym__single_quote_string, - STATE(90), 1, + STATE(80), 1, sym_literal_string, - STATE(94), 1, + STATE(82), 1, sym_decimal_number, - STATE(1474), 1, - sym_object_reference, - STATE(286), 2, - sym_comment, - sym_marginalia, - [20142] = 29, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, - sym_keyword_null, - ACTIONS(537), 1, - sym_keyword_true, - ACTIONS(539), 1, - sym_keyword_false, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, - sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, - sym_binary_expression, - STATE(128), 1, - sym_between_expression, - STATE(132), 1, - sym_literal, - STATE(210), 1, - sym_expression, - STATE(1329), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(287), 2, sym_comment, @@ -29898,57 +29968,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(710), 1, sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(714), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(716), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(718), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(720), 1, + anon_sym_LPAREN, + ACTIONS(724), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(726), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(728), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(730), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(734), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(736), 1, sym_natural_number, - ACTIONS(702), 1, - anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(738), 1, + anon_sym_BQUOTE, + STATE(97), 1, + sym_expression, + STATE(162), 1, + sym__double_quote_string, + STATE(163), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(69), 1, + STATE(164), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(168), 1, + sym_literal_string, + STATE(178), 1, sym_parameter, - STATE(126), 1, + STATE(179), 1, + sym_qualified_field, + STATE(180), 1, sym_binary_expression, - STATE(128), 1, + STATE(181), 1, sym_between_expression, - STATE(132), 1, + STATE(182), 1, sym_literal, - STATE(171), 1, - sym_expression, - STATE(1329), 1, + STATE(184), 1, + sym__single_quote_string, + STATE(187), 1, + sym_decimal_number, + STATE(1539), 1, sym_object_reference, STATE(288), 2, sym_comment, @@ -29958,57 +30028,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(32), 1, + sym_expression, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, + STATE(73), 1, sym_binary_expression, - STATE(128), 1, + STATE(76), 1, sym_between_expression, - STATE(132), 1, + STATE(77), 1, sym_literal, - STATE(163), 1, - sym_expression, - STATE(1329), 1, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(289), 2, sym_comment, @@ -30018,57 +30088,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(57), 1, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(33), 1, sym_expression, - STATE(108), 1, - sym_identifier, - STATE(111), 1, + STATE(63), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, + STATE(66), 1, + sym_integer, + STATE(67), 1, + sym_identifier, + STATE(73), 1, sym_binary_expression, - STATE(128), 1, + STATE(76), 1, sym_between_expression, - STATE(132), 1, + STATE(77), 1, sym_literal, - STATE(1329), 1, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(290), 2, sym_comment, @@ -30078,57 +30148,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(786), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(34), 1, + sym_expression, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, + STATE(73), 1, sym_binary_expression, - STATE(128), 1, + STATE(76), 1, sym_between_expression, - STATE(132), 1, + STATE(77), 1, sym_literal, - STATE(139), 1, - sym_expression, - STATE(1329), 1, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(291), 2, sym_comment, @@ -30138,57 +30208,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, - sym__identifier, - ACTIONS(716), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(728), 1, - anon_sym_QMARK, - ACTIONS(730), 1, - anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(575), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, + anon_sym_LPAREN, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(96), 1, + STATE(35), 1, sym_expression, - STATE(157), 1, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(159), 1, + STATE(67), 1, sym_identifier, - STATE(162), 1, - sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, - STATE(178), 1, + STATE(73), 1, sym_binary_expression, - STATE(179), 1, + STATE(76), 1, sym_between_expression, - STATE(180), 1, + STATE(77), 1, sym_literal, - STATE(182), 1, + STATE(79), 1, sym__single_quote_string, - STATE(183), 1, + STATE(80), 1, sym_literal_string, - STATE(184), 1, + STATE(82), 1, sym_decimal_number, - STATE(1524), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(292), 2, sym_comment, @@ -30198,57 +30268,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, - sym__identifier, - ACTIONS(716), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(728), 1, - anon_sym_QMARK, - ACTIONS(730), 1, - anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(575), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, + anon_sym_LPAREN, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(97), 1, + STATE(31), 1, sym_expression, - STATE(157), 1, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(159), 1, + STATE(67), 1, sym_identifier, - STATE(162), 1, - sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, - STATE(178), 1, + STATE(73), 1, sym_binary_expression, - STATE(179), 1, + STATE(76), 1, sym_between_expression, - STATE(180), 1, + STATE(77), 1, sym_literal, - STATE(182), 1, + STATE(79), 1, sym__single_quote_string, - STATE(183), 1, + STATE(80), 1, sym_literal_string, - STATE(184), 1, + STATE(82), 1, sym_decimal_number, - STATE(1524), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(293), 2, sym_comment, @@ -30258,57 +30328,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, - sym__identifier, - ACTIONS(716), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(728), 1, - anon_sym_QMARK, - ACTIONS(730), 1, - anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(575), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, + anon_sym_LPAREN, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(99), 1, + STATE(26), 1, sym_expression, - STATE(157), 1, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(159), 1, + STATE(67), 1, sym_identifier, - STATE(162), 1, - sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, - STATE(178), 1, + STATE(73), 1, sym_binary_expression, - STATE(179), 1, + STATE(76), 1, sym_between_expression, - STATE(180), 1, + STATE(77), 1, sym_literal, - STATE(182), 1, + STATE(79), 1, sym__single_quote_string, - STATE(183), 1, + STATE(80), 1, sym_literal_string, - STATE(184), 1, + STATE(82), 1, sym_decimal_number, - STATE(1524), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(294), 2, sym_comment, @@ -30318,57 +30388,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(100), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(144), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(295), 2, sym_comment, @@ -30378,57 +30448,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(101), 1, - sym_expression, - STATE(157), 1, - sym_integer, - STATE(159), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(145), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(296), 2, sym_comment, @@ -30438,57 +30508,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, - sym__identifier, - ACTIONS(716), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(728), 1, - anon_sym_QMARK, - ACTIONS(730), 1, - anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(734), 1, + ACTIONS(575), 1, anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(740), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, + anon_sym_LPAREN, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(102), 1, + STATE(28), 1, sym_expression, - STATE(157), 1, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(159), 1, + STATE(67), 1, sym_identifier, - STATE(162), 1, - sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, - sym_parameter, - STATE(178), 1, + STATE(73), 1, sym_binary_expression, - STATE(179), 1, + STATE(76), 1, sym_between_expression, - STATE(180), 1, + STATE(77), 1, sym_literal, - STATE(182), 1, + STATE(79), 1, sym__single_quote_string, - STATE(183), 1, + STATE(80), 1, sym_literal_string, - STATE(184), 1, + STATE(82), 1, sym_decimal_number, - STATE(1524), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(297), 2, sym_comment, @@ -30498,57 +30568,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(103), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(135), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(298), 2, sym_comment, @@ -30558,57 +30628,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(104), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(148), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(299), 2, sym_comment, @@ -30618,57 +30688,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(98), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(149), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(300), 2, sym_comment, @@ -30678,57 +30748,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(105), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(150), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(301), 2, sym_comment, @@ -30738,57 +30808,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(712), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(716), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(718), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(720), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(722), 1, - anon_sym_LPAREN, - ACTIONS(726), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(728), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(730), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(732), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(736), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(738), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(740), 1, - anon_sym_BQUOTE, - STATE(106), 1, - sym_expression, - STATE(157), 1, + ACTIONS(702), 1, + anon_sym_LPAREN, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, sym_integer, - STATE(159), 1, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(67), 1, sym_identifier, - STATE(162), 1, + STATE(108), 1, sym__double_quote_string, - STATE(168), 1, - sym_qualified_field, - STATE(177), 1, + STATE(120), 1, sym_parameter, - STATE(178), 1, + STATE(122), 1, sym_binary_expression, - STATE(179), 1, + STATE(124), 1, sym_between_expression, - STATE(180), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(182), 1, - sym__single_quote_string, - STATE(183), 1, - sym_literal_string, - STATE(184), 1, - sym_decimal_number, - STATE(1524), 1, + STATE(151), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(302), 2, sym_comment, @@ -30798,57 +30868,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(192), 1, + STATE(152), 1, sym_expression, - STATE(1139), 1, + STATE(1359), 1, sym_object_reference, STATE(303), 2, sym_comment, @@ -30858,57 +30928,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(148), 1, + STATE(146), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(304), 2, sym_comment, @@ -30918,57 +30988,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(563), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(565), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(567), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(571), 1, anon_sym_DOT, - ACTIONS(549), 1, - anon_sym_QMARK, - ACTIONS(551), 1, - anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(573), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(579), 1, sym_natural_number, - ACTIONS(702), 1, + ACTIONS(768), 1, + sym__identifier, + ACTIONS(770), 1, anon_sym_LPAREN, - STATE(24), 1, - sym__single_quote_string, - STATE(40), 1, + ACTIONS(772), 1, + anon_sym_QMARK, + ACTIONS(774), 1, + anon_sym_DOLLAR, + ACTIONS(776), 1, + anon_sym_BQUOTE, + STATE(36), 1, + sym_expression, + STATE(63), 1, + sym__double_quote_string, + STATE(66), 1, sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, - sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, - sym_parameter, - STATE(126), 1, + STATE(73), 1, sym_binary_expression, - STATE(128), 1, + STATE(76), 1, sym_between_expression, - STATE(132), 1, + STATE(77), 1, sym_literal, - STATE(149), 1, - sym_expression, - STATE(1329), 1, + STATE(79), 1, + sym__single_quote_string, + STATE(80), 1, + sym_literal_string, + STATE(82), 1, + sym_decimal_number, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(305), 2, sym_comment, @@ -30978,57 +31048,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(135), 1, + STATE(185), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(306), 2, sym_comment, @@ -31038,57 +31108,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(151), 1, + STATE(143), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(307), 2, sym_comment, @@ -31098,57 +31168,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(57), 1, + sym_expression, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(147), 1, - sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(308), 2, sym_comment, @@ -31158,57 +31228,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(146), 1, + STATE(210), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(309), 2, sym_comment, @@ -31218,57 +31288,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(153), 1, + STATE(207), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(310), 2, sym_comment, @@ -31278,57 +31348,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(150), 1, + STATE(154), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(311), 2, sym_comment, @@ -31338,57 +31408,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(108), 1, + STATE(67), 1, sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(206), 1, + STATE(155), 1, sym_expression, - STATE(1139), 1, + STATE(1359), 1, sym_object_reference, STATE(312), 2, sym_comment, @@ -31398,57 +31468,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(788), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(143), 1, + STATE(209), 1, sym_expression, - STATE(1329), 1, + STATE(1232), 1, sym_object_reference, STATE(313), 2, sym_comment, @@ -31458,57 +31528,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, + STATE(60), 1, + sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(144), 1, - sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(314), 2, sym_comment, @@ -31518,57 +31588,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(52), 1, + sym_expression, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(207), 1, - sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(315), 2, sym_comment, @@ -31578,57 +31648,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(563), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(565), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(567), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(571), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(573), 1, + ACTIONS(541), 1, + anon_sym_QMARK, + ACTIONS(543), 1, + anon_sym_DOLLAR, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(577), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(579), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(768), 1, - sym__identifier, - ACTIONS(770), 1, + ACTIONS(702), 1, anon_sym_LPAREN, - ACTIONS(772), 1, - anon_sym_QMARK, - ACTIONS(774), 1, - anon_sym_DOLLAR, - ACTIONS(776), 1, - anon_sym_BQUOTE, - STATE(50), 1, - sym_expression, - STATE(56), 1, + STATE(23), 1, + sym__single_quote_string, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(108), 1, sym__double_quote_string, - STATE(69), 1, + STATE(112), 1, sym_identifier, - STATE(71), 1, - sym_integer, - STATE(77), 1, + STATE(120), 1, sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(122), 1, sym_binary_expression, - STATE(81), 1, + STATE(124), 1, sym_between_expression, - STATE(82), 1, + STATE(129), 1, + sym_qualified_field, + STATE(132), 1, sym_literal, - STATE(88), 1, - sym__single_quote_string, - STATE(90), 1, - sym_literal_string, - STATE(94), 1, - sym_decimal_number, - STATE(1474), 1, + STATE(133), 1, + sym_expression, + STATE(1359), 1, sym_object_reference, STATE(316), 2, sym_comment, @@ -31638,57 +31708,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(154), 1, + STATE(205), 1, sym_expression, - STATE(1329), 1, + STATE(1318), 1, sym_object_reference, STATE(317), 2, sym_comment, @@ -31698,57 +31768,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(69), 1, - sym_identifier, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(155), 1, + STATE(213), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(318), 2, sym_comment, @@ -31758,57 +31828,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(202), 1, + STATE(211), 1, sym_expression, - STATE(1305), 1, + STATE(1359), 1, sym_object_reference, STATE(319), 2, sym_comment, @@ -31818,57 +31888,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, + STATE(59), 1, + sym_expression, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(213), 1, - sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(320), 2, sym_comment, @@ -31878,57 +31948,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(214), 1, + STATE(170), 1, sym_expression, - STATE(1329), 1, + STATE(1232), 1, sym_object_reference, STATE(321), 2, sym_comment, @@ -31938,57 +32008,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(169), 1, + STATE(208), 1, sym_expression, - STATE(1313), 1, + STATE(1323), 1, sym_object_reference, STATE(322), 2, sym_comment, @@ -31998,57 +32068,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(212), 1, + STATE(214), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(323), 2, sym_comment, @@ -32058,57 +32128,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(217), 1, + STATE(215), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(324), 2, sym_comment, @@ -32118,57 +32188,57 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(549), 1, + ACTIONS(541), 1, anon_sym_QMARK, - ACTIONS(551), 1, + ACTIONS(543), 1, anon_sym_DOLLAR, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, ACTIONS(702), 1, anon_sym_LPAREN, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, STATE(108), 1, - sym_identifier, - STATE(111), 1, sym__double_quote_string, - STATE(118), 1, - sym_qualified_field, - STATE(119), 1, + STATE(112), 1, + sym_identifier, + STATE(120), 1, sym_parameter, - STATE(126), 1, + STATE(122), 1, sym_binary_expression, - STATE(128), 1, + STATE(124), 1, sym_between_expression, + STATE(129), 1, + sym_qualified_field, STATE(132), 1, sym_literal, - STATE(215), 1, + STATE(216), 1, sym_expression, - STATE(1329), 1, + STATE(1359), 1, sym_object_reference, STATE(325), 2, sym_comment, @@ -32204,31 +32274,31 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DOLLAR, ACTIONS(776), 1, anon_sym_BQUOTE, - STATE(27), 1, + STATE(29), 1, sym_expression, - STATE(56), 1, + STATE(63), 1, sym__double_quote_string, - STATE(69), 1, - sym_identifier, - STATE(71), 1, + STATE(66), 1, sym_integer, - STATE(77), 1, - sym_parameter, - STATE(78), 1, - sym_qualified_field, - STATE(80), 1, + STATE(67), 1, + sym_identifier, + STATE(73), 1, sym_binary_expression, - STATE(81), 1, + STATE(76), 1, sym_between_expression, - STATE(82), 1, + STATE(77), 1, sym_literal, - STATE(88), 1, + STATE(79), 1, sym__single_quote_string, - STATE(90), 1, + STATE(80), 1, sym_literal_string, - STATE(94), 1, + STATE(82), 1, sym_decimal_number, - STATE(1474), 1, + STATE(90), 1, + sym_parameter, + STATE(91), 1, + sym_qualified_field, + STATE(1452), 1, sym_object_reference, STATE(326), 2, sym_comment, @@ -32272,7 +32342,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [23750] = 8, + [23750] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -32280,15 +32350,13 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(804), 1, sym_keyword_as, ACTIONS(806), 1, - sym_keyword_unsigned, + aux_sym_keyword_with_token1, ACTIONS(808), 1, - sym_keyword_zerofill, - ACTIONS(810), 1, - anon_sym_LPAREN, + aux_sym_keyword_timestamp_base_token2, STATE(328), 2, sym_comment, sym_marginalia, - ACTIONS(802), 20, + ACTIONS(802), 21, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32307,25 +32375,26 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, + anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [23795] = 8, + [23793] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(792), 1, + ACTIONS(812), 1, sym_keyword_as, - ACTIONS(794), 1, + ACTIONS(814), 1, sym_keyword_unsigned, - ACTIONS(796), 1, + ACTIONS(816), 1, sym_keyword_zerofill, - ACTIONS(800), 1, + ACTIONS(818), 1, anon_sym_LPAREN, STATE(329), 2, sym_comment, sym_marginalia, - ACTIONS(790), 20, + ACTIONS(810), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32346,27 +32415,23 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [23840] = 10, + [23838] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(814), 1, + ACTIONS(792), 1, sym_keyword_as, - ACTIONS(816), 1, - sym_keyword_array, - ACTIONS(818), 1, - anon_sym_LBRACK, - STATE(360), 1, - aux_sym_array_size_definition_repeat1, - STATE(418), 1, - sym__array_size_definition, - STATE(420), 1, - sym_array_size_definition, + ACTIONS(794), 1, + sym_keyword_unsigned, + ACTIONS(796), 1, + sym_keyword_zerofill, + ACTIONS(800), 1, + anon_sym_LPAREN, STATE(330), 2, sym_comment, sym_marginalia, - ACTIONS(812), 18, + ACTIONS(790), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32383,19 +32448,27 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, + anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [23889] = 5, + [23883] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(822), 1, sym_keyword_as, + ACTIONS(824), 1, + sym_keyword_unsigned, + ACTIONS(826), 1, + sym_keyword_zerofill, + ACTIONS(828), 1, + anon_sym_LPAREN, STATE(331), 2, sym_comment, sym_marginalia, - ACTIONS(820), 23, + ACTIONS(820), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32410,32 +32483,23 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_restrict, sym_keyword_first, sym_keyword_after, - sym_keyword_unsigned, - sym_keyword_zerofill, sym_keyword_comment, sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, - anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [23928] = 8, + [23928] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(826), 1, - sym_keyword_as, - ACTIONS(828), 1, - sym_keyword_unsigned, - ACTIONS(830), 1, - sym_keyword_zerofill, ACTIONS(832), 1, - anon_sym_LPAREN, + sym_keyword_as, STATE(332), 2, sym_comment, sym_marginalia, - ACTIONS(824), 20, + ACTIONS(830), 23, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32450,70 +32514,69 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_restrict, sym_keyword_first, sym_keyword_after, + sym_keyword_unsigned, + sym_keyword_zerofill, sym_keyword_comment, sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, + anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [23973] = 15, + [23967] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(839), 1, - sym_keyword_primary, - ACTIONS(842), 1, + ACTIONS(836), 1, sym_keyword_as, - ACTIONS(845), 1, - sym_keyword_not, - ACTIONS(851), 1, - sym_keyword_generated, - ACTIONS(854), 1, - sym_keyword_default, - ACTIONS(857), 1, - sym_keyword_comment, - STATE(471), 1, - sym__primary_key, - STATE(472), 1, - sym_column_constraint, - ACTIONS(836), 2, - sym_keyword_desc, - sym_keyword_asc, - ACTIONS(848), 2, - sym_keyword_auto_increment, - sym_keyword_null, - STATE(333), 3, + ACTIONS(838), 1, + sym_keyword_array, + ACTIONS(840), 1, + anon_sym_LBRACK, + STATE(354), 1, + aux_sym_array_size_definition_repeat1, + STATE(422), 1, + sym__array_size_definition, + STATE(423), 1, + sym_array_size_definition, + STATE(333), 2, sym_comment, sym_marginalia, - aux_sym_column_definition_repeat1, - STATE(470), 4, - sym__not_null, - sym_direction, - sym__column_comment, - sym__default_expression, - ACTIONS(834), 6, + ACTIONS(834), 18, ts_builtin_sym_end, anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_collate, + sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, sym_keyword_first, sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [24031] = 7, + [24016] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(862), 1, + ACTIONS(844), 1, sym_keyword_as, - ACTIONS(864), 1, + ACTIONS(846), 1, sym_keyword_unsigned, - ACTIONS(866), 1, + ACTIONS(848), 1, sym_keyword_zerofill, STATE(334), 2, sym_comment, sym_marginalia, - ACTIONS(860), 20, + ACTIONS(842), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32534,65 +32597,64 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24073] = 16, + [24058] = 15, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(872), 1, + ACTIONS(855), 1, sym_keyword_primary, - ACTIONS(874), 1, + ACTIONS(858), 1, sym_keyword_as, - ACTIONS(876), 1, + ACTIONS(861), 1, sym_keyword_not, - ACTIONS(880), 1, + ACTIONS(867), 1, sym_keyword_generated, - ACTIONS(882), 1, + ACTIONS(870), 1, sym_keyword_default, - ACTIONS(884), 1, + ACTIONS(873), 1, sym_keyword_comment, - STATE(339), 1, - aux_sym_column_definition_repeat1, - STATE(471), 1, + STATE(483), 1, sym__primary_key, - STATE(472), 1, + STATE(484), 1, sym_column_constraint, - ACTIONS(870), 2, + ACTIONS(852), 2, sym_keyword_desc, sym_keyword_asc, - ACTIONS(878), 2, + ACTIONS(864), 2, sym_keyword_auto_increment, sym_keyword_null, - STATE(335), 2, + STATE(335), 3, sym_comment, sym_marginalia, - STATE(470), 4, + aux_sym_column_definition_repeat1, + STATE(482), 4, sym__not_null, sym_direction, sym__column_comment, sym__default_expression, - ACTIONS(868), 6, + ACTIONS(850), 6, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_first, sym_keyword_after, anon_sym_RPAREN, anon_sym_COMMA, - [24133] = 7, + [24116] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(888), 1, + ACTIONS(812), 1, sym_keyword_as, - ACTIONS(890), 1, - aux_sym_keyword_with_token1, - ACTIONS(892), 1, - aux_sym_keyword_timestamp_token2, + ACTIONS(876), 1, + sym_keyword_precision, + ACTIONS(878), 1, + anon_sym_LPAREN, STATE(336), 2, sym_comment, sym_marginalia, - ACTIONS(886), 20, + ACTIONS(810), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32613,21 +32675,21 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24175] = 7, + [24158] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(896), 1, + ACTIONS(882), 1, sym_keyword_as, - ACTIONS(898), 1, - sym_keyword_unsigned, - ACTIONS(900), 1, - sym_keyword_zerofill, + ACTIONS(884), 1, + sym_keyword_varying, + ACTIONS(886), 1, + anon_sym_LPAREN, STATE(337), 2, sym_comment, sym_marginalia, - ACTIONS(894), 20, + ACTIONS(880), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32648,21 +32710,21 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24217] = 7, + [24200] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(904), 1, + ACTIONS(890), 1, sym_keyword_as, - ACTIONS(906), 1, + ACTIONS(892), 1, sym_keyword_unsigned, - ACTIONS(908), 1, + ACTIONS(894), 1, sym_keyword_zerofill, STATE(338), 2, sym_comment, sym_marginalia, - ACTIONS(902), 20, + ACTIONS(888), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32683,65 +32745,65 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24259] = 16, + [24242] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(872), 1, + ACTIONS(900), 1, sym_keyword_primary, - ACTIONS(874), 1, + ACTIONS(902), 1, sym_keyword_as, - ACTIONS(876), 1, + ACTIONS(904), 1, sym_keyword_not, - ACTIONS(880), 1, + ACTIONS(908), 1, sym_keyword_generated, - ACTIONS(882), 1, + ACTIONS(910), 1, sym_keyword_default, - ACTIONS(884), 1, + ACTIONS(912), 1, sym_keyword_comment, - STATE(333), 1, + STATE(335), 1, aux_sym_column_definition_repeat1, - STATE(471), 1, + STATE(483), 1, sym__primary_key, - STATE(472), 1, + STATE(484), 1, sym_column_constraint, - ACTIONS(870), 2, + ACTIONS(898), 2, sym_keyword_desc, sym_keyword_asc, - ACTIONS(878), 2, + ACTIONS(906), 2, sym_keyword_auto_increment, sym_keyword_null, STATE(339), 2, sym_comment, sym_marginalia, - STATE(470), 4, + STATE(482), 4, sym__not_null, sym_direction, sym__column_comment, sym__default_expression, - ACTIONS(910), 6, + ACTIONS(896), 6, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_first, sym_keyword_after, anon_sym_RPAREN, anon_sym_COMMA, - [24319] = 7, + [24302] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(914), 1, - sym_keyword_as, ACTIONS(916), 1, - sym_keyword_varying, + sym_keyword_as, ACTIONS(918), 1, - anon_sym_LPAREN, + sym_keyword_unsigned, + ACTIONS(920), 1, + sym_keyword_zerofill, STATE(340), 2, sym_comment, sym_marginalia, - ACTIONS(912), 20, + ACTIONS(914), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32762,87 +32824,63 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24361] = 7, + [24344] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(804), 1, - sym_keyword_as, - ACTIONS(920), 1, - sym_keyword_precision, - ACTIONS(922), 1, - anon_sym_LPAREN, - STATE(341), 2, - sym_comment, - sym_marginalia, - ACTIONS(802), 20, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, + ACTIONS(900), 1, sym_keyword_primary, + ACTIONS(902), 1, + sym_keyword_as, + ACTIONS(904), 1, sym_keyword_not, - sym_keyword_auto_increment, + ACTIONS(908), 1, sym_keyword_generated, - sym_keyword_collate, + ACTIONS(910), 1, sym_keyword_default, - sym_keyword_cascade, - sym_keyword_restrict, - sym_keyword_first, - sym_keyword_after, + ACTIONS(912), 1, sym_keyword_comment, + STATE(339), 1, + aux_sym_column_definition_repeat1, + STATE(483), 1, + sym__primary_key, + STATE(484), 1, + sym_column_constraint, + ACTIONS(898), 2, + sym_keyword_desc, + sym_keyword_asc, + ACTIONS(906), 2, + sym_keyword_auto_increment, sym_keyword_null, - sym_keyword_array, - anon_sym_LBRACK, - anon_sym_RPAREN, - anon_sym_COMMA, - [24403] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(926), 1, - sym_keyword_as, - ACTIONS(928), 1, - anon_sym_LPAREN, - STATE(342), 2, + STATE(341), 2, sym_comment, sym_marginalia, - ACTIONS(924), 20, + STATE(482), 4, + sym__not_null, + sym_direction, + sym__column_comment, + sym__default_expression, + ACTIONS(922), 6, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_primary, - sym_keyword_not, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_collate, - sym_keyword_default, - sym_keyword_cascade, - sym_keyword_restrict, sym_keyword_first, sym_keyword_after, - sym_keyword_comment, - sym_keyword_null, - sym_keyword_array, - anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24442] = 6, + [24404] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(804), 1, + ACTIONS(812), 1, sym_keyword_as, - ACTIONS(808), 1, + ACTIONS(816), 1, sym_keyword_zerofill, - STATE(343), 2, + STATE(342), 2, sym_comment, sym_marginalia, - ACTIONS(802), 20, + ACTIONS(810), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32863,17 +32901,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24481] = 5, + [24443] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(932), 1, + ACTIONS(926), 1, sym_keyword_as, - STATE(344), 2, + ACTIONS(928), 1, + anon_sym_LPAREN, + STATE(343), 2, sym_comment, sym_marginalia, - ACTIONS(930), 21, + ACTIONS(924), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32892,22 +32932,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, - anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [24518] = 6, + [24482] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(936), 1, + ACTIONS(932), 1, sym_keyword_as, - ACTIONS(938), 1, - sym_keyword_zerofill, - STATE(345), 2, + ACTIONS(934), 1, + anon_sym_LPAREN, + STATE(344), 2, sym_comment, sym_marginalia, - ACTIONS(934), 20, + ACTIONS(930), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32928,19 +32967,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24557] = 6, + [24521] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(942), 1, + ACTIONS(938), 1, sym_keyword_as, - ACTIONS(944), 1, + ACTIONS(940), 1, anon_sym_LPAREN, - STATE(346), 2, + STATE(345), 2, sym_comment, sym_marginalia, - ACTIONS(940), 20, + ACTIONS(936), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32961,19 +33000,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24596] = 6, + [24560] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(948), 1, + ACTIONS(944), 1, sym_keyword_as, - ACTIONS(950), 1, + ACTIONS(946), 1, sym_keyword_zerofill, - STATE(347), 2, + STATE(346), 2, sym_comment, sym_marginalia, - ACTIONS(946), 20, + ACTIONS(942), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -32994,19 +33033,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24635] = 6, + [24599] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(954), 1, + ACTIONS(950), 1, sym_keyword_as, - ACTIONS(956), 1, + ACTIONS(952), 1, anon_sym_LPAREN, - STATE(348), 2, + STATE(347), 2, sym_comment, sym_marginalia, - ACTIONS(952), 20, + ACTIONS(948), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33027,19 +33066,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24674] = 6, + [24638] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(960), 1, + ACTIONS(950), 1, sym_keyword_as, - ACTIONS(962), 1, + ACTIONS(954), 1, sym_keyword_zerofill, - STATE(349), 2, + STATE(348), 2, sym_comment, sym_marginalia, - ACTIONS(958), 20, + ACTIONS(948), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33060,19 +33099,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24713] = 6, + [24677] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(966), 1, + ACTIONS(958), 1, sym_keyword_as, - ACTIONS(968), 1, - sym_keyword_zerofill, - STATE(350), 2, + STATE(349), 2, sym_comment, sym_marginalia, - ACTIONS(964), 20, + ACTIONS(956), 21, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33091,24 +33128,25 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, + anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [24752] = 7, + [24714] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(972), 1, + ACTIONS(962), 1, sym_keyword_as, - ACTIONS(974), 1, + ACTIONS(964), 1, anon_sym_LBRACK, - STATE(418), 1, + STATE(422), 1, sym__array_size_definition, - STATE(351), 3, + STATE(350), 3, sym_comment, sym_marginalia, aux_sym_array_size_definition_repeat1, - ACTIONS(970), 18, + ACTIONS(960), 18, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33127,19 +33165,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [24793] = 6, + [24755] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(979), 1, + ACTIONS(969), 1, sym_keyword_as, - ACTIONS(981), 1, - anon_sym_LPAREN, - STATE(352), 2, + STATE(351), 2, sym_comment, sym_marginalia, - ACTIONS(977), 20, + ACTIONS(967), 21, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33158,21 +33194,22 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, + anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [24832] = 6, + [24792] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(985), 1, + ACTIONS(973), 1, sym_keyword_as, - ACTIONS(987), 1, + ACTIONS(975), 1, anon_sym_LPAREN, - STATE(353), 2, + STATE(352), 2, sym_comment, sym_marginalia, - ACTIONS(983), 20, + ACTIONS(971), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33193,19 +33230,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24871] = 6, + [24831] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(991), 1, + ACTIONS(979), 1, sym_keyword_as, - ACTIONS(993), 1, + ACTIONS(981), 1, anon_sym_LPAREN, - STATE(354), 2, + STATE(353), 2, sym_comment, sym_marginalia, - ACTIONS(989), 20, + ACTIONS(977), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33226,19 +33263,23 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24910] = 6, + [24870] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(997), 1, + ACTIONS(840), 1, + anon_sym_LBRACK, + ACTIONS(985), 1, sym_keyword_as, - ACTIONS(999), 1, - anon_sym_LPAREN, - STATE(355), 2, + STATE(350), 1, + aux_sym_array_size_definition_repeat1, + STATE(422), 1, + sym__array_size_definition, + STATE(354), 2, sym_comment, sym_marginalia, - ACTIONS(995), 20, + ACTIONS(983), 18, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33255,23 +33296,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, - sym_keyword_array, - anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24949] = 6, + [24913] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(804), 1, + ACTIONS(944), 1, sym_keyword_as, - ACTIONS(922), 1, + ACTIONS(987), 1, anon_sym_LPAREN, - STATE(356), 2, + STATE(355), 2, sym_comment, sym_marginalia, - ACTIONS(802), 20, + ACTIONS(942), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33292,19 +33331,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [24988] = 6, + [24952] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1003), 1, + ACTIONS(991), 1, sym_keyword_as, - ACTIONS(1005), 1, - anon_sym_LPAREN, - STATE(357), 2, + ACTIONS(993), 1, + sym_keyword_zerofill, + STATE(356), 2, sym_comment, sym_marginalia, - ACTIONS(1001), 20, + ACTIONS(989), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33325,19 +33364,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25027] = 6, + [24991] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(979), 1, + ACTIONS(997), 1, sym_keyword_as, - ACTIONS(1007), 1, - sym_keyword_zerofill, - STATE(358), 2, + STATE(357), 2, sym_comment, sym_marginalia, - ACTIONS(977), 20, + ACTIONS(995), 21, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33356,21 +33393,22 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, sym_keyword_array, anon_sym_LBRACK, + anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [25066] = 6, + [25028] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1011), 1, + ACTIONS(1001), 1, sym_keyword_as, - ACTIONS(1013), 1, + ACTIONS(1003), 1, anon_sym_LPAREN, - STATE(359), 2, + STATE(358), 2, sym_comment, sym_marginalia, - ACTIONS(1009), 20, + ACTIONS(999), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33391,23 +33429,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25105] = 8, + [25067] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(818), 1, - anon_sym_LBRACK, - ACTIONS(1017), 1, + ACTIONS(1007), 1, sym_keyword_as, - STATE(351), 1, - aux_sym_array_size_definition_repeat1, - STATE(418), 1, - sym__array_size_definition, - STATE(360), 2, + STATE(359), 2, sym_comment, sym_marginalia, - ACTIONS(1015), 18, + ACTIONS(1005), 21, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33424,21 +33456,24 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, + anon_sym_LBRACK, + anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [25148] = 6, + [25104] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1021), 1, + ACTIONS(1011), 1, sym_keyword_as, - ACTIONS(1023), 1, - anon_sym_LPAREN, - STATE(361), 2, + ACTIONS(1013), 1, + sym_keyword_zerofill, + STATE(360), 2, sym_comment, sym_marginalia, - ACTIONS(1019), 20, + ACTIONS(1009), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33459,19 +33494,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25187] = 6, + [25143] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(948), 1, + ACTIONS(1017), 1, sym_keyword_as, - ACTIONS(1025), 1, + ACTIONS(1019), 1, anon_sym_LPAREN, - STATE(362), 2, + STATE(361), 2, sym_comment, sym_marginalia, - ACTIONS(946), 20, + ACTIONS(1015), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33492,17 +33527,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25226] = 5, + [25182] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1029), 1, + ACTIONS(1023), 1, sym_keyword_as, - STATE(363), 2, + ACTIONS(1025), 1, + sym_keyword_zerofill, + STATE(362), 2, sym_comment, sym_marginalia, - ACTIONS(1027), 20, + ACTIONS(1021), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33523,17 +33560,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25262] = 5, + [25221] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1033), 1, + ACTIONS(812), 1, sym_keyword_as, - STATE(364), 2, + ACTIONS(878), 1, + anon_sym_LPAREN, + STATE(363), 2, sym_comment, sym_marginalia, - ACTIONS(1031), 20, + ACTIONS(810), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33554,17 +33593,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25298] = 5, + [25260] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1037), 1, + ACTIONS(1029), 1, sym_keyword_as, - STATE(365), 2, + ACTIONS(1031), 1, + anon_sym_LPAREN, + STATE(364), 2, sym_comment, sym_marginalia, - ACTIONS(1035), 20, + ACTIONS(1027), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33585,17 +33626,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25334] = 5, + [25299] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1041), 1, + ACTIONS(1035), 1, sym_keyword_as, - STATE(366), 2, + ACTIONS(1037), 1, + anon_sym_LPAREN, + STATE(365), 2, sym_comment, sym_marginalia, - ACTIONS(1039), 20, + ACTIONS(1033), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33616,17 +33659,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25370] = 5, + [25338] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1045), 1, + ACTIONS(1041), 1, sym_keyword_as, - STATE(367), 2, + ACTIONS(1043), 1, + anon_sym_LPAREN, + STATE(366), 2, sym_comment, sym_marginalia, - ACTIONS(1043), 20, + ACTIONS(1039), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33647,17 +33692,19 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25406] = 5, + [25377] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1049), 1, + ACTIONS(1047), 1, sym_keyword_as, - STATE(368), 2, + ACTIONS(1049), 1, + anon_sym_LPAREN, + STATE(367), 2, sym_comment, sym_marginalia, - ACTIONS(1047), 20, + ACTIONS(1045), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -33678,14 +33725,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25442] = 5, + [25416] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1053), 1, sym_keyword_as, - STATE(369), 2, + STATE(368), 2, sym_comment, sym_marginalia, ACTIONS(1051), 20, @@ -33709,14 +33756,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25478] = 5, + [25452] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1057), 1, sym_keyword_as, - STATE(370), 2, + STATE(369), 2, sym_comment, sym_marginalia, ACTIONS(1055), 20, @@ -33740,14 +33787,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25514] = 5, + [25488] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1061), 1, sym_keyword_as, - STATE(371), 2, + STATE(370), 2, sym_comment, sym_marginalia, ACTIONS(1059), 20, @@ -33771,14 +33818,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25550] = 5, + [25524] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1065), 1, sym_keyword_as, - STATE(372), 2, + STATE(371), 2, sym_comment, sym_marginalia, ACTIONS(1063), 20, @@ -33802,14 +33849,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25586] = 5, + [25560] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1069), 1, sym_keyword_as, - STATE(373), 2, + STATE(372), 2, sym_comment, sym_marginalia, ACTIONS(1067), 20, @@ -33833,14 +33880,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25622] = 5, + [25596] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1073), 1, sym_keyword_as, - STATE(374), 2, + STATE(373), 2, sym_comment, sym_marginalia, ACTIONS(1071), 20, @@ -33864,14 +33911,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25658] = 5, + [25632] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1077), 1, sym_keyword_as, - STATE(375), 2, + STATE(374), 2, sym_comment, sym_marginalia, ACTIONS(1075), 20, @@ -33895,14 +33942,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25694] = 5, + [25668] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1081), 1, sym_keyword_as, - STATE(376), 2, + STATE(375), 2, sym_comment, sym_marginalia, ACTIONS(1079), 20, @@ -33926,14 +33973,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25730] = 5, + [25704] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1085), 1, sym_keyword_as, - STATE(377), 2, + STATE(376), 2, sym_comment, sym_marginalia, ACTIONS(1083), 20, @@ -33957,14 +34004,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25766] = 5, + [25740] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1089), 1, sym_keyword_as, - STATE(378), 2, + STATE(377), 2, sym_comment, sym_marginalia, ACTIONS(1087), 20, @@ -33988,14 +34035,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25802] = 5, + [25776] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1093), 1, sym_keyword_as, - STATE(379), 2, + STATE(378), 2, sym_comment, sym_marginalia, ACTIONS(1091), 20, @@ -34019,14 +34066,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25838] = 5, + [25812] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1097), 1, sym_keyword_as, - STATE(380), 2, + STATE(379), 2, sym_comment, sym_marginalia, ACTIONS(1095), 20, @@ -34050,45 +34097,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25874] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(792), 1, - sym_keyword_as, - STATE(381), 2, - sym_comment, - sym_marginalia, - ACTIONS(790), 20, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_primary, - sym_keyword_not, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_collate, - sym_keyword_default, - sym_keyword_cascade, - sym_keyword_restrict, - sym_keyword_first, - sym_keyword_after, - sym_keyword_comment, - sym_keyword_null, - sym_keyword_array, - anon_sym_LBRACK, - anon_sym_RPAREN, - anon_sym_COMMA, - [25910] = 5, + [25848] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1101), 1, sym_keyword_as, - STATE(382), 2, + STATE(380), 2, sym_comment, sym_marginalia, ACTIONS(1099), 20, @@ -34112,14 +34128,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25946] = 5, + [25884] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1105), 1, sym_keyword_as, - STATE(383), 2, + STATE(381), 2, sym_comment, sym_marginalia, ACTIONS(1103), 20, @@ -34143,14 +34159,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [25982] = 5, + [25920] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1109), 1, sym_keyword_as, - STATE(384), 2, + STATE(382), 2, sym_comment, sym_marginalia, ACTIONS(1107), 20, @@ -34174,14 +34190,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26018] = 5, + [25956] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1113), 1, sym_keyword_as, - STATE(385), 2, + STATE(383), 2, sym_comment, sym_marginalia, ACTIONS(1111), 20, @@ -34205,14 +34221,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26054] = 5, + [25992] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1117), 1, sym_keyword_as, - STATE(386), 2, + STATE(384), 2, sym_comment, sym_marginalia, ACTIONS(1115), 20, @@ -34236,14 +34252,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26090] = 5, + [26028] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1121), 1, sym_keyword_as, - STATE(387), 2, + STATE(385), 2, sym_comment, sym_marginalia, ACTIONS(1119), 20, @@ -34267,14 +34283,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26126] = 5, + [26064] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1125), 1, sym_keyword_as, - STATE(388), 2, + STATE(386), 2, sym_comment, sym_marginalia, ACTIONS(1123), 20, @@ -34298,14 +34314,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26162] = 5, + [26100] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1129), 1, sym_keyword_as, - STATE(389), 2, + STATE(387), 2, sym_comment, sym_marginalia, ACTIONS(1127), 20, @@ -34329,14 +34345,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26198] = 5, + [26136] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1133), 1, sym_keyword_as, - STATE(390), 2, + STATE(388), 2, sym_comment, sym_marginalia, ACTIONS(1131), 20, @@ -34360,17 +34376,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26234] = 5, + [26172] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1137), 1, + ACTIONS(916), 1, sym_keyword_as, - STATE(391), 2, + STATE(389), 2, sym_comment, sym_marginalia, - ACTIONS(1135), 20, + ACTIONS(914), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34391,17 +34407,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26270] = 5, + [26208] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1141), 1, + ACTIONS(991), 1, sym_keyword_as, - STATE(392), 2, + STATE(390), 2, sym_comment, sym_marginalia, - ACTIONS(1139), 20, + ACTIONS(989), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34422,17 +34438,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26306] = 5, + [26244] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(948), 1, + ACTIONS(1011), 1, sym_keyword_as, - STATE(393), 2, + STATE(391), 2, sym_comment, sym_marginalia, - ACTIONS(946), 20, + ACTIONS(1009), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34453,17 +34469,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26342] = 5, + [26280] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(804), 1, + ACTIONS(1137), 1, sym_keyword_as, - STATE(394), 2, + STATE(392), 2, sym_comment, sym_marginalia, - ACTIONS(802), 20, + ACTIONS(1135), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34484,17 +34500,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26378] = 5, + [26316] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1145), 1, + ACTIONS(1023), 1, sym_keyword_as, - STATE(395), 2, + STATE(393), 2, sym_comment, sym_marginalia, - ACTIONS(1143), 20, + ACTIONS(1021), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34515,21 +34531,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26414] = 7, + [26352] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(818), 1, - anon_sym_LBRACK, - ACTIONS(1149), 1, + ACTIONS(1141), 1, sym_keyword_as, - STATE(419), 1, - sym__array_size_definition, - STATE(396), 2, + STATE(394), 2, sym_comment, sym_marginalia, - ACTIONS(1147), 18, + ACTIONS(1139), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34546,19 +34558,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, + anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26454] = 5, + [26388] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1153), 1, + ACTIONS(1145), 1, sym_keyword_as, - STATE(397), 2, + STATE(395), 2, sym_comment, sym_marginalia, - ACTIONS(1151), 20, + ACTIONS(1143), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34579,17 +34593,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26490] = 5, + [26424] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(904), 1, + ACTIONS(1149), 1, sym_keyword_as, - STATE(398), 2, + STATE(396), 2, sym_comment, sym_marginalia, - ACTIONS(902), 20, + ACTIONS(1147), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34610,17 +34624,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26526] = 5, + [26460] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1157), 1, + ACTIONS(1153), 1, sym_keyword_as, - STATE(399), 2, + STATE(397), 2, sym_comment, sym_marginalia, - ACTIONS(1155), 20, + ACTIONS(1151), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34641,17 +34655,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26562] = 5, + [26496] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(960), 1, + ACTIONS(1157), 1, sym_keyword_as, - STATE(400), 2, + STATE(398), 2, sym_comment, sym_marginalia, - ACTIONS(958), 20, + ACTIONS(1155), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34672,14 +34686,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26598] = 5, + [26532] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1161), 1, sym_keyword_as, - STATE(401), 2, + STATE(399), 2, sym_comment, sym_marginalia, ACTIONS(1159), 20, @@ -34703,14 +34717,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26634] = 5, + [26568] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1165), 1, sym_keyword_as, - STATE(402), 2, + STATE(400), 2, sym_comment, sym_marginalia, ACTIONS(1163), 20, @@ -34734,45 +34748,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26670] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(936), 1, - sym_keyword_as, - STATE(403), 2, - sym_comment, - sym_marginalia, - ACTIONS(934), 20, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_primary, - sym_keyword_not, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_collate, - sym_keyword_default, - sym_keyword_cascade, - sym_keyword_restrict, - sym_keyword_first, - sym_keyword_after, - sym_keyword_comment, - sym_keyword_null, - sym_keyword_array, - anon_sym_LBRACK, - anon_sym_RPAREN, - anon_sym_COMMA, - [26706] = 5, + [26604] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1169), 1, sym_keyword_as, - STATE(404), 2, + STATE(401), 2, sym_comment, sym_marginalia, ACTIONS(1167), 20, @@ -34796,17 +34779,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26742] = 5, + [26640] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(979), 1, + ACTIONS(1173), 1, sym_keyword_as, - STATE(405), 2, + STATE(402), 2, sym_comment, sym_marginalia, - ACTIONS(977), 20, + ACTIONS(1171), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34827,17 +34810,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26778] = 5, + [26676] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1173), 1, + ACTIONS(1177), 1, sym_keyword_as, - STATE(406), 2, + STATE(403), 2, sym_comment, sym_marginalia, - ACTIONS(1171), 20, + ACTIONS(1175), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34858,17 +34841,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26814] = 5, + [26712] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1177), 1, + ACTIONS(1181), 1, sym_keyword_as, - STATE(407), 2, + STATE(404), 2, sym_comment, sym_marginalia, - ACTIONS(1175), 20, + ACTIONS(1179), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34889,17 +34872,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26850] = 5, + [26748] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1181), 1, + ACTIONS(792), 1, sym_keyword_as, - STATE(408), 2, + STATE(405), 2, sym_comment, sym_marginalia, - ACTIONS(1179), 20, + ACTIONS(790), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -34920,14 +34903,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26886] = 5, + [26784] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1185), 1, sym_keyword_as, - STATE(409), 2, + STATE(406), 2, sym_comment, sym_marginalia, ACTIONS(1183), 20, @@ -34951,14 +34934,14 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26922] = 5, + [26820] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, ACTIONS(1189), 1, sym_keyword_as, - STATE(410), 2, + STATE(407), 2, sym_comment, sym_marginalia, ACTIONS(1187), 20, @@ -34982,17 +34965,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26958] = 5, + [26856] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(966), 1, + ACTIONS(1193), 1, sym_keyword_as, - STATE(411), 2, + STATE(408), 2, sym_comment, sym_marginalia, - ACTIONS(964), 20, + ACTIONS(1191), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35013,17 +34996,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [26994] = 5, + [26892] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1193), 1, + ACTIONS(1197), 1, sym_keyword_as, - STATE(412), 2, + STATE(409), 2, sym_comment, sym_marginalia, - ACTIONS(1191), 20, + ACTIONS(1195), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35044,17 +35027,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27030] = 5, + [26928] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1197), 1, + ACTIONS(1201), 1, sym_keyword_as, - STATE(413), 2, + STATE(410), 2, sym_comment, sym_marginalia, - ACTIONS(1195), 20, + ACTIONS(1199), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35075,17 +35058,17 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27066] = 5, + [26964] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1201), 1, + ACTIONS(1205), 1, sym_keyword_as, - STATE(414), 2, + STATE(411), 2, sym_comment, sym_marginalia, - ACTIONS(1199), 19, + ACTIONS(1203), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35102,20 +35085,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27101] = 5, + [27000] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1205), 1, + ACTIONS(944), 1, sym_keyword_as, - STATE(415), 2, + STATE(412), 2, sym_comment, sym_marginalia, - ACTIONS(1203), 19, + ACTIONS(942), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35132,96 +35116,116 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27136] = 22, + [27036] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1209), 1, - sym_keyword_set, - ACTIONS(1211), 1, - sym_keyword_in, - ACTIONS(1213), 1, - aux_sym_keyword_with_token1, - ACTIONS(1215), 1, - sym_keyword_rename, - ACTIONS(1217), 1, - sym_keyword_password, - ACTIONS(1219), 1, - sym_keyword_encrypted, - ACTIONS(1221), 1, - sym_keyword_valid, - ACTIONS(1223), 1, - sym_keyword_connection, - ACTIONS(1225), 1, - sym_keyword_reset, - STATE(4), 1, - sym__double_quote_string, - STATE(577), 1, - sym_keyword_with, - STATE(584), 1, - aux_sym_alter_role_repeat1, - STATE(619), 1, - sym_identifier, - STATE(621), 1, - sym__role_options, - STATE(1166), 1, - sym_rename_object, - ACTIONS(1207), 2, + ACTIONS(812), 1, + sym_keyword_as, + STATE(413), 2, + sym_comment, + sym_marginalia, + ACTIONS(810), 20, ts_builtin_sym_end, anon_sym_SEMI, - STATE(416), 2, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_collate, + sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + sym_keyword_array, + anon_sym_LBRACK, + anon_sym_RPAREN, + anon_sym_COMMA, + [27072] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(840), 1, + anon_sym_LBRACK, + ACTIONS(1209), 1, + sym_keyword_as, + STATE(424), 1, + sym__array_size_definition, + STATE(414), 2, sym_comment, sym_marginalia, - [27205] = 4, + ACTIONS(1207), 18, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_collate, + sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [27112] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(417), 2, + ACTIONS(1213), 1, + sym_keyword_as, + STATE(415), 2, sym_comment, sym_marginalia, - ACTIONS(181), 20, + ACTIONS(1211), 20, ts_builtin_sym_end, - sym_keyword_select, - sym_keyword_delete, - sym_keyword_insert, - sym_keyword_copy, - sym_keyword_update, - sym_keyword_truncate, - sym_keyword_merge, - sym_keyword_create, - sym_keyword_alter, - sym_keyword_analyze, - sym_keyword_explain, - sym_keyword_drop, - sym_keyword_rename, - sym_keyword_begin, - sym_keyword_commit, - sym_keyword_rollback, - sym_keyword_vacuum, - sym_keyword_compute, - sym_keyword_optimize, - [27238] = 5, + anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_collate, + sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + sym_keyword_array, + anon_sym_LBRACK, + anon_sym_RPAREN, + anon_sym_COMMA, + [27148] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1229), 1, + ACTIONS(950), 1, sym_keyword_as, - STATE(418), 2, + STATE(416), 2, sym_comment, sym_marginalia, - ACTIONS(1227), 19, + ACTIONS(948), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35238,20 +35242,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27273] = 5, + [27184] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1233), 1, + ACTIONS(1217), 1, sym_keyword_as, - STATE(419), 2, + STATE(417), 2, sym_comment, sym_marginalia, - ACTIONS(1231), 18, + ACTIONS(1215), 20, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35268,19 +35273,50 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + sym_keyword_array, + anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27307] = 5, + [27220] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1237), 1, + STATE(418), 2, + sym_comment, + sym_marginalia, + ACTIONS(183), 20, + ts_builtin_sym_end, + sym_keyword_select, + sym_keyword_delete, + sym_keyword_insert, + sym_keyword_copy, + sym_keyword_update, + sym_keyword_truncate, + sym_keyword_merge, + sym_keyword_create, + sym_keyword_alter, + sym_keyword_analyze, + sym_keyword_explain, + sym_keyword_drop, + sym_keyword_rename, + sym_keyword_begin, + sym_keyword_commit, + sym_keyword_rollback, + sym_keyword_vacuum, + sym_keyword_compute, + sym_keyword_optimize, + [27253] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1221), 1, sym_keyword_as, - STATE(420), 2, + STATE(419), 2, sym_comment, sym_marginalia, - ACTIONS(1235), 18, + ACTIONS(1219), 19, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35297,23 +35333,20 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_after, sym_keyword_comment, sym_keyword_null, + anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27341] = 7, + [27288] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1241), 1, + ACTIONS(1225), 1, sym_keyword_as, - ACTIONS(1243), 1, - sym_keyword_filter, - STATE(464), 1, - sym_filter_expression, - STATE(421), 2, + STATE(420), 2, sym_comment, sym_marginalia, - ACTIONS(1239), 15, + ACTIONS(1223), 19, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35322,28 +35355,75 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, sym_keyword_auto_increment, sym_keyword_generated, + sym_keyword_collate, sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, sym_keyword_first, sym_keyword_after, sym_keyword_comment, sym_keyword_null, + anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27378] = 7, + [27323] = 22, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1229), 1, + sym_keyword_set, + ACTIONS(1231), 1, + sym_keyword_in, + ACTIONS(1233), 1, + aux_sym_keyword_with_token1, + ACTIONS(1235), 1, + sym_keyword_rename, + ACTIONS(1237), 1, + sym_keyword_password, + ACTIONS(1239), 1, + sym_keyword_encrypted, + ACTIONS(1241), 1, + sym_keyword_valid, ACTIONS(1243), 1, - sym_keyword_filter, - ACTIONS(1247), 1, + sym_keyword_connection, + ACTIONS(1245), 1, + sym_keyword_reset, + STATE(3), 1, + sym__double_quote_string, + STATE(586), 1, + sym_keyword_with, + STATE(596), 1, + aux_sym_alter_role_repeat1, + STATE(627), 1, + sym__role_options, + STATE(632), 1, + sym_identifier, + STATE(1217), 1, + sym_rename_object, + ACTIONS(1227), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(421), 2, + sym_comment, + sym_marginalia, + [27392] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1249), 1, sym_keyword_as, - STATE(475), 1, - sym_filter_expression, STATE(422), 2, sym_comment, sym_marginalia, - ACTIONS(1245), 15, + ACTIONS(1247), 19, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35352,28 +35432,28 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, sym_keyword_auto_increment, sym_keyword_generated, + sym_keyword_collate, sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, sym_keyword_first, sym_keyword_after, sym_keyword_comment, sym_keyword_null, + anon_sym_LBRACK, anon_sym_RPAREN, anon_sym_COMMA, - [27415] = 7, + [27427] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, - sym_keyword_filter, - ACTIONS(1251), 1, + ACTIONS(1253), 1, sym_keyword_as, - STATE(473), 1, - sym_filter_expression, STATE(423), 2, sym_comment, sym_marginalia, - ACTIONS(1249), 15, + ACTIONS(1251), 18, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35382,28 +35462,27 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, sym_keyword_auto_increment, sym_keyword_generated, + sym_keyword_collate, sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, sym_keyword_first, sym_keyword_after, sym_keyword_comment, sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27452] = 7, + [27461] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, - sym_keyword_filter, - ACTIONS(1255), 1, + ACTIONS(1257), 1, sym_keyword_as, - STATE(483), 1, - sym_filter_expression, STATE(424), 2, sym_comment, sym_marginalia, - ACTIONS(1253), 15, + ACTIONS(1255), 18, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35412,28 +35491,31 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_not, sym_keyword_auto_increment, sym_keyword_generated, + sym_keyword_collate, sym_keyword_default, + sym_keyword_cascade, + sym_keyword_restrict, sym_keyword_first, sym_keyword_after, sym_keyword_comment, sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27489] = 7, + [27495] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, - sym_keyword_filter, - ACTIONS(1259), 1, + ACTIONS(1261), 1, sym_keyword_as, - STATE(488), 1, + ACTIONS(1263), 1, + sym_keyword_filter, + STATE(474), 1, sym_filter_expression, STATE(425), 2, sym_comment, sym_marginalia, - ACTIONS(1257), 15, + ACTIONS(1259), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35449,21 +35531,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27526] = 7, + [27532] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, - sym_keyword_filter, ACTIONS(1263), 1, + sym_keyword_filter, + ACTIONS(1267), 1, sym_keyword_as, - STATE(474), 1, + STATE(470), 1, sym_filter_expression, STATE(426), 2, sym_comment, sym_marginalia, - ACTIONS(1261), 15, + ACTIONS(1265), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35479,21 +35561,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27563] = 7, + [27569] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, - ACTIONS(1267), 1, + ACTIONS(1271), 1, sym_keyword_as, - STATE(462), 1, + STATE(467), 1, sym_filter_expression, STATE(427), 2, sym_comment, sym_marginalia, - ACTIONS(1265), 15, + ACTIONS(1269), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35509,21 +35591,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27600] = 7, + [27606] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, - ACTIONS(1271), 1, + ACTIONS(1275), 1, sym_keyword_as, - STATE(484), 1, + STATE(468), 1, sym_filter_expression, STATE(428), 2, sym_comment, sym_marginalia, - ACTIONS(1269), 15, + ACTIONS(1273), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35539,47 +35621,46 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27637] = 8, + [27643] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1273), 1, - sym_keyword_unsigned, - ACTIONS(1275), 1, - sym_keyword_zerofill, - ACTIONS(1277), 1, - sym_keyword_precision, + ACTIONS(1263), 1, + sym_keyword_filter, ACTIONS(1279), 1, - anon_sym_LPAREN, + sym_keyword_as, + STATE(472), 1, + sym_filter_expression, STATE(429), 2, sym_comment, sym_marginalia, - ACTIONS(790), 14, + ACTIONS(1277), 15, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [27676] = 7, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [27680] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1283), 1, sym_keyword_as, - STATE(489), 1, + STATE(456), 1, sym_filter_expression, STATE(430), 2, sym_comment, @@ -35600,16 +35681,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27713] = 7, + [27717] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1287), 1, sym_keyword_as, - STATE(476), 1, + STATE(458), 1, sym_filter_expression, STATE(431), 2, sym_comment, @@ -35630,16 +35711,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27750] = 7, + [27754] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1291), 1, sym_keyword_as, - STATE(466), 1, + STATE(461), 1, sym_filter_expression, STATE(432), 2, sym_comment, @@ -35660,16 +35741,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27787] = 7, + [27791] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1295), 1, sym_keyword_as, - STATE(467), 1, + STATE(462), 1, sym_filter_expression, STATE(433), 2, sym_comment, @@ -35690,16 +35771,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27824] = 7, + [27828] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1299), 1, sym_keyword_as, - STATE(450), 1, + STATE(466), 1, sym_filter_expression, STATE(434), 2, sym_comment, @@ -35720,16 +35801,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27861] = 7, + [27865] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1303), 1, sym_keyword_as, - STATE(454), 1, + STATE(463), 1, sym_filter_expression, STATE(435), 2, sym_comment, @@ -35750,16 +35831,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27898] = 7, + [27902] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1307), 1, sym_keyword_as, - STATE(455), 1, + STATE(479), 1, sym_filter_expression, STATE(436), 2, sym_comment, @@ -35780,16 +35861,16 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27935] = 7, + [27939] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, ACTIONS(1311), 1, sym_keyword_as, - STATE(461), 1, + STATE(480), 1, sym_filter_expression, STATE(437), 2, sym_comment, @@ -35810,65 +35891,126 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [27972] = 21, + [27976] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1263), 1, + sym_keyword_filter, + ACTIONS(1315), 1, + sym_keyword_as, + STATE(486), 1, + sym_filter_expression, + STATE(438), 2, + sym_comment, + sym_marginalia, + ACTIONS(1313), 15, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [28013] = 8, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1317), 1, + sym_keyword_unsigned, + ACTIONS(1319), 1, + sym_keyword_zerofill, + ACTIONS(1321), 1, + sym_keyword_precision, + ACTIONS(1323), 1, + anon_sym_LPAREN, + STATE(439), 2, + sym_comment, + sym_marginalia, + ACTIONS(790), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [28052] = 21, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(535), 1, + ACTIONS(527), 1, sym_keyword_null, - ACTIONS(537), 1, + ACTIONS(529), 1, sym_keyword_true, - ACTIONS(539), 1, + ACTIONS(531), 1, sym_keyword_false, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(1313), 1, + ACTIONS(1325), 1, sym_keyword_default, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(1143), 1, + STATE(1281), 1, sym_literal, - STATE(1144), 1, + STATE(1282), 1, sym_identifier, - STATE(438), 2, + STATE(440), 2, sym_comment, sym_marginalia, - [28037] = 7, + [28117] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, - ACTIONS(1317), 1, + ACTIONS(1329), 1, sym_keyword_as, - STATE(479), 1, + STATE(454), 1, sym_filter_expression, - STATE(439), 2, + STATE(441), 2, sym_comment, sym_marginalia, - ACTIONS(1315), 15, + ACTIONS(1327), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35884,21 +36026,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28074] = 7, + [28154] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, - ACTIONS(1321), 1, + ACTIONS(1333), 1, sym_keyword_as, - STATE(465), 1, + STATE(489), 1, sym_filter_expression, - STATE(440), 2, + STATE(442), 2, sym_comment, sym_marginalia, - ACTIONS(1319), 15, + ACTIONS(1331), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35914,21 +36056,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28111] = 7, + [28191] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1243), 1, + ACTIONS(1263), 1, sym_keyword_filter, - ACTIONS(1325), 1, + ACTIONS(1337), 1, sym_keyword_as, - STATE(468), 1, + STATE(485), 1, sym_filter_expression, - STATE(441), 2, + STATE(443), 2, sym_comment, sym_marginalia, - ACTIONS(1323), 15, + ACTIONS(1335), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -35944,132 +36086,77 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28148] = 9, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1327), 1, - sym_keyword_array, - ACTIONS(1329), 1, - anon_sym_LBRACK, - STATE(509), 1, - aux_sym_array_size_definition_repeat1, - STATE(589), 1, - sym__array_size_definition, - STATE(604), 1, - sym_array_size_definition, - STATE(442), 2, - sym_comment, - sym_marginalia, - ACTIONS(812), 12, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - [28188] = 7, + [28228] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1273), 1, - sym_keyword_unsigned, - ACTIONS(1275), 1, - sym_keyword_zerofill, - ACTIONS(1279), 1, - anon_sym_LPAREN, - STATE(443), 2, - sym_comment, - sym_marginalia, - ACTIONS(790), 14, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, + ACTIONS(1263), 1, + sym_keyword_filter, + ACTIONS(1341), 1, sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [28224] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1331), 1, - sym_keyword_unsigned, - ACTIONS(1333), 1, - sym_keyword_zerofill, - ACTIONS(1335), 1, - anon_sym_LPAREN, + STATE(496), 1, + sym_filter_expression, STATE(444), 2, sym_comment, sym_marginalia, - ACTIONS(824), 14, + ACTIONS(1339), 15, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [28260] = 4, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [28265] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1263), 1, + sym_keyword_filter, + ACTIONS(1345), 1, + sym_keyword_as, + STATE(488), 1, + sym_filter_expression, STATE(445), 2, sym_comment, sym_marginalia, - ACTIONS(820), 17, + ACTIONS(1343), 15, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_unsigned, - sym_keyword_zerofill, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - anon_sym_LPAREN, - [28290] = 5, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [28302] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1339), 1, + ACTIONS(1349), 1, sym_keyword_as, STATE(446), 2, sym_comment, sym_marginalia, - ACTIONS(1337), 16, + ACTIONS(1347), 16, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36086,7 +36173,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LPAREN, anon_sym_RPAREN, anon_sym_COMMA, - [28322] = 18, + [28334] = 18, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -36095,27 +36182,27 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_primary, ACTIONS(65), 1, sym_keyword_constraint, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(978), 1, + STATE(975), 1, sym__constraint_literal, - STATE(979), 1, + STATE(976), 1, sym_primary_key_constraint, - STATE(980), 1, + STATE(977), 1, sym__key_constraint, - STATE(1040), 1, + STATE(1103), 1, sym_constraint, - STATE(1260), 1, + STATE(1229), 1, sym__primary_key, - STATE(1307), 1, + STATE(1277), 1, sym_column_definition, ACTIONS(63), 2, sym_keyword_key, @@ -36126,21 +36213,15 @@ static const uint16_t ts_small_parse_table[] = { STATE(447), 2, sym_comment, sym_marginalia, - [28380] = 7, + [28392] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1341), 1, - sym_keyword_unsigned, - ACTIONS(1343), 1, - sym_keyword_zerofill, - ACTIONS(1345), 1, - anon_sym_LPAREN, STATE(448), 2, sym_comment, sym_marginalia, - ACTIONS(802), 14, + ACTIONS(830), 17, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -36152,74 +36233,84 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_as, sym_keyword_no, sym_keyword_cycle, + sym_keyword_unsigned, + sym_keyword_zerofill, sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [28416] = 5, + anon_sym_LPAREN, + [28422] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1349), 1, - sym_keyword_as, + ACTIONS(1351), 1, + sym_keyword_unsigned, + ACTIONS(1353), 1, + sym_keyword_zerofill, + ACTIONS(1355), 1, + anon_sym_LPAREN, STATE(449), 2, sym_comment, sym_marginalia, - ACTIONS(1347), 15, + ACTIONS(820), 14, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_primary, - sym_keyword_not, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_default, - sym_keyword_first, - sym_keyword_after, - sym_keyword_comment, - sym_keyword_null, - anon_sym_RPAREN, - anon_sym_COMMA, - [28447] = 5, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [28458] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1321), 1, - sym_keyword_as, + ACTIONS(1357), 1, + aux_sym_keyword_with_token1, + ACTIONS(1359), 1, + aux_sym_keyword_timestamp_base_token2, STATE(450), 2, sym_comment, sym_marginalia, - ACTIONS(1319), 15, + ACTIONS(802), 15, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_primary, - sym_keyword_not, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_default, - sym_keyword_first, - sym_keyword_after, - sym_keyword_comment, - sym_keyword_null, - anon_sym_RPAREN, - anon_sym_COMMA, - [28478] = 6, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + anon_sym_LPAREN, + [28492] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1351), 1, + ACTIONS(1317), 1, sym_keyword_unsigned, - ACTIONS(1353), 1, + ACTIONS(1319), 1, sym_keyword_zerofill, + ACTIONS(1323), 1, + anon_sym_LPAREN, STATE(451), 2, sym_comment, sym_marginalia, - ACTIONS(860), 14, + ACTIONS(790), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -36234,19 +36325,25 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [28511] = 6, + [28528] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1355), 1, - sym_keyword_unsigned, - ACTIONS(1357), 1, - sym_keyword_zerofill, + ACTIONS(1361), 1, + sym_keyword_array, + ACTIONS(1363), 1, + anon_sym_LBRACK, + STATE(519), 1, + aux_sym_array_size_definition_repeat1, + STATE(587), 1, + sym__array_size_definition, + STATE(612), 1, + sym_array_size_definition, STATE(452), 2, sym_comment, sym_marginalia, - ACTIONS(894), 14, + ACTIONS(834), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -36259,21 +36356,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [28544] = 6, + [28568] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1359), 1, + ACTIONS(1365), 1, sym_keyword_unsigned, - ACTIONS(1361), 1, + ACTIONS(1367), 1, sym_keyword_zerofill, + ACTIONS(1369), 1, + anon_sym_LPAREN, STATE(453), 2, sym_comment, sym_marginalia, - ACTIONS(902), 14, + ACTIONS(810), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -36288,17 +36385,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [28577] = 5, + [28604] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1365), 1, + ACTIONS(1373), 1, sym_keyword_as, STATE(454), 2, sym_comment, sym_marginalia, - ACTIONS(1363), 15, + ACTIONS(1371), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36314,17 +36411,43 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28608] = 5, + [28635] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1369), 1, - sym_keyword_as, STATE(455), 2, sym_comment, sym_marginalia, - ACTIONS(1367), 15, + ACTIONS(1375), 5, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_DQUOTE, + sym_natural_number, + anon_sym_BQUOTE, + ACTIONS(1377), 11, + sym_keyword_set, + sym_keyword_force, + sym_keyword_rename, + sym_keyword_owner, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, + sym_keyword_reset, + anon_sym_DASH, + sym__identifier, + [28666] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1381), 1, + sym_keyword_as, + STATE(456), 2, + sym_comment, + sym_marginalia, + ACTIONS(1379), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36340,17 +36463,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28639] = 5, + [28697] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1373), 1, + ACTIONS(1385), 1, sym_keyword_as, - STATE(456), 2, + STATE(457), 2, sym_comment, sym_marginalia, - ACTIONS(1371), 15, + ACTIONS(1383), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36366,17 +36489,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28670] = 5, + [28728] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1377), 1, + ACTIONS(1337), 1, sym_keyword_as, - STATE(457), 2, + STATE(458), 2, sym_comment, sym_marginalia, - ACTIONS(1375), 15, + ACTIONS(1335), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36392,43 +36515,43 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28701] = 5, + [28759] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(458), 2, + ACTIONS(1389), 1, + sym_keyword_as, + STATE(459), 2, sym_comment, sym_marginalia, - ACTIONS(1379), 5, + ACTIONS(1387), 15, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_DQUOTE, - sym_natural_number, - anon_sym_BQUOTE, - ACTIONS(1381), 11, - sym_keyword_set, - sym_keyword_force, - sym_keyword_rename, - sym_keyword_owner, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym_keyword_reset, - anon_sym_DASH, - sym__identifier, - [28732] = 5, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [28790] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1385), 1, + ACTIONS(1393), 1, sym_keyword_as, - STATE(459), 2, + STATE(460), 2, sym_comment, sym_marginalia, - ACTIONS(1383), 15, + ACTIONS(1391), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36444,17 +36567,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28763] = 5, + [28821] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1389), 1, + ACTIONS(1397), 1, sym_keyword_as, - STATE(460), 2, + STATE(461), 2, sym_comment, sym_marginalia, - ACTIONS(1387), 15, + ACTIONS(1395), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36470,17 +36593,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28794] = 5, + [28852] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1291), 1, + ACTIONS(1401), 1, sym_keyword_as, - STATE(461), 2, + STATE(462), 2, sym_comment, sym_marginalia, - ACTIONS(1289), 15, + ACTIONS(1399), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36496,17 +36619,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28825] = 5, + [28883] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1393), 1, + ACTIONS(1329), 1, sym_keyword_as, - STATE(462), 2, + STATE(463), 2, sym_comment, sym_marginalia, - ACTIONS(1391), 15, + ACTIONS(1327), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36522,56 +36645,83 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28856] = 18, + [28914] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1395), 1, - sym_keyword_set, - ACTIONS(1397), 1, + ACTIONS(1403), 1, + sym_keyword_varying, + ACTIONS(1405), 1, + anon_sym_LPAREN, + STATE(464), 2, + sym_comment, + sym_marginalia, + ACTIONS(880), 14, + ts_builtin_sym_end, + anon_sym_SEMI, sym_keyword_increment, - ACTIONS(1399), 1, sym_keyword_minvalue, - ACTIONS(1401), 1, sym_keyword_maxvalue, - ACTIONS(1403), 1, sym_keyword_owned, - ACTIONS(1405), 1, sym_keyword_start, - ACTIONS(1407), 1, sym_keyword_restart, - ACTIONS(1409), 1, sym_keyword_as, - ACTIONS(1411), 1, sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [28947] = 18, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1407), 1, + sym_keyword_set, + ACTIONS(1409), 1, + sym_keyword_increment, + ACTIONS(1411), 1, + sym_keyword_minvalue, ACTIONS(1413), 1, - sym_keyword_rename, + sym_keyword_maxvalue, ACTIONS(1415), 1, - sym_keyword_owner, + sym_keyword_owned, ACTIONS(1417), 1, - sym_keyword_cycle, + sym_keyword_start, ACTIONS(1419), 1, + sym_keyword_restart, + ACTIONS(1421), 1, + sym_keyword_as, + ACTIONS(1423), 1, + sym_keyword_no, + ACTIONS(1425), 1, + sym_keyword_rename, + ACTIONS(1427), 1, + sym_keyword_owner, + ACTIONS(1429), 1, + sym_keyword_cycle, + ACTIONS(1431), 1, sym_keyword_cache, - STATE(588), 1, + STATE(593), 1, aux_sym_alter_sequence_repeat1, - STATE(463), 2, + STATE(465), 2, sym_comment, sym_marginalia, - STATE(1296), 2, + STATE(1304), 2, sym_rename_object, sym_change_ownership, - [28913] = 5, + [29004] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1283), 1, + ACTIONS(1261), 1, sym_keyword_as, - STATE(464), 2, + STATE(466), 2, sym_comment, sym_marginalia, - ACTIONS(1281), 15, + ACTIONS(1259), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36587,17 +36737,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28944] = 5, + [29035] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1423), 1, + ACTIONS(1279), 1, sym_keyword_as, - STATE(465), 2, + STATE(467), 2, sym_comment, sym_marginalia, - ACTIONS(1421), 15, + ACTIONS(1277), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36613,17 +36763,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [28975] = 5, + [29066] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1427), 1, + ACTIONS(1435), 1, sym_keyword_as, - STATE(466), 2, + STATE(468), 2, sym_comment, sym_marginalia, - ACTIONS(1425), 15, + ACTIONS(1433), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36639,17 +36789,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29006] = 5, + [29097] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1251), 1, + ACTIONS(1439), 1, sym_keyword_as, - STATE(467), 2, + STATE(469), 2, sym_comment, sym_marginalia, - ACTIONS(1249), 15, + ACTIONS(1437), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36665,17 +36815,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29037] = 5, + [29128] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1255), 1, + ACTIONS(1443), 1, sym_keyword_as, - STATE(468), 2, + STATE(470), 2, sym_comment, sym_marginalia, - ACTIONS(1253), 15, + ACTIONS(1441), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36691,43 +36841,44 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29068] = 5, + [29159] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1431), 1, - sym_keyword_as, - STATE(469), 2, + ACTIONS(1445), 1, + sym_keyword_precision, + ACTIONS(1447), 1, + anon_sym_LPAREN, + STATE(471), 2, sym_comment, sym_marginalia, - ACTIONS(1429), 15, + ACTIONS(810), 14, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_desc, - sym_keyword_asc, - sym_keyword_primary, - sym_keyword_not, - sym_keyword_auto_increment, - sym_keyword_generated, - sym_keyword_default, - sym_keyword_first, - sym_keyword_after, - sym_keyword_comment, - sym_keyword_null, - anon_sym_RPAREN, - anon_sym_COMMA, - [29099] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1435), 1, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, sym_keyword_as, - STATE(470), 2, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [29192] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1307), 1, + sym_keyword_as, + STATE(472), 2, sym_comment, sym_marginalia, - ACTIONS(1433), 15, + ACTIONS(1305), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36743,17 +36894,44 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29130] = 5, + [29223] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1439), 1, + ACTIONS(1449), 1, + sym_keyword_unsigned, + ACTIONS(1451), 1, + sym_keyword_zerofill, + STATE(473), 2, + sym_comment, + sym_marginalia, + ACTIONS(888), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, sym_keyword_as, - STATE(471), 2, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [29256] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1291), 1, + sym_keyword_as, + STATE(474), 2, sym_comment, sym_marginalia, - ACTIONS(1437), 15, + ACTIONS(1289), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36769,17 +36947,83 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29161] = 5, + [29287] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1443), 1, + ACTIONS(1453), 1, + sym_keyword_unsigned, + ACTIONS(1455), 1, + sym_keyword_zerofill, + STATE(475), 2, + sym_comment, + sym_marginalia, + ACTIONS(914), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, sym_keyword_as, - STATE(472), 2, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [29320] = 18, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1409), 1, + sym_keyword_increment, + ACTIONS(1411), 1, + sym_keyword_minvalue, + ACTIONS(1413), 1, + sym_keyword_maxvalue, + ACTIONS(1415), 1, + sym_keyword_owned, + ACTIONS(1417), 1, + sym_keyword_start, + ACTIONS(1419), 1, + sym_keyword_restart, + ACTIONS(1421), 1, + sym_keyword_as, + ACTIONS(1423), 1, + sym_keyword_no, + ACTIONS(1425), 1, + sym_keyword_rename, + ACTIONS(1427), 1, + sym_keyword_owner, + ACTIONS(1429), 1, + sym_keyword_cycle, + ACTIONS(1431), 1, + sym_keyword_cache, + ACTIONS(1457), 1, + sym_keyword_set, + STATE(585), 1, + aux_sym_alter_sequence_repeat1, + STATE(476), 2, sym_comment, sym_marginalia, - ACTIONS(1441), 15, + STATE(1248), 2, + sym_rename_object, + sym_change_ownership, + [29377] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1461), 1, + sym_keyword_as, + STATE(477), 2, + sym_comment, + sym_marginalia, + ACTIONS(1459), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36795,17 +37039,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29192] = 5, + [29408] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1447), 1, + ACTIONS(1465), 1, sym_keyword_as, - STATE(473), 2, + STATE(478), 2, sym_comment, sym_marginalia, - ACTIONS(1445), 15, + ACTIONS(1463), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36821,17 +37065,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29223] = 5, + [29439] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1451), 1, + ACTIONS(1469), 1, sym_keyword_as, - STATE(474), 2, + STATE(479), 2, sym_comment, sym_marginalia, - ACTIONS(1449), 15, + ACTIONS(1467), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36847,17 +37091,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29254] = 5, + [29470] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1307), 1, + ACTIONS(1473), 1, sym_keyword_as, - STATE(475), 2, + STATE(480), 2, sym_comment, sym_marginalia, - ACTIONS(1305), 15, + ACTIONS(1471), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36873,17 +37117,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29285] = 5, + [29501] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1455), 1, + ACTIONS(1477), 1, sym_keyword_as, - STATE(476), 2, + STATE(481), 2, sym_comment, sym_marginalia, - ACTIONS(1453), 15, + ACTIONS(1475), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36899,17 +37143,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29316] = 5, + [29532] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1459), 1, + ACTIONS(1481), 1, sym_keyword_as, - STATE(477), 2, + STATE(482), 2, sym_comment, sym_marginalia, - ACTIONS(1457), 15, + ACTIONS(1479), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36925,56 +37169,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29347] = 18, + [29563] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1397), 1, - sym_keyword_increment, - ACTIONS(1399), 1, - sym_keyword_minvalue, - ACTIONS(1401), 1, - sym_keyword_maxvalue, - ACTIONS(1403), 1, - sym_keyword_owned, - ACTIONS(1405), 1, - sym_keyword_start, - ACTIONS(1407), 1, - sym_keyword_restart, - ACTIONS(1409), 1, - sym_keyword_as, - ACTIONS(1411), 1, - sym_keyword_no, - ACTIONS(1413), 1, - sym_keyword_rename, - ACTIONS(1415), 1, - sym_keyword_owner, - ACTIONS(1417), 1, - sym_keyword_cycle, - ACTIONS(1419), 1, - sym_keyword_cache, - ACTIONS(1461), 1, - sym_keyword_set, - STATE(591), 1, - aux_sym_alter_sequence_repeat1, - STATE(478), 2, - sym_comment, - sym_marginalia, - STATE(1152), 2, - sym_rename_object, - sym_change_ownership, - [29404] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1295), 1, + ACTIONS(1485), 1, sym_keyword_as, - STATE(479), 2, + STATE(483), 2, sym_comment, sym_marginalia, - ACTIONS(1293), 15, + ACTIONS(1483), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -36990,44 +37195,43 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29435] = 6, + [29594] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1463), 1, - aux_sym_keyword_with_token1, - ACTIONS(1465), 1, - aux_sym_keyword_timestamp_token2, - STATE(480), 2, + ACTIONS(1489), 1, + sym_keyword_as, + STATE(484), 2, sym_comment, sym_marginalia, - ACTIONS(886), 14, + ACTIONS(1487), 15, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [29468] = 5, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [29625] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1469), 1, + ACTIONS(1493), 1, sym_keyword_as, - STATE(481), 2, + STATE(485), 2, sym_comment, sym_marginalia, - ACTIONS(1467), 15, + ACTIONS(1491), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37043,17 +37247,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29499] = 5, + [29656] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1473), 1, + ACTIONS(1341), 1, sym_keyword_as, - STATE(482), 2, + STATE(486), 2, sym_comment, sym_marginalia, - ACTIONS(1471), 15, + ACTIONS(1339), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37069,17 +37273,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29530] = 5, + [29687] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1477), 1, + ACTIONS(1497), 1, sym_keyword_as, - STATE(483), 2, + STATE(487), 2, sym_comment, sym_marginalia, - ACTIONS(1475), 15, + ACTIONS(1495), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37095,17 +37299,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29561] = 5, + [29718] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1325), 1, + ACTIONS(1501), 1, sym_keyword_as, - STATE(484), 2, + STATE(488), 2, sym_comment, sym_marginalia, - ACTIONS(1323), 15, + ACTIONS(1499), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37121,17 +37325,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29592] = 5, + [29749] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(519), 1, + ACTIONS(1345), 1, sym_keyword_as, - STATE(485), 2, + STATE(489), 2, sym_comment, sym_marginalia, - ACTIONS(517), 15, + ACTIONS(1343), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37147,17 +37351,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29623] = 5, + [29780] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1481), 1, + ACTIONS(1505), 1, sym_keyword_as, - STATE(486), 2, + STATE(490), 2, sym_comment, sym_marginalia, - ACTIONS(1479), 15, + ACTIONS(1503), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37173,17 +37377,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29654] = 5, + [29811] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1485), 1, + ACTIONS(1509), 1, sym_keyword_as, - STATE(487), 2, + STATE(491), 2, sym_comment, sym_marginalia, - ACTIONS(1483), 15, + ACTIONS(1507), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37199,17 +37403,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29685] = 5, + [29842] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1489), 1, + ACTIONS(1513), 1, sym_keyword_as, - STATE(488), 2, + STATE(492), 2, sym_comment, sym_marginalia, - ACTIONS(1487), 15, + ACTIONS(1511), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37225,17 +37429,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29716] = 5, + [29873] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1493), 1, + ACTIONS(508), 1, sym_keyword_as, - STATE(489), 2, + STATE(493), 2, sym_comment, sym_marginalia, - ACTIONS(1491), 15, + ACTIONS(506), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37251,17 +37455,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29747] = 5, + [29904] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1497), 1, + ACTIONS(1517), 1, sym_keyword_as, - STATE(490), 2, + STATE(494), 2, sym_comment, sym_marginalia, - ACTIONS(1495), 15, + ACTIONS(1515), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37277,44 +37481,43 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29778] = 6, + [29935] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1499), 1, - sym_keyword_precision, - ACTIONS(1501), 1, - anon_sym_LPAREN, - STATE(491), 2, + ACTIONS(1521), 1, + sym_keyword_as, + STATE(495), 2, sym_comment, sym_marginalia, - ACTIONS(802), 14, + ACTIONS(1519), 15, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [29811] = 5, + sym_keyword_desc, + sym_keyword_asc, + sym_keyword_primary, + sym_keyword_not, + sym_keyword_auto_increment, + sym_keyword_generated, + sym_keyword_default, + sym_keyword_first, + sym_keyword_after, + sym_keyword_comment, + sym_keyword_null, + anon_sym_RPAREN, + anon_sym_COMMA, + [29966] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1505), 1, + ACTIONS(1525), 1, sym_keyword_as, - STATE(492), 2, + STATE(496), 2, sym_comment, sym_marginalia, - ACTIONS(1503), 15, + ACTIONS(1523), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_desc, @@ -37330,19 +37533,19 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_null, anon_sym_RPAREN, anon_sym_COMMA, - [29842] = 6, + [29997] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1507), 1, - sym_keyword_varying, - ACTIONS(1509), 1, - anon_sym_LPAREN, - STATE(493), 2, + ACTIONS(1527), 1, + sym_keyword_unsigned, + ACTIONS(1529), 1, + sym_keyword_zerofill, + STATE(497), 2, sym_comment, sym_marginalia, - ACTIONS(912), 14, + ACTIONS(842), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37357,17 +37560,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [29875] = 5, + [30030] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1511), 1, - sym_keyword_zerofill, - STATE(494), 2, + ACTIONS(1531), 1, + anon_sym_LPAREN, + STATE(498), 2, sym_comment, sym_marginalia, - ACTIONS(958), 14, + ACTIONS(977), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37382,17 +37585,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [29905] = 5, + [30060] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1513), 1, + ACTIONS(1533), 1, sym_keyword_zerofill, - STATE(495), 2, + STATE(499), 2, sym_comment, sym_marginalia, - ACTIONS(977), 14, + ACTIONS(1021), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37407,177 +37610,128 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [29935] = 17, + [30090] = 17, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(1515), 1, + ACTIONS(1535), 1, sym_keyword_by, - ACTIONS(1517), 1, + ACTIONS(1537), 1, sym_keyword_null, - ACTIONS(1519), 1, + ACTIONS(1539), 1, sym_keyword_true, - ACTIONS(1521), 1, + ACTIONS(1541), 1, sym_keyword_false, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(603), 1, + STATE(604), 1, sym_literal, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(496), 2, + STATE(500), 2, sym_comment, sym_marginalia, - [29989] = 17, + [30144] = 17, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(1517), 1, + ACTIONS(1537), 1, sym_keyword_null, - ACTIONS(1519), 1, + ACTIONS(1539), 1, sym_keyword_true, - ACTIONS(1521), 1, + ACTIONS(1541), 1, sym_keyword_false, - ACTIONS(1523), 1, + ACTIONS(1543), 1, sym_keyword_no, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(603), 1, + STATE(604), 1, sym_literal, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(497), 2, - sym_comment, - sym_marginalia, - [30043] = 4, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(498), 2, - sym_comment, - sym_marginalia, - ACTIONS(930), 15, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - anon_sym_LPAREN, - [30071] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1525), 1, - sym_keyword_zerofill, - STATE(499), 2, + STATE(501), 2, sym_comment, sym_marginalia, - ACTIONS(934), 14, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [30101] = 17, + [30198] = 17, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(1517), 1, + ACTIONS(1537), 1, sym_keyword_null, - ACTIONS(1519), 1, + ACTIONS(1539), 1, sym_keyword_true, - ACTIONS(1521), 1, + ACTIONS(1541), 1, sym_keyword_false, - ACTIONS(1527), 1, + ACTIONS(1545), 1, sym_keyword_no, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(603), 1, + STATE(604), 1, sym_literal, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(500), 2, + STATE(502), 2, sym_comment, sym_marginalia, - [30155] = 5, + [30252] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1343), 1, - sym_keyword_zerofill, - STATE(501), 2, + ACTIONS(1547), 1, + anon_sym_LPAREN, + STATE(503), 2, sym_comment, sym_marginalia, - ACTIONS(802), 14, + ACTIONS(1027), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37592,17 +37746,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30185] = 5, + [30282] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1529), 1, + ACTIONS(1549), 1, anon_sym_LPAREN, - STATE(502), 2, + STATE(504), 2, sym_comment, sym_marginalia, - ACTIONS(940), 14, + ACTIONS(971), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37617,17 +37771,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30215] = 5, + [30312] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1531), 1, + ACTIONS(1551), 1, anon_sym_LPAREN, - STATE(503), 2, + STATE(505), 2, sym_comment, sym_marginalia, - ACTIONS(983), 14, + ACTIONS(1033), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37642,17 +37796,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30245] = 5, + [30342] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1533), 1, + ACTIONS(1553), 1, anon_sym_LPAREN, - STATE(504), 2, + STATE(506), 2, sym_comment, sym_marginalia, - ACTIONS(989), 14, + ACTIONS(999), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37667,17 +37821,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30275] = 5, + [30372] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1535), 1, + ACTIONS(1555), 1, anon_sym_LPAREN, - STATE(505), 2, + STATE(507), 2, sym_comment, sym_marginalia, - ACTIONS(995), 14, + ACTIONS(1039), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37692,17 +37846,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30305] = 5, + [30402] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1537), 1, + ACTIONS(1557), 1, anon_sym_LPAREN, - STATE(506), 2, + STATE(508), 2, sym_comment, sym_marginalia, - ACTIONS(1001), 14, + ACTIONS(1045), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37717,17 +37871,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30335] = 5, + [30432] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1539), 1, - sym_keyword_zerofill, - STATE(507), 2, + ACTIONS(1559), 1, + anon_sym_LPAREN, + STATE(509), 2, sym_comment, sym_marginalia, - ACTIONS(964), 14, + ACTIONS(924), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37742,20 +37896,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30365] = 6, + [30462] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1541), 1, - anon_sym_LBRACK, - STATE(589), 1, - sym__array_size_definition, - STATE(508), 3, + STATE(510), 2, sym_comment, sym_marginalia, - aux_sym_array_size_definition_repeat1, - ACTIONS(970), 12, + ACTIONS(995), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37768,21 +37917,18 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [30397] = 7, + sym_keyword_array, + anon_sym_LBRACK, + anon_sym_LPAREN, + [30490] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1329), 1, - anon_sym_LBRACK, - STATE(508), 1, - aux_sym_array_size_definition_repeat1, - STATE(589), 1, - sym__array_size_definition, - STATE(509), 2, + STATE(511), 2, sym_comment, sym_marginalia, - ACTIONS(1015), 12, + ACTIONS(956), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37795,17 +37941,20 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [30431] = 5, + sym_keyword_array, + anon_sym_LBRACK, + anon_sym_LPAREN, + [30518] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1544), 1, + ACTIONS(1561), 1, anon_sym_LPAREN, - STATE(510), 2, + STATE(512), 2, sym_comment, sym_marginalia, - ACTIONS(1019), 14, + ACTIONS(1015), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37820,17 +37969,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30461] = 5, + [30548] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1546), 1, + ACTIONS(1563), 1, anon_sym_LPAREN, - STATE(511), 2, + STATE(513), 2, sym_comment, sym_marginalia, - ACTIONS(977), 14, + ACTIONS(936), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37845,17 +37994,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30491] = 5, + [30578] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1548), 1, + ACTIONS(1565), 1, anon_sym_LPAREN, - STATE(512), 2, + STATE(514), 2, sym_comment, sym_marginalia, - ACTIONS(946), 14, + ACTIONS(942), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37870,17 +38019,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30521] = 5, + [30608] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1550), 1, + ACTIONS(1447), 1, anon_sym_LPAREN, - STATE(513), 2, + STATE(515), 2, sym_comment, sym_marginalia, - ACTIONS(1009), 14, + ACTIONS(810), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37895,17 +38044,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30551] = 5, + [30638] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1501), 1, + ACTIONS(1567), 1, anon_sym_LPAREN, - STATE(514), 2, + STATE(516), 2, sym_comment, sym_marginalia, - ACTIONS(802), 14, + ACTIONS(930), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37920,17 +38069,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30581] = 5, + [30668] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1552), 1, - anon_sym_LPAREN, - STATE(515), 2, + ACTIONS(1569), 1, + sym_keyword_zerofill, + STATE(517), 2, sym_comment, sym_marginalia, - ACTIONS(924), 14, + ACTIONS(942), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37945,17 +38094,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30611] = 5, + [30698] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1554), 1, + ACTIONS(1367), 1, sym_keyword_zerofill, - STATE(516), 2, + STATE(518), 2, sym_comment, sym_marginalia, - ACTIONS(946), 14, + ACTIONS(810), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -37970,40 +38119,21 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30641] = 5, + [30728] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1556), 1, - anon_sym_LPAREN, - STATE(517), 2, - sym_comment, - sym_marginalia, - ACTIONS(952), 14, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, + ACTIONS(1363), 1, anon_sym_LBRACK, - [30671] = 4, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(518), 2, + STATE(522), 1, + aux_sym_array_size_definition_repeat1, + STATE(587), 1, + sym__array_size_definition, + STATE(519), 2, sym_comment, sym_marginalia, - ACTIONS(1087), 14, + ACTIONS(983), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38016,52 +38146,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [30698] = 16, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(1517), 1, - sym_keyword_null, - ACTIONS(1519), 1, - sym_keyword_true, - ACTIONS(1521), 1, - sym_keyword_false, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(597), 1, - sym_literal, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, - STATE(519), 2, - sym_comment, - sym_marginalia, - [30749] = 4, + [30762] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1571), 1, + anon_sym_LPAREN, STATE(520), 2, sym_comment, sym_marginalia, - ACTIONS(1131), 14, + ACTIONS(948), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38076,15 +38171,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30776] = 4, + [30792] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1573), 1, + sym_keyword_zerofill, STATE(521), 2, sym_comment, sym_marginalia, - ACTIONS(1135), 14, + ACTIONS(948), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38099,15 +38196,20 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30803] = 4, + [30822] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(522), 2, + ACTIONS(1575), 1, + anon_sym_LBRACK, + STATE(587), 1, + sym__array_size_definition, + STATE(522), 3, sym_comment, sym_marginalia, - ACTIONS(1139), 14, + aux_sym_array_size_definition_repeat1, + ACTIONS(960), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38120,9 +38222,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [30830] = 4, + [30854] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38130,7 +38230,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(523), 2, sym_comment, sym_marginalia, - ACTIONS(1143), 14, + ACTIONS(1005), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38145,7 +38245,8 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30857] = 4, + anon_sym_LPAREN, + [30882] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38153,7 +38254,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(524), 2, sym_comment, sym_marginalia, - ACTIONS(1155), 14, + ACTIONS(967), 15, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38168,15 +38269,18 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30884] = 4, + anon_sym_LPAREN, + [30910] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1578), 1, + sym_keyword_zerofill, STATE(525), 2, sym_comment, sym_marginalia, - ACTIONS(1159), 14, + ACTIONS(989), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38191,15 +38295,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30911] = 4, + [30940] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1580), 1, + sym_keyword_zerofill, STATE(526), 2, sym_comment, sym_marginalia, - ACTIONS(1163), 14, + ACTIONS(1009), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38214,7 +38320,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30938] = 4, + [30970] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38222,7 +38328,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(527), 2, sym_comment, sym_marginalia, - ACTIONS(1167), 14, + ACTIONS(1009), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38237,7 +38343,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30965] = 4, + [30997] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38245,7 +38351,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(528), 2, sym_comment, sym_marginalia, - ACTIONS(1171), 14, + ACTIONS(1195), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38260,7 +38366,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [30992] = 4, + [31024] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38268,7 +38374,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(529), 2, sym_comment, sym_marginalia, - ACTIONS(1175), 14, + ACTIONS(1199), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38283,7 +38389,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31019] = 4, + [31051] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38291,7 +38397,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(530), 2, sym_comment, sym_marginalia, - ACTIONS(1187), 14, + ACTIONS(1203), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38306,7 +38412,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31046] = 4, + [31078] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38314,7 +38420,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(531), 2, sym_comment, sym_marginalia, - ACTIONS(1123), 14, + ACTIONS(1163), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38329,7 +38435,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31073] = 4, + [31105] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38337,7 +38443,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(532), 2, sym_comment, sym_marginalia, - ACTIONS(1031), 14, + ACTIONS(1167), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38352,15 +38458,50 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31100] = 4, + [31132] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(539), 1, + anon_sym_DOT, + ACTIONS(545), 1, + anon_sym_DASH, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(1537), 1, + sym_keyword_null, + ACTIONS(1539), 1, + sym_keyword_true, + ACTIONS(1541), 1, + sym_keyword_false, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(610), 1, + sym_literal, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, STATE(533), 2, sym_comment, sym_marginalia, - ACTIONS(1035), 14, + [31183] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(534), 2, + sym_comment, + sym_marginalia, + ACTIONS(1171), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38375,15 +38516,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31127] = 4, + [31210] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(534), 2, + STATE(535), 2, sym_comment, sym_marginalia, - ACTIONS(1043), 14, + ACTIONS(1175), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38398,15 +38539,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31154] = 4, + [31237] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(535), 2, + STATE(536), 2, sym_comment, sym_marginalia, - ACTIONS(1047), 14, + ACTIONS(1179), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38421,65 +38562,42 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31181] = 16, + [31264] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(1517), 1, + ACTIONS(1537), 1, sym_keyword_null, - ACTIONS(1519), 1, + ACTIONS(1539), 1, sym_keyword_true, - ACTIONS(1521), 1, + ACTIONS(1541), 1, sym_keyword_false, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(1053), 1, + STATE(1125), 1, sym_literal, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(536), 2, - sym_comment, - sym_marginalia, - [31232] = 4, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, STATE(537), 2, sym_comment, sym_marginalia, - ACTIONS(1091), 14, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [31259] = 4, + [31315] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38487,7 +38605,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(538), 2, sym_comment, sym_marginalia, - ACTIONS(1195), 14, + ACTIONS(942), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38502,7 +38620,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31286] = 4, + [31342] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38510,7 +38628,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(539), 2, sym_comment, sym_marginalia, - ACTIONS(1127), 14, + ACTIONS(1147), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38525,7 +38643,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31313] = 4, + [31369] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38533,7 +38651,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(540), 2, sym_comment, sym_marginalia, - ACTIONS(1151), 14, + ACTIONS(810), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38548,15 +38666,19 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31340] = 4, + [31396] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1363), 1, + anon_sym_LBRACK, + STATE(607), 1, + sym__array_size_definition, STATE(541), 2, sym_comment, sym_marginalia, - ACTIONS(902), 14, + ACTIONS(1207), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38569,40 +38691,85 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [31367] = 4, + [31427] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(539), 1, + anon_sym_DOT, + ACTIONS(545), 1, + anon_sym_DASH, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(1537), 1, + sym_keyword_null, + ACTIONS(1539), 1, + sym_keyword_true, + ACTIONS(1541), 1, + sym_keyword_false, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(1109), 1, + sym_literal, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, STATE(542), 2, sym_comment, sym_marginalia, - ACTIONS(958), 14, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - sym_keyword_array, - anon_sym_LBRACK, - [31394] = 4, + [31478] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(539), 1, + anon_sym_DOT, + ACTIONS(545), 1, + anon_sym_DASH, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(1537), 1, + sym_keyword_null, + ACTIONS(1539), 1, + sym_keyword_true, + ACTIONS(1541), 1, + sym_keyword_false, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(1009), 1, + sym_literal, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, STATE(543), 2, sym_comment, sym_marginalia, - ACTIONS(934), 14, + [31529] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(544), 2, + sym_comment, + sym_marginalia, + ACTIONS(1211), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38617,15 +38784,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31421] = 4, + [31556] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(544), 2, + STATE(545), 2, sym_comment, sym_marginalia, - ACTIONS(1179), 14, + ACTIONS(948), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38640,15 +38807,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31448] = 4, + [31583] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(545), 2, + STATE(546), 2, sym_comment, sym_marginalia, - ACTIONS(1183), 14, + ACTIONS(1151), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38663,32 +38830,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31475] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1560), 1, - sym_keyword_distinct, - STATE(546), 2, - sym_comment, - sym_marginalia, - ACTIONS(1558), 5, - sym_keyword_null, - sym_keyword_true, - sym_keyword_false, - anon_sym_DASH, - sym__identifier, - ACTIONS(1562), 8, - anon_sym_LPAREN, - anon_sym_DOT, - anon_sym_QMARK, - anon_sym_DOLLAR, - anon_sym_DQUOTE, - anon_sym_SQUOTE, - sym_natural_number, - anon_sym_BQUOTE, - [31506] = 4, + [31610] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38696,7 +38838,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(547), 2, sym_comment, sym_marginalia, - ACTIONS(1191), 14, + ACTIONS(1155), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38711,7 +38853,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31533] = 4, + [31637] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38719,7 +38861,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(548), 2, sym_comment, sym_marginalia, - ACTIONS(1039), 14, + ACTIONS(1055), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38734,7 +38876,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31560] = 4, + [31664] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38742,7 +38884,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(549), 2, sym_comment, sym_marginalia, - ACTIONS(1051), 14, + ACTIONS(1059), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38757,7 +38899,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31587] = 4, + [31691] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38765,7 +38907,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(550), 2, sym_comment, sym_marginalia, - ACTIONS(1055), 14, + ACTIONS(1063), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38780,7 +38922,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31614] = 4, + [31718] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38788,7 +38930,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(551), 2, sym_comment, sym_marginalia, - ACTIONS(1059), 14, + ACTIONS(1215), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38803,7 +38945,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31641] = 4, + [31745] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38811,7 +38953,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(552), 2, sym_comment, sym_marginalia, - ACTIONS(1063), 14, + ACTIONS(1067), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38826,7 +38968,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31668] = 4, + [31772] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38834,7 +38976,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(553), 2, sym_comment, sym_marginalia, - ACTIONS(1067), 14, + ACTIONS(1071), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38849,7 +38991,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31695] = 4, + [31799] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38857,7 +38999,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(554), 2, sym_comment, sym_marginalia, - ACTIONS(1071), 14, + ACTIONS(1075), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38872,42 +39014,42 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31722] = 16, + [31826] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(547), 1, + ACTIONS(539), 1, anon_sym_DOT, - ACTIONS(553), 1, + ACTIONS(545), 1, anon_sym_DASH, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(1517), 1, + ACTIONS(1537), 1, sym_keyword_null, - ACTIONS(1519), 1, + ACTIONS(1539), 1, sym_keyword_true, - ACTIONS(1521), 1, + ACTIONS(1541), 1, sym_keyword_false, - STATE(40), 1, + STATE(42), 1, sym_integer, - STATE(45), 1, + STATE(47), 1, sym_literal_string, - STATE(49), 1, + STATE(48), 1, sym_decimal_number, - STATE(997), 1, + STATE(1373), 1, sym_literal, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, STATE(555), 2, sym_comment, sym_marginalia, - [31773] = 4, + [31877] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38915,7 +39057,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(556), 2, sym_comment, sym_marginalia, - ACTIONS(1075), 14, + ACTIONS(1083), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38930,7 +39072,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31800] = 4, + [31904] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38938,7 +39080,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(557), 2, sym_comment, sym_marginalia, - ACTIONS(1079), 14, + ACTIONS(1087), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38953,7 +39095,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31827] = 4, + [31931] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -38961,7 +39103,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(558), 2, sym_comment, sym_marginalia, - ACTIONS(1083), 14, + ACTIONS(1091), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -38976,42 +39118,30 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31854] = 16, + [31958] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(1517), 1, - sym_keyword_null, - ACTIONS(1519), 1, - sym_keyword_true, - ACTIONS(1521), 1, - sym_keyword_false, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(1125), 1, - sym_literal, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, STATE(559), 2, sym_comment, sym_marginalia, - [31905] = 4, + ACTIONS(1159), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [31985] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39019,7 +39149,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(560), 2, sym_comment, sym_marginalia, - ACTIONS(1095), 14, + ACTIONS(790), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39034,7 +39164,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31932] = 4, + [32012] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39042,7 +39172,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(561), 2, sym_comment, sym_marginalia, - ACTIONS(790), 14, + ACTIONS(1095), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39057,7 +39187,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31959] = 4, + [32039] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39080,7 +39210,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [31986] = 4, + [32066] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39103,7 +39233,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32013] = 4, + [32093] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39126,7 +39256,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32040] = 4, + [32120] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39149,7 +39279,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32067] = 4, + [32147] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39172,7 +39302,7 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32094] = 4, + [32174] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39195,42 +39325,30 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32121] = 16, + [32201] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(1517), 1, - sym_keyword_null, - ACTIONS(1519), 1, - sym_keyword_true, - ACTIONS(1521), 1, - sym_keyword_false, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(1362), 1, - sym_literal, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, STATE(568), 2, sym_comment, sym_marginalia, - [32172] = 4, + ACTIONS(1123), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [32228] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39238,7 +39356,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(569), 2, sym_comment, sym_marginalia, - ACTIONS(946), 14, + ACTIONS(1127), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39253,50 +39371,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32199] = 16, + [32255] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(547), 1, - anon_sym_DOT, - ACTIONS(553), 1, - anon_sym_DASH, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(1517), 1, - sym_keyword_null, - ACTIONS(1519), 1, - sym_keyword_true, - ACTIONS(1521), 1, - sym_keyword_false, - STATE(40), 1, - sym_integer, - STATE(45), 1, - sym_literal_string, - STATE(49), 1, - sym_decimal_number, - STATE(1288), 1, - sym_literal, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, STATE(570), 2, sym_comment, sym_marginalia, - [32250] = 4, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(571), 2, - sym_comment, - sym_marginalia, - ACTIONS(802), 14, + ACTIONS(1131), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39311,19 +39394,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32277] = 6, + [32282] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1329), 1, - anon_sym_LBRACK, - STATE(605), 1, - sym__array_size_definition, - STATE(572), 2, + STATE(571), 2, sym_comment, sym_marginalia, - ACTIONS(1147), 12, + ACTIONS(914), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39336,15 +39415,17 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [32308] = 4, + sym_keyword_array, + anon_sym_LBRACK, + [32309] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(573), 2, + STATE(572), 2, sym_comment, sym_marginalia, - ACTIONS(1027), 14, + ACTIONS(1183), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39359,15 +39440,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32335] = 4, + [32336] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(574), 2, + STATE(573), 2, sym_comment, sym_marginalia, - ACTIONS(977), 14, + ACTIONS(989), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39382,15 +39463,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32362] = 4, + [32363] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(575), 2, + STATE(574), 2, sym_comment, sym_marginalia, - ACTIONS(964), 14, + ACTIONS(1187), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39405,21 +39486,23 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cache, sym_keyword_array, anon_sym_LBRACK, - [32389] = 5, + [32390] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(576), 2, + ACTIONS(1584), 1, + sym_keyword_distinct, + STATE(575), 2, sym_comment, sym_marginalia, - ACTIONS(1564), 5, + ACTIONS(1582), 5, sym_keyword_null, sym_keyword_true, sym_keyword_false, anon_sym_DASH, sym__identifier, - ACTIONS(1566), 8, + ACTIONS(1586), 8, anon_sym_LPAREN, anon_sym_DOT, anon_sym_QMARK, @@ -39428,40 +39511,53 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_SQUOTE, sym_natural_number, anon_sym_BQUOTE, - [32417] = 15, + [32421] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1217), 1, - sym_keyword_password, - ACTIONS(1219), 1, - sym_keyword_encrypted, - ACTIONS(1221), 1, - sym_keyword_valid, - ACTIONS(1223), 1, - sym_keyword_connection, - STATE(4), 1, - sym__double_quote_string, - STATE(586), 1, - aux_sym_alter_role_repeat1, - STATE(619), 1, - sym_identifier, - STATE(621), 1, - sym__role_options, - ACTIONS(1568), 2, + STATE(576), 2, + sym_comment, + sym_marginalia, + ACTIONS(1051), 14, ts_builtin_sym_end, anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [32448] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, STATE(577), 2, sym_comment, sym_marginalia, - [32465] = 4, + ACTIONS(1135), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [32475] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39469,7 +39565,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(578), 2, sym_comment, sym_marginalia, - ACTIONS(1199), 13, + ACTIONS(1191), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39482,8 +39578,9 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, + sym_keyword_array, anon_sym_LBRACK, - [32491] = 5, + [32502] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39491,22 +39588,22 @@ static const uint16_t ts_small_parse_table[] = { STATE(579), 2, sym_comment, sym_marginalia, - ACTIONS(1570), 5, - sym_keyword_null, - sym_keyword_true, - sym_keyword_false, - anon_sym_DASH, - sym__identifier, - ACTIONS(1572), 8, - anon_sym_LPAREN, - anon_sym_DOT, - anon_sym_QMARK, - anon_sym_DOLLAR, - anon_sym_DQUOTE, - anon_sym_SQUOTE, - sym_natural_number, - anon_sym_BQUOTE, - [32519] = 5, + ACTIONS(1021), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [32529] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39514,22 +39611,22 @@ static const uint16_t ts_small_parse_table[] = { STATE(580), 2, sym_comment, sym_marginalia, - ACTIONS(1574), 5, - sym_keyword_null, - sym_keyword_true, - sym_keyword_false, - anon_sym_DASH, - sym__identifier, - ACTIONS(1576), 8, - anon_sym_LPAREN, - anon_sym_DOT, - anon_sym_QMARK, - anon_sym_DOLLAR, - anon_sym_DQUOTE, - anon_sym_SQUOTE, - sym_natural_number, - anon_sym_BQUOTE, - [32547] = 4, + ACTIONS(1139), 14, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + sym_keyword_array, + anon_sym_LBRACK, + [32556] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39537,7 +39634,7 @@ static const uint16_t ts_small_parse_table[] = { STATE(581), 2, sym_comment, sym_marginalia, - ACTIONS(1203), 13, + ACTIONS(1143), 14, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39550,161 +39647,165 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, + sym_keyword_array, anon_sym_LBRACK, - [32573] = 14, + [32583] = 16, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1580), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(539), 1, + anon_sym_DOT, + ACTIONS(545), 1, + anon_sym_DASH, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(1537), 1, + sym_keyword_null, + ACTIONS(1539), 1, + sym_keyword_true, + ACTIONS(1541), 1, + sym_keyword_false, + STATE(42), 1, + sym_integer, + STATE(47), 1, + sym_literal_string, + STATE(48), 1, + sym_decimal_number, + STATE(1159), 1, + sym_literal, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, + STATE(582), 2, + sym_comment, + sym_marginalia, + [32634] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(583), 2, + sym_comment, + sym_marginalia, + ACTIONS(1079), 14, + ts_builtin_sym_end, + anon_sym_SEMI, sym_keyword_increment, - ACTIONS(1583), 1, sym_keyword_minvalue, - ACTIONS(1586), 1, sym_keyword_maxvalue, - ACTIONS(1589), 1, sym_keyword_owned, - ACTIONS(1592), 1, sym_keyword_start, - ACTIONS(1595), 1, sym_keyword_restart, - ACTIONS(1598), 1, sym_keyword_as, - ACTIONS(1601), 1, sym_keyword_no, - ACTIONS(1604), 1, sym_keyword_cycle, - ACTIONS(1607), 1, sym_keyword_cache, - ACTIONS(1578), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(582), 3, - sym_comment, - sym_marginalia, - aux_sym_alter_sequence_repeat1, - [32619] = 14, + sym_keyword_array, + anon_sym_LBRACK, + [32661] = 14, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1612), 1, + ACTIONS(1590), 1, sym_keyword_table, - ACTIONS(1616), 1, + ACTIONS(1594), 1, sym_keyword_only, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(673), 1, + STATE(677), 1, sym_object_reference, - STATE(1283), 1, + STATE(1204), 1, sym__drop_behavior, - ACTIONS(1610), 2, + ACTIONS(1588), 2, ts_builtin_sym_end, anon_sym_SEMI, - ACTIONS(1614), 2, + ACTIONS(1592), 2, sym_keyword_cascade, sym_keyword_restrict, - STATE(583), 2, + STATE(584), 2, sym_comment, sym_marginalia, - [32665] = 15, + [32707] = 15, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1217), 1, - sym_keyword_password, - ACTIONS(1219), 1, - sym_keyword_encrypted, - ACTIONS(1221), 1, - sym_keyword_valid, - ACTIONS(1223), 1, - sym_keyword_connection, - STATE(4), 1, - sym__double_quote_string, - STATE(590), 1, - aux_sym_alter_role_repeat1, - STATE(619), 1, - sym_identifier, - STATE(621), 1, - sym__role_options, - ACTIONS(1618), 2, + ACTIONS(1409), 1, + sym_keyword_increment, + ACTIONS(1411), 1, + sym_keyword_minvalue, + ACTIONS(1413), 1, + sym_keyword_maxvalue, + ACTIONS(1415), 1, + sym_keyword_owned, + ACTIONS(1417), 1, + sym_keyword_start, + ACTIONS(1419), 1, + sym_keyword_restart, + ACTIONS(1421), 1, + sym_keyword_as, + ACTIONS(1423), 1, + sym_keyword_no, + ACTIONS(1429), 1, + sym_keyword_cycle, + ACTIONS(1431), 1, + sym_keyword_cache, + STATE(589), 1, + aux_sym_alter_sequence_repeat1, + ACTIONS(1596), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(584), 2, - sym_comment, - sym_marginalia, - [32713] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, STATE(585), 2, sym_comment, sym_marginalia, - ACTIONS(1620), 5, - sym_keyword_null, - sym_keyword_true, - sym_keyword_false, - anon_sym_DASH, - sym__identifier, - ACTIONS(1622), 8, - anon_sym_LPAREN, - anon_sym_DOT, - anon_sym_QMARK, - anon_sym_DOLLAR, - anon_sym_DQUOTE, - anon_sym_SQUOTE, - sym_natural_number, - anon_sym_BQUOTE, - [32741] = 15, + [32755] = 15, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1217), 1, + ACTIONS(1237), 1, sym_keyword_password, - ACTIONS(1219), 1, + ACTIONS(1239), 1, sym_keyword_encrypted, - ACTIONS(1221), 1, + ACTIONS(1241), 1, sym_keyword_valid, - ACTIONS(1223), 1, + ACTIONS(1243), 1, sym_keyword_connection, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(590), 1, + STATE(591), 1, aux_sym_alter_role_repeat1, - STATE(619), 1, - sym_identifier, - STATE(621), 1, + STATE(627), 1, sym__role_options, - ACTIONS(1624), 2, + STATE(632), 1, + sym_identifier, + ACTIONS(1598), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(586), 2, sym_comment, sym_marginalia, - [32789] = 5, + [32803] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -39712,63 +39813,83 @@ static const uint16_t ts_small_parse_table[] = { STATE(587), 2, sym_comment, sym_marginalia, - ACTIONS(1626), 5, - sym_keyword_null, - sym_keyword_true, - sym_keyword_false, - anon_sym_DASH, - sym__identifier, - ACTIONS(1628), 8, - anon_sym_LPAREN, - anon_sym_DOT, - anon_sym_QMARK, - anon_sym_DOLLAR, - anon_sym_DQUOTE, - anon_sym_SQUOTE, - sym_natural_number, - anon_sym_BQUOTE, - [32817] = 15, + ACTIONS(1247), 13, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + anon_sym_LBRACK, + [32829] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1397), 1, + STATE(588), 2, + sym_comment, + sym_marginalia, + ACTIONS(1219), 13, + ts_builtin_sym_end, + anon_sym_SEMI, sym_keyword_increment, - ACTIONS(1399), 1, sym_keyword_minvalue, - ACTIONS(1401), 1, sym_keyword_maxvalue, - ACTIONS(1403), 1, sym_keyword_owned, - ACTIONS(1405), 1, sym_keyword_start, - ACTIONS(1407), 1, sym_keyword_restart, - ACTIONS(1409), 1, sym_keyword_as, - ACTIONS(1411), 1, sym_keyword_no, - ACTIONS(1417), 1, sym_keyword_cycle, - ACTIONS(1419), 1, sym_keyword_cache, - STATE(582), 1, - aux_sym_alter_sequence_repeat1, - ACTIONS(1630), 2, + anon_sym_LBRACK, + [32855] = 14, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1602), 1, + sym_keyword_increment, + ACTIONS(1605), 1, + sym_keyword_minvalue, + ACTIONS(1608), 1, + sym_keyword_maxvalue, + ACTIONS(1611), 1, + sym_keyword_owned, + ACTIONS(1614), 1, + sym_keyword_start, + ACTIONS(1617), 1, + sym_keyword_restart, + ACTIONS(1620), 1, + sym_keyword_as, + ACTIONS(1623), 1, + sym_keyword_no, + ACTIONS(1626), 1, + sym_keyword_cycle, + ACTIONS(1629), 1, + sym_keyword_cache, + ACTIONS(1600), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(588), 2, + STATE(589), 3, sym_comment, sym_marginalia, - [32865] = 4, + aux_sym_alter_sequence_repeat1, + [32901] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(589), 2, + STATE(590), 2, sym_comment, sym_marginalia, - ACTIONS(1227), 13, + ACTIONS(1223), 13, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39782,86 +39903,119 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_cycle, sym_keyword_cache, anon_sym_LBRACK, - [32891] = 14, + [32927] = 15, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1634), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(1637), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1237), 1, sym_keyword_password, - ACTIONS(1640), 1, + ACTIONS(1239), 1, sym_keyword_encrypted, - ACTIONS(1643), 1, + ACTIONS(1241), 1, sym_keyword_valid, - ACTIONS(1646), 1, + ACTIONS(1243), 1, sym_keyword_connection, - ACTIONS(1649), 1, + STATE(3), 1, + sym__double_quote_string, + STATE(592), 1, + aux_sym_alter_role_repeat1, + STATE(627), 1, + sym__role_options, + STATE(632), 1, + sym_identifier, + ACTIONS(1632), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(591), 2, + sym_comment, + sym_marginalia, + [32975] = 14, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1636), 1, + sym__identifier, + ACTIONS(1639), 1, + sym_keyword_password, + ACTIONS(1642), 1, + sym_keyword_encrypted, + ACTIONS(1645), 1, + sym_keyword_valid, + ACTIONS(1648), 1, + sym_keyword_connection, + ACTIONS(1651), 1, anon_sym_DQUOTE, - ACTIONS(1652), 1, + ACTIONS(1654), 1, anon_sym_BQUOTE, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(619), 1, - sym_identifier, - STATE(621), 1, + STATE(627), 1, sym__role_options, - ACTIONS(1632), 2, + STATE(632), 1, + sym_identifier, + ACTIONS(1634), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(590), 3, + STATE(592), 3, sym_comment, sym_marginalia, aux_sym_alter_role_repeat1, - [32937] = 15, + [33021] = 15, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1397), 1, + ACTIONS(1409), 1, sym_keyword_increment, - ACTIONS(1399), 1, + ACTIONS(1411), 1, sym_keyword_minvalue, - ACTIONS(1401), 1, + ACTIONS(1413), 1, sym_keyword_maxvalue, - ACTIONS(1403), 1, + ACTIONS(1415), 1, sym_keyword_owned, - ACTIONS(1405), 1, + ACTIONS(1417), 1, sym_keyword_start, - ACTIONS(1407), 1, + ACTIONS(1419), 1, sym_keyword_restart, - ACTIONS(1409), 1, + ACTIONS(1421), 1, sym_keyword_as, - ACTIONS(1411), 1, + ACTIONS(1423), 1, sym_keyword_no, - ACTIONS(1417), 1, + ACTIONS(1429), 1, sym_keyword_cycle, - ACTIONS(1419), 1, + ACTIONS(1431), 1, sym_keyword_cache, - STATE(582), 1, + STATE(589), 1, aux_sym_alter_sequence_repeat1, - ACTIONS(1655), 2, + ACTIONS(1657), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(591), 2, + STATE(593), 2, sym_comment, sym_marginalia, - [32985] = 5, + [33069] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(592), 2, + STATE(594), 2, sym_comment, sym_marginalia, - ACTIONS(1657), 5, + ACTIONS(1659), 5, sym_keyword_null, sym_keyword_true, sym_keyword_false, anon_sym_DASH, sym__identifier, - ACTIONS(1659), 8, + ACTIONS(1661), 8, anon_sym_LPAREN, anon_sym_DOT, anon_sym_QMARK, @@ -39870,108 +40024,193 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_SQUOTE, sym_natural_number, anon_sym_BQUOTE, - [33013] = 4, + [33097] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(593), 2, + STATE(595), 2, sym_comment, sym_marginalia, - ACTIONS(1661), 12, + ACTIONS(1663), 5, + sym_keyword_null, + sym_keyword_true, + sym_keyword_false, + anon_sym_DASH, + sym__identifier, + ACTIONS(1665), 8, + anon_sym_LPAREN, + anon_sym_DOT, + anon_sym_QMARK, + anon_sym_DOLLAR, + anon_sym_DQUOTE, + anon_sym_SQUOTE, + sym_natural_number, + anon_sym_BQUOTE, + [33125] = 15, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1237), 1, + sym_keyword_password, + ACTIONS(1239), 1, + sym_keyword_encrypted, + ACTIONS(1241), 1, + sym_keyword_valid, + ACTIONS(1243), 1, + sym_keyword_connection, + STATE(3), 1, + sym__double_quote_string, + STATE(592), 1, + aux_sym_alter_role_repeat1, + STATE(627), 1, + sym__role_options, + STATE(632), 1, + sym_identifier, + ACTIONS(1667), 2, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - [33038] = 4, + STATE(596), 2, + sym_comment, + sym_marginalia, + [33173] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(594), 2, + STATE(597), 2, sym_comment, sym_marginalia, - ACTIONS(1663), 12, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - [33063] = 13, + ACTIONS(1669), 5, + sym_keyword_null, + sym_keyword_true, + sym_keyword_false, + anon_sym_DASH, + sym__identifier, + ACTIONS(1671), 8, + anon_sym_LPAREN, + anon_sym_DOT, + anon_sym_QMARK, + anon_sym_DOLLAR, + anon_sym_DQUOTE, + anon_sym_SQUOTE, + sym_natural_number, + anon_sym_BQUOTE, + [33201] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(598), 2, + sym_comment, + sym_marginalia, + ACTIONS(1673), 5, + sym_keyword_null, + sym_keyword_true, + sym_keyword_false, + anon_sym_DASH, + sym__identifier, + ACTIONS(1675), 8, + anon_sym_LPAREN, + anon_sym_DOT, + anon_sym_QMARK, + anon_sym_DOLLAR, + anon_sym_DQUOTE, + anon_sym_SQUOTE, + sym_natural_number, + anon_sym_BQUOTE, + [33229] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(599), 2, + sym_comment, + sym_marginalia, + ACTIONS(1677), 5, + sym_keyword_null, + sym_keyword_true, + sym_keyword_false, + anon_sym_DASH, + sym__identifier, + ACTIONS(1679), 8, + anon_sym_LPAREN, + anon_sym_DOT, + anon_sym_QMARK, + anon_sym_DOLLAR, + anon_sym_DQUOTE, + anon_sym_SQUOTE, + sym_natural_number, + anon_sym_BQUOTE, + [33257] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + STATE(600), 2, + sym_comment, + sym_marginalia, + ACTIONS(1681), 5, + sym_keyword_null, + sym_keyword_true, + sym_keyword_false, + anon_sym_DASH, sym__identifier, - ACTIONS(502), 1, + ACTIONS(1683), 8, + anon_sym_LPAREN, + anon_sym_DOT, + anon_sym_QMARK, + anon_sym_DOLLAR, anon_sym_DQUOTE, - ACTIONS(504), 1, + anon_sym_SQUOTE, + sym_natural_number, anon_sym_BQUOTE, - ACTIONS(1667), 1, + [33285] = 13, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1687), 1, sym_keyword_only, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(691), 1, + STATE(703), 1, sym_object_reference, - STATE(1141), 1, + STATE(1226), 1, sym__drop_behavior, - ACTIONS(1614), 2, + ACTIONS(1592), 2, sym_keyword_cascade, sym_keyword_restrict, - ACTIONS(1665), 2, + ACTIONS(1685), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(595), 2, - sym_comment, - sym_marginalia, - [33106] = 4, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(596), 2, + STATE(601), 2, sym_comment, sym_marginalia, - ACTIONS(1669), 12, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_increment, - sym_keyword_minvalue, - sym_keyword_maxvalue, - sym_keyword_owned, - sym_keyword_start, - sym_keyword_restart, - sym_keyword_as, - sym_keyword_no, - sym_keyword_cycle, - sym_keyword_cache, - [33131] = 4, + [33328] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(597), 2, + STATE(602), 2, sym_comment, sym_marginalia, - ACTIONS(1671), 12, + ACTIONS(1689), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -39984,15 +40223,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33156] = 4, + [33353] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(598), 2, + STATE(603), 2, sym_comment, sym_marginalia, - ACTIONS(1673), 12, + ACTIONS(1691), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -40005,15 +40244,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33181] = 4, + [33378] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(599), 2, + STATE(604), 2, sym_comment, sym_marginalia, - ACTIONS(1675), 12, + ACTIONS(1693), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -40026,77 +40265,67 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33206] = 14, + [33403] = 14, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - ACTIONS(1677), 1, + ACTIONS(1695), 1, sym_keyword_collate, - ACTIONS(1679), 1, + ACTIONS(1697), 1, sym_keyword_engine, - ACTIONS(1681), 1, + ACTIONS(1699), 1, sym_keyword_default, - STATE(24), 1, + STATE(23), 1, sym__single_quote_string, - STATE(111), 1, + STATE(108), 1, sym__double_quote_string, - STATE(1035), 1, + STATE(1088), 1, sym_table_option, - STATE(600), 2, + STATE(605), 2, sym_comment, sym_marginalia, - STATE(1540), 2, + STATE(1395), 2, sym_literal_string, sym_identifier, - [33251] = 14, + [33448] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(1677), 1, - sym_keyword_collate, - ACTIONS(1679), 1, - sym_keyword_engine, - ACTIONS(1681), 1, - sym_keyword_default, - STATE(24), 1, - sym__single_quote_string, - STATE(111), 1, - sym__double_quote_string, - STATE(1191), 1, - sym_table_option, - STATE(601), 2, + STATE(606), 2, sym_comment, sym_marginalia, - STATE(1540), 2, - sym_literal_string, - sym_identifier, - [33296] = 4, + ACTIONS(1701), 12, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + [33473] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(602), 2, + STATE(607), 2, sym_comment, sym_marginalia, - ACTIONS(1683), 12, + ACTIONS(1255), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -40109,15 +40338,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33321] = 4, + [33498] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(603), 2, + STATE(608), 2, sym_comment, sym_marginalia, - ACTIONS(1685), 12, + ACTIONS(1703), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -40130,15 +40359,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33346] = 4, + [33523] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(604), 2, + STATE(609), 2, sym_comment, sym_marginalia, - ACTIONS(1235), 12, + ACTIONS(1705), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -40151,15 +40380,15 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33371] = 4, + [33548] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(605), 2, + STATE(610), 2, sym_comment, sym_marginalia, - ACTIONS(1231), 12, + ACTIONS(1707), 12, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_increment, @@ -40172,1128 +40401,755 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_no, sym_keyword_cycle, sym_keyword_cache, - [33396] = 12, + [33573] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(872), 1, - sym_keyword_primary, - ACTIONS(1689), 1, - sym_keyword_constraint, - STATE(978), 1, - sym__constraint_literal, - STATE(979), 1, - sym_primary_key_constraint, - STATE(980), 1, - sym__key_constraint, - STATE(1092), 1, - sym_constraint, - STATE(1260), 1, - sym__primary_key, - ACTIONS(1687), 2, - sym_keyword_key, - sym_keyword_index, - ACTIONS(1691), 2, - sym_keyword_unique, - sym_keyword_foreign, - STATE(606), 2, + STATE(611), 2, sym_comment, sym_marginalia, - [33436] = 12, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - STATE(4), 1, - sym__double_quote_string, - STATE(115), 1, - sym_identifier, - STATE(678), 1, - sym_object_reference, - STATE(1269), 1, - sym__drop_behavior, - ACTIONS(1614), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1693), 2, + ACTIONS(1709), 12, ts_builtin_sym_end, anon_sym_SEMI, - STATE(607), 2, - sym_comment, - sym_marginalia, - [33476] = 12, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + [33598] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(872), 1, - sym_keyword_primary, - ACTIONS(1689), 1, - sym_keyword_constraint, - STATE(978), 1, - sym__constraint_literal, - STATE(979), 1, - sym_primary_key_constraint, - STATE(980), 1, - sym__key_constraint, - STATE(1232), 1, - sym_constraint, - STATE(1260), 1, - sym__primary_key, - ACTIONS(1687), 2, - sym_keyword_key, - sym_keyword_index, - ACTIONS(1691), 2, - sym_keyword_unique, - sym_keyword_foreign, - STATE(608), 2, + STATE(612), 2, sym_comment, sym_marginalia, - [33516] = 12, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - STATE(4), 1, - sym__double_quote_string, - STATE(115), 1, - sym_identifier, - STATE(691), 1, - sym_object_reference, - STATE(1141), 1, - sym__drop_behavior, - ACTIONS(1614), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1665), 2, + ACTIONS(1251), 12, ts_builtin_sym_end, anon_sym_SEMI, - STATE(609), 2, - sym_comment, - sym_marginalia, - [33556] = 13, + sym_keyword_increment, + sym_keyword_minvalue, + sym_keyword_maxvalue, + sym_keyword_owned, + sym_keyword_start, + sym_keyword_restart, + sym_keyword_as, + sym_keyword_no, + sym_keyword_cycle, + sym_keyword_cache, + [33623] = 14, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, + ACTIONS(547), 1, + anon_sym_SQUOTE, ACTIONS(1695), 1, - sym__identifier, + sym_keyword_collate, ACTIONS(1697), 1, - anon_sym_RPAREN, + sym_keyword_engine, ACTIONS(1699), 1, - anon_sym_COMMA, - STATE(4), 1, + sym_keyword_default, + STATE(23), 1, + sym__single_quote_string, + STATE(108), 1, sym__double_quote_string, - STATE(627), 1, - aux_sym__compute_stats_repeat1, - STATE(785), 1, - sym_identifier, - STATE(869), 1, - sym_field, - STATE(995), 1, - aux_sym__compute_stats_repeat2, - STATE(610), 2, + STATE(1245), 1, + sym_table_option, + STATE(613), 2, sym_comment, sym_marginalia, - [33597] = 13, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(388), 1, - sym__identifier, - ACTIONS(424), 1, - anon_sym_DQUOTE, - ACTIONS(426), 1, - anon_sym_BQUOTE, - ACTIONS(762), 1, - sym_keyword_if, - ACTIONS(1701), 1, - sym_keyword_column, - ACTIONS(1703), 1, - sym_keyword_constraint, - STATE(5), 1, + STATE(1395), 2, + sym_literal_string, sym_identifier, - STATE(17), 1, - sym__double_quote_string, - STATE(749), 1, - sym__if_not_exists, - STATE(751), 1, - sym_column_definition, - STATE(611), 2, - sym_comment, - sym_marginalia, - [33638] = 11, + [33668] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1707), 1, - sym_keyword_table, - ACTIONS(1709), 1, - sym_keyword_view, - ACTIONS(1711), 1, - sym_keyword_sequence, + ACTIONS(900), 1, + sym_keyword_primary, ACTIONS(1713), 1, + sym_keyword_constraint, + STATE(975), 1, + sym__constraint_literal, + STATE(976), 1, + sym_primary_key_constraint, + STATE(977), 1, + sym__key_constraint, + STATE(1229), 1, + sym__primary_key, + STATE(1313), 1, + sym_constraint, + ACTIONS(1711), 2, + sym_keyword_key, sym_keyword_index, - ACTIONS(1715), 1, - sym_keyword_type, - ACTIONS(1717), 1, - sym_keyword_database, - ACTIONS(1719), 1, - sym_keyword_schema, - STATE(612), 2, - sym_comment, - sym_marginalia, - ACTIONS(1705), 3, - sym_keyword_group, - sym_keyword_user, - sym_keyword_role, - [33675] = 11, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1723), 1, - sym_keyword_table, - ACTIONS(1725), 1, - sym_keyword_view, - ACTIONS(1727), 1, - sym_keyword_sequence, - ACTIONS(1729), 1, - sym_keyword_index, - ACTIONS(1731), 1, - sym_keyword_type, - ACTIONS(1733), 1, - sym_keyword_database, - ACTIONS(1735), 1, - sym_keyword_schema, - STATE(613), 2, - sym_comment, - sym_marginalia, - ACTIONS(1721), 3, - sym_keyword_group, - sym_keyword_user, - sym_keyword_role, - [33712] = 11, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - STATE(4), 1, - sym__double_quote_string, - STATE(115), 1, - sym_identifier, - STATE(722), 1, - sym__vacuum_option, - STATE(1119), 1, - sym_object_reference, + ACTIONS(1715), 2, + sym_keyword_unique, + sym_keyword_foreign, STATE(614), 2, sym_comment, sym_marginalia, - ACTIONS(1737), 3, - sym_keyword_full, - sym_keyword_analyze, - sym_keyword_parallel, - [33749] = 13, + [33708] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - ACTIONS(1699), 1, - anon_sym_COMMA, - ACTIONS(1739), 1, - anon_sym_RPAREN, - STATE(4), 1, - sym__double_quote_string, - STATE(627), 1, - aux_sym__compute_stats_repeat1, - STATE(785), 1, - sym_identifier, - STATE(869), 1, - sym_field, - STATE(992), 1, - aux_sym__compute_stats_repeat2, + ACTIONS(900), 1, + sym_keyword_primary, + ACTIONS(1713), 1, + sym_keyword_constraint, + STATE(975), 1, + sym__constraint_literal, + STATE(976), 1, + sym_primary_key_constraint, + STATE(977), 1, + sym__key_constraint, + STATE(1115), 1, + sym_constraint, + STATE(1229), 1, + sym__primary_key, + ACTIONS(1711), 2, + sym_keyword_key, + sym_keyword_index, + ACTIONS(1715), 2, + sym_keyword_unique, + sym_keyword_foreign, STATE(615), 2, sym_comment, sym_marginalia, - [33790] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(616), 2, - sym_comment, - sym_marginalia, - ACTIONS(1741), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1743), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [33814] = 11, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(627), 1, - aux_sym__compute_stats_repeat1, - STATE(785), 1, - sym_identifier, - STATE(869), 1, - sym_field, - ACTIONS(1745), 2, - anon_sym_RPAREN, - anon_sym_COMMA, - STATE(617), 2, - sym_comment, - sym_marginalia, - [33850] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(618), 2, - sym_comment, - sym_marginalia, - ACTIONS(1747), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1749), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [33874] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(619), 2, - sym_comment, - sym_marginalia, - ACTIONS(1751), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1753), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [33898] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(620), 2, - sym_comment, - sym_marginalia, - ACTIONS(1755), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1757), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [33922] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(621), 2, - sym_comment, - sym_marginalia, - ACTIONS(1759), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1761), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [33946] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(622), 2, - sym_comment, - sym_marginalia, - ACTIONS(1763), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1765), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [33970] = 12, + [33748] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1767), 1, - sym_keyword_column, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(116), 1, sym_identifier, - STATE(702), 1, - sym__if_exists, - STATE(746), 1, - sym_column_definition, - STATE(623), 2, - sym_comment, - sym_marginalia, - [34008] = 10, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1415), 1, - sym_keyword_owner, - ACTIONS(1771), 1, - sym_keyword_set, - ACTIONS(1773), 1, - sym_keyword_alter, - ACTIONS(1775), 1, - sym_keyword_drop, - ACTIONS(1777), 1, - sym_keyword_add, - ACTIONS(1779), 1, - sym_keyword_rename, - STATE(624), 2, - sym_comment, - sym_marginalia, - STATE(1268), 3, - sym_rename_object, - sym_set_schema, - sym_change_ownership, - [34042] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(625), 2, - sym_comment, - sym_marginalia, - ACTIONS(1781), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1783), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [34066] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - STATE(626), 2, - sym_comment, - sym_marginalia, - ACTIONS(1785), 4, + STATE(690), 1, + sym_object_reference, + STATE(1165), 1, + sym__drop_behavior, + ACTIONS(1592), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(1717), 2, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - ACTIONS(1787), 5, - sym_keyword_password, - sym_keyword_encrypted, - sym_keyword_valid, - sym_keyword_connection, - sym__identifier, - [34090] = 10, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1789), 1, - sym__identifier, - ACTIONS(1794), 1, - anon_sym_DQUOTE, - ACTIONS(1797), 1, - anon_sym_BQUOTE, - STATE(4), 1, - sym__double_quote_string, - STATE(785), 1, - sym_identifier, - STATE(869), 1, - sym_field, - ACTIONS(1792), 2, - anon_sym_RPAREN, - anon_sym_COMMA, - STATE(627), 3, - sym_comment, - sym_marginalia, - aux_sym__compute_stats_repeat1, - [34124] = 10, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(24), 1, - sym__single_quote_string, - STATE(111), 1, - sym__double_quote_string, - STATE(628), 2, - sym_comment, - sym_marginalia, - STATE(1187), 2, - sym_literal_string, - sym_identifier, - [34157] = 11, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(770), 1, - sym_assignment, - STATE(785), 1, - sym_identifier, - STATE(958), 1, - sym_set_values, - STATE(1584), 1, - sym_field, - STATE(629), 2, + STATE(616), 2, sym_comment, sym_marginalia, - [34192] = 11, + [33788] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(243), 1, + STATE(703), 1, sym_object_reference, - STATE(763), 1, - sym__if_exists, - STATE(630), 2, + STATE(1226), 1, + sym__drop_behavior, + ACTIONS(1592), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(1685), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(617), 2, sym_comment, sym_marginalia, - [34227] = 4, + [33828] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(631), 2, + ACTIONS(1721), 1, + sym_keyword_table, + ACTIONS(1723), 1, + sym_keyword_view, + ACTIONS(1725), 1, + sym_keyword_sequence, + ACTIONS(1727), 1, + sym_keyword_index, + ACTIONS(1729), 1, + sym_keyword_type, + ACTIONS(1731), 1, + sym_keyword_database, + ACTIONS(1733), 1, + sym_keyword_schema, + STATE(618), 2, sym_comment, sym_marginalia, - ACTIONS(1800), 8, - sym_keyword_from, - sym_keyword_on, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_separator, - sym_keyword_using, - anon_sym_RPAREN, - anon_sym_COMMA, - [34248] = 11, + ACTIONS(1719), 3, + sym_keyword_group, + sym_keyword_user, + sym_keyword_role, + [33865] = 13, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(498), 1, - sym_keyword_as, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1802), 1, - sym_keyword_on, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + ACTIONS(1737), 1, + anon_sym_RPAREN, + ACTIONS(1739), 1, + anon_sym_COMMA, + STATE(3), 1, sym__double_quote_string, - STATE(631), 1, + STATE(630), 1, + aux_sym__compute_stats_repeat1, + STATE(774), 1, sym_identifier, - STATE(1591), 1, - sym_alias_name, - STATE(632), 2, + STATE(888), 1, + sym_field, + STATE(1091), 1, + aux_sym__compute_stats_repeat2, + STATE(619), 2, sym_comment, sym_marginalia, - [34283] = 11, + [33906] = 13, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + ACTIONS(1739), 1, + anon_sym_COMMA, + ACTIONS(1741), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(630), 1, + aux_sym__compute_stats_repeat1, + STATE(774), 1, sym_identifier, - STATE(695), 1, - sym_object_reference, - STATE(765), 1, - sym__if_exists, - STATE(633), 2, + STATE(888), 1, + sym_field, + STATE(1096), 1, + aux_sym__compute_stats_repeat2, + STATE(620), 2, sym_comment, sym_marginalia, - [34318] = 11, + [33947] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(783), 1, - sym__if_exists, - STATE(882), 1, + STATE(803), 1, + sym__vacuum_option, + STATE(1063), 1, sym_object_reference, - STATE(634), 2, + STATE(621), 2, sym_comment, sym_marginalia, - [34353] = 11, + ACTIONS(1743), 3, + sym_keyword_full, + sym_keyword_analyze, + sym_keyword_parallel, + [33984] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1804), 1, - sym_keyword_only, - STATE(4), 1, - sym__double_quote_string, - STATE(115), 1, - sym_identifier, - STATE(927), 1, - sym_relation, - STATE(987), 1, - sym_object_reference, - STATE(635), 2, + ACTIONS(1747), 1, + sym_keyword_table, + ACTIONS(1749), 1, + sym_keyword_view, + ACTIONS(1751), 1, + sym_keyword_sequence, + ACTIONS(1753), 1, + sym_keyword_index, + ACTIONS(1755), 1, + sym_keyword_type, + ACTIONS(1757), 1, + sym_keyword_database, + ACTIONS(1759), 1, + sym_keyword_schema, + STATE(622), 2, sym_comment, sym_marginalia, - [34388] = 11, + ACTIONS(1745), 3, + sym_keyword_group, + sym_keyword_user, + sym_keyword_role, + [34021] = 13, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(397), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(433), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(435), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(758), 1, sym_keyword_if, - STATE(4), 1, - sym__double_quote_string, - STATE(115), 1, + ACTIONS(1761), 1, + sym_keyword_column, + ACTIONS(1763), 1, + sym_keyword_constraint, + STATE(5), 1, sym_identifier, - STATE(784), 1, - sym__if_exists, - STATE(884), 1, - sym_object_reference, - STATE(636), 2, + STATE(17), 1, + sym__double_quote_string, + STATE(712), 1, + sym__if_not_exists, + STATE(728), 1, + sym_column_definition, + STATE(623), 2, sym_comment, sym_marginalia, - [34423] = 11, + [34062] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1806), 1, - sym_keyword_order, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(1810), 1, - sym_keyword_separator, - ACTIONS(1812), 1, - anon_sym_RPAREN, - ACTIONS(1814), 1, - anon_sym_COMMA, - STATE(727), 1, - sym_order_by, - STATE(1062), 1, - aux_sym_invocation_repeat1, - STATE(1368), 1, - sym_limit, - STATE(637), 2, + STATE(624), 2, sym_comment, sym_marginalia, - [34458] = 11, + ACTIONS(1765), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(1767), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, + sym__identifier, + [34086] = 12, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, ACTIONS(1769), 1, + sym_keyword_column, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(8), 1, sym_identifier, - STATE(463), 1, - sym_object_reference, - STATE(767), 1, + STATE(756), 1, + sym_column_definition, + STATE(805), 1, sym__if_exists, - STATE(638), 2, + STATE(625), 2, sym_comment, sym_marginalia, - [34493] = 11, + [34124] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + STATE(626), 2, + sym_comment, + sym_marginalia, + ACTIONS(1773), 4, + ts_builtin_sym_end, + anon_sym_SEMI, anon_sym_DQUOTE, - ACTIONS(504), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1775), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, sym__identifier, - ACTIONS(1816), 1, - anon_sym_RPAREN, - STATE(4), 1, - sym__double_quote_string, - STATE(610), 1, - aux_sym__compute_stats_repeat1, - STATE(785), 1, - sym_identifier, - STATE(869), 1, - sym_field, - STATE(639), 2, - sym_comment, - sym_marginalia, - [34528] = 11, + [34148] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(498), 1, - sym_keyword_as, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1818), 1, - sym_keyword_on, - STATE(4), 1, - sym__double_quote_string, - STATE(631), 1, - sym_identifier, - STATE(1403), 1, - sym_alias_name, - STATE(640), 2, + STATE(627), 2, sym_comment, sym_marginalia, - [34563] = 10, + ACTIONS(1777), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(1779), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, + sym__identifier, + [34172] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - ACTIONS(1820), 1, - anon_sym_LPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(630), 1, + aux_sym__compute_stats_repeat1, + STATE(774), 1, sym_identifier, - STATE(632), 2, - sym_object_reference, - sym_subquery, - STATE(641), 2, + STATE(888), 1, + sym_field, + ACTIONS(1781), 2, + anon_sym_RPAREN, + anon_sym_COMMA, + STATE(628), 2, sym_comment, sym_marginalia, - [34596] = 11, + [34208] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + STATE(629), 2, + sym_comment, + sym_marginalia, + ACTIONS(1783), 4, + ts_builtin_sym_end, + anon_sym_SEMI, anon_sym_DQUOTE, - ACTIONS(504), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1785), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(770), 1, - sym_assignment, - STATE(785), 1, - sym_identifier, - STATE(993), 1, - sym_set_values, - STATE(1584), 1, - sym_field, - STATE(642), 2, - sym_comment, - sym_marginalia, - [34631] = 11, + [34232] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(1787), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(1792), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(1795), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(774), 1, sym_identifier, - STATE(790), 1, - sym__if_exists, - STATE(791), 1, - sym_column_definition, - STATE(643), 2, + STATE(888), 1, + sym_field, + ACTIONS(1790), 2, + anon_sym_RPAREN, + anon_sym_COMMA, + STATE(630), 3, sym_comment, sym_marginalia, - [34666] = 11, + aux_sym__compute_stats_repeat1, + [34266] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + STATE(631), 2, + sym_comment, + sym_marginalia, + ACTIONS(1798), 4, + ts_builtin_sym_end, + anon_sym_SEMI, anon_sym_DQUOTE, - ACTIONS(504), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1800), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(770), 1, - sym_assignment, - STATE(785), 1, - sym_identifier, - STATE(1011), 1, - sym_set_values, - STATE(1584), 1, - sym_field, - STATE(644), 2, - sym_comment, - sym_marginalia, - [34701] = 11, + [34290] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(498), 1, - sym_keyword_as, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1822), 1, - sym_keyword_using, - STATE(4), 1, - sym__double_quote_string, - STATE(631), 1, - sym_identifier, - STATE(1401), 1, - sym_alias_name, - STATE(645), 2, + STATE(632), 2, sym_comment, sym_marginalia, - [34736] = 10, + ACTIONS(1802), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(1804), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, + sym__identifier, + [34314] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1413), 1, - sym_keyword_rename, - ACTIONS(1415), 1, + ACTIONS(1427), 1, sym_keyword_owner, - ACTIONS(1824), 1, + ACTIONS(1806), 1, sym_keyword_set, - ACTIONS(1826), 1, - aux_sym_keyword_with_token1, - ACTIONS(1828), 1, - sym_keyword_reset, - STATE(731), 1, - sym_keyword_with, - STATE(646), 2, + ACTIONS(1808), 1, + sym_keyword_alter, + ACTIONS(1810), 1, + sym_keyword_drop, + ACTIONS(1812), 1, + sym_keyword_add, + ACTIONS(1814), 1, + sym_keyword_rename, + STATE(633), 2, sym_comment, sym_marginalia, - STATE(1282), 2, + STATE(1271), 3, sym_rename_object, + sym_set_schema, sym_change_ownership, - [34769] = 11, + [34348] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(634), 2, + sym_comment, + sym_marginalia, + ACTIONS(1816), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(1818), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, + sym__identifier, + [34372] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + STATE(635), 2, + sym_comment, + sym_marginalia, + ACTIONS(1820), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + ACTIONS(1822), 5, + sym_keyword_password, + sym_keyword_encrypted, + sym_keyword_valid, + sym_keyword_connection, sym__identifier, - ACTIONS(502), 1, + [34396] = 11, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - ACTIONS(1830), 1, - sym_keyword_column, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - STATE(817), 1, - sym__if_exists, - STATE(1023), 1, + STATE(774), 1, sym_identifier, - STATE(647), 2, + STATE(802), 1, + sym_assignment, + STATE(1001), 1, + sym_set_values, + STATE(1401), 1, + sym_field, + STATE(636), 2, sym_comment, sym_marginalia, - [34804] = 11, + [34431] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(762), 1, + ACTIONS(758), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(749), 1, + STATE(736), 1, sym__if_not_exists, - STATE(751), 1, + STATE(737), 1, sym_column_definition, - STATE(648), 2, + STATE(637), 2, sym_comment, sym_marginalia, - [34839] = 9, + [34466] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1834), 1, + ACTIONS(1826), 1, sym_keyword_delete, - ACTIONS(1836), 1, + ACTIONS(1828), 1, sym_keyword_insert, - ACTIONS(1838), 1, + ACTIONS(1830), 1, sym_keyword_update, - ACTIONS(1840), 1, + ACTIONS(1832), 1, sym_keyword_where, - STATE(1101), 1, + STATE(1003), 1, sym_where, - STATE(649), 2, + STATE(638), 2, sym_comment, sym_marginalia, - ACTIONS(1832), 3, + ACTIONS(1824), 3, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_when, - [34870] = 11, + [34497] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - ACTIONS(1842), 1, - sym_keyword_concurrently, - STATE(4), 1, + ACTIONS(1834), 1, + sym_keyword_table, + ACTIONS(1836), 1, + sym_keyword_local, + STATE(3), 1, sym__double_quote_string, - STATE(786), 1, + STATE(116), 1, sym_identifier, - STATE(886), 1, - sym__if_exists, - STATE(650), 2, + STATE(1488), 1, + sym_object_reference, + STATE(639), 2, sym_comment, sym_marginalia, - [34905] = 11, + [34532] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(770), 1, - sym_assignment, - STATE(785), 1, - sym_identifier, - STATE(1009), 1, - sym_set_values, - STATE(1584), 1, - sym_field, - STATE(651), 2, + ACTIONS(1838), 1, + sym_keyword_order, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(1842), 1, + sym_keyword_separator, + ACTIONS(1844), 1, + anon_sym_RPAREN, + ACTIONS(1846), 1, + anon_sym_COMMA, + STATE(726), 1, + sym_order_by, + STATE(1007), 1, + aux_sym_invocation_repeat1, + STATE(1448), 1, + sym_limit, + STATE(640), 2, sym_comment, sym_marginalia, - [34940] = 11, + [34567] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(787), 1, - sym__if_exists, - STATE(897), 1, + STATE(238), 1, sym_object_reference, - STATE(652), 2, + STATE(739), 1, + sym__if_exists, + STATE(641), 2, sym_comment, sym_marginalia, - [34975] = 4, + [34602] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(653), 2, + STATE(642), 2, sym_comment, sym_marginalia, - ACTIONS(1844), 8, + ACTIONS(1848), 8, sym_keyword_from, sym_keyword_on, sym_keyword_order, @@ -41302,4965 +41158,5278 @@ static const uint16_t ts_small_parse_table[] = { sym_keyword_using, anon_sym_RPAREN, anon_sym_COMMA, - [34996] = 11, + [34623] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(795), 1, - sym__if_exists, - STATE(1112), 1, + STATE(688), 1, sym_object_reference, - STATE(654), 2, + STATE(745), 1, + sym__if_exists, + STATE(643), 2, sym_comment, sym_marginalia, - [35031] = 11, + [34658] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(770), 1, - sym_assignment, - STATE(785), 1, + STATE(774), 1, sym_identifier, - STATE(1002), 1, - sym_set_values, - STATE(1584), 1, - sym_field, - STATE(655), 2, - sym_comment, - sym_marginalia, - [35066] = 11, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(770), 1, + STATE(802), 1, sym_assignment, - STATE(785), 1, - sym_identifier, - STATE(1103), 1, + STATE(949), 1, sym_set_values, - STATE(1584), 1, + STATE(1401), 1, sym_field, - STATE(656), 2, + STATE(644), 2, sym_comment, sym_marginalia, - [35101] = 11, + [34693] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - ACTIONS(1846), 1, - sym_keyword_column, - STATE(4), 1, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(23), 1, + sym__single_quote_string, + STATE(108), 1, sym__double_quote_string, - STATE(744), 1, - sym_identifier, - STATE(812), 1, - sym__if_exists, - STATE(657), 2, - sym_comment, - sym_marginalia, - [35136] = 9, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - ACTIONS(1850), 1, - sym_keyword_delete, - ACTIONS(1852), 1, - sym_keyword_insert, - ACTIONS(1854), 1, - sym_keyword_update, - STATE(994), 1, - sym_where, - STATE(658), 2, - sym_comment, - sym_marginalia, - ACTIONS(1848), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [35167] = 9, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - ACTIONS(1858), 1, - sym_keyword_delete, - ACTIONS(1860), 1, - sym_keyword_insert, - ACTIONS(1862), 1, - sym_keyword_update, - STATE(1011), 1, - sym_where, - STATE(659), 2, + STATE(645), 2, sym_comment, sym_marginalia, - ACTIONS(1856), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [35198] = 11, + STATE(1243), 2, + sym_literal_string, + sym_identifier, + [34726] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(770), 1, - sym_assignment, - STATE(785), 1, + STATE(774), 1, sym_identifier, - STATE(1013), 1, + STATE(802), 1, + sym_assignment, + STATE(1031), 1, sym_set_values, - STATE(1584), 1, + STATE(1401), 1, sym_field, - STATE(660), 2, + STATE(646), 2, sym_comment, sym_marginalia, - [35233] = 11, + [34761] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1806), 1, - sym_keyword_order, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(1864), 1, - sym_keyword_separator, - ACTIONS(1866), 1, - anon_sym_RPAREN, - ACTIONS(1868), 1, - anon_sym_COMMA, - STATE(732), 1, - sym_order_by, - STATE(996), 1, - aux_sym_invocation_repeat1, - STATE(1425), 1, - sym_limit, - STATE(661), 2, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(495), 1, + sym_keyword_as, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1850), 1, + sym_keyword_using, + STATE(3), 1, + sym__double_quote_string, + STATE(642), 1, + sym_identifier, + STATE(1353), 1, + sym_alias_name, + STATE(647), 2, sym_comment, sym_marginalia, - [35268] = 9, + [34796] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1840), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(476), 1, + sym_object_reference, + STATE(714), 1, + sym__if_exists, + STATE(648), 2, + sym_comment, + sym_marginalia, + [34831] = 9, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1832), 1, sym_keyword_where, - ACTIONS(1872), 1, + ACTIONS(1854), 1, sym_keyword_delete, - ACTIONS(1874), 1, + ACTIONS(1856), 1, sym_keyword_insert, - ACTIONS(1876), 1, + ACTIONS(1858), 1, sym_keyword_update, - STATE(1075), 1, + STATE(1031), 1, sym_where, - STATE(662), 2, + STATE(649), 2, sym_comment, sym_marginalia, - ACTIONS(1870), 3, + ACTIONS(1852), 3, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_when, - [35299] = 11, + [34862] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(762), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + ACTIONS(1860), 1, + sym_keyword_column, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(798), 1, sym_identifier, - STATE(792), 1, - sym__if_not_exists, - STATE(793), 1, - sym_column_definition, - STATE(663), 2, + STATE(847), 1, + sym__if_exists, + STATE(650), 2, sym_comment, sym_marginalia, - [35334] = 11, + [34897] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - ACTIONS(1697), 1, - anon_sym_RPAREN, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + ACTIONS(1862), 1, + sym_keyword_column, + STATE(3), 1, sym__double_quote_string, - STATE(615), 1, - aux_sym__compute_stats_repeat1, - STATE(785), 1, + STATE(849), 1, + sym__if_exists, + STATE(1081), 1, sym_identifier, - STATE(869), 1, - sym_field, - STATE(664), 2, + STATE(651), 2, sym_comment, sym_marginalia, - [35369] = 11, + [34932] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1878), 1, - sym_keyword_only, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(774), 1, sym_identifier, - STATE(987), 1, - sym_object_reference, - STATE(1131), 1, - sym_relation, - STATE(665), 2, + STATE(802), 1, + sym_assignment, + STATE(1013), 1, + sym_set_values, + STATE(1401), 1, + sym_field, + STATE(652), 2, sym_comment, sym_marginalia, - [35404] = 11, + [34967] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(758), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(8), 1, sym_identifier, - STATE(782), 1, - sym__if_exists, - STATE(880), 1, - sym_object_reference, - STATE(666), 2, + STATE(712), 1, + sym__if_not_exists, + STATE(728), 1, + sym_column_definition, + STATE(653), 2, sym_comment, sym_marginalia, - [35439] = 11, + [35002] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1880), 1, - sym_keyword_table, - ACTIONS(1882), 1, - sym_keyword_local, - STATE(4), 1, + ACTIONS(1864), 1, + sym_keyword_only, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1351), 1, + STATE(962), 1, sym_object_reference, - STATE(667), 2, + STATE(963), 1, + sym_relation, + STATE(654), 2, + sym_comment, + sym_marginalia, + [35037] = 11, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1838), 1, + sym_keyword_order, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(1866), 1, + sym_keyword_separator, + ACTIONS(1868), 1, + anon_sym_RPAREN, + ACTIONS(1870), 1, + anon_sym_COMMA, + STATE(799), 1, + sym_order_by, + STATE(1017), 1, + aux_sym_invocation_repeat1, + STATE(1617), 1, + sym_limit, + STATE(655), 2, sym_comment, sym_marginalia, - [35474] = 10, + [35072] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - ACTIONS(1820), 1, - anon_sym_LPAREN, - STATE(4), 1, + ACTIONS(1872), 1, + sym_keyword_only, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(640), 2, + STATE(962), 1, sym_object_reference, - sym_subquery, - STATE(668), 2, + STATE(1140), 1, + sym_relation, + STATE(656), 2, + sym_comment, + sym_marginalia, + [35107] = 10, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1425), 1, + sym_keyword_rename, + ACTIONS(1427), 1, + sym_keyword_owner, + ACTIONS(1874), 1, + sym_keyword_set, + ACTIONS(1876), 1, + aux_sym_keyword_with_token1, + ACTIONS(1878), 1, + sym_keyword_reset, + STATE(713), 1, + sym_keyword_with, + STATE(657), 2, sym_comment, sym_marginalia, - [35507] = 10, + STATE(1273), 2, + sym_rename_object, + sym_change_ownership, + [35140] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(495), 1, + sym_keyword_as, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + ACTIONS(1880), 1, + sym_keyword_on, + STATE(3), 1, sym__double_quote_string, - STATE(873), 1, - sym__if_exists, - STATE(1215), 1, + STATE(642), 1, sym_identifier, - STATE(669), 2, + STATE(1434), 1, + sym_alias_name, + STATE(658), 2, + sym_comment, + sym_marginalia, + [35175] = 9, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1832), 1, + sym_keyword_where, + ACTIONS(1884), 1, + sym_keyword_delete, + ACTIONS(1886), 1, + sym_keyword_insert, + ACTIONS(1888), 1, + sym_keyword_update, + STATE(1075), 1, + sym_where, + STATE(659), 2, sym_comment, sym_marginalia, - [35539] = 10, + ACTIONS(1882), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [35206] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(774), 1, sym_identifier, - STATE(987), 1, - sym_object_reference, - STATE(1117), 1, - sym_relation, - STATE(670), 2, + STATE(802), 1, + sym_assignment, + STATE(1018), 1, + sym_set_values, + STATE(1401), 1, + sym_field, + STATE(660), 2, sym_comment, sym_marginalia, - [35571] = 10, + [35241] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1890), 1, + anon_sym_LPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1098), 1, - sym__rename_table_names, - STATE(1435), 1, - sym_object_reference, - STATE(671), 2, + STATE(661), 2, sym_comment, sym_marginalia, - [35603] = 10, + STATE(663), 2, + sym_object_reference, + sym_subquery, + [35274] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1892), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(617), 1, + STATE(620), 1, aux_sym__compute_stats_repeat1, - STATE(785), 1, + STATE(774), 1, sym_identifier, - STATE(869), 1, + STATE(888), 1, sym_field, - STATE(672), 2, - sym_comment, - sym_marginalia, - [35635] = 8, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1886), 1, - anon_sym_COMMA, - STATE(692), 1, - aux_sym__truncate_statement_repeat1, - STATE(1141), 1, - sym__drop_behavior, - ACTIONS(1665), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - STATE(673), 2, + STATE(662), 2, sym_comment, sym_marginalia, - [35663] = 10, + [35309] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(495), 1, + sym_keyword_as, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(762), 1, - sym_keyword_if, - STATE(4), 1, + ACTIONS(1894), 1, + sym_keyword_on, + STATE(3), 1, sym__double_quote_string, - STATE(842), 1, - sym__if_not_exists, - STATE(1136), 1, + STATE(642), 1, sym_identifier, - STATE(674), 2, + STATE(1420), 1, + sym_alias_name, + STATE(663), 2, sym_comment, sym_marginalia, - [35695] = 10, + [35344] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(426), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1888), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(17), 1, + STATE(3), 1, sym__double_quote_string, - STATE(917), 1, - sym_column, - STATE(944), 1, + STATE(774), 1, sym_identifier, - STATE(1030), 1, - sym_ordered_column, - STATE(675), 2, + STATE(802), 1, + sym_assignment, + STATE(1024), 1, + sym_set_values, + STATE(1401), 1, + sym_field, + STATE(664), 2, sym_comment, sym_marginalia, - [35727] = 10, + [35379] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, ACTIONS(1890), 1, anon_sym_LPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(807), 1, - sym_ordered_columns, - STATE(1299), 1, + STATE(116), 1, sym_identifier, - STATE(676), 2, + STATE(658), 2, + sym_object_reference, + sym_subquery, + STATE(665), 2, sym_comment, sym_marginalia, - [35759] = 10, + [35412] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(862), 1, - sym__if_exists, - STATE(926), 1, + STATE(116), 1, sym_identifier, - STATE(677), 2, + STATE(722), 1, + sym__if_exists, + STATE(822), 1, + sym_object_reference, + STATE(666), 2, sym_comment, sym_marginalia, - [35791] = 8, + [35447] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, - anon_sym_COMMA, - STATE(688), 1, - aux_sym__truncate_statement_repeat1, - STATE(1188), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1892), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(678), 2, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(723), 1, + sym__if_exists, + STATE(827), 1, + sym_object_reference, + STATE(667), 2, sym_comment, sym_marginalia, - [35819] = 8, + [35482] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, - anon_sym_COMMA, - STATE(703), 1, - aux_sym__truncate_statement_repeat1, - STATE(1188), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1892), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(679), 2, + STATE(668), 2, sym_comment, sym_marginalia, - [35847] = 10, + ACTIONS(1896), 8, + sym_keyword_from, + sym_keyword_on, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_separator, + sym_keyword_using, + anon_sym_RPAREN, + anon_sym_COMMA, + [35503] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(901), 1, - sym__if_exists, - STATE(902), 1, + STATE(116), 1, sym_identifier, - STATE(680), 2, + STATE(731), 1, + sym__if_exists, + STATE(828), 1, + sym_object_reference, + STATE(669), 2, sym_comment, sym_marginalia, - [35879] = 10, + [35538] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + ACTIONS(1898), 1, + sym_keyword_concurrently, + STATE(3), 1, sym__double_quote_string, - STATE(903), 1, - sym__if_exists, - STATE(904), 1, + STATE(741), 1, sym_identifier, - STATE(681), 2, + STATE(830), 1, + sym__if_exists, + STATE(670), 2, sym_comment, sym_marginalia, - [35911] = 10, + [35573] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(426), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1888), 1, - sym__identifier, - STATE(17), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(917), 1, - sym_column, - STATE(944), 1, + STATE(116), 1, sym_identifier, - STATE(1167), 1, - sym_ordered_column, - STATE(682), 2, + STATE(742), 1, + sym__if_exists, + STATE(834), 1, + sym_object_reference, + STATE(671), 2, sym_comment, sym_marginalia, - [35943] = 10, + [35608] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(1832), 1, + sym_keyword_where, + ACTIONS(1902), 1, + sym_keyword_delete, + ACTIONS(1904), 1, + sym_keyword_insert, + ACTIONS(1906), 1, + sym_keyword_update, + STATE(1092), 1, + sym_where, + STATE(672), 2, + sym_comment, + sym_marginalia, + ACTIONS(1900), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [35639] = 11, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1894), 1, - sym_keyword_column, - ACTIONS(1896), 1, - sym_keyword_to, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - STATE(1443), 1, + STATE(774), 1, sym_identifier, - STATE(683), 2, + STATE(802), 1, + sym_assignment, + STATE(1101), 1, + sym_set_values, + STATE(1401), 1, + sym_field, + STATE(673), 2, sym_comment, sym_marginalia, - [35975] = 7, + [35674] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1415), 1, - sym_keyword_owner, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, ACTIONS(1771), 1, - sym_keyword_set, - ACTIONS(1898), 1, - sym_keyword_rename, - STATE(684), 2, + sym_keyword_if, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(743), 1, + sym__if_exists, + STATE(1069), 1, + sym_object_reference, + STATE(674), 2, sym_comment, sym_marginalia, - STATE(1150), 4, - sym_rename_column, - sym_rename_object, - sym_set_schema, - sym_change_ownership, - [36001] = 10, + [35709] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1900), 1, - sym_keyword_tablespace, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(1005), 1, + STATE(8), 1, sym_identifier, - STATE(1177), 1, - sym_set_configuration, - STATE(685), 2, + STATE(734), 1, + sym__if_exists, + STATE(735), 1, + sym_column_definition, + STATE(675), 2, sym_comment, sym_marginalia, - [36033] = 10, + [35744] = 11, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - ACTIONS(1902), 1, + ACTIONS(1741), 1, anon_sym_RPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(785), 1, + STATE(619), 1, + aux_sym__compute_stats_repeat1, + STATE(774), 1, sym_identifier, - STATE(1065), 1, + STATE(888), 1, sym_field, - STATE(686), 2, + STATE(676), 2, + sym_comment, + sym_marginalia, + [35779] = 8, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1910), 1, + anon_sym_COMMA, + STATE(704), 1, + aux_sym__truncate_statement_repeat1, + STATE(1226), 1, + sym__drop_behavior, + ACTIONS(1685), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + STATE(677), 2, sym_comment, sym_marginalia, - [36065] = 10, + [35807] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(785), 1, + STATE(116), 1, sym_identifier, - STATE(877), 1, - sym_assignment, - STATE(1584), 1, - sym_field, - STATE(687), 2, + STATE(962), 1, + sym_object_reference, + STATE(1127), 1, + sym_relation, + STATE(678), 2, + sym_comment, + sym_marginalia, + [35839] = 10, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(758), 1, + sym_keyword_if, + STATE(3), 1, + sym__double_quote_string, + STATE(904), 1, + sym__if_not_exists, + STATE(1237), 1, + sym_identifier, + STATE(679), 2, sym_comment, sym_marginalia, - [36097] = 8, + [35871] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, - anon_sym_COMMA, - STATE(703), 1, - aux_sym__truncate_statement_repeat1, - STATE(1225), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1904), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(688), 2, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(758), 1, + sym_keyword_if, + STATE(3), 1, + sym__double_quote_string, + STATE(889), 1, + sym__if_not_exists, + STATE(1202), 1, + sym_identifier, + STATE(680), 2, sym_comment, sym_marginalia, - [36125] = 10, + [35903] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(788), 1, + STATE(764), 1, sym_identifier, - STATE(889), 1, + STATE(914), 1, sym__if_exists, - STATE(689), 2, + STATE(681), 2, sym_comment, sym_marginalia, - [36157] = 10, + [35935] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + ACTIONS(1912), 1, + sym_keyword_tablespace, + STATE(3), 1, sym__double_quote_string, - STATE(894), 1, - sym__if_exists, - STATE(1096), 1, + STATE(1020), 1, sym_identifier, - STATE(690), 2, + STATE(1256), 1, + sym_set_configuration, + STATE(682), 2, sym_comment, sym_marginalia, - [36189] = 8, + [35967] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, + ACTIONS(1427), 1, + sym_keyword_owner, + ACTIONS(1806), 1, + sym_keyword_set, + ACTIONS(1914), 1, + sym_keyword_rename, + STATE(683), 2, + sym_comment, + sym_marginalia, + STATE(1298), 4, + sym_rename_column, + sym_rename_object, + sym_set_schema, + sym_change_ownership, + [35993] = 8, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1910), 1, anon_sym_COMMA, - STATE(679), 1, + STATE(715), 1, aux_sym__truncate_statement_repeat1, - STATE(1269), 1, + STATE(1210), 1, sym__drop_behavior, - ACTIONS(1693), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - STATE(691), 2, + ACTIONS(1916), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(684), 2, sym_comment, sym_marginalia, - [36217] = 8, + [36021] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, + ACTIONS(1910), 1, anon_sym_COMMA, - STATE(703), 1, + STATE(715), 1, aux_sym__truncate_statement_repeat1, - STATE(1269), 1, + STATE(1150), 1, sym__drop_behavior, - ACTIONS(1693), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - STATE(692), 2, + ACTIONS(1918), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(685), 2, sym_comment, sym_marginalia, - [36245] = 10, + [36049] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(433), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(435), 1, anon_sym_BQUOTE, - ACTIONS(762), 1, - sym_keyword_if, - STATE(4), 1, + ACTIONS(1920), 1, + sym__identifier, + STATE(17), 1, sym__double_quote_string, - STATE(820), 1, - sym__if_not_exists, - STATE(1148), 1, + STATE(823), 1, + sym_column, + STATE(995), 1, sym_identifier, - STATE(693), 2, + STATE(1212), 1, + sym_ordered_column, + STATE(686), 2, sym_comment, sym_marginalia, - [36277] = 10, + [36081] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1906), 1, - sym_keyword_none, - STATE(4), 1, + ACTIONS(1922), 1, + sym_keyword_tablespace, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(1020), 1, sym_identifier, - STATE(597), 1, - sym_object_reference, - STATE(694), 2, + STATE(1162), 1, + sym_set_configuration, + STATE(687), 2, sym_comment, sym_marginalia, - [36309] = 7, + [36113] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1415), 1, + ACTIONS(1427), 1, sym_keyword_owner, - ACTIONS(1771), 1, + ACTIONS(1806), 1, sym_keyword_set, - ACTIONS(1898), 1, + ACTIONS(1914), 1, sym_keyword_rename, - STATE(695), 2, + STATE(688), 2, sym_comment, sym_marginalia, - STATE(1287), 4, + STATE(1235), 4, sym_rename_column, sym_rename_object, sym_set_schema, sym_change_ownership, - [36335] = 10, + [36139] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, - sym_keyword_if, - STATE(4), 1, + ACTIONS(1924), 1, + sym_keyword_column, + ACTIONS(1926), 1, + sym_keyword_to, + STATE(3), 1, sym__double_quote_string, - STATE(754), 1, + STATE(1427), 1, sym_identifier, - STATE(870), 1, - sym__if_exists, - STATE(696), 2, + STATE(689), 2, sym_comment, sym_marginalia, - [36367] = 10, + [36171] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1908), 1, - sym_keyword_tablespace, - STATE(4), 1, - sym__double_quote_string, - STATE(1005), 1, - sym_identifier, - STATE(1274), 1, - sym_set_configuration, - STATE(697), 2, + ACTIONS(1910), 1, + anon_sym_COMMA, + STATE(684), 1, + aux_sym__truncate_statement_repeat1, + STATE(1150), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(1918), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(690), 2, sym_comment, sym_marginalia, - [36399] = 10, + [36199] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1769), 1, + ACTIONS(1771), 1, sym_keyword_if, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(733), 1, - sym_identifier, - STATE(872), 1, + STATE(925), 1, sym__if_exists, - STATE(698), 2, + STATE(927), 1, + sym_identifier, + STATE(691), 2, sym_comment, sym_marginalia, - [36431] = 10, + [36231] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - ACTIONS(1890), 1, + ACTIONS(1928), 1, anon_sym_LPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(818), 1, + STATE(924), 1, sym_ordered_columns, - STATE(1255), 1, + STATE(1293), 1, sym_identifier, - STATE(699), 2, + STATE(692), 2, sym_comment, sym_marginalia, - [36463] = 10, + [36263] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - ACTIONS(1910), 1, - anon_sym_RPAREN, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(785), 1, + STATE(807), 1, sym_identifier, - STATE(1048), 1, - sym_field, - STATE(700), 2, + STATE(923), 1, + sym__if_exists, + STATE(693), 2, sym_comment, sym_marginalia, - [36495] = 10, + [36295] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1930), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(774), 1, sym_identifier, - STATE(938), 1, - sym_relation, - STATE(987), 1, - sym_object_reference, - STATE(701), 2, + STATE(1056), 1, + sym_field, + STATE(694), 2, sym_comment, sym_marginalia, - [36527] = 9, + [36327] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1932), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(774), 1, sym_identifier, - STATE(791), 1, - sym_column_definition, - STATE(702), 2, - sym_comment, - sym_marginalia, - [36556] = 5, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1914), 1, - anon_sym_COMMA, - STATE(703), 3, + STATE(1022), 1, + sym_field, + STATE(695), 2, sym_comment, sym_marginalia, - aux_sym__truncate_statement_repeat1, - ACTIONS(1912), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_cascade, - sym_keyword_restrict, - [36577] = 9, + [36359] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(898), 1, + sym__if_exists, + STATE(997), 1, sym_identifier, - STATE(952), 1, - sym_column_definition, - STATE(704), 2, + STATE(696), 2, sym_comment, sym_marginalia, - [36606] = 9, + [36391] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1005), 1, + STATE(116), 1, sym_identifier, - STATE(1220), 1, - sym_set_configuration, - STATE(705), 2, - sym_comment, - sym_marginalia, - [36635] = 8, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(1917), 1, - sym_keyword_null, - STATE(622), 1, - sym_literal_string, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, - STATE(706), 2, + STATE(962), 1, + sym_object_reference, + STATE(990), 1, + sym_relation, + STATE(697), 2, sym_comment, sym_marginalia, - [36662] = 9, + [36423] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1919), 1, - sym_keyword_all, - STATE(4), 1, + ACTIONS(1934), 1, + sym_keyword_none, + STATE(3), 1, sym__double_quote_string, - STATE(1245), 1, + STATE(116), 1, sym_identifier, - STATE(707), 2, + STATE(610), 1, + sym_object_reference, + STATE(698), 2, sym_comment, sym_marginalia, - [36691] = 9, + [36455] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1005), 1, + STATE(774), 1, sym_identifier, - STATE(1256), 1, - sym_set_configuration, - STATE(708), 2, - sym_comment, - sym_marginalia, - [36720] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1923), 1, - sym_keyword_collate, - STATE(1311), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1921), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(709), 2, + STATE(892), 1, + sym_assignment, + STATE(1401), 1, + sym_field, + STATE(699), 2, sym_comment, sym_marginalia, - [36745] = 9, + [36487] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1069), 1, + STATE(1030), 1, + sym__rename_table_names, + STATE(1543), 1, sym_object_reference, - STATE(710), 2, + STATE(700), 2, sym_comment, sym_marginalia, - [36774] = 9, + [36519] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1925), 1, - sym_keyword_all, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - STATE(1262), 1, + STATE(628), 1, + aux_sym__compute_stats_repeat1, + STATE(774), 1, sym_identifier, - STATE(711), 2, + STATE(888), 1, + sym_field, + STATE(701), 2, sym_comment, sym_marginalia, - [36803] = 9, + [36551] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, + ACTIONS(493), 1, sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1927), 1, - sym_keyword_column, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(1018), 1, + STATE(821), 1, + sym__if_exists, + STATE(1181), 1, sym_identifier, - STATE(712), 2, + STATE(702), 2, sym_comment, sym_marginalia, - [36832] = 8, + [36583] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1929), 1, - sym_keyword_table, - ACTIONS(1931), 1, - sym_keyword_temp, - ACTIONS(1933), 1, - sym_keyword_temporary, - STATE(1601), 1, - sym__temporary, - ACTIONS(1935), 2, - sym_keyword_unlogged, - sym_keyword_external, - STATE(713), 2, + ACTIONS(1910), 1, + anon_sym_COMMA, + STATE(685), 1, + aux_sym__truncate_statement_repeat1, + STATE(1165), 1, + sym__drop_behavior, + ACTIONS(1717), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + STATE(703), 2, sym_comment, sym_marginalia, - [36859] = 4, + [36611] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(714), 2, - sym_comment, - sym_marginalia, - ACTIONS(1937), 6, + ACTIONS(1910), 1, + anon_sym_COMMA, + STATE(715), 1, + aux_sym__truncate_statement_repeat1, + STATE(1165), 1, + sym__drop_behavior, + ACTIONS(1717), 2, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_on, - sym_keyword_references, - anon_sym_RPAREN, - anon_sym_COMMA, - [36878] = 9, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + STATE(704), 2, + sym_comment, + sym_marginalia, + [36639] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(433), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(435), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1920), 1, sym__identifier, - STATE(4), 1, + STATE(17), 1, sym__double_quote_string, - STATE(115), 1, + STATE(823), 1, + sym_column, + STATE(995), 1, sym_identifier, - STATE(1248), 1, - sym_object_reference, - STATE(715), 2, + STATE(1100), 1, + sym_ordered_column, + STATE(705), 2, sym_comment, sym_marginalia, - [36907] = 9, + [36671] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(826), 1, + sym_ordered_columns, + STATE(1276), 1, sym_identifier, - STATE(1240), 1, - sym_object_reference, - STATE(716), 2, + STATE(706), 2, sym_comment, sym_marginalia, - [36936] = 9, + [36703] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(835), 1, + sym__if_exists, + STATE(836), 1, sym_identifier, - STATE(1244), 1, - sym_object_reference, - STATE(717), 2, + STATE(707), 2, sym_comment, sym_marginalia, - [36965] = 9, + [36735] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(732), 1, sym_identifier, - STATE(796), 1, - sym_column_definition, - STATE(718), 2, + STATE(896), 1, + sym__if_exists, + STATE(708), 2, sym_comment, sym_marginalia, - [36994] = 9, + [36767] = 10, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(1771), 1, + sym_keyword_if, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(838), 1, + sym__if_exists, + STATE(842), 1, sym_identifier, - STATE(751), 1, - sym_column_definition, - STATE(719), 2, + STATE(709), 2, sym_comment, sym_marginalia, - [37023] = 7, + [36799] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, - sym_keyword_first, - ACTIONS(1943), 1, - sym_keyword_after, - STATE(1034), 1, - sym_column_position, - STATE(720), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1146), 1, + sym_file_path, + STATE(1147), 1, + sym_literal_string, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, + STATE(710), 2, sym_comment, sym_marginalia, - ACTIONS(1939), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [37048] = 7, + [36826] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, - sym_keyword_first, - ACTIONS(1943), 1, - sym_keyword_after, - STATE(1026), 1, - sym_column_position, - STATE(721), 2, + ACTIONS(1938), 1, + anon_sym_COMMA, + STATE(721), 1, + aux_sym_set_values_repeat1, + STATE(711), 2, sym_comment, sym_marginalia, - ACTIONS(1945), 3, + ACTIONS(1936), 4, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [37073] = 9, + sym_keyword_where, + sym_keyword_when, + [36849] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(8), 1, sym_identifier, - STATE(1115), 1, - sym_object_reference, - STATE(722), 2, + STATE(737), 1, + sym_column_definition, + STATE(712), 2, sym_comment, sym_marginalia, - [37102] = 9, + [36878] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(115), 1, - sym_identifier, - STATE(908), 1, - sym_object_reference, - STATE(723), 2, + ACTIONS(1425), 1, + sym_keyword_rename, + ACTIONS(1427), 1, + sym_keyword_owner, + ACTIONS(1940), 1, + sym_keyword_set, + ACTIONS(1942), 1, + sym_keyword_reset, + STATE(713), 2, sym_comment, sym_marginalia, - [37131] = 9, + STATE(1162), 2, + sym_rename_object, + sym_change_ownership, + [36905] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(986), 1, + STATE(465), 1, sym_object_reference, - STATE(724), 2, + STATE(714), 2, sym_comment, sym_marginalia, - [37160] = 4, + [36934] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(725), 2, + ACTIONS(1946), 1, + anon_sym_COMMA, + STATE(715), 3, sym_comment, sym_marginalia, - ACTIONS(1947), 6, + aux_sym__truncate_statement_repeat1, + ACTIONS(1944), 4, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_on, - sym_keyword_references, - anon_sym_RPAREN, - anon_sym_COMMA, - [37179] = 9, + sym_keyword_cascade, + sym_keyword_restrict, + [36955] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1277), 1, + STATE(1400), 1, sym_object_reference, - STATE(726), 2, + STATE(716), 2, sym_comment, sym_marginalia, - [37208] = 9, + [36984] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(1949), 1, - sym_keyword_separator, ACTIONS(1951), 1, - anon_sym_RPAREN, + sym_keyword_first, ACTIONS(1953), 1, - anon_sym_COMMA, - STATE(1003), 1, - aux_sym_invocation_repeat1, - STATE(1439), 1, - sym_limit, - STATE(727), 2, + sym_keyword_after, + STATE(1068), 1, + sym_column_position, + STATE(717), 2, sym_comment, sym_marginalia, - [37237] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1957), 1, - sym_keyword_collate, - STATE(1218), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1955), 2, + ACTIONS(1949), 3, ts_builtin_sym_end, anon_sym_SEMI, - STATE(728), 2, - sym_comment, - sym_marginalia, - [37262] = 7, + anon_sym_COMMA, + [37009] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, - sym_keyword_first, - ACTIONS(1943), 1, - sym_keyword_after, - STATE(1027), 1, - sym_column_position, - STATE(729), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(1176), 1, + sym_object_reference, + STATE(718), 2, sym_comment, sym_marginalia, - ACTIONS(1959), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [37287] = 9, + [37038] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1961), 1, - sym_keyword_all, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - STATE(1178), 1, + STATE(116), 1, sym_identifier, - STATE(730), 2, + STATE(1278), 1, + sym_object_reference, + STATE(719), 2, sym_comment, sym_marginalia, - [37316] = 8, + [37067] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1413), 1, - sym_keyword_rename, - ACTIONS(1415), 1, - sym_keyword_owner, - ACTIONS(1963), 1, - sym_keyword_set, - ACTIONS(1965), 1, - sym_keyword_reset, - STATE(731), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(995), 1, + sym_identifier, + STATE(1275), 1, + sym_column, + STATE(720), 2, sym_comment, sym_marginalia, - STATE(1177), 2, - sym_rename_object, - sym_change_ownership, - [37343] = 9, + [37096] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(1967), 1, - sym_keyword_separator, - ACTIONS(1969), 1, - anon_sym_RPAREN, - ACTIONS(1971), 1, + ACTIONS(1957), 1, anon_sym_COMMA, - STATE(1058), 1, - aux_sym_invocation_repeat1, - STATE(1549), 1, - sym_limit, - STATE(732), 2, + STATE(721), 3, sym_comment, sym_marginalia, - [37372] = 7, + aux_sym_set_values_repeat1, + ACTIONS(1955), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_where, + sym_keyword_when, + [37117] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1975), 1, - sym_keyword_on, - STATE(1059), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1973), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(733), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(920), 1, + sym_object_reference, + STATE(722), 2, sym_comment, sym_marginalia, - [37397] = 9, + [37146] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1190), 1, + STATE(921), 1, sym_object_reference, - STATE(734), 2, + STATE(723), 2, sym_comment, sym_marginalia, - [37426] = 9, + [37175] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1960), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(1379), 1, sym_identifier, - STATE(968), 1, - sym_object_reference, - STATE(735), 2, + STATE(724), 2, sym_comment, sym_marginalia, - [37455] = 7, + [37204] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, - sym_keyword_first, - ACTIONS(1943), 1, - sym_keyword_after, - STATE(1028), 1, - sym_column_position, - STATE(736), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(961), 1, + sym_object_reference, + STATE(725), 2, sym_comment, sym_marginalia, - ACTIONS(1977), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [37480] = 4, + [37233] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(737), 2, - sym_comment, - sym_marginalia, - ACTIONS(1979), 6, - sym_keyword_from, - sym_keyword_order, + ACTIONS(1840), 1, sym_keyword_limit, + ACTIONS(1962), 1, sym_keyword_separator, + ACTIONS(1964), 1, anon_sym_RPAREN, + ACTIONS(1966), 1, anon_sym_COMMA, - [37499] = 9, + STATE(1060), 1, + aux_sym_invocation_repeat1, + STATE(1387), 1, + sym_limit, + STATE(726), 2, + sym_comment, + sym_marginalia, + [37262] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(1960), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(1082), 1, sym_identifier, - STATE(943), 1, - sym_object_reference, - STATE(738), 2, + STATE(727), 2, sym_comment, sym_marginalia, - [37528] = 6, + [37291] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1983), 1, - anon_sym_COMMA, - STATE(781), 1, - aux_sym_set_values_repeat1, - STATE(739), 2, + ACTIONS(1951), 1, + sym_keyword_first, + ACTIONS(1953), 1, + sym_keyword_after, + STATE(1051), 1, + sym_column_position, + STATE(728), 2, sym_comment, sym_marginalia, - ACTIONS(1981), 4, + ACTIONS(1968), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_where, - sym_keyword_when, - [37551] = 9, + anon_sym_COMMA, + [37316] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(8), 1, sym_identifier, - STATE(1264), 1, - sym_object_reference, - STATE(740), 2, + STATE(728), 1, + sym_column_definition, + STATE(729), 2, sym_comment, sym_marginalia, - [37580] = 9, + [37345] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(995), 1, sym_identifier, - STATE(1082), 1, - sym_object_reference, - STATE(741), 2, - sym_comment, - sym_marginalia, - [37609] = 8, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(1985), 1, - sym_keyword_null, - STATE(616), 1, - sym_literal_string, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, - STATE(742), 2, + STATE(1133), 1, + sym_column, + STATE(730), 2, sym_comment, sym_marginalia, - [37636] = 9, + [37374] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1987), 1, - sym_keyword_all, - STATE(4), 1, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - STATE(416), 1, + STATE(116), 1, sym_identifier, - STATE(743), 2, + STATE(922), 1, + sym_object_reference, + STATE(731), 2, sym_comment, sym_marginalia, - [37665] = 9, + [37403] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(789), 1, + STATE(785), 1, sym_column_definition, - STATE(744), 2, - sym_comment, - sym_marginalia, - [37694] = 8, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1989), 1, - sym_keyword_in, - ACTIONS(1991), 1, - sym_keyword_between, - ACTIONS(1993), 1, - sym_keyword_similar, - STATE(580), 1, - sym_keyword_like, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - STATE(745), 2, + STATE(732), 2, sym_comment, sym_marginalia, - [37721] = 7, + [37432] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, + ACTIONS(1951), 1, sym_keyword_first, - ACTIONS(1943), 1, + ACTIONS(1953), 1, sym_keyword_after, - STATE(1095), 1, + STATE(1110), 1, sym_column_position, - STATE(746), 2, + STATE(733), 2, sym_comment, sym_marginalia, - ACTIONS(1995), 3, + ACTIONS(1970), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [37746] = 4, + [37457] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(747), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(8), 1, + sym_identifier, + STATE(786), 1, + sym_column_definition, + STATE(734), 2, sym_comment, sym_marginalia, - ACTIONS(1997), 6, - sym_keyword_from, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [37765] = 9, + [37486] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - ACTIONS(1999), 1, - anon_sym_STAR, - STATE(4), 1, - sym__double_quote_string, - STATE(127), 1, - sym_identifier, - STATE(748), 2, + ACTIONS(1951), 1, + sym_keyword_first, + ACTIONS(1953), 1, + sym_keyword_after, + STATE(1111), 1, + sym_column_position, + STATE(735), 2, sym_comment, sym_marginalia, - [37794] = 9, + ACTIONS(1972), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [37511] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(793), 1, + STATE(787), 1, sym_column_definition, - STATE(749), 2, + STATE(736), 2, sym_comment, sym_marginalia, - [37823] = 9, + [37540] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(734), 1, - anon_sym_DQUOTE, - ACTIONS(740), 1, - anon_sym_BQUOTE, - ACTIONS(1999), 1, - anon_sym_STAR, - ACTIONS(2001), 1, - sym__identifier, - STATE(167), 1, - sym__double_quote_string, - STATE(209), 1, - sym_identifier, - STATE(750), 2, + ACTIONS(1951), 1, + sym_keyword_first, + ACTIONS(1953), 1, + sym_keyword_after, + STATE(1114), 1, + sym_column_position, + STATE(737), 2, sym_comment, sym_marginalia, - [37852] = 7, + ACTIONS(1974), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [37565] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, + ACTIONS(1951), 1, sym_keyword_first, - ACTIONS(1943), 1, + ACTIONS(1953), 1, sym_keyword_after, - STATE(1099), 1, + STATE(1134), 1, sym_column_position, - STATE(751), 2, + STATE(738), 2, sym_comment, sym_marginalia, - ACTIONS(2003), 3, + ACTIONS(1976), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [37877] = 8, + [37590] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1989), 1, - sym_keyword_in, - ACTIONS(1993), 1, - sym_keyword_similar, - ACTIONS(2005), 1, - sym_keyword_between, - STATE(580), 1, - sym_keyword_like, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - STATE(752), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(245), 1, + sym_object_reference, + STATE(739), 2, sym_comment, sym_marginalia, - [37904] = 4, + [37619] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(753), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(967), 1, + sym_object_reference, + STATE(740), 2, sym_comment, sym_marginalia, - ACTIONS(2007), 6, - sym_keyword_from, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [37923] = 7, + [37648] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2011), 1, - sym_keyword_collate, - STATE(1172), 1, + ACTIONS(1980), 1, + sym_keyword_on, + STATE(1124), 1, sym__drop_behavior, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - ACTIONS(2009), 2, + ACTIONS(1978), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(754), 2, + STATE(741), 2, sym_comment, sym_marginalia, - [37948] = 4, + [37673] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(755), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(928), 1, + sym_object_reference, + STATE(742), 2, sym_comment, sym_marginalia, - ACTIONS(2013), 6, - sym_keyword_from, - sym_keyword_order, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [37967] = 9, + [37702] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1588), 1, + STATE(1141), 1, sym_object_reference, - STATE(756), 2, + STATE(743), 2, sym_comment, sym_marginalia, - [37996] = 8, + [37731] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1161), 1, - sym_file_path, - STATE(1207), 1, - sym_literal_string, - STATE(24), 2, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1982), 1, + sym_keyword_all, + STATE(3), 1, sym__double_quote_string, - sym__single_quote_string, - STATE(757), 2, + STATE(421), 1, + sym_identifier, + STATE(744), 2, sym_comment, sym_marginalia, - [38023] = 8, + [37760] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1207), 1, - sym_literal_string, - STATE(1239), 1, - sym_file_path, - STATE(24), 2, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - sym__single_quote_string, - STATE(758), 2, + STATE(116), 1, + sym_identifier, + STATE(683), 1, + sym_object_reference, + STATE(745), 2, sym_comment, sym_marginalia, - [38050] = 9, + [37789] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1070), 1, + STATE(816), 1, sym_object_reference, - STATE(759), 2, + STATE(746), 2, + sym_comment, + sym_marginalia, + [37818] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(747), 2, sym_comment, sym_marginalia, - [38079] = 9, + ACTIONS(1984), 6, + sym_keyword_from, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [37837] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(815), 1, + STATE(953), 1, sym_object_reference, - STATE(760), 2, + STATE(748), 2, sym_comment, sym_marginalia, - [38108] = 9, + [37866] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(944), 1, + STATE(116), 1, sym_identifier, - STATE(1122), 1, - sym_column, - STATE(761), 2, + STATE(1128), 1, + sym_object_reference, + STATE(749), 2, sym_comment, sym_marginalia, - [38137] = 7, + [37895] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2017), 1, - sym_keyword_collate, - STATE(1180), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2015), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(762), 2, + ACTIONS(1986), 1, + sym_keyword_table, + ACTIONS(1988), 1, + sym_keyword_temp, + ACTIONS(1990), 1, + sym_keyword_temporary, + STATE(1445), 1, + sym__temporary, + ACTIONS(1992), 2, + sym_keyword_unlogged, + sym_keyword_external, + STATE(750), 2, sym_comment, sym_marginalia, - [38162] = 9, + [37922] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1994), 1, + sym_keyword_all, + STATE(3), 1, + sym__double_quote_string, + STATE(1208), 1, + sym_identifier, + STATE(751), 2, + sym_comment, + sym_marginalia, + [37951] = 9, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(8), 1, sym_identifier, - STATE(239), 1, - sym_object_reference, - STATE(763), 2, + STATE(941), 1, + sym_column_definition, + STATE(752), 2, sym_comment, sym_marginalia, - [38191] = 9, + [37980] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1211), 1, + STATE(1219), 1, sym_object_reference, - STATE(764), 2, + STATE(753), 2, sym_comment, sym_marginalia, - [38220] = 9, + [38009] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(684), 1, + STATE(1074), 1, sym_object_reference, - STATE(765), 2, + STATE(754), 2, sym_comment, sym_marginalia, - [38249] = 9, + [38038] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(1020), 1, sym_identifier, - STATE(971), 1, - sym_object_reference, - STATE(766), 2, + STATE(1180), 1, + sym_set_configuration, + STATE(755), 2, + sym_comment, + sym_marginalia, + [38067] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1951), 1, + sym_keyword_first, + ACTIONS(1953), 1, + sym_keyword_after, + STATE(1048), 1, + sym_column_position, + STATE(756), 2, + sym_comment, + sym_marginalia, + ACTIONS(1996), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [38092] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(757), 2, sym_comment, sym_marginalia, - [38278] = 9, + ACTIONS(1998), 6, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_on, + sym_keyword_references, + anon_sym_RPAREN, + anon_sym_COMMA, + [38111] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(478), 1, + STATE(1158), 1, sym_object_reference, - STATE(767), 2, + STATE(758), 2, sym_comment, sym_marginalia, - [38307] = 9, + [38140] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(732), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(738), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(2000), 1, sym__identifier, - ACTIONS(2019), 1, - anon_sym_RPAREN, - STATE(4), 1, + ACTIONS(2002), 1, + anon_sym_STAR, + STATE(167), 1, sym__double_quote_string, - STATE(1326), 1, + STATE(196), 1, sym_identifier, - STATE(768), 2, + STATE(759), 2, sym_comment, sym_marginalia, - [38336] = 9, + [38169] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - ACTIONS(2019), 1, - anon_sym_RPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1045), 1, + STATE(116), 1, sym_identifier, - STATE(769), 2, + STATE(1261), 1, + sym_object_reference, + STATE(760), 2, sym_comment, sym_marginalia, - [38365] = 6, + [38198] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1983), 1, - anon_sym_COMMA, - STATE(739), 1, - aux_sym_set_values_repeat1, - STATE(770), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(2004), 1, + sym_keyword_null, + STATE(635), 1, + sym_literal_string, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, + STATE(761), 2, sym_comment, sym_marginalia, - ACTIONS(2021), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_where, - sym_keyword_when, - [38388] = 9, + [38225] = 9, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + ACTIONS(2002), 1, + anon_sym_STAR, + STATE(3), 1, + sym__double_quote_string, + STATE(126), 1, + sym_identifier, + STATE(762), 2, + sym_comment, + sym_marginalia, + [38254] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(2006), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(1050), 1, sym_identifier, - STATE(1307), 1, - sym_column_definition, - STATE(771), 2, + STATE(763), 2, sym_comment, sym_marginalia, - [38417] = 9, + [38283] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(496), 1, - sym__identifier, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(2023), 1, - sym_keyword_all, - STATE(4), 1, - sym__double_quote_string, - STATE(1304), 1, - sym_identifier, - STATE(772), 2, + ACTIONS(2010), 1, + sym_keyword_collate, + STATE(1244), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2008), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(764), 2, sym_comment, sym_marginalia, - [38446] = 7, + [38308] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2027), 1, - sym_keyword_on, - STATE(1051), 1, + ACTIONS(2014), 1, + sym_keyword_collate, + STATE(1191), 1, sym__drop_behavior, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - ACTIONS(2025), 2, + ACTIONS(2012), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(773), 2, + STATE(765), 2, sym_comment, sym_marginalia, - [38471] = 9, + [38333] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1181), 1, + STATE(1198), 1, sym_object_reference, - STATE(774), 2, + STATE(766), 2, sym_comment, sym_marginalia, - [38500] = 9, + [38362] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1224), 1, + STATE(1201), 1, sym_object_reference, - STATE(775), 2, + STATE(767), 2, sym_comment, sym_marginalia, - [38529] = 9, + [38391] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(976), 1, + STATE(942), 1, sym_object_reference, - STATE(776), 2, + STATE(768), 2, + sym_comment, + sym_marginalia, + [38420] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(769), 2, sym_comment, sym_marginalia, - [38558] = 9, + ACTIONS(2016), 6, + sym_keyword_from, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [38439] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(785), 1, + STATE(116), 1, sym_identifier, - STATE(1194), 1, - sym_field, - STATE(777), 2, + STATE(947), 1, + sym_object_reference, + STATE(770), 2, sym_comment, sym_marginalia, - [38587] = 9, + [38468] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1236), 1, + STATE(1220), 1, sym_object_reference, - STATE(778), 2, + STATE(771), 2, sym_comment, sym_marginalia, - [38616] = 9, + [38497] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1147), 1, + sym_literal_string, + STATE(1148), 1, + sym_file_path, + STATE(23), 2, sym__double_quote_string, - STATE(115), 1, - sym_identifier, - STATE(963), 1, - sym_object_reference, - STATE(779), 2, + sym__single_quote_string, + STATE(772), 2, sym_comment, sym_marginalia, - [38645] = 9, + [38524] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(2018), 1, + sym_keyword_all, + STATE(3), 1, sym__double_quote_string, - STATE(944), 1, + STATE(1163), 1, sym_identifier, - STATE(1272), 1, - sym_column, - STATE(780), 2, + STATE(773), 2, sym_comment, sym_marginalia, - [38674] = 5, + [38553] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2031), 1, + STATE(774), 2, + sym_comment, + sym_marginalia, + ACTIONS(2020), 6, + anon_sym_RPAREN, anon_sym_COMMA, - STATE(781), 3, + anon_sym_EQ, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + sym__identifier, + [38572] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(775), 2, sym_comment, sym_marginalia, - aux_sym_set_values_repeat1, - ACTIONS(2029), 4, + ACTIONS(2022), 6, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_where, - sym_keyword_when, - [38695] = 9, + sym_keyword_on, + sym_keyword_references, + anon_sym_RPAREN, + anon_sym_COMMA, + [38591] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(776), 2, + sym_comment, + sym_marginalia, + ACTIONS(2024), 6, + sym_keyword_from, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [38610] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(865), 1, + STATE(1221), 1, sym_object_reference, - STATE(782), 2, + STATE(777), 2, sym_comment, sym_marginalia, - [38724] = 9, + [38639] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(867), 1, + STATE(1038), 1, sym_object_reference, - STATE(783), 2, + STATE(778), 2, sym_comment, sym_marginalia, - [38753] = 9, + [38668] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(868), 1, + STATE(885), 1, sym_object_reference, - STATE(784), 2, + STATE(779), 2, sym_comment, sym_marginalia, - [38782] = 4, + [38697] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(785), 2, - sym_comment, - sym_marginalia, - ACTIONS(2034), 6, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_EQ, + ACTIONS(499), 1, anon_sym_DQUOTE, + ACTIONS(501), 1, anon_sym_BQUOTE, + ACTIONS(1735), 1, sym__identifier, - [38801] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(2038), 1, - sym_keyword_on, - STATE(1008), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2036), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(786), 2, + STATE(3), 1, + sym__double_quote_string, + STATE(1020), 1, + sym_identifier, + STATE(1182), 1, + sym_set_configuration, + STATE(780), 2, sym_comment, sym_marginalia, - [38826] = 9, + [38726] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(2026), 1, + sym_keyword_all, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(1188), 1, sym_identifier, - STATE(881), 1, - sym_object_reference, - STATE(787), 2, + STATE(781), 2, sym_comment, sym_marginalia, - [38855] = 9, + [38755] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(2028), 1, + sym_keyword_all, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(1257), 1, sym_identifier, - STATE(721), 1, - sym_column_definition, - STATE(788), 2, + STATE(782), 2, sym_comment, sym_marginalia, - [38884] = 7, + [38784] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, - sym_keyword_first, - ACTIONS(1943), 1, - sym_keyword_after, - STATE(1074), 1, - sym_column_position, - STATE(789), 2, + ACTIONS(493), 1, + sym__identifier, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(2030), 1, + sym_keyword_column, + STATE(3), 1, + sym__double_quote_string, + STATE(1052), 1, + sym_identifier, + STATE(783), 2, sym_comment, sym_marginalia, - ACTIONS(2040), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [38909] = 9, + [38813] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(6), 1, + STATE(8), 1, sym_identifier, - STATE(729), 1, + STATE(717), 1, sym_column_definition, - STATE(790), 2, + STATE(784), 2, sym_comment, sym_marginalia, - [38938] = 7, + [38842] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, + ACTIONS(1951), 1, sym_keyword_first, - ACTIONS(1943), 1, + ACTIONS(1953), 1, sym_keyword_after, - STATE(1079), 1, + STATE(1078), 1, sym_column_position, - STATE(791), 2, + STATE(785), 2, sym_comment, sym_marginalia, - ACTIONS(2042), 3, + ACTIONS(2032), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [38963] = 9, + [38867] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(6), 1, - sym_identifier, - STATE(736), 1, - sym_column_definition, - STATE(792), 2, + ACTIONS(1951), 1, + sym_keyword_first, + ACTIONS(1953), 1, + sym_keyword_after, + STATE(1080), 1, + sym_column_position, + STATE(786), 2, sym_comment, sym_marginalia, - [38992] = 7, + ACTIONS(2034), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [38892] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, + ACTIONS(1951), 1, sym_keyword_first, - ACTIONS(1943), 1, + ACTIONS(1953), 1, sym_keyword_after, STATE(1085), 1, sym_column_position, - STATE(793), 2, + STATE(787), 2, sym_comment, sym_marginalia, - ACTIONS(2044), 3, + ACTIONS(2036), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [39017] = 9, + [38917] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(939), 1, + STATE(973), 1, sym_object_reference, - STATE(794), 2, + STATE(788), 2, + sym_comment, + sym_marginalia, + [38946] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(789), 2, + sym_comment, + sym_marginalia, + ACTIONS(2038), 6, + sym_keyword_from, + sym_keyword_order, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [38965] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2042), 1, + sym_keyword_on, + STATE(1090), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2040), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(790), 2, sym_comment, sym_marginalia, - [39046] = 9, + [38990] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1041), 1, + STATE(1263), 1, sym_object_reference, - STATE(795), 2, + STATE(791), 2, sym_comment, sym_marginalia, - [39075] = 7, + [39019] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1941), 1, - sym_keyword_first, - ACTIONS(1943), 1, - sym_keyword_after, - STATE(1091), 1, - sym_column_position, - STATE(796), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(8), 1, + sym_identifier, + STATE(1277), 1, + sym_column_definition, + STATE(792), 2, sym_comment, sym_marginalia, - ACTIONS(2046), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [39100] = 9, + [39048] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(895), 1, + STATE(647), 1, sym_object_reference, - STATE(797), 2, + STATE(793), 2, sym_comment, sym_marginalia, - [39129] = 9, + [39077] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(936), 1, + STATE(983), 1, sym_object_reference, - STATE(798), 2, + STATE(794), 2, sym_comment, sym_marginalia, - [39158] = 9, + [39106] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1251), 1, + STATE(1265), 1, sym_object_reference, - STATE(799), 2, + STATE(795), 2, sym_comment, sym_marginalia, - [39187] = 8, + [39135] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1989), 1, + ACTIONS(2044), 1, sym_keyword_in, - ACTIONS(1993), 1, - sym_keyword_similar, - ACTIONS(2048), 1, + ACTIONS(2046), 1, sym_keyword_between, - STATE(580), 1, + ACTIONS(2048), 1, + sym_keyword_similar, + STATE(598), 1, sym_keyword_like, - ACTIONS(291), 2, + ACTIONS(293), 2, aux_sym_keyword_like_token1, aux_sym_keyword_like_token2, - STATE(800), 2, + STATE(796), 2, sym_comment, sym_marginalia, - [39214] = 9, + [39162] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(645), 1, + STATE(985), 1, sym_object_reference, - STATE(801), 2, + STATE(797), 2, sym_comment, sym_marginalia, - [39243] = 9, + [39191] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - ACTIONS(2050), 1, - anon_sym_RPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1106), 1, + STATE(8), 1, sym_identifier, - STATE(802), 2, + STATE(733), 1, + sym_column_definition, + STATE(798), 2, sym_comment, sym_marginalia, - [39272] = 8, + [39220] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1989), 1, - sym_keyword_in, - ACTIONS(1993), 1, - sym_keyword_similar, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(2050), 1, + sym_keyword_separator, ACTIONS(2052), 1, - sym_keyword_between, - STATE(580), 1, - sym_keyword_like, - ACTIONS(291), 2, - aux_sym_keyword_like_token1, - aux_sym_keyword_like_token2, - STATE(803), 2, + anon_sym_RPAREN, + ACTIONS(2054), 1, + anon_sym_COMMA, + STATE(1023), 1, + aux_sym_invocation_repeat1, + STATE(1475), 1, + sym_limit, + STATE(799), 2, sym_comment, sym_marginalia, - [39299] = 9, + [39249] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - ACTIONS(2050), 1, - anon_sym_RPAREN, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1541), 1, + STATE(774), 1, sym_identifier, - STATE(804), 2, + STATE(1268), 1, + sym_field, + STATE(800), 2, sym_comment, sym_marginalia, - [39328] = 9, + [39278] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(115), 1, + STATE(116), 1, sym_identifier, - STATE(1314), 1, + STATE(1154), 1, sym_object_reference, - STATE(805), 2, + STATE(801), 2, sym_comment, sym_marginalia, - [39357] = 7, + [39307] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1123), 1, - sym_literal_string, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, - STATE(806), 2, + ACTIONS(1938), 1, + anon_sym_COMMA, + STATE(711), 1, + aux_sym_set_values_repeat1, + STATE(802), 2, sym_comment, sym_marginalia, - [39381] = 5, + ACTIONS(2056), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_where, + sym_keyword_when, + [39330] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2056), 1, - sym_keyword_references, - STATE(807), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(116), 1, + sym_identifier, + STATE(1076), 1, + sym_object_reference, + STATE(803), 2, sym_comment, sym_marginalia, - ACTIONS(2054), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [39401] = 7, + [39359] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(618), 1, - sym_literal_string, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, - STATE(808), 2, + ACTIONS(2060), 1, + sym_keyword_collate, + STATE(1307), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2058), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(804), 2, sym_comment, sym_marginalia, - [39425] = 8, + [39384] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1087), 1, + STATE(8), 1, sym_identifier, - STATE(809), 2, + STATE(735), 1, + sym_column_definition, + STATE(805), 2, sym_comment, sym_marginalia, - [39451] = 8, + [39413] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1088), 1, + STATE(116), 1, sym_identifier, - STATE(810), 2, + STATE(848), 1, + sym_object_reference, + STATE(806), 2, sym_comment, sym_marginalia, - [39477] = 5, + [39442] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2060), 1, - sym_keyword_references, - STATE(811), 2, - sym_comment, - sym_marginalia, - ACTIONS(2058), 4, + ACTIONS(2064), 1, + sym_keyword_on, + STATE(1005), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2062), 2, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [39497] = 8, + STATE(807), 2, + sym_comment, + sym_marginalia, + [39467] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(788), 1, - sym_identifier, - STATE(812), 2, + ACTIONS(2044), 1, + sym_keyword_in, + ACTIONS(2048), 1, + sym_keyword_similar, + ACTIONS(2066), 1, + sym_keyword_between, + STATE(598), 1, + sym_keyword_like, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(808), 2, sym_comment, sym_marginalia, - [39523] = 6, + [39494] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2062), 1, - sym__identifier, - ACTIONS(2064), 2, - sym_keyword_true, - sym_keyword_false, - ACTIONS(2066), 2, + ACTIONS(499), 1, anon_sym_DQUOTE, - anon_sym_BQUOTE, - STATE(813), 2, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(2068), 1, + sym_keyword_null, + STATE(629), 1, + sym_literal_string, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, + STATE(809), 2, sym_comment, sym_marginalia, - [39545] = 8, + [39521] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1173), 1, - sym_identifier, - STATE(814), 2, + ACTIONS(2072), 1, + sym_keyword_collate, + STATE(1233), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2070), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(810), 2, sym_comment, sym_marginalia, - [39571] = 4, + [39546] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(815), 2, + ACTIONS(2044), 1, + sym_keyword_in, + ACTIONS(2048), 1, + sym_keyword_similar, + ACTIONS(2074), 1, + sym_keyword_between, + STATE(598), 1, + sym_keyword_like, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(811), 2, sym_comment, sym_marginalia, - ACTIONS(1912), 5, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_cascade, - sym_keyword_restrict, - anon_sym_COMMA, - [39589] = 4, + [39573] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(816), 2, + ACTIONS(2044), 1, + sym_keyword_in, + ACTIONS(2048), 1, + sym_keyword_similar, + ACTIONS(2076), 1, + sym_keyword_between, + STATE(598), 1, + sym_keyword_like, + ACTIONS(293), 2, + aux_sym_keyword_like_token1, + aux_sym_keyword_like_token2, + STATE(812), 2, sym_comment, sym_marginalia, - ACTIONS(2068), 5, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_values, - anon_sym_RPAREN, - anon_sym_COMMA, - [39607] = 8, + [39600] = 9, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + ACTIONS(2006), 1, + anon_sym_RPAREN, + STATE(3), 1, sym__double_quote_string, - STATE(1096), 1, + STATE(1381), 1, sym_identifier, - STATE(817), 2, + STATE(813), 2, sym_comment, sym_marginalia, - [39633] = 5, + [39629] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2072), 1, + ACTIONS(2080), 1, sym_keyword_references, - STATE(818), 2, + STATE(814), 2, sym_comment, sym_marginalia, - ACTIONS(2070), 4, + ACTIONS(2078), 4, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RPAREN, anon_sym_COMMA, - [39653] = 8, + [39649] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(426), 1, - anon_sym_BQUOTE, - ACTIONS(1888), 1, - sym__identifier, - STATE(17), 1, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1131), 1, + sym_literal_string, + STATE(23), 2, sym__double_quote_string, - STATE(606), 1, - sym_identifier, - STATE(819), 2, + sym__single_quote_string, + STATE(815), 2, sym_comment, sym_marginalia, - [39679] = 8, + [39673] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1214), 1, - sym_identifier, - STATE(820), 2, + ACTIONS(2084), 1, + sym_keyword_partition, + ACTIONS(2086), 1, + anon_sym_LPAREN, + STATE(1195), 1, + sym__partition_spec, + ACTIONS(2082), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(816), 2, sym_comment, sym_marginalia, - [39705] = 8, + [39697] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1377), 1, + STATE(1223), 1, sym_identifier, - STATE(821), 2, + STATE(817), 2, sym_comment, sym_marginalia, - [39731] = 8, + [39723] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(426), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1888), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(17), 1, + STATE(3), 1, sym__double_quote_string, - STATE(653), 1, + STATE(840), 1, sym_identifier, - STATE(822), 2, + STATE(818), 2, sym_comment, sym_marginalia, - [39757] = 8, + [39749] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(848), 1, + STATE(123), 1, sym_identifier, - STATE(823), 2, + STATE(819), 2, sym_comment, sym_marginalia, - [39783] = 8, + [39775] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(653), 1, - sym_identifier, - STATE(824), 2, + ACTIONS(633), 1, + sym_keyword_when, + STATE(843), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + ACTIONS(2088), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(820), 2, sym_comment, sym_marginalia, - [39809] = 8, + [39799] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1445), 1, + STATE(1285), 1, sym_identifier, - STATE(825), 2, + STATE(821), 2, sym_comment, sym_marginalia, - [39835] = 8, + [39825] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1104), 1, - sym_identifier, - STATE(826), 2, + STATE(1287), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2090), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(822), 2, sym_comment, sym_marginalia, - [39861] = 8, + [39847] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1107), 1, - sym_identifier, - STATE(827), 2, + STATE(1145), 1, + sym_direction, + ACTIONS(898), 2, + sym_keyword_desc, + sym_keyword_asc, + ACTIONS(2092), 2, + anon_sym_RPAREN, + anon_sym_COMMA, + STATE(823), 2, sym_comment, sym_marginalia, - [39887] = 8, + [39869] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(575), 1, - anon_sym_DQUOTE, - ACTIONS(776), 1, - anon_sym_BQUOTE, - ACTIONS(2074), 1, - sym__identifier, - STATE(70), 1, - sym__double_quote_string, - STATE(74), 1, - sym_identifier, - STATE(828), 2, + ACTIONS(2096), 1, + anon_sym_COMMA, + STATE(890), 1, + aux_sym_typed_row_value_expr_list_repeat1, + STATE(824), 2, sym_comment, sym_marginalia, - [39913] = 7, + ACTIONS(2094), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [39891] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2078), 1, - sym_keyword_float, - ACTIONS(2080), 1, - sym_keyword_double, - STATE(356), 1, - sym_keyword_real, - ACTIONS(2076), 2, - aux_sym_keyword_real_token1, - aux_sym_keyword_real_token2, - STATE(829), 2, + ACTIONS(2100), 1, + sym_keyword_references, + STATE(825), 2, + sym_comment, + sym_marginalia, + ACTIONS(2098), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [39911] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2104), 1, + sym_keyword_references, + STATE(826), 2, sym_comment, sym_marginalia, - [39937] = 6, + ACTIONS(2102), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [39931] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1234), 1, + STATE(1288), 1, sym__drop_behavior, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - ACTIONS(2082), 2, + ACTIONS(2106), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(830), 2, + STATE(827), 2, sym_comment, sym_marginalia, - [39959] = 7, + [39953] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(637), 1, - sym_keyword_when, - STATE(878), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - ACTIONS(2084), 2, + STATE(1291), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2108), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(831), 2, + STATE(828), 2, sym_comment, sym_marginalia, - [39983] = 7, + [39975] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - STATE(1265), 1, + STATE(1161), 1, sym_literal_string, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(832), 2, + STATE(829), 2, sym_comment, sym_marginalia, - [40007] = 8, + [39999] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(860), 1, + STATE(807), 1, sym_identifier, - STATE(833), 2, + STATE(830), 2, sym_comment, sym_marginalia, - [40033] = 8, + [40025] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(575), 1, + ACTIONS(433), 1, anon_sym_DQUOTE, - ACTIONS(776), 1, + ACTIONS(435), 1, anon_sym_BQUOTE, - ACTIONS(2074), 1, + ACTIONS(1920), 1, sym__identifier, - STATE(70), 1, + STATE(17), 1, sym__double_quote_string, - STATE(85), 1, + STATE(478), 1, sym_identifier, - STATE(834), 2, - sym_comment, - sym_marginalia, - [40059] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(637), 1, - sym_keyword_when, - STATE(878), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - ACTIONS(2086), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(835), 2, + STATE(831), 2, sym_comment, sym_marginalia, - [40083] = 8, + [40051] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(116), 1, + STATE(1215), 1, sym_identifier, - STATE(836), 2, + STATE(832), 2, sym_comment, sym_marginalia, - [40109] = 8, + [40077] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(2110), 1, + sym__identifier, + ACTIONS(2112), 2, + sym_keyword_true, + sym_keyword_false, + ACTIONS(2114), 2, anon_sym_DQUOTE, - ACTIONS(504), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1199), 1, - sym_identifier, - STATE(837), 2, + STATE(833), 2, sym_comment, sym_marginalia, - [40135] = 5, + [40099] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2090), 1, - sym_keyword_on, - STATE(838), 2, - sym_comment, - sym_marginalia, - ACTIONS(2088), 4, + STATE(1305), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2116), 2, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [40155] = 8, + STATE(834), 2, + sym_comment, + sym_marginalia, + [40121] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(426), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1888), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(17), 1, + STATE(3), 1, sym__double_quote_string, - STATE(456), 1, + STATE(932), 1, sym_identifier, - STATE(839), 2, + STATE(835), 2, sym_comment, sym_marginalia, - [40181] = 8, + [40147] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(1826), 1, + ACTIONS(1876), 1, aux_sym_keyword_with_token1, - ACTIONS(2092), 1, - anon_sym_DASH, - STATE(594), 1, - sym_integer, - STATE(1047), 1, + ACTIONS(2120), 1, + sym_keyword_force, + STATE(1138), 1, sym_keyword_with, - STATE(840), 2, + ACTIONS(2118), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(836), 2, sym_comment, sym_marginalia, - [40207] = 8, + [40171] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(1826), 1, - aux_sym_keyword_with_token1, - ACTIONS(2092), 1, - anon_sym_DASH, - STATE(593), 1, - sym_integer, - STATE(1049), 1, - sym_keyword_with, - STATE(841), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(624), 1, + sym_literal_string, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, + STATE(837), 2, sym_comment, sym_marginalia, - [40233] = 8, + [40195] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1138), 1, + STATE(933), 1, sym_identifier, - STATE(842), 2, - sym_comment, - sym_marginalia, - [40259] = 8, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1413), 1, - sym_keyword_rename, - ACTIONS(2094), 1, - sym_keyword_set, - ACTIONS(2096), 1, - sym_keyword_alter, - ACTIONS(2098), 1, - sym_keyword_reset, - STATE(1165), 1, - sym_rename_object, - STATE(843), 2, + STATE(838), 2, sym_comment, sym_marginalia, - [40285] = 8, + [40221] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1312), 1, + STATE(856), 1, sym_identifier, - STATE(844), 2, + STATE(839), 2, sym_comment, sym_marginalia, - [40311] = 7, + [40247] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(998), 1, - sym_literal_string, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, - STATE(845), 2, + STATE(1191), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2012), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(840), 2, sym_comment, sym_marginalia, - [40335] = 8, + [40269] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1039), 1, + STATE(1194), 1, sym_identifier, - STATE(846), 2, + STATE(841), 2, sym_comment, sym_marginalia, - [40361] = 7, + [40295] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(637), 1, - sym_keyword_when, - STATE(878), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - ACTIONS(2100), 2, + STATE(1320), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2122), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(847), 2, + STATE(842), 2, sym_comment, sym_marginalia, - [40385] = 6, + [40317] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1218), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(1955), 2, + ACTIONS(2126), 1, + sym_keyword_when, + STATE(1139), 1, + sym_when_clause, + ACTIONS(2124), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(848), 2, + STATE(843), 3, sym_comment, sym_marginalia, - [40407] = 7, + aux_sym__merge_statement_repeat1, + [40339] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(637), 1, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1041), 1, + sym_identifier, + STATE(844), 2, + sym_comment, + sym_marginalia, + [40365] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(633), 1, sym_keyword_when, - STATE(878), 1, + STATE(843), 1, aux_sym__merge_statement_repeat1, - STATE(1006), 1, + STATE(1139), 1, sym_when_clause, - ACTIONS(2102), 2, + ACTIONS(2129), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(849), 2, + STATE(845), 2, sym_comment, sym_marginalia, - [40431] = 8, + [40389] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1263), 1, + STATE(1042), 1, sym_identifier, - STATE(850), 2, + STATE(846), 2, sym_comment, sym_marginalia, - [40457] = 5, + [40415] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2106), 1, - sym_keyword_on, - STATE(851), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(732), 1, + sym_identifier, + STATE(847), 2, sym_comment, sym_marginalia, - ACTIONS(2104), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [40477] = 4, + [40441] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(852), 2, + ACTIONS(2084), 1, + sym_keyword_partition, + ACTIONS(2133), 1, + anon_sym_LPAREN, + STATE(1328), 1, + sym__partition_spec, + ACTIONS(2131), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(848), 2, sym_comment, sym_marginalia, - ACTIONS(1429), 5, - sym_keyword_limit, - sym_keyword_separator, - sym_keyword_nulls, - anon_sym_RPAREN, - anon_sym_COMMA, - [40495] = 5, + [40465] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2110), 1, - sym_keyword_on, - STATE(853), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(997), 1, + sym_identifier, + STATE(849), 2, sym_comment, sym_marginalia, - ACTIONS(2108), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [40515] = 8, + [40491] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(433), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(435), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1920), 1, sym__identifier, - STATE(4), 1, + STATE(17), 1, sym__double_quote_string, - STATE(1310), 1, + STATE(615), 1, sym_identifier, - STATE(854), 2, + STATE(850), 2, sym_comment, sym_marginalia, - [40541] = 7, + [40517] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1739), 1, - sym_keyword_noscan, - ACTIONS(2114), 1, - sym_keyword_for, - ACTIONS(2116), 1, - sym_keyword_cache, - ACTIONS(2112), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(855), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1552), 1, + sym_identifier, + STATE(851), 2, sym_comment, sym_marginalia, - [40565] = 8, + [40543] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(9), 1, + STATE(1058), 1, sym_identifier, - STATE(856), 2, + STATE(852), 2, sym_comment, sym_marginalia, - [40591] = 8, + [40569] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1438), 1, + STATE(1350), 1, sym_identifier, - STATE(857), 2, + STATE(853), 2, sym_comment, sym_marginalia, - [40617] = 8, + [40595] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1274), 1, + STATE(1061), 1, sym_identifier, - STATE(858), 2, + STATE(854), 2, sym_comment, sym_marginalia, - [40643] = 8, + [40621] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(830), 1, + STATE(863), 1, sym_identifier, - STATE(859), 2, + STATE(855), 2, sym_comment, sym_marginalia, - [40669] = 6, + [40647] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1311), 1, + STATE(1241), 1, sym__drop_behavior, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - ACTIONS(1921), 2, + ACTIONS(2135), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(860), 2, + STATE(856), 2, sym_comment, sym_marginalia, - [40691] = 8, + [40669] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1273), 1, - sym_identifier, - STATE(861), 2, + ACTIONS(633), 1, + sym_keyword_when, + STATE(843), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + ACTIONS(2137), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(857), 2, sym_comment, sym_marginalia, - [40717] = 8, + [40693] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, + ACTIONS(2141), 1, + sym_keyword_float, + ACTIONS(2143), 1, + sym_keyword_double, + STATE(363), 1, + sym_keyword_real, + ACTIONS(2139), 2, + aux_sym_keyword_real_token1, + aux_sym_keyword_real_token2, + STATE(858), 2, + sym_comment, + sym_marginalia, + [40717] = 7, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(633), 1, + sym_keyword_when, STATE(843), 1, - sym_identifier, - STATE(862), 2, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + ACTIONS(2145), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(859), 2, + sym_comment, + sym_marginalia, + [40741] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2149), 1, + sym_keyword_on, + STATE(860), 2, sym_comment, sym_marginalia, - [40743] = 7, + ACTIONS(2147), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [40761] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1697), 1, - sym_keyword_noscan, - ACTIONS(2120), 1, - sym_keyword_for, - ACTIONS(2122), 1, - sym_keyword_cache, - ACTIONS(2118), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(863), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(126), 1, + sym_identifier, + STATE(861), 2, sym_comment, sym_marginalia, - [40767] = 7, + [40787] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - STATE(1043), 1, + STATE(1014), 1, sym_literal_string, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(864), 2, + STATE(862), 2, sym_comment, sym_marginalia, - [40791] = 6, + [40811] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1184), 1, + STATE(1307), 1, sym__drop_behavior, - ACTIONS(1884), 2, + ACTIONS(1908), 2, sym_keyword_cascade, sym_keyword_restrict, - ACTIONS(2124), 2, + ACTIONS(2058), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(865), 2, + STATE(863), 2, sym_comment, sym_marginalia, - [40813] = 8, + [40833] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1318), 1, - sym_identifier, - STATE(866), 2, + ACTIONS(633), 1, + sym_keyword_when, + STATE(843), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + ACTIONS(2151), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(864), 2, sym_comment, sym_marginalia, - [40839] = 6, + [40857] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1185), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2126), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(867), 2, + ACTIONS(2155), 1, + sym_keyword_on, + STATE(865), 2, sym_comment, sym_marginalia, - [40861] = 6, + ACTIONS(2153), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [40877] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1186), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2128), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(868), 2, + ACTIONS(2159), 1, + sym_keyword_on, + STATE(866), 2, sym_comment, sym_marginalia, - [40883] = 4, + ACTIONS(2157), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [40897] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(869), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1055), 1, + sym_literal_string, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, + STATE(867), 2, sym_comment, sym_marginalia, - ACTIONS(2130), 5, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - sym__identifier, - [40901] = 8, + [40921] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(762), 1, + STATE(668), 1, sym_identifier, - STATE(870), 2, + STATE(868), 2, sym_comment, sym_marginalia, - [40927] = 7, + [40947] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(555), 1, + ACTIONS(547), 1, anon_sym_SQUOTE, - STATE(1073), 1, + STATE(1084), 1, sym_literal_string, - STATE(24), 2, + STATE(23), 2, sym__double_quote_string, sym__single_quote_string, - STATE(871), 2, + STATE(869), 2, sym_comment, sym_marginalia, - [40951] = 8, + [40971] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(773), 1, + STATE(877), 1, sym_identifier, - STATE(872), 2, + STATE(870), 2, sym_comment, sym_marginalia, - [40977] = 8, + [40997] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1303), 1, + STATE(1246), 1, sym_identifier, - STATE(873), 2, + STATE(871), 2, sym_comment, sym_marginalia, - [41003] = 6, + [41023] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2134), 1, - anon_sym_COMMA, - STATE(918), 1, - aux_sym_typed_row_value_expr_list_repeat1, - STATE(874), 2, - sym_comment, - sym_marginalia, - ACTIONS(2132), 3, + ACTIONS(633), 1, + sym_keyword_when, + STATE(843), 1, + aux_sym__merge_statement_repeat1, + STATE(1139), 1, + sym_when_clause, + ACTIONS(2161), 2, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_when, - [41025] = 4, + STATE(872), 2, + sym_comment, + sym_marginalia, + [41047] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(875), 2, + ACTIONS(2165), 1, + sym_keyword_on, + STATE(873), 2, sym_comment, sym_marginalia, - ACTIONS(2136), 5, + ACTIONS(2163), 4, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_values, anon_sym_RPAREN, anon_sym_COMMA, - [41043] = 8, + [41067] = 6, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2169), 1, + anon_sym_COMMA, + STATE(883), 1, + aux_sym_order_by_repeat1, + STATE(874), 2, + sym_comment, + sym_marginalia, + ACTIONS(2167), 3, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + [41089] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1197), 1, + STATE(1250), 1, sym_identifier, - STATE(876), 2, + STATE(875), 2, sym_comment, sym_marginalia, - [41069] = 4, + [41115] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(877), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1252), 1, + sym_identifier, + STATE(876), 2, sym_comment, sym_marginalia, - ACTIONS(2138), 5, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_where, - sym_keyword_when, - anon_sym_COMMA, - [41087] = 6, + [41141] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2142), 1, - sym_keyword_when, - STATE(1006), 1, - sym_when_clause, - ACTIONS(2140), 2, + STATE(1173), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2171), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(878), 3, + STATE(877), 2, sym_comment, sym_marginalia, - aux_sym__merge_statement_repeat1, - [41109] = 8, + [41163] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(898), 1, + STATE(9), 1, + sym_identifier, + STATE(878), 2, + sym_comment, + sym_marginalia, + [41189] = 8, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1389), 1, sym_identifier, STATE(879), 2, sym_comment, sym_marginalia, - [41135] = 6, + [41215] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1151), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2145), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1256), 1, + sym_identifier, STATE(880), 2, sym_comment, sym_marginalia, - [41157] = 6, + [41241] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1192), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2147), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1258), 1, + sym_identifier, STATE(881), 2, sym_comment, sym_marginalia, - [41179] = 6, + [41267] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1159), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2149), 2, + ACTIONS(1741), 1, + sym_keyword_noscan, + ACTIONS(2175), 1, + sym_keyword_for, + ACTIONS(2177), 1, + sym_keyword_cache, + ACTIONS(2173), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(882), 2, sym_comment, sym_marginalia, - [41201] = 7, + [41291] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1826), 1, - aux_sym_keyword_with_token1, - ACTIONS(2153), 1, - sym_keyword_force, - STATE(1060), 1, - sym_keyword_with, - ACTIONS(2151), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2169), 1, + anon_sym_COMMA, + STATE(886), 1, + aux_sym_order_by_repeat1, STATE(883), 2, sym_comment, sym_marginalia, - [41225] = 6, + ACTIONS(2179), 3, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + [41313] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1179), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2155), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2183), 1, + sym_keyword_nulls, STATE(884), 2, sym_comment, sym_marginalia, - [41247] = 7, + ACTIONS(2181), 4, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [41333] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(637), 1, - sym_keyword_when, - STATE(878), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - ACTIONS(2157), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(885), 2, sym_comment, sym_marginalia, - [41271] = 8, + ACTIONS(1944), 5, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_cascade, + sym_keyword_restrict, + anon_sym_COMMA, + [41351] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(733), 1, - sym_identifier, - STATE(886), 2, + ACTIONS(2187), 1, + anon_sym_COMMA, + ACTIONS(2185), 3, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + STATE(886), 3, sym_comment, sym_marginalia, - [41297] = 5, + aux_sym_order_by_repeat1, + [41371] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2161), 1, - sym_keyword_on, + ACTIONS(2192), 1, + sym_keyword_nulls, STATE(887), 2, sym_comment, sym_marginalia, - ACTIONS(2159), 4, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2190), 4, + sym_keyword_limit, + sym_keyword_separator, anon_sym_RPAREN, anon_sym_COMMA, - [41317] = 6, + [41391] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1195), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2163), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(888), 2, sym_comment, sym_marginalia, - [41339] = 8, + ACTIONS(2194), 5, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + sym__identifier, + [41409] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(718), 1, + STATE(1174), 1, sym_identifier, STATE(889), 2, sym_comment, sym_marginalia, - [41365] = 8, + [41435] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(624), 1, - sym_identifier, + ACTIONS(2096), 1, + anon_sym_COMMA, + STATE(918), 1, + aux_sym_typed_row_value_expr_list_repeat1, STATE(890), 2, sym_comment, sym_marginalia, - [41391] = 7, + ACTIONS(2196), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [41457] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1110), 1, - sym_literal_string, - STATE(24), 2, - sym__double_quote_string, - sym__single_quote_string, STATE(891), 2, sym_comment, sym_marginalia, - [41415] = 7, + ACTIONS(2198), 5, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_values, + anon_sym_RPAREN, + anon_sym_COMMA, + [41475] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(637), 1, - sym_keyword_when, - STATE(878), 1, - aux_sym__merge_statement_repeat1, - STATE(1006), 1, - sym_when_clause, - ACTIONS(2165), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(892), 2, sym_comment, sym_marginalia, - [41439] = 6, + ACTIONS(2200), 5, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_where, + sym_keyword_when, + anon_sym_COMMA, + [41493] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2169), 1, - anon_sym_COMMA, - STATE(911), 1, - aux_sym_order_by_repeat1, + ACTIONS(433), 1, + anon_sym_DQUOTE, + ACTIONS(435), 1, + anon_sym_BQUOTE, + ACTIONS(1920), 1, + sym__identifier, + STATE(17), 1, + sym__double_quote_string, + STATE(668), 1, + sym_identifier, STATE(893), 2, sym_comment, sym_marginalia, - ACTIONS(2167), 3, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - [41461] = 8, + [41519] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(575), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(776), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(2202), 1, sym__identifier, - STATE(4), 1, + STATE(68), 1, sym__double_quote_string, - STATE(1080), 1, + STATE(74), 1, sym_identifier, STATE(894), 2, sym_comment, sym_marginalia, - [41487] = 7, + [41545] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2173), 1, - sym_keyword_partition, - ACTIONS(2175), 1, - anon_sym_LPAREN, - STATE(1202), 1, - sym__partition_spec, - ACTIONS(2171), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(115), 1, + sym_identifier, STATE(895), 2, sym_comment, sym_marginalia, - [41511] = 8, + [41571] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(121), 1, + STATE(784), 1, sym_identifier, STATE(896), 2, sym_comment, sym_marginalia, - [41537] = 6, + [41597] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1226), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2177), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(575), 1, + anon_sym_DQUOTE, + ACTIONS(776), 1, + anon_sym_BQUOTE, + ACTIONS(2202), 1, + sym__identifier, + STATE(68), 1, + sym__double_quote_string, + STATE(86), 1, + sym_identifier, STATE(897), 2, sym_comment, sym_marginalia, - [41559] = 6, + [41623] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1176), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2179), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1112), 1, + sym_identifier, STATE(898), 2, sym_comment, sym_marginalia, - [41581] = 8, + [41649] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1257), 1, + STATE(1295), 1, sym_identifier, STATE(899), 2, sym_comment, sym_marginalia, - [41607] = 8, + [41675] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1118), 1, + STATE(1122), 1, sym_identifier, STATE(900), 2, sym_comment, sym_marginalia, - [41633] = 8, + [41701] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(883), 1, + STATE(633), 1, sym_identifier, STATE(901), 2, sym_comment, sym_marginalia, - [41659] = 7, + [41727] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1826), 1, - aux_sym_keyword_with_token1, - ACTIONS(2183), 1, - sym_keyword_force, - STATE(1019), 1, - sym_keyword_with, - ACTIONS(2181), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(657), 1, + sym_identifier, STATE(902), 2, sym_comment, sym_marginalia, - [41683] = 8, + [41753] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(888), 1, + STATE(1325), 1, sym_identifier, STATE(903), 2, sym_comment, sym_marginalia, - [41709] = 6, + [41779] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1242), 1, - sym__drop_behavior, - ACTIONS(1884), 2, - sym_keyword_cascade, - sym_keyword_restrict, - ACTIONS(2185), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1197), 1, + sym_identifier, STATE(904), 2, sym_comment, sym_marginalia, - [41731] = 8, + [41805] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1126), 1, + sym_literal_string, + STATE(23), 2, sym__double_quote_string, - STATE(646), 1, - sym_identifier, + sym__single_quote_string, STATE(905), 2, sym_comment, sym_marginalia, - [41757] = 6, + [41829] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2134), 1, - anon_sym_COMMA, - STATE(874), 1, - aux_sym_typed_row_value_expr_list_repeat1, STATE(906), 2, sym_comment, sym_marginalia, - ACTIONS(2187), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [41779] = 7, + ACTIONS(1475), 5, + sym_keyword_limit, + sym_keyword_separator, + sym_keyword_nulls, + anon_sym_RPAREN, + anon_sym_COMMA, + [41847] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(433), 1, anon_sym_DQUOTE, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1133), 1, - sym_literal_string, - STATE(24), 2, + ACTIONS(435), 1, + anon_sym_BQUOTE, + ACTIONS(1920), 1, + sym__identifier, + STATE(17), 1, sym__double_quote_string, - sym__single_quote_string, + STATE(491), 1, + sym_identifier, STATE(907), 2, sym_comment, sym_marginalia, - [41803] = 7, + [41873] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2173), 1, - sym_keyword_partition, - ACTIONS(2191), 1, - anon_sym_LPAREN, - STATE(1267), 1, - sym__partition_spec, - ACTIONS(2189), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(433), 1, + anon_sym_DQUOTE, + ACTIONS(577), 1, + anon_sym_SQUOTE, + STATE(495), 1, + sym_literal_string, + STATE(79), 2, + sym__double_quote_string, + sym__single_quote_string, STATE(908), 2, sym_comment, sym_marginalia, - [41827] = 8, + [41897] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, - anon_sym_DQUOTE, - ACTIONS(426), 1, - anon_sym_BQUOTE, - ACTIONS(1888), 1, - sym__identifier, - STATE(17), 1, - sym__double_quote_string, - STATE(482), 1, - sym_identifier, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(1876), 1, + aux_sym_keyword_with_token1, + ACTIONS(2204), 1, + anon_sym_DASH, + STATE(609), 1, + sym_integer, + STATE(1047), 1, + sym_keyword_with, STATE(909), 2, sym_comment, sym_marginalia, - [41853] = 7, + [41923] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2195), 1, - sym_keyword_float, - ACTIONS(2197), 1, - sym_keyword_double, - STATE(514), 1, - sym_keyword_real, - ACTIONS(2193), 2, - aux_sym_keyword_real_token1, - aux_sym_keyword_real_token2, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(1876), 1, + aux_sym_keyword_with_token1, + ACTIONS(2204), 1, + anon_sym_DASH, + STATE(602), 1, + sym_integer, + STATE(1054), 1, + sym_keyword_with, STATE(910), 2, sym_comment, sym_marginalia, - [41877] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(2169), 1, - anon_sym_COMMA, - STATE(921), 1, - aux_sym_order_by_repeat1, - STATE(911), 2, - sym_comment, - sym_marginalia, - ACTIONS(2199), 3, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - [41899] = 8, + [41949] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(734), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(740), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(2001), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(167), 1, + STATE(3), 1, sym__double_quote_string, - STATE(209), 1, + STATE(1183), 1, sym_identifier, - STATE(912), 2, + STATE(911), 2, sym_comment, sym_marginalia, - [41925] = 8, + [41975] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(734), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(740), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(2001), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(167), 1, + STATE(3), 1, sym__double_quote_string, - STATE(198), 1, + STATE(1326), 1, sym_identifier, + STATE(912), 2, + sym_comment, + sym_marginalia, + [42001] = 8, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(1425), 1, + sym_keyword_rename, + ACTIONS(2206), 1, + sym_keyword_set, + ACTIONS(2208), 1, + sym_keyword_alter, + ACTIONS(2210), 1, + sym_keyword_reset, + STATE(1153), 1, + sym_rename_object, STATE(913), 2, sym_comment, sym_marginalia, - [41951] = 7, + [42027] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(424), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(577), 1, - anon_sym_SQUOTE, - STATE(487), 1, - sym_literal_string, - STATE(88), 2, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, sym__double_quote_string, - sym__single_quote_string, + STATE(810), 1, + sym_identifier, STATE(914), 2, sym_comment, sym_marginalia, - [41975] = 5, + [42053] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2203), 1, - sym_keyword_nulls, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1214), 1, + sym_identifier, STATE(915), 2, sym_comment, sym_marginalia, - ACTIONS(2201), 4, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [41995] = 8, + [42079] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1209), 1, + STATE(1216), 1, sym_identifier, STATE(916), 2, sym_comment, sym_marginalia, - [42021] = 6, + [42105] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1246), 1, - sym_direction, - ACTIONS(870), 2, - sym_keyword_desc, - sym_keyword_asc, - ACTIONS(2205), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(1737), 1, + sym_keyword_noscan, + ACTIONS(2214), 1, + sym_keyword_for, + ACTIONS(2216), 1, + sym_keyword_cache, + ACTIONS(2212), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(917), 2, sym_comment, sym_marginalia, - [42043] = 5, + [42129] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2209), 1, + ACTIONS(2220), 1, anon_sym_COMMA, - ACTIONS(2207), 3, + ACTIONS(2218), 3, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_when, @@ -46268,954 +46437,938 @@ static const uint16_t ts_small_parse_table[] = { sym_comment, sym_marginalia, aux_sym_typed_row_value_expr_list_repeat1, - [42063] = 8, + [42149] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(127), 1, - sym_identifier, STATE(919), 2, sym_comment, sym_marginalia, - [42089] = 8, + ACTIONS(2223), 5, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_values, + anon_sym_RPAREN, + anon_sym_COMMA, + [42167] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, - anon_sym_DQUOTE, - ACTIONS(504), 1, - anon_sym_BQUOTE, - ACTIONS(1695), 1, - sym__identifier, - STATE(4), 1, - sym__double_quote_string, - STATE(1275), 1, - sym_identifier, + STATE(1169), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2225), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(920), 2, sym_comment, sym_marginalia, - [42115] = 5, + [42189] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2214), 1, - anon_sym_COMMA, - ACTIONS(2212), 3, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - STATE(921), 3, + STATE(1171), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2227), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(921), 2, sym_comment, sym_marginalia, - aux_sym_order_by_repeat1, - [42135] = 5, + [42211] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2219), 1, - sym_keyword_nulls, + STATE(1172), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2229), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(922), 2, sym_comment, sym_marginalia, - ACTIONS(2217), 4, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [42155] = 8, + [42233] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1276), 1, + STATE(790), 1, sym_identifier, STATE(923), 2, sym_comment, sym_marginalia, - [42181] = 8, + [42259] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2233), 1, + sym_keyword_references, + STATE(924), 2, + sym_comment, + sym_marginalia, + ACTIONS(2231), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [42279] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(502), 1, + ACTIONS(499), 1, anon_sym_DQUOTE, - ACTIONS(504), 1, + ACTIONS(501), 1, anon_sym_BQUOTE, - ACTIONS(1695), 1, + ACTIONS(1735), 1, sym__identifier, - STATE(4), 1, + STATE(3), 1, sym__double_quote_string, - STATE(1233), 1, + STATE(913), 1, sym_identifier, - STATE(924), 2, + STATE(925), 2, sym_comment, sym_marginalia, - [42207] = 5, + [42305] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2223), 1, - sym_keyword_references, - STATE(925), 2, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(501), 1, + anon_sym_BQUOTE, + ACTIONS(1735), 1, + sym__identifier, + STATE(3), 1, + sym__double_quote_string, + STATE(1121), 1, + sym_identifier, + STATE(926), 2, sym_comment, sym_marginalia, - ACTIONS(2221), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [42227] = 8, + [42331] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1413), 1, + ACTIONS(1425), 1, sym_keyword_rename, - ACTIONS(2225), 1, + ACTIONS(2235), 1, sym_keyword_set, - ACTIONS(2227), 1, + ACTIONS(2237), 1, sym_keyword_alter, - ACTIONS(2229), 1, + ACTIONS(2239), 1, sym_keyword_reset, - STATE(1250), 1, + STATE(1264), 1, sym_rename_object, - STATE(926), 2, + STATE(927), 2, sym_comment, sym_marginalia, - [42253] = 6, + [42357] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - STATE(1081), 1, - sym_where, - ACTIONS(2231), 2, + STATE(1178), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2241), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(927), 2, - sym_comment, - sym_marginalia, - [42274] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(2233), 1, - sym_keyword_values, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(1011), 1, - sym_insert_values, - STATE(1379), 1, - sym_column_list, STATE(928), 2, sym_comment, sym_marginalia, - [42297] = 6, + [42379] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - STATE(1196), 1, - sym_where, - ACTIONS(2237), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2245), 1, + sym_keyword_float, + ACTIONS(2247), 1, + sym_keyword_double, + STATE(515), 1, + sym_keyword_real, + ACTIONS(2243), 2, + aux_sym_keyword_real_token1, + aux_sym_keyword_real_token2, STATE(929), 2, sym_comment, sym_marginalia, - [42318] = 6, + [42403] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1806), 1, - sym_keyword_order, - STATE(1278), 1, - sym_order_by, - ACTIONS(2239), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(738), 1, + anon_sym_BQUOTE, + ACTIONS(2000), 1, + sym__identifier, + STATE(167), 1, + sym__double_quote_string, + STATE(196), 1, + sym_identifier, STATE(930), 2, sym_comment, sym_marginalia, - [42339] = 5, + [42429] = 8, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2241), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - ACTIONS(2243), 2, - sym_keyword_after, - sym_keyword_before, + ACTIONS(732), 1, + anon_sym_DQUOTE, + ACTIONS(738), 1, + anon_sym_BQUOTE, + ACTIONS(2000), 1, + sym__identifier, + STATE(167), 1, + sym__double_quote_string, + STATE(200), 1, + sym_identifier, STATE(931), 2, sym_comment, sym_marginalia, - [42358] = 7, + [42455] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2233), 1, - sym_keyword_values, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(1103), 1, - sym_insert_values, - STATE(1379), 1, - sym_column_list, + ACTIONS(1876), 1, + aux_sym_keyword_with_token1, + ACTIONS(2251), 1, + sym_keyword_force, + STATE(1008), 1, + sym_keyword_with, + ACTIONS(2249), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(932), 2, sym_comment, sym_marginalia, - [42381] = 6, + [42479] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2247), 1, - sym_keyword_cache, - ACTIONS(2249), 1, - sym_keyword_noscan, - ACTIONS(2245), 2, + STATE(1184), 1, + sym__drop_behavior, + ACTIONS(1908), 2, + sym_keyword_cascade, + sym_keyword_restrict, + ACTIONS(2253), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(933), 2, sym_comment, sym_marginalia, - [42402] = 6, + [42501] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, - anon_sym_COMMA, - STATE(942), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2251), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(499), 1, + anon_sym_DQUOTE, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1130), 1, + sym_literal_string, + STATE(23), 2, + sym__double_quote_string, + sym__single_quote_string, STATE(934), 2, sym_comment, sym_marginalia, - [42423] = 6, + [42525] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, - anon_sym_COMMA, - STATE(703), 1, - aux_sym__truncate_statement_repeat1, - ACTIONS(2255), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(935), 2, sym_comment, sym_marginalia, - [42444] = 6, + ACTIONS(2255), 4, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [42542] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, - anon_sym_COMMA, - STATE(970), 1, - aux_sym__truncate_statement_repeat1, - ACTIONS(2255), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(9), 1, + sym_keyword_select, + STATE(998), 1, + sym_select_statement, + STATE(1327), 1, + sym_select, + STATE(1478), 1, + sym_dml_read_stmt, STATE(936), 2, sym_comment, sym_marginalia, - [42465] = 6, + [42565] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1806), 1, - sym_keyword_order, - STATE(1170), 1, - sym_order_by, - ACTIONS(2257), 2, - anon_sym_RPAREN, + ACTIONS(2259), 1, anon_sym_COMMA, + STATE(944), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2257), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(937), 2, sym_comment, sym_marginalia, - [42486] = 6, + [42586] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - STATE(1068), 1, - sym_where, - ACTIONS(2259), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2261), 1, + sym_keyword_values, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(1031), 1, + sym_insert_values, + STATE(1360), 1, + sym_column_list, STATE(938), 2, sym_comment, sym_marginalia, - [42507] = 6, + [42609] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, + ACTIONS(1910), 1, anon_sym_COMMA, - STATE(972), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2251), 2, + STATE(715), 1, + aux_sym__truncate_statement_repeat1, + ACTIONS(2265), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(939), 2, sym_comment, sym_marginalia, - [42528] = 7, + [42630] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2233), 1, - sym_keyword_values, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(993), 1, - sym_insert_values, - STATE(1379), 1, - sym_column_list, STATE(940), 2, sym_comment, sym_marginalia, - [42551] = 4, + ACTIONS(2267), 4, + anon_sym_DQUOTE, + anon_sym_SQUOTE, + anon_sym_BQUOTE, + sym__identifier, + [42647] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2269), 1, + anon_sym_RPAREN, + ACTIONS(2271), 1, + anon_sym_COMMA, + STATE(970), 1, + aux_sym_column_definitions_repeat1, + STATE(1430), 1, + sym_constraints, STATE(941), 2, sym_comment, sym_marginalia, - ACTIONS(2261), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [42568] = 5, + [42670] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2265), 1, + ACTIONS(2259), 1, anon_sym_COMMA, - ACTIONS(2263), 2, + STATE(968), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2257), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(942), 3, + STATE(942), 2, sym_comment, sym_marginalia, - aux_sym__rename_statement_repeat1, - [42587] = 6, + [42691] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, + ACTIONS(1838), 1, + sym_keyword_order, + STATE(1155), 1, + sym_order_by, + ACTIONS(2273), 2, + anon_sym_RPAREN, anon_sym_COMMA, - STATE(973), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2268), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(943), 2, sym_comment, sym_marginalia, - [42608] = 4, + [42712] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(944), 2, + ACTIONS(2277), 1, + anon_sym_COMMA, + ACTIONS(2275), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(944), 3, sym_comment, sym_marginalia, - ACTIONS(2270), 4, - sym_keyword_desc, - sym_keyword_asc, - anon_sym_RPAREN, - anon_sym_COMMA, - [42625] = 5, + aux_sym__rename_statement_repeat1, + [42731] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2272), 2, - anon_sym_LT, - anon_sym_GT, - ACTIONS(2274), 2, - anon_sym_LT_EQ, - anon_sym_GT_EQ, + ACTIONS(2261), 1, + sym_keyword_values, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(1101), 1, + sym_insert_values, + STATE(1360), 1, + sym_column_list, STATE(945), 2, sym_comment, sym_marginalia, - [42644] = 7, + [42754] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2233), 1, - sym_keyword_values, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(1002), 1, - sym_insert_values, - STATE(1379), 1, - sym_column_list, + ACTIONS(9), 1, + sym_keyword_select, + STATE(998), 1, + sym_select_statement, + STATE(1327), 1, + sym_select, + STATE(1405), 1, + sym_dml_read_stmt, STATE(946), 2, sym_comment, sym_marginalia, - [42667] = 4, + [42777] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2259), 1, + anon_sym_COMMA, + STATE(969), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2280), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(947), 2, sym_comment, sym_marginalia, - ACTIONS(2276), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [42684] = 4, + [42798] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1838), 1, + sym_keyword_order, + STATE(1170), 1, + sym_order_by, + ACTIONS(2282), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(948), 2, sym_comment, sym_marginalia, - ACTIONS(2278), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [42701] = 7, + [42819] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(9), 1, - sym_keyword_select, - STATE(1097), 1, - sym_select_statement, - STATE(1320), 1, - sym_select, - STATE(1335), 1, - sym_dml_read_stmt, + ACTIONS(1832), 1, + sym_keyword_where, + STATE(1306), 1, + sym_where, + ACTIONS(2284), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(949), 2, sym_comment, sym_marginalia, - [42724] = 4, + [42840] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2261), 1, + sym_keyword_values, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(1001), 1, + sym_insert_values, + STATE(1360), 1, + sym_column_list, STATE(950), 2, sym_comment, sym_marginalia, - ACTIONS(2280), 4, - anon_sym_DQUOTE, - anon_sym_SQUOTE, - anon_sym_BQUOTE, - sym__identifier, - [42741] = 4, + [42863] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(547), 1, + anon_sym_SQUOTE, + ACTIONS(2286), 1, + sym_keyword_if, + STATE(982), 1, + sym__single_quote_string, + STATE(1254), 1, + sym__if_not_exists, STATE(951), 2, sym_comment, sym_marginalia, - ACTIONS(2212), 4, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [42758] = 7, + [42886] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2282), 1, - anon_sym_RPAREN, - ACTIONS(2284), 1, - anon_sym_COMMA, - STATE(974), 1, - aux_sym_column_definitions_repeat1, - STATE(1407), 1, - sym_constraints, STATE(952), 2, sym_comment, sym_marginalia, - [42781] = 7, + ACTIONS(2288), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [42903] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2233), 1, - sym_keyword_values, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(1009), 1, - sym_insert_values, - STATE(1379), 1, - sym_column_list, + ACTIONS(1910), 1, + anon_sym_COMMA, + STATE(966), 1, + aux_sym__truncate_statement_repeat1, + ACTIONS(2265), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(953), 2, sym_comment, sym_marginalia, - [42804] = 4, + [42924] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2290), 2, + anon_sym_LT, + anon_sym_GT, + ACTIONS(2292), 2, + anon_sym_LT_EQ, + anon_sym_GT_EQ, STATE(954), 2, sym_comment, sym_marginalia, - ACTIONS(2286), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [42821] = 7, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(2092), 1, - anon_sym_DASH, - ACTIONS(2288), 1, - anon_sym_RBRACK, - STATE(1523), 1, - sym_integer, - STATE(955), 2, - sym_comment, - sym_marginalia, - [42844] = 7, + [42943] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2233), 1, + ACTIONS(2261), 1, sym_keyword_values, - ACTIONS(2235), 1, + ACTIONS(2263), 1, anon_sym_LPAREN, STATE(1013), 1, sym_insert_values, - STATE(1379), 1, + STATE(1360), 1, sym_column_list, - STATE(956), 2, + STATE(955), 2, sym_comment, sym_marginalia, - [42867] = 4, + [42966] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(957), 2, + STATE(956), 2, sym_comment, sym_marginalia, - ACTIONS(2290), 4, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, - anon_sym_COMMA, - [42884] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - STATE(1169), 1, - sym_where, - ACTIONS(2292), 2, + ACTIONS(2294), 4, ts_builtin_sym_end, anon_sym_SEMI, - STATE(958), 2, - sym_comment, - sym_marginalia, - [42905] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(2296), 1, + anon_sym_RPAREN, anon_sym_COMMA, - STATE(975), 1, - aux_sym_alter_table_repeat1, - ACTIONS(2294), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(959), 2, - sym_comment, - sym_marginalia, - [42926] = 4, + [42983] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(960), 2, + STATE(957), 2, sym_comment, sym_marginalia, - ACTIONS(2298), 4, + ACTIONS(2296), 4, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_when, - anon_sym_COMMA, - [42943] = 6, - ACTIONS(3), 1, - anon_sym_DASH_DASH, - ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(2300), 1, - aux_sym_keyword_character_token1, - STATE(1375), 1, - sym_keyword_character, - ACTIONS(2302), 2, anon_sym_RPAREN, anon_sym_COMMA, - STATE(961), 2, - sym_comment, - sym_marginalia, - [42964] = 6, + [43000] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2296), 1, - anon_sym_COMMA, - STATE(981), 1, - aux_sym_alter_table_repeat1, - ACTIONS(2294), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(962), 2, + STATE(958), 2, sym_comment, sym_marginalia, - [42985] = 7, + ACTIONS(2185), 4, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [43017] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2233), 1, + ACTIONS(2261), 1, sym_keyword_values, - ACTIONS(2235), 1, + ACTIONS(2263), 1, anon_sym_LPAREN, - STATE(1212), 1, + STATE(1018), 1, sym_insert_values, - STATE(1379), 1, + STATE(1360), 1, sym_column_list, - STATE(963), 2, + STATE(959), 2, sym_comment, sym_marginalia, - [43008] = 6, + [43040] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, - anon_sym_COMMA, - STATE(942), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2304), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(964), 2, + STATE(960), 2, sym_comment, sym_marginalia, - [43029] = 7, + ACTIONS(2298), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [43057] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(9), 1, - sym_keyword_select, - STATE(1097), 1, - sym_select_statement, - STATE(1320), 1, - sym_select, - STATE(1437), 1, - sym_dml_read_stmt, - STATE(965), 2, + ACTIONS(2259), 1, + anon_sym_COMMA, + STATE(986), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2300), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(961), 2, sym_comment, sym_marginalia, - [43052] = 7, + [43078] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(555), 1, - anon_sym_SQUOTE, - ACTIONS(2306), 1, - sym_keyword_if, - STATE(967), 1, - sym__single_quote_string, - STATE(1154), 1, - sym__if_not_exists, - STATE(966), 2, + STATE(962), 2, sym_comment, sym_marginalia, - [43075] = 5, + ACTIONS(2302), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_where, + anon_sym_RPAREN, + [43095] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2308), 2, + ACTIONS(1832), 1, + sym_keyword_where, + STATE(1086), 1, + sym_where, + ACTIONS(2304), 2, ts_builtin_sym_end, anon_sym_SEMI, - ACTIONS(2310), 2, - sym_keyword_after, - sym_keyword_before, - STATE(967), 2, + STATE(963), 2, sym_comment, sym_marginalia, - [43094] = 6, + [43116] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, - anon_sym_COMMA, - STATE(983), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2312), 2, - ts_builtin_sym_end, - anon_sym_SEMI, - STATE(968), 2, + STATE(964), 2, sym_comment, sym_marginalia, - [43115] = 6, + ACTIONS(2306), 4, + sym_keyword_limit, + sym_keyword_separator, + anon_sym_RPAREN, + anon_sym_COMMA, + [43133] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2316), 1, + ACTIONS(2310), 1, sym_keyword_cache, - ACTIONS(2318), 1, + ACTIONS(2312), 1, sym_keyword_noscan, - ACTIONS(2314), 2, + ACTIONS(2308), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(969), 2, + STATE(965), 2, sym_comment, sym_marginalia, - [43136] = 6, + [43154] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, + ACTIONS(1910), 1, anon_sym_COMMA, - STATE(703), 1, + STATE(715), 1, aux_sym__truncate_statement_repeat1, - ACTIONS(2320), 2, + ACTIONS(2314), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(970), 2, + STATE(966), 2, sym_comment, sym_marginalia, - [43157] = 6, + [43175] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, + ACTIONS(2259), 1, anon_sym_COMMA, - STATE(964), 1, + STATE(993), 1, aux_sym__rename_statement_repeat1, - ACTIONS(2322), 2, + ACTIONS(2316), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(971), 2, + STATE(967), 2, sym_comment, sym_marginalia, - [43178] = 6, + [43196] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, + ACTIONS(2259), 1, anon_sym_COMMA, - STATE(942), 1, + STATE(944), 1, aux_sym__rename_statement_repeat1, - ACTIONS(2324), 2, + ACTIONS(2318), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(972), 2, + STATE(968), 2, sym_comment, sym_marginalia, - [43199] = 6, + [43217] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, + ACTIONS(2259), 1, anon_sym_COMMA, - STATE(942), 1, + STATE(944), 1, aux_sym__rename_statement_repeat1, - ACTIONS(2326), 2, + ACTIONS(2320), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(973), 2, + STATE(969), 2, sym_comment, sym_marginalia, - [43220] = 7, + [43238] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2284), 1, + ACTIONS(2271), 1, anon_sym_COMMA, - ACTIONS(2328), 1, + ACTIONS(2322), 1, anon_sym_RPAREN, - STATE(1042), 1, + STATE(1104), 1, aux_sym_column_definitions_repeat1, - STATE(1432), 1, + STATE(1438), 1, sym_constraints, - STATE(974), 2, + STATE(970), 2, sym_comment, sym_marginalia, - [43243] = 6, + [43261] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2296), 1, + ACTIONS(2326), 1, anon_sym_COMMA, - STATE(981), 1, + STATE(972), 1, aux_sym_alter_table_repeat1, - ACTIONS(2330), 2, + ACTIONS(2324), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(975), 2, + STATE(971), 2, sym_comment, sym_marginalia, - [43264] = 6, + [43282] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, + ACTIONS(2326), 1, anon_sym_COMMA, - STATE(934), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2332), 2, + STATE(978), 1, + aux_sym_alter_table_repeat1, + ACTIONS(2328), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(976), 2, + STATE(972), 2, sym_comment, sym_marginalia, - [43285] = 4, + [43303] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(977), 2, + ACTIONS(2261), 1, + sym_keyword_values, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(1322), 1, + sym_insert_values, + STATE(1360), 1, + sym_column_list, + STATE(973), 2, sym_comment, sym_marginalia, - ACTIONS(2334), 4, + [43326] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2330), 2, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_RPAREN, - anon_sym_COMMA, - [43302] = 4, + ACTIONS(2332), 2, + sym_keyword_after, + sym_keyword_before, + STATE(974), 2, + sym_comment, + sym_marginalia, + [43345] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(978), 2, + STATE(975), 2, sym_comment, sym_marginalia, - ACTIONS(2336), 4, + ACTIONS(2334), 4, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RPAREN, anon_sym_COMMA, - [43319] = 4, + [43362] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(979), 2, + STATE(976), 2, sym_comment, sym_marginalia, - ACTIONS(2338), 4, + ACTIONS(2336), 4, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RPAREN, anon_sym_COMMA, - [43336] = 4, + [43379] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(980), 2, + STATE(977), 2, sym_comment, sym_marginalia, - ACTIONS(2336), 4, + ACTIONS(2334), 4, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_RPAREN, anon_sym_COMMA, - [43353] = 5, + [43396] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2342), 1, + ACTIONS(2340), 1, anon_sym_COMMA, - ACTIONS(2340), 2, + ACTIONS(2338), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(981), 3, + STATE(978), 3, sym_comment, sym_marginalia, aux_sym_alter_table_repeat1, - [43372] = 4, + [43415] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(982), 2, + ACTIONS(2326), 1, + anon_sym_COMMA, + STATE(989), 1, + aux_sym_alter_table_repeat1, + ACTIONS(2343), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(979), 2, + sym_comment, + sym_marginalia, + [43436] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + STATE(980), 2, sym_comment, sym_marginalia, ACTIONS(2345), 4, @@ -47223,81 +47376,112 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_SEMI, anon_sym_RPAREN, anon_sym_COMMA, - [43389] = 6, + [43453] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2253), 1, - anon_sym_COMMA, - STATE(942), 1, - aux_sym__rename_statement_repeat1, - ACTIONS(2332), 2, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(2204), 1, + anon_sym_DASH, + ACTIONS(2347), 1, + anon_sym_RBRACK, + STATE(1616), 1, + sym_integer, + STATE(981), 2, + sym_comment, + sym_marginalia, + [43476] = 5, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2349), 2, ts_builtin_sym_end, anon_sym_SEMI, - STATE(983), 2, + ACTIONS(2351), 2, + sym_keyword_after, + sym_keyword_before, + STATE(982), 2, sym_comment, sym_marginalia, - [43410] = 6, + [43495] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2296), 1, + ACTIONS(1910), 1, anon_sym_COMMA, - STATE(962), 1, - aux_sym_alter_table_repeat1, - ACTIONS(2347), 2, + STATE(939), 1, + aux_sym__truncate_statement_repeat1, + ACTIONS(2353), 2, ts_builtin_sym_end, anon_sym_SEMI, + STATE(983), 2, + sym_comment, + sym_marginalia, + [43516] = 6, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2355), 1, + aux_sym_keyword_character_token1, + STATE(1338), 1, + sym_keyword_character, + ACTIONS(2357), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(984), 2, sym_comment, sym_marginalia, - [43431] = 7, + [43537] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(2092), 1, - anon_sym_DASH, - ACTIONS(2349), 1, - anon_sym_RBRACK, - STATE(1512), 1, - sym_integer, + ACTIONS(2259), 1, + anon_sym_COMMA, + STATE(937), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2359), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(985), 2, sym_comment, sym_marginalia, - [43454] = 6, + [43558] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1886), 1, + ACTIONS(2259), 1, anon_sym_COMMA, - STATE(935), 1, - aux_sym__truncate_statement_repeat1, - ACTIONS(2351), 2, + STATE(944), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2359), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(986), 2, sym_comment, sym_marginalia, - [43475] = 4, + [43579] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1832), 1, + sym_keyword_where, + STATE(1297), 1, + sym_where, + ACTIONS(2361), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(987), 2, sym_comment, sym_marginalia, - ACTIONS(2353), 4, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_where, - anon_sym_RPAREN, - [43492] = 4, + [43600] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47305,289 +47489,300 @@ static const uint16_t ts_small_parse_table[] = { STATE(988), 2, sym_comment, sym_marginalia, - ACTIONS(2355), 4, - sym_keyword_limit, - sym_keyword_separator, - anon_sym_RPAREN, + ACTIONS(2363), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, anon_sym_COMMA, - [43509] = 6, + [43617] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2357), 1, - anon_sym_RPAREN, - ACTIONS(2359), 1, + ACTIONS(2326), 1, anon_sym_COMMA, - STATE(1108), 1, - aux_sym_enum_repeat1, + STATE(978), 1, + aux_sym_alter_table_repeat1, + ACTIONS(2324), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(989), 2, sym_comment, sym_marginalia, - [43529] = 6, + [43638] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2361), 1, - anon_sym_LPAREN, - STATE(906), 1, - sym_list, - STATE(1077), 1, - sym_typed_row_value_expr_list, + ACTIONS(1832), 1, + sym_keyword_where, + STATE(1027), 1, + sym_where, + ACTIONS(2365), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(990), 2, sym_comment, sym_marginalia, - [43549] = 5, + [43659] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1745), 1, - anon_sym_RPAREN, - ACTIONS(2363), 1, - anon_sym_COMMA, - STATE(991), 3, + ACTIONS(2369), 1, + sym_keyword_cache, + ACTIONS(2371), 1, + sym_keyword_noscan, + ACTIONS(2367), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(991), 2, sym_comment, sym_marginalia, - aux_sym__compute_stats_repeat2, - [43567] = 6, + [43680] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1699), 1, - anon_sym_COMMA, - ACTIONS(2249), 1, - anon_sym_RPAREN, - STATE(991), 1, - aux_sym__compute_stats_repeat2, STATE(992), 2, sym_comment, sym_marginalia, - [43587] = 4, + ACTIONS(2373), 4, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + anon_sym_COMMA, + [43697] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2259), 1, + anon_sym_COMMA, + STATE(944), 1, + aux_sym__rename_statement_repeat1, + ACTIONS(2375), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(993), 2, sym_comment, sym_marginalia, - ACTIONS(2366), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [43603] = 4, + [43718] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(2204), 1, + anon_sym_DASH, + ACTIONS(2377), 1, + anon_sym_RBRACK, + STATE(1527), 1, + sym_integer, STATE(994), 2, sym_comment, sym_marginalia, - ACTIONS(2368), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [43619] = 6, + [43741] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1699), 1, - anon_sym_COMMA, - ACTIONS(1739), 1, - anon_sym_RPAREN, - STATE(991), 1, - aux_sym__compute_stats_repeat2, STATE(995), 2, sym_comment, sym_marginalia, - [43639] = 6, + ACTIONS(2379), 4, + sym_keyword_desc, + sym_keyword_asc, + anon_sym_RPAREN, + anon_sym_COMMA, + [43758] = 7, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2370), 1, - anon_sym_RPAREN, - ACTIONS(2372), 1, - anon_sym_COMMA, - STATE(1004), 1, - aux_sym_invocation_repeat1, + ACTIONS(2261), 1, + sym_keyword_values, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(1024), 1, + sym_insert_values, + STATE(1360), 1, + sym_column_list, STATE(996), 2, sym_comment, sym_marginalia, - [43659] = 6, + [43781] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2374), 1, - sym_keyword_offset, - ACTIONS(2376), 1, - anon_sym_RPAREN, - STATE(1589), 1, - sym_offset, STATE(997), 2, sym_comment, sym_marginalia, - [43679] = 6, + ACTIONS(2381), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [43797] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(2378), 1, - anon_sym_RPAREN, - STATE(1600), 1, - sym_limit, STATE(998), 2, sym_comment, sym_marginalia, - [43699] = 5, + ACTIONS(2383), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_RPAREN, + [43813] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2380), 1, - anon_sym_RPAREN, - ACTIONS(2382), 1, + ACTIONS(652), 1, + anon_sym_RBRACK, + ACTIONS(2385), 1, anon_sym_COMMA, STATE(999), 3, sym_comment, sym_marginalia, - aux_sym_ordered_columns_repeat1, - [43717] = 5, + aux_sym_array_repeat1, + [43831] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2385), 1, + ACTIONS(2388), 1, anon_sym_RPAREN, - ACTIONS(2387), 1, + ACTIONS(2390), 1, anon_sym_COMMA, - STATE(1000), 3, + STATE(1136), 1, + aux_sym_alter_index_repeat1, + STATE(1000), 2, sym_comment, sym_marginalia, - aux_sym__vacuum_table_repeat1, - [43735] = 6, + [43851] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2390), 1, - anon_sym_RPAREN, - ACTIONS(2392), 1, - anon_sym_COMMA, - STATE(1000), 1, - aux_sym__vacuum_table_repeat1, STATE(1001), 2, sym_comment, sym_marginalia, - [43755] = 4, + ACTIONS(2392), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [43867] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2394), 1, + anon_sym_RPAREN, + ACTIONS(2396), 1, + anon_sym_COMMA, + STATE(1057), 1, + aux_sym_constraints_repeat1, STATE(1002), 2, sym_comment, sym_marginalia, - ACTIONS(2394), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [43771] = 6, + [43887] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2372), 1, - anon_sym_COMMA, - ACTIONS(2396), 1, - anon_sym_RPAREN, - STATE(1004), 1, - aux_sym_invocation_repeat1, STATE(1003), 2, sym_comment, sym_marginalia, - [43791] = 5, + ACTIONS(2398), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [43903] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2398), 1, - anon_sym_RPAREN, ACTIONS(2400), 1, + sym_keyword_from, + ACTIONS(2402), 1, anon_sym_COMMA, STATE(1004), 3, sym_comment, sym_marginalia, - aux_sym_invocation_repeat1, - [43809] = 5, + aux_sym_select_expression_repeat1, + [43921] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2403), 1, - sym_keyword_from, + ACTIONS(2407), 1, + sym_keyword_on, ACTIONS(2405), 2, - sym_keyword_to, - anon_sym_EQ, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1005), 2, sym_comment, sym_marginalia, - [43827] = 4, + [43939] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2409), 1, + sym_keyword_from, + ACTIONS(2411), 1, + anon_sym_COMMA, + STATE(1004), 1, + aux_sym_select_expression_repeat1, STATE(1006), 2, sym_comment, sym_marginalia, - ACTIONS(2407), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [43843] = 5, + [43959] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2409), 1, + ACTIONS(2413), 1, anon_sym_RPAREN, - ACTIONS(2411), 1, + ACTIONS(2415), 1, anon_sym_COMMA, - STATE(1007), 3, + STATE(1026), 1, + aux_sym_invocation_repeat1, + STATE(1007), 2, sym_comment, sym_marginalia, - aux_sym_list_repeat1, - [43861] = 5, + [43979] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2416), 1, - sym_keyword_on, - ACTIONS(2414), 2, + ACTIONS(2419), 1, + sym_keyword_force, + ACTIONS(2417), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1008), 2, sym_comment, sym_marginalia, - [43879] = 4, + [43997] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2421), 1, + sym_keyword_offset, + ACTIONS(2423), 1, + anon_sym_RPAREN, + STATE(1455), 1, + sym_offset, STATE(1009), 2, sym_comment, sym_marginalia, - ACTIONS(2418), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [43895] = 4, + [44017] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47595,23 +47790,24 @@ static const uint16_t ts_small_parse_table[] = { STATE(1010), 2, sym_comment, sym_marginalia, - ACTIONS(2420), 3, + ACTIONS(2425), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_when, - [43911] = 4, + sym_keyword_compute, + [44033] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1011), 2, + ACTIONS(2427), 1, + anon_sym_RPAREN, + ACTIONS(2429), 1, + anon_sym_COMMA, + STATE(1011), 3, sym_comment, sym_marginalia, - ACTIONS(2422), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [43927] = 4, + aux_sym__partition_spec_repeat1, + [44051] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47619,11 +47815,11 @@ static const uint16_t ts_small_parse_table[] = { STATE(1012), 2, sym_comment, sym_marginalia, - ACTIONS(2424), 3, + ACTIONS(2432), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_compute, - [43943] = 4, + sym_keyword_on, + [44067] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47631,144 +47827,144 @@ static const uint16_t ts_small_parse_table[] = { STATE(1013), 2, sym_comment, sym_marginalia, - ACTIONS(2426), 3, + ACTIONS(2434), 3, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_when, - [43959] = 6, + [44083] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(2092), 1, - anon_sym_DASH, - STATE(596), 1, - sym_integer, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(2436), 1, + anon_sym_RPAREN, + STATE(1567), 1, + sym_limit, STATE(1014), 2, sym_comment, sym_marginalia, - [43979] = 6, + [44103] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(2092), 1, - anon_sym_DASH, - STATE(626), 1, - sym_integer, - STATE(1015), 2, + ACTIONS(2438), 1, + anon_sym_RPAREN, + ACTIONS(2440), 1, + anon_sym_COMMA, + STATE(1015), 3, sym_comment, sym_marginalia, - [43999] = 6, + aux_sym_ordered_columns_repeat1, + [44121] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2428), 1, - anon_sym_RPAREN, - ACTIONS(2430), 1, - anon_sym_COMMA, - STATE(1063), 1, - aux_sym__partition_spec_repeat1, + ACTIONS(2443), 1, + anon_sym_LPAREN, + STATE(128), 2, + sym_subquery, + sym_list, STATE(1016), 2, sym_comment, sym_marginalia, - [44019] = 6, + [44139] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2432), 1, - anon_sym_RPAREN, - ACTIONS(2434), 1, + ACTIONS(2415), 1, anon_sym_COMMA, - STATE(1083), 1, - aux_sym_constraints_repeat1, + ACTIONS(2445), 1, + anon_sym_RPAREN, + STATE(1026), 1, + aux_sym_invocation_repeat1, STATE(1017), 2, sym_comment, sym_marginalia, - [44039] = 6, + [44159] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2436), 1, - sym_keyword_set, - ACTIONS(2438), 1, - sym_keyword_drop, - ACTIONS(2440), 1, - sym_keyword_type, STATE(1018), 2, sym_comment, sym_marginalia, - [44059] = 5, + ACTIONS(2447), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [44175] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2153), 1, - sym_keyword_force, - ACTIONS(2151), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(1019), 2, sym_comment, sym_marginalia, - [44077] = 6, + ACTIONS(2449), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [44191] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2442), 1, + ACTIONS(2451), 1, sym_keyword_from, - ACTIONS(2444), 1, - anon_sym_COMMA, - STATE(1054), 1, - aux_sym_select_expression_repeat1, + ACTIONS(2453), 2, + sym_keyword_to, + anon_sym_EQ, STATE(1020), 2, sym_comment, sym_marginalia, - [44097] = 4, + [44209] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2455), 1, + anon_sym_RPAREN, + ACTIONS(2457), 1, + anon_sym_COMMA, + STATE(1093), 1, + aux_sym__vacuum_table_repeat1, STATE(1021), 2, sym_comment, sym_marginalia, - ACTIONS(2446), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44113] = 4, + [44229] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2455), 1, + anon_sym_RPAREN, + ACTIONS(2457), 1, + anon_sym_COMMA, + STATE(1094), 1, + aux_sym__vacuum_table_repeat1, STATE(1022), 2, sym_comment, sym_marginalia, - ACTIONS(2448), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44129] = 4, + [44249] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2415), 1, + anon_sym_COMMA, + ACTIONS(2459), 1, + anon_sym_RPAREN, + STATE(1026), 1, + aux_sym_invocation_repeat1, STATE(1023), 2, sym_comment, sym_marginalia, - ACTIONS(2450), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44145] = 4, + [44269] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47776,37 +47972,37 @@ static const uint16_t ts_small_parse_table[] = { STATE(1024), 2, sym_comment, sym_marginalia, - ACTIONS(643), 3, + ACTIONS(2461), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [44161] = 6, + sym_keyword_when, + [44285] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(631), 1, - anon_sym_COMMA, - ACTIONS(2452), 1, - anon_sym_RBRACK, - STATE(1127), 1, - aux_sym_array_repeat1, + ACTIONS(2463), 1, + sym_keyword_schema, + ACTIONS(2465), 2, + sym_keyword_unlogged, + sym_keyword_logged, STATE(1025), 2, sym_comment, sym_marginalia, - [44181] = 4, + [44303] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1026), 2, + ACTIONS(2467), 1, + anon_sym_RPAREN, + ACTIONS(2469), 1, + anon_sym_COMMA, + STATE(1026), 3, sym_comment, sym_marginalia, - ACTIONS(2454), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44197] = 4, + aux_sym_invocation_repeat1, + [44321] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47814,76 +48010,76 @@ static const uint16_t ts_small_parse_table[] = { STATE(1027), 2, sym_comment, sym_marginalia, - ACTIONS(2456), 3, + ACTIONS(2472), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [44213] = 4, + anon_sym_RPAREN, + [44337] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2312), 1, + sym_keyword_noscan, + ACTIONS(2308), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1028), 2, sym_comment, sym_marginalia, - ACTIONS(2458), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44229] = 5, + [44355] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2460), 1, - anon_sym_RPAREN, - ACTIONS(2462), 1, + ACTIONS(609), 1, anon_sym_COMMA, - STATE(1029), 3, + ACTIONS(2474), 1, + anon_sym_RPAREN, + STATE(1098), 1, + aux_sym_list_repeat1, + STATE(1029), 2, sym_comment, sym_marginalia, - aux_sym_column_list_repeat1, - [44247] = 6, + [44375] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2465), 1, - anon_sym_RPAREN, - ACTIONS(2467), 1, - anon_sym_COMMA, - STATE(1094), 1, - aux_sym_ordered_columns_repeat1, STATE(1030), 2, sym_comment, sym_marginalia, - [44267] = 5, + ACTIONS(2275), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44391] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2469), 1, - anon_sym_LPAREN, - STATE(129), 2, - sym_subquery, - sym_list, STATE(1031), 2, sym_comment, sym_marginalia, - [44285] = 5, + ACTIONS(2476), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [44407] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2249), 1, - sym_keyword_noscan, - ACTIONS(2245), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2478), 1, + anon_sym_RPAREN, + ACTIONS(2480), 1, + anon_sym_COMMA, + STATE(1102), 1, + aux_sym_column_list_repeat1, STATE(1032), 2, sym_comment, sym_marginalia, - [44303] = 4, + [44427] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47891,11 +48087,11 @@ static const uint16_t ts_small_parse_table[] = { STATE(1033), 2, sym_comment, sym_marginalia, - ACTIONS(2471), 3, + ACTIONS(2482), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [44319] = 4, + sym_keyword_when, + [44443] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47903,65 +48099,64 @@ static const uint16_t ts_small_parse_table[] = { STATE(1034), 2, sym_comment, sym_marginalia, - ACTIONS(2003), 3, + ACTIONS(2484), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [44335] = 6, + [44459] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2430), 1, - anon_sym_COMMA, - ACTIONS(2473), 1, + ACTIONS(2486), 1, anon_sym_RPAREN, - STATE(1016), 1, - aux_sym__partition_spec_repeat1, + ACTIONS(2488), 1, + anon_sym_COMMA, + STATE(1036), 1, + aux_sym_alter_index_repeat2, STATE(1035), 2, sym_comment, sym_marginalia, - [44355] = 6, + [44479] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2444), 1, + ACTIONS(2490), 1, + anon_sym_RPAREN, + ACTIONS(2492), 1, anon_sym_COMMA, - ACTIONS(2475), 1, - sym_keyword_from, - STATE(1020), 1, - aux_sym_select_expression_repeat1, - STATE(1036), 2, + STATE(1036), 3, sym_comment, sym_marginalia, - [44375] = 5, + aux_sym_alter_index_repeat2, + [44497] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2479), 1, - sym_keyword_transaction, - ACTIONS(2477), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2495), 1, + anon_sym_LPAREN, + STATE(824), 1, + sym_list, + STATE(1066), 1, + sym_typed_row_value_expr_list, STATE(1037), 2, sym_comment, sym_marginalia, - [44393] = 5, + [44517] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2483), 1, - sym_keyword_transaction, - ACTIONS(2481), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(1038), 2, sym_comment, sym_marginalia, - [44411] = 4, + ACTIONS(2497), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44533] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -47969,294 +48164,286 @@ static const uint16_t ts_small_parse_table[] = { STATE(1039), 2, sym_comment, sym_marginalia, - ACTIONS(2485), 3, + ACTIONS(2499), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [44427] = 6, + [44549] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2434), 1, - anon_sym_COMMA, - ACTIONS(2487), 1, - anon_sym_RPAREN, - STATE(1017), 1, - aux_sym_constraints_repeat1, + ACTIONS(2371), 1, + sym_keyword_noscan, + ACTIONS(2367), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1040), 2, sym_comment, sym_marginalia, - [44447] = 6, + [44567] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2489), 1, - sym_keyword_to, - ACTIONS(2491), 1, - sym_keyword_wait, - ACTIONS(2493), 1, - sym_keyword_nowait, STATE(1041), 2, sym_comment, sym_marginalia, - [44467] = 5, + ACTIONS(2501), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44583] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2495), 1, - anon_sym_RPAREN, - ACTIONS(2497), 1, - anon_sym_COMMA, - STATE(1042), 3, + ACTIONS(2503), 1, + sym_keyword_set, + ACTIONS(2505), 1, + sym_keyword_drop, + ACTIONS(2507), 1, + sym_keyword_type, + STATE(1042), 2, sym_comment, sym_marginalia, - aux_sym_column_definitions_repeat1, - [44485] = 6, + [44603] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(2500), 1, - anon_sym_RPAREN, - STATE(1349), 1, - sym_limit, + ACTIONS(2509), 1, + sym_keyword_not, + ACTIONS(2511), 1, + sym_keyword_default, + ACTIONS(2513), 1, + sym_keyword_data, STATE(1043), 2, sym_comment, sym_marginalia, - [44505] = 5, + [44623] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2502), 1, - sym_keyword_schema, - ACTIONS(2504), 2, - sym_keyword_unlogged, - sym_keyword_logged, STATE(1044), 2, sym_comment, sym_marginalia, - [44523] = 6, + ACTIONS(2515), 3, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + sym__identifier, + [44639] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2050), 1, - anon_sym_RPAREN, - ACTIONS(2506), 1, - anon_sym_COMMA, - STATE(1129), 1, - aux_sym_alter_index_repeat1, STATE(1045), 2, sym_comment, sym_marginalia, - [44543] = 6, + ACTIONS(643), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44655] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2508), 1, - sym_keyword_not, - ACTIONS(2510), 1, - sym_keyword_default, - ACTIONS(2512), 1, - sym_keyword_data, + ACTIONS(2519), 1, + sym_keyword_noscan, + ACTIONS(2517), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1046), 2, sym_comment, sym_marginalia, - [44563] = 6, + [44673] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, + ACTIONS(549), 1, sym_natural_number, - ACTIONS(2092), 1, + ACTIONS(2204), 1, anon_sym_DASH, - STATE(598), 1, + STATE(611), 1, sym_integer, STATE(1047), 2, sym_comment, sym_marginalia, - [44583] = 6, + [44693] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1902), 1, - anon_sym_RPAREN, - ACTIONS(2392), 1, - anon_sym_COMMA, - STATE(1064), 1, - aux_sym__vacuum_table_repeat1, STATE(1048), 2, sym_comment, sym_marginalia, - [44603] = 6, + ACTIONS(1972), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44709] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(557), 1, - sym_natural_number, - ACTIONS(2092), 1, - anon_sym_DASH, - STATE(599), 1, - sym_integer, + ACTIONS(2411), 1, + anon_sym_COMMA, + ACTIONS(2521), 1, + sym_keyword_from, + STATE(1006), 1, + aux_sym_select_expression_repeat1, STATE(1049), 2, sym_comment, sym_marginalia, - [44623] = 6, + [44729] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2514), 1, - anon_sym_LPAREN, - ACTIONS(2516), 1, + ACTIONS(2388), 1, anon_sym_RPAREN, - ACTIONS(2518), 1, - anon_sym_DOT, + ACTIONS(2390), 1, + anon_sym_COMMA, + STATE(1120), 1, + aux_sym_alter_index_repeat1, STATE(1050), 2, sym_comment, sym_marginalia, - [44643] = 5, + [44749] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2522), 1, - sym_keyword_on, - ACTIONS(2520), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(1051), 2, sym_comment, sym_marginalia, - [44661] = 6, + ACTIONS(1974), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44765] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2506), 1, - anon_sym_COMMA, - ACTIONS(2524), 1, - anon_sym_RPAREN, - STATE(1055), 1, - aux_sym_alter_index_repeat1, + ACTIONS(2523), 1, + sym_keyword_set, + ACTIONS(2525), 1, + sym_keyword_drop, + ACTIONS(2527), 1, + sym_keyword_type, STATE(1052), 2, sym_comment, sym_marginalia, - [44681] = 6, + [44785] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2526), 1, - anon_sym_RPAREN, - ACTIONS(2528), 1, - anon_sym_COMMA, - STATE(1130), 1, - aux_sym_alter_index_repeat2, STATE(1053), 2, sym_comment, sym_marginalia, - [44701] = 5, + ACTIONS(2529), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44801] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2530), 1, - sym_keyword_from, - ACTIONS(2532), 1, - anon_sym_COMMA, - STATE(1054), 3, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(2204), 1, + anon_sym_DASH, + STATE(603), 1, + sym_integer, + STATE(1054), 2, sym_comment, sym_marginalia, - aux_sym_select_expression_repeat1, - [44719] = 5, + [44821] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2535), 1, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(2531), 1, anon_sym_RPAREN, - ACTIONS(2537), 1, - anon_sym_COMMA, - STATE(1055), 3, + STATE(1514), 1, + sym_limit, + STATE(1055), 2, sym_comment, sym_marginalia, - aux_sym_alter_index_repeat1, - [44737] = 4, + [44841] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1932), 1, + anon_sym_RPAREN, + ACTIONS(2457), 1, + anon_sym_COMMA, + STATE(1021), 1, + aux_sym__vacuum_table_repeat1, STATE(1056), 2, sym_comment, sym_marginalia, - ACTIONS(2540), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44753] = 4, + [44861] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1057), 2, + ACTIONS(2533), 1, + anon_sym_RPAREN, + ACTIONS(2535), 1, + anon_sym_COMMA, + STATE(1057), 3, sym_comment, sym_marginalia, - ACTIONS(2542), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44769] = 6, + aux_sym_constraints_repeat1, + [44879] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2372), 1, - anon_sym_COMMA, - ACTIONS(2544), 1, - anon_sym_RPAREN, - STATE(1004), 1, - aux_sym_invocation_repeat1, STATE(1058), 2, sym_comment, sym_marginalia, - [44789] = 5, + ACTIONS(2538), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44895] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2548), 1, - sym_keyword_on, - ACTIONS(2546), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(1059), 2, sym_comment, sym_marginalia, - [44807] = 5, + ACTIONS(2338), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44911] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2552), 1, - sym_keyword_force, - ACTIONS(2550), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2415), 1, + anon_sym_COMMA, + ACTIONS(2540), 1, + anon_sym_RPAREN, + STATE(1026), 1, + aux_sym_invocation_repeat1, STATE(1060), 2, sym_comment, sym_marginalia, - [44825] = 4, + [44931] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48264,93 +48451,86 @@ static const uint16_t ts_small_parse_table[] = { STATE(1061), 2, sym_comment, sym_marginalia, - ACTIONS(2554), 3, + ACTIONS(2542), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_compute, - [44841] = 6, + anon_sym_COMMA, + [44947] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2372), 1, - anon_sym_COMMA, - ACTIONS(2556), 1, - anon_sym_RPAREN, - STATE(1004), 1, - aux_sym_invocation_repeat1, STATE(1062), 2, sym_comment, sym_marginalia, - [44861] = 5, + ACTIONS(629), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [44963] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2558), 1, - anon_sym_RPAREN, - ACTIONS(2560), 1, - anon_sym_COMMA, - STATE(1063), 3, + ACTIONS(2546), 1, + anon_sym_LPAREN, + ACTIONS(2544), 2, + ts_builtin_sym_end, + anon_sym_SEMI, + STATE(1063), 2, sym_comment, sym_marginalia, - aux_sym__partition_spec_repeat1, - [44879] = 6, + [44981] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2392), 1, - anon_sym_COMMA, - ACTIONS(2563), 1, + ACTIONS(2548), 1, + anon_sym_LPAREN, + ACTIONS(2550), 1, anon_sym_RPAREN, - STATE(1000), 1, - aux_sym__vacuum_table_repeat1, + ACTIONS(2552), 1, + anon_sym_DOT, STATE(1064), 2, sym_comment, sym_marginalia, - [44899] = 6, + [45001] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2392), 1, - anon_sym_COMMA, - ACTIONS(2563), 1, - anon_sym_RPAREN, - STATE(1001), 1, - aux_sym__vacuum_table_repeat1, STATE(1065), 2, sym_comment, sym_marginalia, - [44919] = 6, + ACTIONS(2554), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45017] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2528), 1, - anon_sym_COMMA, - ACTIONS(2565), 1, - anon_sym_RPAREN, - STATE(1067), 1, - aux_sym_alter_index_repeat2, STATE(1066), 2, sym_comment, sym_marginalia, - [44939] = 5, + ACTIONS(2556), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [45033] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2567), 1, - anon_sym_RPAREN, - ACTIONS(2569), 1, - anon_sym_COMMA, - STATE(1067), 3, + STATE(1067), 2, sym_comment, sym_marginalia, - aux_sym_alter_index_repeat2, - [44957] = 4, + ACTIONS(2558), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45049] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48358,90 +48538,91 @@ static const uint16_t ts_small_parse_table[] = { STATE(1068), 2, sym_comment, sym_marginalia, - ACTIONS(2572), 3, + ACTIONS(2560), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_RPAREN, - [44973] = 4, + anon_sym_COMMA, + [45065] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2562), 1, + sym_keyword_to, + ACTIONS(2564), 1, + sym_keyword_wait, + ACTIONS(2566), 1, + sym_keyword_nowait, STATE(1069), 2, sym_comment, sym_marginalia, - ACTIONS(2574), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [44989] = 6, + [45085] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2173), 1, - sym_keyword_partition, - ACTIONS(2576), 1, - sym_keyword_compute, - STATE(1417), 1, - sym__partition_spec, STATE(1070), 2, sym_comment, sym_marginalia, - [45009] = 6, + ACTIONS(2568), 3, + anon_sym_DQUOTE, + anon_sym_BQUOTE, + sym__identifier, + [45101] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(609), 1, - anon_sym_COMMA, - ACTIONS(2578), 1, - anon_sym_RPAREN, - STATE(1007), 1, - aux_sym_list_repeat1, + ACTIONS(2570), 1, + sym_keyword_schema, + ACTIONS(2572), 2, + sym_keyword_unlogged, + sym_keyword_logged, STATE(1071), 2, sym_comment, sym_marginalia, - [45029] = 5, + [45119] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2582), 1, - sym_keyword_noscan, - ACTIONS(2580), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2574), 1, + anon_sym_RPAREN, + ACTIONS(2576), 1, + anon_sym_COMMA, + STATE(1015), 1, + aux_sym_ordered_columns_repeat1, STATE(1072), 2, sym_comment, sym_marginalia, - [45047] = 6, + [45139] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(2584), 1, - anon_sym_RPAREN, - STATE(1367), 1, - sym_limit, + ACTIONS(2580), 1, + sym_keyword_transaction, + ACTIONS(2578), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1073), 2, sym_comment, sym_marginalia, - [45067] = 4, + [45157] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2084), 1, + sym_keyword_partition, + ACTIONS(2582), 1, + sym_keyword_compute, + STATE(1442), 1, + sym__partition_spec, STATE(1074), 2, sym_comment, sym_marginalia, - ACTIONS(2586), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45083] = 4, + [45177] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48449,25 +48630,24 @@ static const uint16_t ts_small_parse_table[] = { STATE(1075), 2, sym_comment, sym_marginalia, - ACTIONS(1856), 3, + ACTIONS(1852), 3, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_when, - [45099] = 6, + [45193] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2588), 1, - anon_sym_RPAREN, - ACTIONS(2590), 1, - anon_sym_COMMA, - STATE(1029), 1, - aux_sym_column_list_repeat1, + ACTIONS(2586), 1, + anon_sym_LPAREN, + ACTIONS(2584), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1076), 2, sym_comment, sym_marginalia, - [45119] = 4, + [45211] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48475,11 +48655,11 @@ static const uint16_t ts_small_parse_table[] = { STATE(1077), 2, sym_comment, sym_marginalia, - ACTIONS(2592), 3, + ACTIONS(2588), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_when, - [45135] = 4, + anon_sym_COMMA, + [45227] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48487,23 +48667,25 @@ static const uint16_t ts_small_parse_table[] = { STATE(1078), 2, sym_comment, sym_marginalia, - ACTIONS(2594), 3, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - sym__identifier, - [45151] = 4, + ACTIONS(2590), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45243] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(2204), 1, + anon_sym_DASH, + STATE(606), 1, + sym_integer, STATE(1079), 2, sym_comment, sym_marginalia, - ACTIONS(1959), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45167] = 4, + [45263] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48511,11 +48693,11 @@ static const uint16_t ts_small_parse_table[] = { STATE(1080), 2, sym_comment, sym_marginalia, - ACTIONS(2596), 3, + ACTIONS(2592), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [45183] = 4, + [45279] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48523,48 +48705,52 @@ static const uint16_t ts_small_parse_table[] = { STATE(1081), 2, sym_comment, sym_marginalia, - ACTIONS(2598), 3, + ACTIONS(2594), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_RPAREN, - [45199] = 4, + anon_sym_COMMA, + [45295] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2006), 1, + anon_sym_RPAREN, + ACTIONS(2390), 1, + anon_sym_COMMA, + STATE(1000), 1, + aux_sym_alter_index_repeat1, STATE(1082), 2, sym_comment, sym_marginalia, - ACTIONS(2600), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45215] = 5, + [45315] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2602), 1, + ACTIONS(2596), 1, anon_sym_RPAREN, - ACTIONS(2604), 1, + ACTIONS(2598), 1, anon_sym_COMMA, STATE(1083), 3, sym_comment, sym_marginalia, - aux_sym_constraints_repeat1, - [45233] = 4, + aux_sym_enum_repeat1, + [45333] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(2601), 1, + anon_sym_RPAREN, + STATE(1390), 1, + sym_limit, STATE(1084), 2, sym_comment, sym_marginalia, - ACTIONS(639), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45249] = 4, + [45353] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48572,11 +48758,11 @@ static const uint16_t ts_small_parse_table[] = { STATE(1085), 2, sym_comment, sym_marginalia, - ACTIONS(1977), 3, + ACTIONS(2603), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [45265] = 4, + [45369] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48584,75 +48770,77 @@ static const uint16_t ts_small_parse_table[] = { STATE(1086), 2, sym_comment, sym_marginalia, - ACTIONS(2607), 3, + ACTIONS(2605), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [45281] = 4, + anon_sym_RPAREN, + [45385] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1087), 2, + ACTIONS(1781), 1, + anon_sym_RPAREN, + ACTIONS(2607), 1, + anon_sym_COMMA, + STATE(1087), 3, sym_comment, sym_marginalia, - ACTIONS(2609), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45297] = 6, + aux_sym__compute_stats_repeat2, + [45403] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2611), 1, - sym_keyword_set, - ACTIONS(2613), 1, - sym_keyword_drop, - ACTIONS(2615), 1, - sym_keyword_type, + ACTIONS(2610), 1, + anon_sym_RPAREN, + ACTIONS(2612), 1, + anon_sym_COMMA, + STATE(1117), 1, + aux_sym__partition_spec_repeat1, STATE(1088), 2, sym_comment, sym_marginalia, - [45317] = 6, + [45423] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2617), 1, - sym_keyword_not, - ACTIONS(2619), 1, - sym_keyword_default, - ACTIONS(2621), 1, - sym_keyword_data, STATE(1089), 2, sym_comment, sym_marginalia, - [45337] = 4, + ACTIONS(2614), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_compute, + [45439] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2618), 1, + sym_keyword_on, + ACTIONS(2616), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1090), 2, sym_comment, sym_marginalia, - ACTIONS(2623), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45353] = 4, + [45457] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1739), 1, + anon_sym_COMMA, + ACTIONS(2371), 1, + anon_sym_RPAREN, + STATE(1087), 1, + aux_sym__compute_stats_repeat2, STATE(1091), 2, sym_comment, sym_marginalia, - ACTIONS(2625), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45369] = 4, + [45477] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48660,85 +48848,93 @@ static const uint16_t ts_small_parse_table[] = { STATE(1092), 2, sym_comment, sym_marginalia, - ACTIONS(2627), 3, + ACTIONS(2620), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [45385] = 4, + sym_keyword_when, + [45493] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1093), 2, + ACTIONS(2622), 1, + anon_sym_RPAREN, + ACTIONS(2624), 1, + anon_sym_COMMA, + STATE(1093), 3, sym_comment, sym_marginalia, - ACTIONS(2629), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - [45401] = 6, + aux_sym__vacuum_table_repeat1, + [45511] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2467), 1, + ACTIONS(2457), 1, anon_sym_COMMA, - ACTIONS(2631), 1, + ACTIONS(2627), 1, anon_sym_RPAREN, - STATE(999), 1, - aux_sym_ordered_columns_repeat1, + STATE(1093), 1, + aux_sym__vacuum_table_repeat1, STATE(1094), 2, sym_comment, sym_marginalia, - [45421] = 4, + [45531] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2629), 1, + sym_keyword_value, + ACTIONS(2631), 1, + sym_keyword_to, + ACTIONS(2633), 1, + sym_keyword_attribute, STATE(1095), 2, sym_comment, sym_marginalia, - ACTIONS(2042), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45437] = 4, + [45551] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(1737), 1, + anon_sym_RPAREN, + ACTIONS(1739), 1, + anon_sym_COMMA, + STATE(1087), 1, + aux_sym__compute_stats_repeat2, STATE(1096), 2, sym_comment, sym_marginalia, - ACTIONS(2633), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45453] = 4, + [45571] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2635), 1, + anon_sym_RPAREN, + ACTIONS(2637), 1, + anon_sym_COMMA, + STATE(1083), 1, + aux_sym_enum_repeat1, STATE(1097), 2, sym_comment, sym_marginalia, - ACTIONS(2635), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_RPAREN, - [45469] = 4, + [45591] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1098), 2, + ACTIONS(2639), 1, + anon_sym_RPAREN, + ACTIONS(2641), 1, + anon_sym_COMMA, + STATE(1098), 3, sym_comment, sym_marginalia, - ACTIONS(2263), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45485] = 4, + aux_sym_list_repeat1, + [45609] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48746,23 +48942,25 @@ static const uint16_t ts_small_parse_table[] = { STATE(1099), 2, sym_comment, sym_marginalia, - ACTIONS(2044), 3, + ACTIONS(2644), 3, ts_builtin_sym_end, anon_sym_SEMI, - anon_sym_COMMA, - [45501] = 4, + anon_sym_RPAREN, + [45625] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2576), 1, + anon_sym_COMMA, + ACTIONS(2646), 1, + anon_sym_RPAREN, + STATE(1072), 1, + aux_sym_ordered_columns_repeat1, STATE(1100), 2, sym_comment, sym_marginalia, - ACTIONS(2637), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45517] = 4, + [45645] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48770,75 +48968,77 @@ static const uint16_t ts_small_parse_table[] = { STATE(1101), 2, sym_comment, sym_marginalia, - ACTIONS(2639), 3, + ACTIONS(2648), 3, ts_builtin_sym_end, anon_sym_SEMI, sym_keyword_when, - [45533] = 6, + [45661] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2641), 1, - sym_keyword_value, - ACTIONS(2643), 1, - sym_keyword_to, - ACTIONS(2645), 1, - sym_keyword_attribute, - STATE(1102), 2, + ACTIONS(2650), 1, + anon_sym_RPAREN, + ACTIONS(2652), 1, + anon_sym_COMMA, + STATE(1102), 3, sym_comment, sym_marginalia, - [45553] = 4, + aux_sym_column_list_repeat1, + [45679] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2396), 1, + anon_sym_COMMA, + ACTIONS(2655), 1, + anon_sym_RPAREN, + STATE(1002), 1, + aux_sym_constraints_repeat1, STATE(1103), 2, sym_comment, sym_marginalia, - ACTIONS(2647), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - sym_keyword_when, - [45569] = 4, + [45699] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - STATE(1104), 2, + ACTIONS(2657), 1, + anon_sym_RPAREN, + ACTIONS(2659), 1, + anon_sym_COMMA, + STATE(1104), 3, sym_comment, sym_marginalia, - ACTIONS(2649), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45585] = 4, + aux_sym_column_definitions_repeat1, + [45717] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2662), 1, + sym_keyword_not, + ACTIONS(2664), 1, + sym_keyword_default, + ACTIONS(2666), 1, + sym_keyword_data, STATE(1105), 2, sym_comment, sym_marginalia, - ACTIONS(2340), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45601] = 6, + [45737] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2506), 1, - anon_sym_COMMA, - ACTIONS(2651), 1, - anon_sym_RPAREN, - STATE(1052), 1, - aux_sym_alter_index_repeat1, STATE(1106), 2, sym_comment, sym_marginalia, - [45621] = 4, + ACTIONS(2668), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45753] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48846,91 +49046,87 @@ static const uint16_t ts_small_parse_table[] = { STATE(1107), 2, sym_comment, sym_marginalia, - ACTIONS(2653), 3, + ACTIONS(2670), 3, ts_builtin_sym_end, anon_sym_SEMI, anon_sym_COMMA, - [45637] = 5, + [45769] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2655), 1, - anon_sym_RPAREN, - ACTIONS(2657), 1, - anon_sym_COMMA, - STATE(1108), 3, + STATE(1108), 2, sym_comment, sym_marginalia, - aux_sym_enum_repeat1, - [45655] = 5, + ACTIONS(2672), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45785] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2660), 1, - anon_sym_LPAREN, - STATE(75), 2, - sym_subquery, - sym_list, + ACTIONS(2488), 1, + anon_sym_COMMA, + ACTIONS(2674), 1, + anon_sym_RPAREN, + STATE(1035), 1, + aux_sym_alter_index_repeat2, STATE(1109), 2, sym_comment, sym_marginalia, - [45673] = 6, + [45805] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1808), 1, - sym_keyword_limit, - ACTIONS(2662), 1, - anon_sym_RPAREN, - STATE(1386), 1, - sym_limit, STATE(1110), 2, sym_comment, sym_marginalia, - [45693] = 6, + ACTIONS(2676), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45821] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2361), 1, - anon_sym_LPAREN, - STATE(906), 1, - sym_list, - STATE(1114), 1, - sym_typed_row_value_expr_list, STATE(1111), 2, sym_comment, sym_marginalia, - [45713] = 6, + ACTIONS(2034), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45837] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2664), 1, - sym_keyword_to, - ACTIONS(2666), 1, - sym_keyword_wait, - ACTIONS(2668), 1, - sym_keyword_nowait, STATE(1112), 2, sym_comment, sym_marginalia, - [45733] = 4, + ACTIONS(2678), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45853] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(549), 1, + sym_natural_number, + ACTIONS(2204), 1, + anon_sym_DASH, + STATE(631), 1, + sym_integer, STATE(1113), 2, sym_comment, sym_marginalia, - ACTIONS(2670), 3, - anon_sym_DQUOTE, - anon_sym_BQUOTE, - sym__identifier, - [45749] = 4, + [45873] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -48938,89 +49134,92 @@ static const uint16_t ts_small_parse_table[] = { STATE(1114), 2, sym_comment, sym_marginalia, - ACTIONS(2672), 3, + ACTIONS(2036), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_when, - [45765] = 5, + anon_sym_COMMA, + [45889] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2676), 1, - anon_sym_LPAREN, - ACTIONS(2674), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(1115), 2, sym_comment, sym_marginalia, - [45783] = 4, + ACTIONS(2680), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [45905] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2488), 1, + anon_sym_COMMA, + ACTIONS(2682), 1, + anon_sym_RPAREN, + STATE(1036), 1, + aux_sym_alter_index_repeat2, STATE(1116), 2, sym_comment, sym_marginalia, - ACTIONS(2678), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45799] = 6, + [45925] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2259), 1, + ACTIONS(2612), 1, + anon_sym_COMMA, + ACTIONS(2684), 1, anon_sym_RPAREN, - ACTIONS(2680), 1, - sym_keyword_where, - STATE(1068), 1, - sym_where, + STATE(1011), 1, + aux_sym__partition_spec_repeat1, STATE(1117), 2, sym_comment, sym_marginalia, - [45819] = 4, + [45945] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, + ACTIONS(2686), 1, + anon_sym_LPAREN, + STATE(75), 2, + sym_subquery, + sym_list, STATE(1118), 2, sym_comment, sym_marginalia, - ACTIONS(2682), 3, - ts_builtin_sym_end, - anon_sym_SEMI, - anon_sym_COMMA, - [45835] = 5, + [45963] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2686), 1, - anon_sym_LPAREN, - ACTIONS(2684), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(637), 1, + anon_sym_COMMA, + ACTIONS(2688), 1, + anon_sym_RBRACK, + STATE(999), 1, + aux_sym_array_repeat1, STATE(1119), 2, sym_comment, sym_marginalia, - [45853] = 6, + [45983] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(609), 1, + ACTIONS(2390), 1, anon_sym_COMMA, - ACTIONS(2688), 1, + ACTIONS(2690), 1, anon_sym_RPAREN, - STATE(1007), 1, - aux_sym_list_repeat1, + STATE(1136), 1, + aux_sym_alter_index_repeat1, STATE(1120), 2, sym_comment, sym_marginalia, - [45873] = 4, + [46003] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -49028,2006 +49227,2017 @@ static const uint16_t ts_small_parse_table[] = { STATE(1121), 2, sym_comment, sym_marginalia, - ACTIONS(2690), 3, + ACTIONS(2692), 3, ts_builtin_sym_end, anon_sym_SEMI, - sym_keyword_on, - [45889] = 6, + anon_sym_COMMA, + [46019] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2590), 1, - anon_sym_COMMA, - ACTIONS(2692), 1, - anon_sym_RPAREN, - STATE(1076), 1, - aux_sym_column_list_repeat1, STATE(1122), 2, sym_comment, sym_marginalia, - [45909] = 6, + ACTIONS(2694), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [46035] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2359), 1, - anon_sym_COMMA, - ACTIONS(2694), 1, - anon_sym_RPAREN, - STATE(1124), 1, - aux_sym_enum_repeat1, + ACTIONS(2698), 1, + sym_keyword_noscan, + ACTIONS(2696), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1123), 2, sym_comment, sym_marginalia, - [45929] = 6, + [46053] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2359), 1, - anon_sym_COMMA, - ACTIONS(2696), 1, - anon_sym_RPAREN, - STATE(1108), 1, - aux_sym_enum_repeat1, + ACTIONS(2702), 1, + sym_keyword_on, + ACTIONS(2700), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1124), 2, sym_comment, sym_marginalia, - [45949] = 6, + [46071] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2528), 1, + ACTIONS(2488), 1, anon_sym_COMMA, - ACTIONS(2698), 1, + ACTIONS(2704), 1, anon_sym_RPAREN, - STATE(1066), 1, + STATE(1116), 1, aux_sym_alter_index_repeat2, STATE(1125), 2, sym_comment, sym_marginalia, - [45969] = 5, + [46091] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2700), 1, - anon_sym_LPAREN, - STATE(191), 2, - sym_subquery, - sym_list, + ACTIONS(2637), 1, + anon_sym_COMMA, + ACTIONS(2706), 1, + anon_sym_RPAREN, + STATE(1097), 1, + aux_sym_enum_repeat1, STATE(1126), 2, sym_comment, sym_marginalia, - [45987] = 5, + [46111] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(658), 1, - anon_sym_RBRACK, - ACTIONS(2702), 1, - anon_sym_COMMA, - STATE(1127), 3, + ACTIONS(2365), 1, + anon_sym_RPAREN, + ACTIONS(2708), 1, + sym_keyword_where, + STATE(1027), 1, + sym_where, + STATE(1127), 2, sym_comment, sym_marginalia, - aux_sym_array_repeat1, - [46005] = 6, + [46131] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(609), 1, - anon_sym_COMMA, - ACTIONS(2705), 1, - anon_sym_RPAREN, - STATE(1007), 1, - aux_sym_list_repeat1, STATE(1128), 2, sym_comment, sym_marginalia, - [46025] = 6, + ACTIONS(2710), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [46147] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2506), 1, + ACTIONS(609), 1, anon_sym_COMMA, - ACTIONS(2651), 1, + ACTIONS(2712), 1, anon_sym_RPAREN, - STATE(1055), 1, - aux_sym_alter_index_repeat1, + STATE(1098), 1, + aux_sym_list_repeat1, STATE(1129), 2, sym_comment, sym_marginalia, - [46045] = 6, + [46167] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2528), 1, - anon_sym_COMMA, - ACTIONS(2707), 1, + ACTIONS(1840), 1, + sym_keyword_limit, + ACTIONS(2714), 1, anon_sym_RPAREN, - STATE(1067), 1, - aux_sym_alter_index_repeat2, + STATE(1451), 1, + sym_limit, STATE(1130), 2, sym_comment, sym_marginalia, - [46065] = 6, + [46187] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2231), 1, + ACTIONS(2637), 1, + anon_sym_COMMA, + ACTIONS(2716), 1, anon_sym_RPAREN, - ACTIONS(2680), 1, - sym_keyword_where, - STATE(1081), 1, - sym_where, + STATE(1132), 1, + aux_sym_enum_repeat1, STATE(1131), 2, sym_comment, sym_marginalia, - [46085] = 5, + [46207] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2709), 1, - sym_keyword_schema, - ACTIONS(2711), 2, - sym_keyword_unlogged, - sym_keyword_logged, + ACTIONS(2637), 1, + anon_sym_COMMA, + ACTIONS(2718), 1, + anon_sym_RPAREN, + STATE(1083), 1, + aux_sym_enum_repeat1, STATE(1132), 2, sym_comment, sym_marginalia, - [46103] = 6, + [46227] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2359), 1, + ACTIONS(2480), 1, anon_sym_COMMA, - ACTIONS(2713), 1, + ACTIONS(2720), 1, anon_sym_RPAREN, - STATE(989), 1, - aux_sym_enum_repeat1, + STATE(1032), 1, + aux_sym_column_list_repeat1, STATE(1133), 2, sym_comment, sym_marginalia, - [46123] = 5, + [46247] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2717), 1, - sym_keyword_noscan, - ACTIONS(2715), 2, - ts_builtin_sym_end, - anon_sym_SEMI, STATE(1134), 2, sym_comment, sym_marginalia, - [46141] = 5, + ACTIONS(1968), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + anon_sym_COMMA, + [46263] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2318), 1, - sym_keyword_noscan, - ACTIONS(2314), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2722), 1, + anon_sym_LPAREN, + STATE(197), 2, + sym_subquery, + sym_list, STATE(1135), 2, sym_comment, sym_marginalia, - [46159] = 5, + [46281] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2719), 1, - anon_sym_LPAREN, - STATE(1142), 1, - sym_column_definitions, - STATE(1136), 2, + ACTIONS(2724), 1, + anon_sym_RPAREN, + ACTIONS(2726), 1, + anon_sym_COMMA, + STATE(1136), 3, sym_comment, sym_marginalia, - [46176] = 5, + aux_sym_alter_index_repeat1, + [46299] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2721), 1, - sym_keyword_tablespace, - ACTIONS(2723), 1, - anon_sym_LPAREN, + ACTIONS(609), 1, + anon_sym_COMMA, + ACTIONS(2729), 1, + anon_sym_RPAREN, + STATE(1098), 1, + aux_sym_list_repeat1, STATE(1137), 2, sym_comment, sym_marginalia, - [46193] = 5, + [46319] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2719), 1, - anon_sym_LPAREN, - STATE(1204), 1, - sym_column_definitions, + ACTIONS(2251), 1, + sym_keyword_force, + ACTIONS(2249), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1138), 2, sym_comment, sym_marginalia, - [46210] = 5, + [46337] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2516), 1, - anon_sym_RPAREN, - ACTIONS(2518), 1, - anon_sym_DOT, STATE(1139), 2, sym_comment, sym_marginalia, - [46227] = 5, + ACTIONS(2731), 3, + ts_builtin_sym_end, + anon_sym_SEMI, + sym_keyword_when, + [46353] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(240), 1, - ts_builtin_sym_end, - ACTIONS(2725), 1, - anon_sym_SEMI, + ACTIONS(2304), 1, + anon_sym_RPAREN, + ACTIONS(2708), 1, + sym_keyword_where, + STATE(1086), 1, + sym_where, STATE(1140), 2, sym_comment, sym_marginalia, - [46244] = 4, + [46373] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1693), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2733), 1, + sym_keyword_to, + ACTIONS(2735), 1, + sym_keyword_wait, + ACTIONS(2737), 1, + sym_keyword_nowait, STATE(1141), 2, sym_comment, sym_marginalia, - [46259] = 4, + [46393] = 6, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2727), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2495), 1, + anon_sym_LPAREN, + STATE(824), 1, + sym_list, + STATE(1033), 1, + sym_typed_row_value_expr_list, STATE(1142), 2, sym_comment, sym_marginalia, - [46274] = 4, + [46413] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2729), 2, + ACTIONS(2741), 1, + sym_keyword_transaction, + ACTIONS(2739), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1143), 2, sym_comment, sym_marginalia, - [46289] = 4, + [46431] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2731), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2743), 2, + sym_keyword_first, + sym_keyword_last, STATE(1144), 2, sym_comment, sym_marginalia, - [46304] = 4, + [46446] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2733), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2745), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1145), 2, sym_comment, sym_marginalia, - [46319] = 5, + [46461] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2680), 1, - sym_keyword_where, - STATE(1579), 1, - sym_where, + ACTIONS(2747), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1146), 2, sym_comment, sym_marginalia, - [46336] = 4, + [46476] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2715), 2, + ACTIONS(2749), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1147), 2, sym_comment, sym_marginalia, - [46351] = 5, + [46491] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2719), 1, - anon_sym_LPAREN, - STATE(1217), 1, - sym_column_definitions, + ACTIONS(2751), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1148), 2, sym_comment, sym_marginalia, - [46368] = 4, + [46506] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2735), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2753), 1, + sym_keyword_tablespace, + ACTIONS(2755), 1, + anon_sym_LPAREN, STATE(1149), 2, sym_comment, sym_marginalia, - [46383] = 4, + [46523] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2737), 2, + ACTIONS(1916), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1150), 2, sym_comment, sym_marginalia, - [46398] = 4, + [46538] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2739), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2757), 1, + sym_keyword_column, + ACTIONS(2759), 1, + sym_natural_number, STATE(1151), 2, sym_comment, sym_marginalia, - [46413] = 4, + [46555] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2741), 2, + ACTIONS(2761), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1152), 2, sym_comment, sym_marginalia, - [46428] = 4, + [46570] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2743), 2, + ACTIONS(2763), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1153), 2, sym_comment, sym_marginalia, - [46443] = 5, + [46585] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(931), 1, - sym__single_quote_string, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(860), 1, + sym_ordered_columns, STATE(1154), 2, sym_comment, sym_marginalia, - [46460] = 4, + [46602] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2745), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2765), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1155), 2, sym_comment, sym_marginalia, - [46475] = 5, + [46617] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2747), 1, - sym_keyword_column, - ACTIONS(2749), 1, - sym_natural_number, + ACTIONS(2767), 1, + sym_keyword_stats, + ACTIONS(2769), 1, + sym_keyword_incremental, STATE(1156), 2, sym_comment, sym_marginalia, - [46492] = 4, + [46634] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2751), 2, + ACTIONS(2771), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1157), 2, sym_comment, sym_marginalia, - [46507] = 4, + [46649] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2753), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2773), 1, + sym_keyword_from, + ACTIONS(2775), 1, + sym_keyword_to, STATE(1158), 2, sym_comment, sym_marginalia, - [46522] = 4, + [46666] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2126), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2777), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1159), 2, sym_comment, sym_marginalia, - [46537] = 5, + [46681] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2508), 1, - sym_keyword_not, - ACTIONS(2755), 1, - sym_keyword_default, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1388), 1, + sym__single_quote_string, STATE(1160), 2, sym_comment, sym_marginalia, - [46554] = 4, + [46698] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2757), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2779), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1161), 2, sym_comment, sym_marginalia, - [46569] = 4, + [46713] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2759), 2, + ACTIONS(2781), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1162), 2, sym_comment, sym_marginalia, - [46584] = 5, + [46728] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2761), 1, - sym_keyword_tablespace, - ACTIONS(2763), 1, - anon_sym_LPAREN, + ACTIONS(2783), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1163), 2, sym_comment, sym_marginalia, - [46601] = 5, + [46743] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2765), 1, - sym_keyword_column, - ACTIONS(2767), 1, - sym_natural_number, + ACTIONS(2785), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1164), 2, sym_comment, sym_marginalia, - [46618] = 4, + [46758] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2769), 2, + ACTIONS(1918), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1165), 2, sym_comment, sym_marginalia, - [46633] = 4, + [46773] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1568), 2, + ACTIONS(2787), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1166), 2, sym_comment, sym_marginalia, - [46648] = 4, + [46788] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2380), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2789), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1167), 2, sym_comment, sym_marginalia, - [46663] = 4, + [46803] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2771), 2, + ACTIONS(2791), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1168), 2, sym_comment, sym_marginalia, - [46678] = 4, + [46818] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2773), 2, + ACTIONS(2793), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1169), 2, sym_comment, sym_marginalia, - [46693] = 4, + [46833] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2775), 2, + ACTIONS(2795), 2, anon_sym_RPAREN, anon_sym_COMMA, STATE(1170), 2, sym_comment, sym_marginalia, - [46708] = 4, + [46848] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2777), 2, + ACTIONS(2797), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1171), 2, sym_comment, sym_marginalia, - [46723] = 4, + [46863] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2015), 2, + ACTIONS(2799), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1172), 2, sym_comment, sym_marginalia, - [46738] = 4, + [46878] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2535), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2801), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1173), 2, sym_comment, sym_marginalia, - [46753] = 5, + [46893] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1429), 1, - sym__single_quote_string, + ACTIONS(2803), 1, + anon_sym_LPAREN, + STATE(1213), 1, + sym_column_definitions, STATE(1174), 2, sym_comment, sym_marginalia, - [46770] = 4, + [46910] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2779), 2, + ACTIONS(2805), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1175), 2, sym_comment, sym_marginalia, - [46785] = 4, + [46925] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2781), 2, + ACTIONS(2807), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1176), 2, sym_comment, sym_marginalia, - [46800] = 4, + [46940] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2783), 2, + ACTIONS(2809), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1177), 2, sym_comment, sym_marginalia, - [46815] = 4, + [46955] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2785), 2, + ACTIONS(2811), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1178), 2, sym_comment, sym_marginalia, - [46830] = 4, + [46970] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2128), 2, + ACTIONS(2417), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1179), 2, sym_comment, sym_marginalia, - [46845] = 4, + [46985] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1921), 2, + ACTIONS(2813), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1180), 2, sym_comment, sym_marginalia, - [46860] = 4, + [47000] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2787), 2, + ACTIONS(2815), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1181), 2, sym_comment, sym_marginalia, - [46875] = 5, + [47015] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1317), 1, - sym__single_quote_string, + ACTIONS(2817), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1182), 2, sym_comment, sym_marginalia, - [46892] = 4, + [47030] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2789), 2, + ACTIONS(2819), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1183), 2, sym_comment, sym_marginalia, - [46907] = 4, + [47045] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2791), 2, + ACTIONS(2821), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1184), 2, sym_comment, sym_marginalia, - [46922] = 4, + [47060] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2793), 2, + ACTIONS(2823), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1185), 2, sym_comment, sym_marginalia, - [46937] = 4, + [47075] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2795), 2, + ACTIONS(2825), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1186), 2, sym_comment, sym_marginalia, - [46952] = 4, + [47090] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2797), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2827), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1187), 2, sym_comment, sym_marginalia, - [46967] = 4, + [47105] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1904), 2, + ACTIONS(2829), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1188), 2, sym_comment, sym_marginalia, - [46982] = 5, + [47120] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(555), 1, - anon_sym_SQUOTE, - STATE(1183), 1, - sym__single_quote_string, + ACTIONS(2831), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1189), 2, sym_comment, sym_marginalia, - [46999] = 4, + [47135] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2799), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2833), 2, + sym_keyword_first, + sym_keyword_last, STATE(1190), 2, sym_comment, sym_marginalia, - [47014] = 4, + [47150] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2558), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2135), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1191), 2, sym_comment, sym_marginalia, - [47029] = 4, + [47165] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2801), 2, + ACTIONS(2367), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1192), 2, sym_comment, sym_marginalia, - [47044] = 4, + [47180] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2550), 2, + ACTIONS(2835), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1193), 2, sym_comment, sym_marginalia, - [47059] = 4, + [47195] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2385), 2, + ACTIONS(2837), 2, anon_sym_RPAREN, anon_sym_COMMA, STATE(1194), 2, sym_comment, sym_marginalia, - [47074] = 4, + [47210] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2803), 2, + ACTIONS(2173), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1195), 2, sym_comment, sym_marginalia, - [47089] = 4, + [47225] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2805), 2, + ACTIONS(2696), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1196), 2, sym_comment, sym_marginalia, - [47104] = 4, + [47240] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2807), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2803), 1, + anon_sym_LPAREN, + STATE(1167), 1, + sym_column_definitions, STATE(1197), 2, sym_comment, sym_marginalia, - [47119] = 4, + [47257] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2809), 2, + ACTIONS(2839), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1198), 2, sym_comment, sym_marginalia, - [47134] = 4, + [47272] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2811), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2841), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1199), 2, sym_comment, sym_marginalia, - [47149] = 4, + [47287] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2813), 2, + ACTIONS(2843), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1200), 2, sym_comment, sym_marginalia, - [47164] = 4, + [47302] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2815), 2, + ACTIONS(2845), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1201), 2, sym_comment, sym_marginalia, - [47179] = 4, + [47317] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2118), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2803), 1, + anon_sym_LPAREN, + STATE(1175), 1, + sym_column_definitions, STATE(1202), 2, sym_comment, sym_marginalia, - [47194] = 4, + [47334] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2314), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1240), 1, + sym__single_quote_string, STATE(1203), 2, sym_comment, sym_marginalia, - [47209] = 4, + [47351] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2817), 2, + ACTIONS(1685), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1204), 2, sym_comment, sym_marginalia, - [47224] = 4, + [47366] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2819), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2495), 1, + anon_sym_LPAREN, + STATE(988), 1, + sym_list, STATE(1205), 2, sym_comment, sym_marginalia, - [47239] = 4, + [47383] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2821), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2847), 1, + sym_keyword_varying, + ACTIONS(2849), 1, + anon_sym_LPAREN, STATE(1206), 2, sym_comment, sym_marginalia, - [47254] = 4, + [47400] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2823), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2851), 1, + sym_keyword_then, + ACTIONS(2853), 1, + sym_keyword_and, STATE(1207), 2, sym_comment, sym_marginalia, - [47269] = 5, + [47417] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2825), 1, - sym_keyword_matched, - ACTIONS(2827), 1, - sym_keyword_not, + ACTIONS(2855), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1208), 2, sym_comment, sym_marginalia, - [47286] = 4, + [47432] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2829), 2, - sym_keyword_rename, - sym_keyword_owner, + ACTIONS(2857), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1209), 2, sym_comment, sym_marginalia, - [47301] = 4, + [47447] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2831), 2, - sym_keyword_first, - sym_keyword_last, + ACTIONS(2859), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1210), 2, sym_comment, sym_marginalia, - [47316] = 4, + [47462] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2833), 2, + ACTIONS(2861), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1211), 2, sym_comment, sym_marginalia, - [47331] = 4, + [47477] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2835), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2438), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1212), 2, sym_comment, sym_marginalia, - [47346] = 4, + [47492] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2837), 2, + ACTIONS(2863), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1213), 2, sym_comment, sym_marginalia, - [47361] = 5, + [47507] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2719), 1, - anon_sym_LPAREN, - STATE(1231), 1, - sym_column_definitions, + ACTIONS(2865), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1214), 2, sym_comment, sym_marginalia, - [47378] = 4, + [47522] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2839), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2867), 1, + sym_keyword_set, + ACTIONS(2869), 1, + sym_keyword_reset, STATE(1215), 2, sym_comment, sym_marginalia, - [47393] = 5, + [47539] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2361), 1, - anon_sym_LPAREN, - STATE(960), 1, - sym_list, + ACTIONS(2871), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1216), 2, sym_comment, sym_marginalia, - [47410] = 4, + [47554] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2841), 2, + ACTIONS(1598), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1217), 2, sym_comment, sym_marginalia, - [47425] = 4, + [47569] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2843), 2, + ACTIONS(2873), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1218), 2, sym_comment, sym_marginalia, - [47440] = 4, + [47584] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2845), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(1832), 1, + sym_keyword_where, + STATE(1309), 1, + sym_where, STATE(1219), 2, sym_comment, sym_marginalia, - [47455] = 4, + [47601] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2847), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(865), 1, + sym_ordered_columns, STATE(1220), 2, sym_comment, sym_marginalia, - [47470] = 4, + [47618] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2849), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(866), 1, + sym_ordered_columns, STATE(1221), 2, sym_comment, sym_marginalia, - [47485] = 4, + [47635] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2851), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2509), 1, + sym_keyword_not, + ACTIONS(2875), 1, + sym_keyword_default, STATE(1222), 2, sym_comment, sym_marginalia, - [47500] = 5, + [47652] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2853), 1, - sym_keyword_then, - ACTIONS(2855), 1, - sym_keyword_and, + ACTIONS(2724), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1223), 2, sym_comment, sym_marginalia, - [47517] = 4, + [47667] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2857), 2, + ACTIONS(181), 1, ts_builtin_sym_end, + ACTIONS(2877), 1, anon_sym_SEMI, STATE(1224), 2, sym_comment, sym_marginalia, - [47532] = 4, + [47684] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2859), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2879), 1, + sym_keyword_table, + ACTIONS(2881), 1, + sym_keyword_tables, STATE(1225), 2, sym_comment, sym_marginalia, - [47547] = 4, + [47701] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2147), 2, + ACTIONS(1717), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1226), 2, sym_comment, sym_marginalia, - [47562] = 4, + [47716] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2861), 2, + ACTIONS(2883), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1227), 2, sym_comment, sym_marginalia, - [47577] = 4, + [47731] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2863), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2885), 2, + sym_keyword_key, + sym_keyword_index, STATE(1228), 2, sym_comment, sym_marginalia, - [47592] = 4, + [47746] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2865), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(992), 1, + sym_column_list, STATE(1229), 2, sym_comment, sym_marginalia, - [47607] = 4, + [47763] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2867), 2, - sym_keyword_first, - sym_keyword_last, + ACTIONS(2400), 2, + sym_keyword_from, + anon_sym_COMMA, STATE(1230), 2, sym_comment, sym_marginalia, - [47622] = 4, + [47778] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2869), 2, + ACTIONS(2887), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1231), 2, sym_comment, sym_marginalia, - [47637] = 4, + [47793] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2871), 2, + ACTIONS(2550), 1, anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2552), 1, + anon_sym_DOT, STATE(1232), 2, sym_comment, sym_marginalia, - [47652] = 5, + [47810] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2873), 1, - sym_keyword_set, - ACTIONS(2875), 1, - sym_keyword_reset, + ACTIONS(2012), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1233), 2, sym_comment, sym_marginalia, - [47669] = 4, + [47825] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1955), 2, + ACTIONS(2889), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1234), 2, sym_comment, sym_marginalia, - [47684] = 4, + [47840] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2151), 2, + ACTIONS(2891), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1235), 2, sym_comment, sym_marginalia, - [47699] = 5, + [47855] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1840), 1, - sym_keyword_where, - STATE(1266), 1, - sym_where, + ACTIONS(2893), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1236), 2, sym_comment, sym_marginalia, - [47716] = 5, + [47870] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2514), 1, + ACTIONS(2803), 1, anon_sym_LPAREN, - ACTIONS(2518), 1, - anon_sym_DOT, + STATE(1200), 1, + sym_column_definitions, STATE(1237), 2, sym_comment, sym_marginalia, - [47733] = 4, + [47887] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2877), 2, + ACTIONS(2895), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1238), 2, sym_comment, sym_marginalia, - [47748] = 4, + [47902] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2879), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(1193), 1, + sym__single_quote_string, STATE(1239), 2, sym_comment, sym_marginalia, - [47763] = 5, + [47919] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1890), 1, - anon_sym_LPAREN, - STATE(851), 1, - sym_ordered_columns, + ACTIONS(2897), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1240), 2, sym_comment, sym_marginalia, - [47780] = 4, + [47934] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2245), 2, + ACTIONS(2058), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1241), 2, sym_comment, sym_marginalia, - [47795] = 4, + [47949] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2163), 2, + ACTIONS(2517), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1242), 2, sym_comment, sym_marginalia, - [47810] = 5, + [47964] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2617), 1, - sym_keyword_not, - ACTIONS(2881), 1, - sym_keyword_default, + ACTIONS(2899), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1243), 2, sym_comment, sym_marginalia, - [47827] = 5, + [47979] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1890), 1, - anon_sym_LPAREN, - STATE(853), 1, - sym_ordered_columns, + ACTIONS(2070), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1244), 2, sym_comment, sym_marginalia, - [47844] = 4, + [47994] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2883), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2427), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1245), 2, sym_comment, sym_marginalia, - [47859] = 4, + [48009] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2885), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2901), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1246), 2, sym_comment, sym_marginalia, - [47874] = 5, + [48024] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2887), 1, - anon_sym_DOT, - ACTIONS(2889), 1, - sym_natural_number, + ACTIONS(2903), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1247), 2, sym_comment, sym_marginalia, - [47891] = 4, + [48039] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2891), 2, + ACTIONS(2905), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1248), 2, sym_comment, sym_marginalia, - [47906] = 5, + [48054] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2893), 1, - sym_keyword_from, - STATE(1093), 1, - sym_from, + ACTIONS(2907), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1249), 2, sym_comment, sym_marginalia, - [47923] = 4, + [48069] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2895), 2, + ACTIONS(2909), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1250), 2, sym_comment, sym_marginalia, - [47938] = 5, + [48084] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1890), 1, - anon_sym_LPAREN, - STATE(838), 1, - sym_ordered_columns, + ACTIONS(2911), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1251), 2, sym_comment, sym_marginalia, - [47955] = 4, + [48099] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2897), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2913), 1, + sym_keyword_set, + ACTIONS(2915), 1, + sym_keyword_type, STATE(1252), 2, sym_comment, sym_marginalia, - [47970] = 4, + [48116] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2899), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2917), 1, + sym_keyword_tablespace, + ACTIONS(2919), 1, + anon_sym_LPAREN, STATE(1253), 2, sym_comment, sym_marginalia, - [47985] = 5, + [48133] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2901), 1, - sym_keyword_value, - ACTIONS(2903), 1, - sym_keyword_attribute, + ACTIONS(547), 1, + anon_sym_SQUOTE, + STATE(974), 1, + sym__single_quote_string, STATE(1254), 2, sym_comment, sym_marginalia, - [48002] = 5, + [48150] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1890), 1, - anon_sym_LPAREN, - STATE(925), 1, - sym_ordered_columns, + ACTIONS(2921), 1, + sym_keyword_column, + ACTIONS(2923), 1, + sym_natural_number, STATE(1255), 2, sym_comment, sym_marginalia, - [48019] = 4, + [48167] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2905), 2, + ACTIONS(2925), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1256), 2, sym_comment, sym_marginalia, - [48034] = 5, + [48182] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(872), 1, - sym_keyword_primary, - STATE(1289), 1, - sym__primary_key, + ACTIONS(2927), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1257), 2, sym_comment, sym_marginalia, - [48051] = 4, + [48197] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2907), 2, + ACTIONS(2929), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1258), 2, sym_comment, sym_marginalia, - [48066] = 4, + [48212] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2909), 2, - sym_keyword_key, - sym_keyword_index, + ACTIONS(2263), 1, + anon_sym_LPAREN, + STATE(980), 1, + sym_column_list, STATE(1259), 2, sym_comment, sym_marginalia, - [48081] = 5, + [48229] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(982), 1, - sym_column_list, + ACTIONS(2212), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1260), 2, sym_comment, sym_marginalia, - [48098] = 4, + [48244] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2911), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(873), 1, + sym_ordered_columns, STATE(1261), 2, sym_comment, sym_marginalia, - [48113] = 4, + [48261] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2913), 2, + ACTIONS(2931), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1262), 2, sym_comment, sym_marginalia, - [48128] = 4, + [48276] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2915), 2, + ACTIONS(2933), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1263), 2, sym_comment, sym_marginalia, - [48143] = 4, + [48291] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2917), 2, + ACTIONS(2935), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1264), 2, sym_comment, sym_marginalia, - [48158] = 4, + [48306] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2919), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2937), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1265), 2, sym_comment, sym_marginalia, - [48173] = 4, + [48321] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2921), 2, + ACTIONS(2939), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1266), 2, sym_comment, sym_marginalia, - [48188] = 4, + [48336] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2171), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2941), 1, + sym_keyword_value, + ACTIONS(2943), 1, + sym_keyword_attribute, STATE(1267), 2, sym_comment, sym_marginalia, - [48203] = 4, + [48353] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2923), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2622), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1268), 2, sym_comment, sym_marginalia, - [48218] = 4, + [48368] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1892), 2, + ACTIONS(2945), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1269), 2, sym_comment, sym_marginalia, - [48233] = 4, + [48383] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2925), 2, + ACTIONS(2947), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1270), 2, sym_comment, sym_marginalia, - [48248] = 5, + [48398] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2927), 1, - anon_sym_DOT, - ACTIONS(2929), 1, - sym_natural_number, + ACTIONS(2949), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1271), 2, sym_comment, sym_marginalia, - [48265] = 4, + [48413] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2931), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2951), 1, + anon_sym_DOT, + ACTIONS(2953), 1, + sym_natural_number, STATE(1272), 2, sym_comment, sym_marginalia, - [48280] = 4, + [48430] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2933), 2, + ACTIONS(2955), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1273), 2, sym_comment, sym_marginalia, - [48295] = 4, + [48445] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2935), 2, + ACTIONS(2308), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1274), 2, sym_comment, sym_marginalia, - [48310] = 4, + [48460] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2937), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2957), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1275), 2, sym_comment, sym_marginalia, - [48325] = 4, + [48475] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2939), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(814), 1, + sym_ordered_columns, STATE(1276), 2, sym_comment, sym_marginalia, - [48340] = 5, + [48492] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1890), 1, - anon_sym_LPAREN, - STATE(887), 1, - sym_ordered_columns, + ACTIONS(2657), 2, + anon_sym_RPAREN, + anon_sym_COMMA, STATE(1277), 2, sym_comment, sym_marginalia, - [48357] = 4, + [48507] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2941), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2959), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1278), 2, sym_comment, sym_marginalia, - [48372] = 5, + [48522] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2943), 1, - sym_keyword_then, - ACTIONS(2945), 1, - sym_keyword_and, + ACTIONS(2961), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1279), 2, sym_comment, sym_marginalia, - [48389] = 4, + [48537] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2947), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2963), 1, + sym_keyword_from, + STATE(1099), 1, + sym_from, STATE(1280), 2, sym_comment, sym_marginalia, - [48404] = 5, + [48554] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2949), 1, - anon_sym_LBRACK, - ACTIONS(2951), 1, - anon_sym_LPAREN, + ACTIONS(2965), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1281), 2, sym_comment, sym_marginalia, - [48421] = 4, + [48569] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2953), 2, + ACTIONS(2967), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1282), 2, sym_comment, sym_marginalia, - [48436] = 4, + [48584] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1665), 2, + ACTIONS(2969), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1283), 2, sym_comment, sym_marginalia, - [48451] = 4, + [48599] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2955), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2662), 1, + sym_keyword_not, + ACTIONS(2971), 1, + sym_keyword_default, STATE(1284), 2, sym_comment, sym_marginalia, - [48466] = 5, + [48616] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2957), 1, - anon_sym_RPAREN, - ACTIONS(2959), 1, - anon_sym_COMMA, + ACTIONS(2973), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1285), 2, sym_comment, sym_marginalia, - [48483] = 5, + [48631] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2961), 1, - sym_keyword_varying, - ACTIONS(2963), 1, - anon_sym_LPAREN, + ACTIONS(2708), 1, + sym_keyword_where, + STATE(1356), 1, + sym_where, STATE(1286), 2, sym_comment, sym_marginalia, - [48500] = 4, + [48648] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2965), 2, + ACTIONS(2975), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1287), 2, sym_comment, sym_marginalia, - [48515] = 4, + [48663] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2967), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(2227), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1288), 2, sym_comment, sym_marginalia, - [48530] = 5, + [48678] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2235), 1, - anon_sym_LPAREN, - STATE(977), 1, - sym_column_list, + ACTIONS(2977), 1, + sym_keyword_then, + ACTIONS(2979), 1, + sym_keyword_and, STATE(1289), 2, sym_comment, sym_marginalia, - [48547] = 5, + [48695] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2969), 1, - anon_sym_RPAREN, - ACTIONS(2971), 1, - anon_sym_COMMA, + ACTIONS(2981), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1290), 2, sym_comment, sym_marginalia, - [48564] = 5, + [48710] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2973), 1, - anon_sym_RPAREN, - ACTIONS(2975), 1, - anon_sym_COMMA, + ACTIONS(2229), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1291), 2, sym_comment, sym_marginalia, - [48581] = 5, + [48725] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2977), 1, - anon_sym_RPAREN, - ACTIONS(2979), 1, - anon_sym_COMMA, + ACTIONS(2983), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1292), 2, sym_comment, sym_marginalia, - [48598] = 5, + [48740] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2981), 1, - sym_keyword_table, - ACTIONS(2983), 1, - sym_keyword_tables, + ACTIONS(1928), 1, + anon_sym_LPAREN, + STATE(825), 1, + sym_ordered_columns, STATE(1293), 2, sym_comment, sym_marginalia, - [48615] = 4, + [48757] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2112), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2985), 1, + anon_sym_DOT, + ACTIONS(2987), 1, + sym_natural_number, STATE(1294), 2, sym_comment, sym_marginalia, - [48630] = 5, + [48774] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2985), 1, - anon_sym_RPAREN, - ACTIONS(2987), 1, - anon_sym_COMMA, + ACTIONS(900), 1, + sym_keyword_primary, + STATE(1259), 1, + sym__primary_key, STATE(1295), 2, sym_comment, sym_marginalia, - [48647] = 4, + [48791] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, @@ -51038,3165 +51248,3337 @@ static const uint16_t ts_small_parse_table[] = { STATE(1296), 2, sym_comment, sym_marginalia, - [48662] = 5, + [48806] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2991), 1, - anon_sym_DOT, - ACTIONS(2993), 1, - sym_natural_number, + ACTIONS(2991), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1297), 2, sym_comment, sym_marginalia, - [48679] = 4, + [48821] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2995), 2, + ACTIONS(2993), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1298), 2, sym_comment, sym_marginalia, - [48694] = 5, + [48836] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1890), 1, - anon_sym_LPAREN, - STATE(811), 1, - sym_ordered_columns, + ACTIONS(2995), 1, + sym_keyword_matched, + ACTIONS(2997), 1, + sym_keyword_not, STATE(1299), 2, sym_comment, sym_marginalia, - [48711] = 4, + [48853] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2997), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2999), 1, + anon_sym_RPAREN, + ACTIONS(3001), 1, + anon_sym_COMMA, STATE(1300), 2, sym_comment, sym_marginalia, - [48726] = 4, + [48870] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2999), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(3003), 1, + anon_sym_RPAREN, + ACTIONS(3005), 1, + anon_sym_COMMA, STATE(1301), 2, sym_comment, sym_marginalia, - [48741] = 4, + [48887] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3001), 2, + ACTIONS(3007), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1302), 2, sym_comment, sym_marginalia, - [48756] = 4, + [48902] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3003), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(3009), 1, + anon_sym_RPAREN, + ACTIONS(3011), 1, + anon_sym_COMMA, STATE(1303), 2, sym_comment, sym_marginalia, - [48771] = 4, + [48919] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3005), 2, + ACTIONS(3013), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1304), 2, sym_comment, sym_marginalia, - [48786] = 5, + [48934] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2518), 1, - anon_sym_DOT, - ACTIONS(3007), 1, - anon_sym_RPAREN, + ACTIONS(2241), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1305), 2, sym_comment, sym_marginalia, - [48803] = 5, + [48949] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3009), 1, - anon_sym_RPAREN, - ACTIONS(3011), 1, - anon_sym_COMMA, + ACTIONS(3015), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1306), 2, sym_comment, sym_marginalia, - [48820] = 4, + [48964] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2495), 2, - anon_sym_RPAREN, - anon_sym_COMMA, + ACTIONS(3017), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1307), 2, sym_comment, sym_marginalia, - [48835] = 4, + [48979] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2530), 2, - sym_keyword_from, - anon_sym_COMMA, + ACTIONS(3019), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1308), 2, sym_comment, sym_marginalia, - [48850] = 5, + [48994] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3013), 1, - sym_keyword_stats, - ACTIONS(3015), 1, - sym_keyword_incremental, + ACTIONS(3021), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1309), 2, sym_comment, sym_marginalia, - [48867] = 5, + [49009] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3017), 1, - sym_keyword_set, - ACTIONS(3019), 1, - sym_keyword_type, + ACTIONS(3023), 1, + anon_sym_RPAREN, + ACTIONS(3025), 1, + anon_sym_COMMA, STATE(1310), 2, sym_comment, sym_marginalia, - [48884] = 4, + [49026] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2082), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(3027), 1, + anon_sym_RPAREN, + ACTIONS(3029), 1, + anon_sym_COMMA, STATE(1311), 2, sym_comment, sym_marginalia, - [48899] = 4, + [49043] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3021), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(3031), 1, + anon_sym_RPAREN, + ACTIONS(3033), 1, + anon_sym_COMMA, STATE(1312), 2, sym_comment, sym_marginalia, - [48914] = 5, + [49060] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2518), 1, - anon_sym_DOT, - ACTIONS(3023), 1, + ACTIONS(3035), 2, anon_sym_RPAREN, + anon_sym_COMMA, STATE(1313), 2, sym_comment, sym_marginalia, - [48931] = 5, + [49075] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3025), 1, - sym_keyword_from, - ACTIONS(3027), 1, - sym_keyword_to, + ACTIONS(3037), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1314), 2, sym_comment, sym_marginalia, - [48948] = 4, + [49090] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3029), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(3039), 1, + anon_sym_DOT, + ACTIONS(3041), 1, + sym_natural_number, STATE(1315), 2, sym_comment, sym_marginalia, - [48963] = 4, + [49107] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3031), 2, + ACTIONS(3043), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1316), 2, sym_comment, sym_marginalia, - [48978] = 4, + [49122] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3033), 2, + ACTIONS(2249), 2, ts_builtin_sym_end, anon_sym_SEMI, STATE(1317), 2, sym_comment, sym_marginalia, - [48993] = 4, + [49137] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3035), 2, + ACTIONS(2552), 1, + anon_sym_DOT, + ACTIONS(3045), 1, anon_sym_RPAREN, - anon_sym_COMMA, STATE(1318), 2, sym_comment, sym_marginalia, - [49008] = 4, + [49154] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3037), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(3047), 1, + anon_sym_LBRACK, + ACTIONS(3049), 1, + anon_sym_LPAREN, STATE(1319), 2, sym_comment, sym_marginalia, - [49023] = 5, + [49171] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3039), 1, - sym_keyword_from, - STATE(1093), 1, - sym_from, + ACTIONS(2253), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1320), 2, sym_comment, sym_marginalia, - [49040] = 4, + [49186] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2580), 2, - ts_builtin_sym_end, - anon_sym_SEMI, + ACTIONS(2548), 1, + anon_sym_LPAREN, + ACTIONS(2552), 1, + anon_sym_DOT, STATE(1321), 2, sym_comment, sym_marginalia, - [49055] = 4, - ACTIONS(3041), 1, + [49203] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3045), 1, - aux_sym__single_quote_string_token1, + ACTIONS(3051), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1322), 2, sym_comment, sym_marginalia, - [49069] = 4, + [49218] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3047), 1, - sym_keyword_maxvalue, + ACTIONS(2552), 1, + anon_sym_DOT, + ACTIONS(3053), 1, + anon_sym_RPAREN, STATE(1323), 2, sym_comment, sym_marginalia, - [49083] = 4, + [49235] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3049), 1, - sym_natural_number, + ACTIONS(3055), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1324), 2, sym_comment, sym_marginalia, - [49097] = 4, + [49250] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2889), 1, - sym_natural_number, + ACTIONS(3057), 2, + sym_keyword_rename, + sym_keyword_owner, STATE(1325), 2, sym_comment, sym_marginalia, - [49111] = 4, + [49265] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3051), 1, - anon_sym_EQ, + ACTIONS(3059), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1326), 2, sym_comment, sym_marginalia, - [49125] = 4, + [49280] = 5, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3053), 1, - sym_keyword_using, + ACTIONS(3061), 1, + sym_keyword_from, + STATE(1099), 1, + sym_from, STATE(1327), 2, sym_comment, sym_marginalia, - [49139] = 4, + [49297] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3055), 1, - sym_keyword_null, + ACTIONS(2082), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1328), 2, sym_comment, sym_marginalia, - [49153] = 4, + [49312] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2518), 1, - anon_sym_DOT, + ACTIONS(3063), 2, + ts_builtin_sym_end, + anon_sym_SEMI, STATE(1329), 2, sym_comment, sym_marginalia, - [49167] = 4, + [49327] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3057), 1, - sym_keyword_type, + ACTIONS(3065), 1, + anon_sym_COMMA, STATE(1330), 2, sym_comment, sym_marginalia, - [49181] = 4, + [49341] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3059), 1, - anon_sym_RPAREN, + ACTIONS(3067), 1, + sym_natural_number, STATE(1331), 2, sym_comment, sym_marginalia, - [49195] = 4, + [49355] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3061), 1, + ACTIONS(3069), 1, sym_natural_number, STATE(1332), 2, sym_comment, sym_marginalia, - [49209] = 4, + [49369] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3063), 1, - anon_sym_RPAREN, + ACTIONS(3071), 1, + sym_natural_number, STATE(1333), 2, sym_comment, sym_marginalia, - [49223] = 4, + [49383] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3065), 1, - anon_sym_LPAREN, + ACTIONS(3073), 1, + sym_keyword_to, STATE(1334), 2, sym_comment, sym_marginalia, - [49237] = 4, + [49397] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3067), 1, - anon_sym_RPAREN, + ACTIONS(3075), 1, + anon_sym_DOT, STATE(1335), 2, sym_comment, sym_marginalia, - [49251] = 4, + [49411] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3069), 1, - sym_keyword_data, + ACTIONS(3077), 1, + sym_natural_number, STATE(1336), 2, sym_comment, sym_marginalia, - [49265] = 4, + [49425] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3071), 1, - anon_sym_LPAREN, + ACTIONS(3079), 1, + sym_keyword_not, STATE(1337), 2, sym_comment, sym_marginalia, - [49279] = 4, + [49439] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2767), 1, - sym_natural_number, + ACTIONS(3081), 1, + sym_keyword_set, STATE(1338), 2, sym_comment, sym_marginalia, - [49293] = 4, + [49453] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3073), 1, - sym_keyword_set, + ACTIONS(3083), 1, + anon_sym_COMMA, STATE(1339), 2, sym_comment, sym_marginalia, - [49307] = 4, + [49467] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2725), 1, - anon_sym_SEMI, + ACTIONS(3085), 1, + sym_natural_number, STATE(1340), 2, sym_comment, sym_marginalia, - [49321] = 4, + [49481] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3075), 1, - sym_keyword_table, + ACTIONS(3087), 1, + sym_natural_number, STATE(1341), 2, sym_comment, sym_marginalia, - [49335] = 4, + [49495] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3077), 1, - sym_keyword_from, + ACTIONS(3089), 1, + sym_natural_number, STATE(1342), 2, sym_comment, sym_marginalia, - [49349] = 4, + [49509] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3079), 1, + ACTIONS(3091), 1, sym_keyword_from, STATE(1343), 2, sym_comment, sym_marginalia, - [49363] = 4, + [49523] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3081), 1, - anon_sym_RPAREN, + ACTIONS(3093), 1, + sym_natural_number, STATE(1344), 2, sym_comment, sym_marginalia, - [49377] = 4, + [49537] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3083), 1, - sym_keyword_cascade, + ACTIONS(3095), 1, + aux_sym_keyword_time_token1, STATE(1345), 2, sym_comment, sym_marginalia, - [49391] = 4, + [49551] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3085), 1, - sym_keyword_cascade, + ACTIONS(3097), 1, + aux_sym_keyword_time_token1, STATE(1346), 2, sym_comment, sym_marginalia, - [49405] = 4, + [49565] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3087), 1, - sym_keyword_delete, + ACTIONS(3099), 1, + sym_natural_number, STATE(1347), 2, sym_comment, sym_marginalia, - [49419] = 4, + [49579] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3089), 1, - sym_keyword_from, + ACTIONS(3101), 1, + sym_natural_number, STATE(1348), 2, sym_comment, sym_marginalia, - [49433] = 4, + [49593] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3091), 1, - anon_sym_RPAREN, + ACTIONS(3103), 1, + sym_natural_number, STATE(1349), 2, sym_comment, sym_marginalia, - [49447] = 4, + [49607] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3093), 1, - sym_keyword_cycle, + ACTIONS(3105), 1, + anon_sym_EQ, STATE(1350), 2, sym_comment, sym_marginalia, - [49461] = 4, + [49621] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3095), 1, - sym_keyword_rewrite, + ACTIONS(3107), 1, + sym_natural_number, STATE(1351), 2, sym_comment, sym_marginalia, - [49475] = 4, + [49635] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3097), 1, + ACTIONS(3109), 1, sym_natural_number, STATE(1352), 2, sym_comment, sym_marginalia, - [49489] = 4, + [49649] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3099), 1, - sym_keyword_metadata, + ACTIONS(3111), 1, + sym_keyword_using, STATE(1353), 2, sym_comment, sym_marginalia, - [49503] = 4, + [49663] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3101), 1, - sym_natural_number, + ACTIONS(3113), 1, + sym_keyword_type, STATE(1354), 2, sym_comment, sym_marginalia, - [49517] = 4, + [49677] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3103), 1, - sym_keyword_statistics, + ACTIONS(3115), 1, + sym_keyword_null, STATE(1355), 2, sym_comment, sym_marginalia, - [49531] = 4, + [49691] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3105), 1, - anon_sym_COMMA, + ACTIONS(3117), 1, + anon_sym_RPAREN, STATE(1356), 2, sym_comment, sym_marginalia, - [49545] = 4, - ACTIONS(3041), 1, + [49705] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3107), 1, - aux_sym_comment_token1, + ACTIONS(3119), 1, + sym_keyword_always, STATE(1357), 2, sym_comment, sym_marginalia, - [49559] = 4, + [49719] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3109), 1, - anon_sym_LPAREN, + ACTIONS(3121), 1, + sym_natural_number, STATE(1358), 2, sym_comment, sym_marginalia, - [49573] = 4, + [49733] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3111), 1, - anon_sym_RPAREN, + ACTIONS(2552), 1, + anon_sym_DOT, STATE(1359), 2, sym_comment, sym_marginalia, - [49587] = 4, + [49747] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3113), 1, - sym_keyword_by, + ACTIONS(3123), 1, + sym_keyword_values, STATE(1360), 2, sym_comment, sym_marginalia, - [49601] = 4, + [49761] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3115), 1, - anon_sym_RPAREN, + ACTIONS(3125), 1, + sym_keyword_exists, STATE(1361), 2, sym_comment, sym_marginalia, - [49615] = 4, + [49775] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3117), 1, - anon_sym_RPAREN, + ACTIONS(3127), 1, + sym_keyword_by, STATE(1362), 2, sym_comment, sym_marginalia, - [49629] = 4, + [49789] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3119), 1, - sym_keyword_null, + ACTIONS(3129), 1, + sym_keyword_to, STATE(1363), 2, sym_comment, sym_marginalia, - [49643] = 4, + [49803] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3121), 1, - anon_sym_RPAREN, + ACTIONS(3131), 1, + sym_keyword_metadata, STATE(1364), 2, sym_comment, sym_marginalia, - [49657] = 4, + [49817] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3123), 1, - anon_sym_LPAREN, + ACTIONS(3133), 1, + anon_sym_RPAREN, STATE(1365), 2, sym_comment, sym_marginalia, - [49671] = 4, + [49831] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3125), 1, - aux_sym_keyword_timestamp_token3, + ACTIONS(3135), 1, + sym_keyword_metadata, STATE(1366), 2, sym_comment, sym_marginalia, - [49685] = 4, + [49845] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3127), 1, - anon_sym_RPAREN, + ACTIONS(3137), 1, + sym_keyword_cycle, STATE(1367), 2, sym_comment, sym_marginalia, - [49699] = 4, + [49859] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1951), 1, - anon_sym_RPAREN, + ACTIONS(3139), 1, + sym_keyword_into, STATE(1368), 2, sym_comment, sym_marginalia, - [49713] = 4, + [49873] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3129), 1, + ACTIONS(2759), 1, sym_natural_number, STATE(1369), 2, sym_comment, sym_marginalia, - [49727] = 4, + [49887] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3131), 1, - sym_keyword_to, + ACTIONS(3141), 1, + sym_keyword_exists, STATE(1370), 2, sym_comment, sym_marginalia, - [49741] = 4, + [49901] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3133), 1, - sym_keyword_into, + ACTIONS(2849), 1, + anon_sym_LPAREN, STATE(1371), 2, sym_comment, sym_marginalia, - [49755] = 4, + [49915] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3135), 1, - sym_keyword_to, + ACTIONS(3143), 1, + sym_keyword_set, STATE(1372), 2, sym_comment, sym_marginalia, - [49769] = 4, + [49929] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3137), 1, - aux_sym_keyword_timestamp_token3, + ACTIONS(3145), 1, + anon_sym_RPAREN, STATE(1373), 2, sym_comment, sym_marginalia, - [49783] = 4, + [49943] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3139), 1, - sym_keyword_set, + ACTIONS(3147), 1, + aux_sym_parameter_token1, STATE(1374), 2, sym_comment, sym_marginalia, - [49797] = 4, + [49957] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(3141), 1, - sym_keyword_set, + anon_sym_SLASH_STAR, + ACTIONS(3149), 1, + sym_natural_number, STATE(1375), 2, sym_comment, sym_marginalia, - [49811] = 4, + [49971] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3143), 1, - sym_keyword_matched, + ACTIONS(3151), 1, + sym_keyword_set, STATE(1376), 2, sym_comment, sym_marginalia, - [49825] = 4, + [49985] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3145), 1, - anon_sym_EQ, + ACTIONS(3153), 1, + anon_sym_LPAREN, STATE(1377), 2, sym_comment, sym_marginalia, - [49839] = 4, + [49999] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3147), 1, - anon_sym_RPAREN, + ACTIONS(3155), 1, + sym_keyword_bin_pack, STATE(1378), 2, sym_comment, sym_marginalia, - [49853] = 4, + [50013] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3149), 1, - sym_keyword_values, + ACTIONS(3157), 1, + anon_sym_EQ, STATE(1379), 2, sym_comment, sym_marginalia, - [49867] = 4, + [50027] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3151), 1, - anon_sym_RPAREN, + ACTIONS(3159), 1, + sym_keyword_statistics, STATE(1380), 2, sym_comment, sym_marginalia, - [49881] = 4, + [50041] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3153), 1, - sym_keyword_cascade, + ACTIONS(3161), 1, + anon_sym_EQ, STATE(1381), 2, sym_comment, sym_marginalia, - [49895] = 4, + [50055] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3155), 1, - sym_keyword_bin_pack, + ACTIONS(3163), 1, + sym_keyword_statistics, STATE(1382), 2, sym_comment, sym_marginalia, - [49909] = 4, + [50069] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3157), 1, - sym_keyword_schema, + ACTIONS(3165), 1, + anon_sym_LPAREN, STATE(1383), 2, sym_comment, sym_marginalia, - [49923] = 4, + [50083] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(321), 1, - sym_natural_number, + ACTIONS(3167), 1, + anon_sym_LPAREN, STATE(1384), 2, sym_comment, sym_marginalia, - [49937] = 4, + [50097] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3159), 1, - aux_sym_parameter_token1, + ACTIONS(3169), 1, + sym_keyword_from, STATE(1385), 2, sym_comment, sym_marginalia, - [49951] = 4, + [50111] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3161), 1, - anon_sym_RPAREN, + ACTIONS(3171), 1, + sym_keyword_data, STATE(1386), 2, sym_comment, sym_marginalia, - [49965] = 4, + [50125] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3163), 1, + ACTIONS(3173), 1, anon_sym_RPAREN, STATE(1387), 2, sym_comment, sym_marginalia, - [49979] = 4, + [50139] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3165), 1, - sym_keyword_table, + ACTIONS(2351), 1, + sym_keyword_to, STATE(1388), 2, sym_comment, sym_marginalia, - [49993] = 4, + [50153] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3167), 1, - anon_sym_COMMA, + ACTIONS(2010), 1, + sym_keyword_to, STATE(1389), 2, sym_comment, sym_marginalia, - [50007] = 4, + [50167] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3169), 1, - sym_natural_number, + ACTIONS(3175), 1, + anon_sym_RPAREN, STATE(1390), 2, sym_comment, sym_marginalia, - [50021] = 4, + [50181] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3171), 1, - anon_sym_COMMA, + ACTIONS(3177), 1, + sym_keyword_from, STATE(1391), 2, sym_comment, sym_marginalia, - [50035] = 4, + [50195] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3173), 1, - anon_sym_RPAREN, + ACTIONS(3179), 1, + sym_natural_number, STATE(1392), 2, sym_comment, sym_marginalia, - [50049] = 4, + [50209] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3175), 1, - sym_keyword_attribute, + ACTIONS(3181), 1, + sym_keyword_database, STATE(1393), 2, sym_comment, sym_marginalia, - [50063] = 4, + [50223] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3177), 1, - sym_keyword_attribute, + ACTIONS(3183), 1, + sym_keyword_delete, STATE(1394), 2, sym_comment, sym_marginalia, - [50077] = 4, + [50237] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3179), 1, - sym_keyword_columns, + ACTIONS(3185), 1, + anon_sym_EQ, STATE(1395), 2, sym_comment, sym_marginalia, - [50091] = 4, - ACTIONS(3), 1, + [50251] = 4, + ACTIONS(3187), 1, anon_sym_DASH_DASH, - ACTIONS(5), 1, + ACTIONS(3189), 1, anon_sym_SLASH_STAR, - ACTIONS(3181), 1, - sym_keyword_metadata, + ACTIONS(3191), 1, + aux_sym_marginalia_token1, STATE(1396), 2, sym_comment, sym_marginalia, - [50105] = 4, + [50265] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3183), 1, - sym_keyword_to, + ACTIONS(3193), 1, + sym_keyword_metadata, STATE(1397), 2, sym_comment, sym_marginalia, - [50119] = 4, + [50279] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3185), 1, - sym_keyword_as, + ACTIONS(3195), 1, + sym_keyword_columns, STATE(1398), 2, sym_comment, sym_marginalia, - [50133] = 4, + [50293] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3187), 1, - sym_keyword_delete, + ACTIONS(3197), 1, + sym_keyword_metadata, STATE(1399), 2, sym_comment, sym_marginalia, - [50147] = 4, + [50307] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3189), 1, - sym_natural_number, + ACTIONS(3199), 1, + sym_keyword_set, STATE(1400), 2, sym_comment, sym_marginalia, - [50161] = 4, + [50321] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3191), 1, - sym_keyword_using, + ACTIONS(3201), 1, + anon_sym_EQ, STATE(1401), 2, sym_comment, sym_marginalia, - [50175] = 4, + [50335] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3193), 1, - sym_natural_number, + ACTIONS(3203), 1, + anon_sym_LPAREN, STATE(1402), 2, sym_comment, sym_marginalia, - [50189] = 4, + [50349] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3195), 1, - sym_keyword_on, + ACTIONS(3205), 1, + sym_keyword_stats, STATE(1403), 2, sym_comment, sym_marginalia, - [50203] = 4, + [50363] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3197), 1, - sym_keyword_exists, + ACTIONS(2631), 1, + sym_keyword_to, STATE(1404), 2, sym_comment, sym_marginalia, - [50217] = 4, + [50377] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3199), 1, + ACTIONS(635), 1, anon_sym_RPAREN, STATE(1405), 2, sym_comment, sym_marginalia, - [50231] = 4, + [50391] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3201), 1, - anon_sym_DQUOTE, + ACTIONS(3207), 1, + sym_keyword_statistics, STATE(1406), 2, sym_comment, sym_marginalia, - [50245] = 4, + [50405] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2328), 1, - anon_sym_RPAREN, + ACTIONS(3209), 1, + sym_natural_number, STATE(1407), 2, sym_comment, sym_marginalia, - [50259] = 4, + [50419] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3203), 1, - sym_natural_number, + ACTIONS(3211), 1, + anon_sym_RPAREN, STATE(1408), 2, sym_comment, sym_marginalia, - [50273] = 4, + [50433] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3205), 1, - anon_sym_LPAREN, + ACTIONS(3213), 1, + sym_keyword_to, STATE(1409), 2, sym_comment, sym_marginalia, - [50287] = 4, + [50447] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3207), 1, - sym_keyword_current, + ACTIONS(3215), 1, + sym_keyword_attribute, STATE(1410), 2, sym_comment, sym_marginalia, - [50301] = 4, + [50461] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3209), 1, - anon_sym_COMMA, + ACTIONS(3217), 1, + sym_keyword_attribute, STATE(1411), 2, sym_comment, sym_marginalia, - [50315] = 4, + [50475] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3211), 1, - anon_sym_SQUOTE, + ACTIONS(315), 1, + sym_natural_number, STATE(1412), 2, sym_comment, sym_marginalia, - [50329] = 4, + [50489] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3213), 1, - sym_keyword_to, + ACTIONS(3219), 1, + sym_keyword_data, STATE(1413), 2, sym_comment, sym_marginalia, - [50343] = 4, + [50503] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3215), 1, - anon_sym_LPAREN, + ACTIONS(3221), 1, + sym_keyword_password, STATE(1414), 2, sym_comment, sym_marginalia, - [50357] = 4, + [50517] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3217), 1, - sym_keyword_statistics, + ACTIONS(3223), 1, + anon_sym_LPAREN, STATE(1415), 2, sym_comment, sym_marginalia, - [50371] = 4, + [50531] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3219), 1, - anon_sym_RPAREN, + ACTIONS(3225), 1, + anon_sym_COMMA, STATE(1416), 2, sym_comment, sym_marginalia, - [50385] = 4, + [50545] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3221), 1, - sym_keyword_compute, + ACTIONS(3227), 1, + sym_keyword_to, STATE(1417), 2, sym_comment, sym_marginalia, - [50399] = 4, + [50559] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3223), 1, - sym_natural_number, + ACTIONS(3229), 1, + sym_keyword_until, STATE(1418), 2, sym_comment, sym_marginalia, - [50413] = 4, + [50573] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3225), 1, - anon_sym_BQUOTE, + ACTIONS(3231), 1, + anon_sym_DQUOTE, STATE(1419), 2, sym_comment, sym_marginalia, - [50427] = 4, + [50587] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3227), 1, - anon_sym_COMMA, + ACTIONS(3233), 1, + sym_keyword_on, STATE(1420), 2, sym_comment, sym_marginalia, - [50441] = 4, + [50601] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3229), 1, - sym_natural_number, + ACTIONS(3235), 1, + anon_sym_SQUOTE, STATE(1421), 2, sym_comment, sym_marginalia, - [50455] = 4, - ACTIONS(3), 1, + [50615] = 4, + ACTIONS(3187), 1, anon_sym_DASH_DASH, - ACTIONS(5), 1, + ACTIONS(3189), 1, anon_sym_SLASH_STAR, - ACTIONS(3231), 1, - sym_natural_number, + ACTIONS(3237), 1, + aux_sym__double_quote_string_token1, STATE(1422), 2, sym_comment, sym_marginalia, - [50469] = 4, - ACTIONS(3), 1, + [50629] = 4, + ACTIONS(3187), 1, anon_sym_DASH_DASH, - ACTIONS(5), 1, + ACTIONS(3189), 1, anon_sym_SLASH_STAR, - ACTIONS(3233), 1, - anon_sym_RPAREN, + ACTIONS(3239), 1, + aux_sym__single_quote_string_token1, STATE(1423), 2, sym_comment, sym_marginalia, - [50483] = 4, + [50643] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3235), 1, + ACTIONS(3241), 1, anon_sym_RPAREN, STATE(1424), 2, sym_comment, sym_marginalia, - [50497] = 4, + [50657] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(1969), 1, - anon_sym_RPAREN, + ACTIONS(3243), 1, + sym_keyword_limit, STATE(1425), 2, sym_comment, sym_marginalia, - [50511] = 4, + [50671] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3237), 1, - anon_sym_RPAREN, + ACTIONS(3245), 1, + anon_sym_BQUOTE, STATE(1426), 2, sym_comment, sym_marginalia, - [50525] = 4, + [50685] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3239), 1, - sym_natural_number, + ACTIONS(3247), 1, + sym_keyword_to, STATE(1427), 2, sym_comment, sym_marginalia, - [50539] = 4, + [50699] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3241), 1, - anon_sym_RPAREN, + ACTIONS(3249), 1, + anon_sym_SLASH, STATE(1428), 2, sym_comment, sym_marginalia, - [50553] = 4, + [50713] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2310), 1, - sym_keyword_to, + ACTIONS(3251), 1, + sym_keyword_set, STATE(1429), 2, sym_comment, sym_marginalia, - [50567] = 4, + [50727] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3243), 1, - sym_keyword_type, + ACTIONS(2322), 1, + anon_sym_RPAREN, STATE(1430), 2, sym_comment, sym_marginalia, - [50581] = 4, + [50741] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3245), 1, - sym_keyword_columns, + ACTIONS(3253), 1, + sym_keyword_to, STATE(1431), 2, sym_comment, sym_marginalia, - [50595] = 4, + [50755] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3247), 1, - anon_sym_RPAREN, + ACTIONS(3255), 1, + anon_sym_LPAREN, STATE(1432), 2, sym_comment, sym_marginalia, - [50609] = 4, + [50769] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3249), 1, - sym_keyword_metadata, + ACTIONS(3257), 1, + sym_keyword_statistics, STATE(1433), 2, sym_comment, sym_marginalia, - [50623] = 4, + [50783] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3251), 1, - sym_keyword_to, + ACTIONS(3259), 1, + sym_keyword_on, STATE(1434), 2, sym_comment, sym_marginalia, - [50637] = 4, + [50797] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3253), 1, - sym_keyword_to, + ACTIONS(3261), 1, + sym_natural_number, STATE(1435), 2, sym_comment, sym_marginalia, - [50651] = 4, + [50811] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3255), 1, - sym_keyword_key, + ACTIONS(3263), 1, + ts_builtin_sym_end, STATE(1436), 2, sym_comment, sym_marginalia, - [50665] = 4, + [50825] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(629), 1, - anon_sym_RPAREN, + ACTIONS(3265), 1, + sym_keyword_cascade, STATE(1437), 2, sym_comment, sym_marginalia, - [50679] = 4, + [50839] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2011), 1, - sym_keyword_to, + ACTIONS(3267), 1, + anon_sym_RPAREN, STATE(1438), 2, sym_comment, sym_marginalia, - [50693] = 4, + [50853] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3257), 1, - anon_sym_RPAREN, + ACTIONS(3269), 1, + sym_keyword_current, STATE(1439), 2, sym_comment, sym_marginalia, - [50707] = 4, + [50867] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3259), 1, - sym_keyword_database, + ACTIONS(3271), 1, + sym_keyword_table, STATE(1440), 2, sym_comment, sym_marginalia, - [50721] = 4, - ACTIONS(3041), 1, + [50881] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3261), 1, - aux_sym_marginalia_token1, + ACTIONS(3273), 1, + sym_keyword_columns, STATE(1441), 2, sym_comment, sym_marginalia, - [50735] = 4, + [50895] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2643), 1, - sym_keyword_to, + ACTIONS(3275), 1, + sym_keyword_compute, STATE(1442), 2, sym_comment, sym_marginalia, - [50749] = 4, + [50909] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3263), 1, - sym_keyword_to, + ACTIONS(3277), 1, + anon_sym_RPAREN, STATE(1443), 2, sym_comment, sym_marginalia, - [50763] = 4, + [50923] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3265), 1, - sym_keyword_statistics, + ACTIONS(3279), 1, + anon_sym_LPAREN, STATE(1444), 2, sym_comment, sym_marginalia, - [50777] = 4, + [50937] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3267), 1, - sym_keyword_to, + ACTIONS(3281), 1, + sym_keyword_table, STATE(1445), 2, sym_comment, sym_marginalia, - [50791] = 4, + [50951] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3269), 1, - sym_keyword_to, + ACTIONS(3283), 1, + anon_sym_RPAREN, STATE(1446), 2, sym_comment, sym_marginalia, - [50805] = 4, + [50965] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3271), 1, - sym_keyword_password, + ACTIONS(3285), 1, + sym_keyword_null, STATE(1447), 2, sym_comment, sym_marginalia, - [50819] = 4, + [50979] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3273), 1, - sym_keyword_until, + ACTIONS(1964), 1, + anon_sym_RPAREN, STATE(1448), 2, sym_comment, sym_marginalia, - [50833] = 4, + [50993] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3275), 1, - sym_natural_number, + ACTIONS(3287), 1, + sym_keyword_type, STATE(1449), 2, sym_comment, sym_marginalia, - [50847] = 4, + [51007] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3277), 1, - sym_keyword_limit, + ACTIONS(3289), 1, + sym_natural_number, STATE(1450), 2, sym_comment, sym_marginalia, - [50861] = 4, + [51021] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3279), 1, - anon_sym_LPAREN, + ACTIONS(3291), 1, + anon_sym_RPAREN, STATE(1451), 2, sym_comment, sym_marginalia, - [50875] = 4, + [51035] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3281), 1, - sym_natural_number, + ACTIONS(3293), 1, + anon_sym_DOT, STATE(1452), 2, sym_comment, sym_marginalia, - [50889] = 4, + [51049] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3283), 1, - sym_natural_number, + ACTIONS(3295), 1, + anon_sym_LPAREN, STATE(1453), 2, sym_comment, sym_marginalia, - [50903] = 4, + [51063] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3285), 1, - aux_sym_parameter_token1, + ACTIONS(3297), 1, + anon_sym_COMMA, STATE(1454), 2, sym_comment, sym_marginalia, - [50917] = 4, + [51077] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3287), 1, - sym_keyword_from, + ACTIONS(3299), 1, + anon_sym_RPAREN, STATE(1455), 2, sym_comment, sym_marginalia, - [50931] = 4, + [51091] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3289), 1, - anon_sym_DOT, + ACTIONS(3301), 1, + sym_natural_number, STATE(1456), 2, sym_comment, sym_marginalia, - [50945] = 4, + [51105] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3291), 1, - sym_natural_number, + ACTIONS(3303), 1, + anon_sym_COMMA, STATE(1457), 2, sym_comment, sym_marginalia, - [50959] = 4, + [51119] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(386), 1, - sym_natural_number, + ACTIONS(3305), 1, + anon_sym_RPAREN, STATE(1458), 2, sym_comment, sym_marginalia, - [50973] = 4, + [51133] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3293), 1, - anon_sym_DQUOTE, + ACTIONS(3307), 1, + anon_sym_RPAREN, STATE(1459), 2, sym_comment, sym_marginalia, - [50987] = 4, + [51147] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3295), 1, - anon_sym_SQUOTE, + ACTIONS(3309), 1, + sym_keyword_cascade, STATE(1460), 2, sym_comment, sym_marginalia, - [51001] = 4, + [51161] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3297), 1, - anon_sym_BQUOTE, + ACTIONS(3311), 1, + anon_sym_DOT, STATE(1461), 2, sym_comment, sym_marginalia, - [51015] = 4, - ACTIONS(3041), 1, + [51175] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3299), 1, - aux_sym__double_quote_string_token1, + ACTIONS(3313), 1, + sym_keyword_matched, STATE(1462), 2, sym_comment, sym_marginalia, - [51029] = 4, - ACTIONS(3041), 1, + [51189] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3301), 1, - aux_sym__single_quote_string_token1, + ACTIONS(3315), 1, + anon_sym_RPAREN, STATE(1463), 2, sym_comment, sym_marginalia, - [51043] = 4, + [51203] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3303), 1, - anon_sym_RPAREN, + ACTIONS(3317), 1, + sym_keyword_cascade, STATE(1464), 2, sym_comment, sym_marginalia, - [51057] = 4, + [51217] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3305), 1, + ACTIONS(3319), 1, sym_natural_number, STATE(1465), 2, sym_comment, sym_marginalia, - [51071] = 4, + [51231] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3307), 1, - sym_natural_number, + ACTIONS(3321), 1, + aux_sym_parameter_token1, STATE(1466), 2, sym_comment, sym_marginalia, - [51085] = 4, + [51245] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3309), 1, + ACTIONS(3323), 1, sym_natural_number, STATE(1467), 2, sym_comment, sym_marginalia, - [51099] = 4, + [51259] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3311), 1, - sym_natural_number, + ACTIONS(3325), 1, + anon_sym_DOT, STATE(1468), 2, sym_comment, sym_marginalia, - [51113] = 4, + [51273] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3313), 1, - sym_natural_number, + ACTIONS(3327), 1, + anon_sym_RPAREN, STATE(1469), 2, sym_comment, sym_marginalia, - [51127] = 4, + [51287] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3315), 1, - sym__identifier, + ACTIONS(386), 1, + sym_natural_number, STATE(1470), 2, sym_comment, sym_marginalia, - [51141] = 4, + [51301] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3317), 1, - sym_natural_number, + ACTIONS(3329), 1, + anon_sym_DQUOTE, STATE(1471), 2, sym_comment, sym_marginalia, - [51155] = 4, + [51315] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3319), 1, - anon_sym_DOT, + ACTIONS(3331), 1, + anon_sym_SQUOTE, STATE(1472), 2, sym_comment, sym_marginalia, - [51169] = 4, + [51329] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3321), 1, - sym_keyword_transaction, + ACTIONS(3333), 1, + anon_sym_BQUOTE, STATE(1473), 2, sym_comment, sym_marginalia, - [51183] = 4, + [51343] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3323), 1, - anon_sym_DOT, + ACTIONS(3335), 1, + sym_natural_number, STATE(1474), 2, sym_comment, sym_marginalia, - [51197] = 4, + [51357] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3325), 1, - sym_keyword_to, + ACTIONS(3337), 1, + anon_sym_RPAREN, STATE(1475), 2, sym_comment, sym_marginalia, - [51211] = 4, + [51371] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3327), 1, - sym_natural_number, + ACTIONS(3339), 1, + sym_keyword_table, STATE(1476), 2, sym_comment, sym_marginalia, - [51225] = 4, + [51385] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3329), 1, - sym_natural_number, + ACTIONS(3341), 1, + sym_keyword_schema, STATE(1477), 2, sym_comment, sym_marginalia, - [51239] = 4, + [51399] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3331), 1, - sym_natural_number, + ACTIONS(3343), 1, + anon_sym_RPAREN, STATE(1478), 2, sym_comment, sym_marginalia, - [51253] = 4, + [51413] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3333), 1, - sym_keyword_from, + ACTIONS(3345), 1, + sym_natural_number, STATE(1479), 2, sym_comment, sym_marginalia, - [51267] = 4, + [51427] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3335), 1, - sym_keyword_set, + ACTIONS(287), 1, + sym_keyword_table, STATE(1480), 2, sym_comment, sym_marginalia, - [51281] = 4, + [51441] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3337), 1, - aux_sym_keyword_time_token1, + ACTIONS(3347), 1, + sym_natural_number, STATE(1481), 2, sym_comment, sym_marginalia, - [51295] = 4, + [51455] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3339), 1, - aux_sym_keyword_time_token1, + ACTIONS(3349), 1, + sym_natural_number, STATE(1482), 2, sym_comment, sym_marginalia, - [51309] = 4, + [51469] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3341), 1, - sym_natural_number, + ACTIONS(3351), 1, + anon_sym_RPAREN, STATE(1483), 2, sym_comment, sym_marginalia, - [51323] = 4, + [51483] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3343), 1, - sym_natural_number, + ACTIONS(3353), 1, + anon_sym_RPAREN, STATE(1484), 2, sym_comment, sym_marginalia, - [51337] = 4, + [51497] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3345), 1, - anon_sym_SLASH, + ACTIONS(3355), 1, + anon_sym_DOT, STATE(1485), 2, sym_comment, sym_marginalia, - [51351] = 4, + [51511] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3347), 1, + ACTIONS(3357), 1, anon_sym_RPAREN, STATE(1486), 2, sym_comment, sym_marginalia, - [51365] = 4, - ACTIONS(3), 1, + [51525] = 4, + ACTIONS(3187), 1, anon_sym_DASH_DASH, - ACTIONS(5), 1, + ACTIONS(3189), 1, anon_sym_SLASH_STAR, - ACTIONS(3349), 1, - sym_natural_number, + ACTIONS(3359), 1, + aux_sym_comment_token1, STATE(1487), 2, sym_comment, sym_marginalia, - [51379] = 4, + [51539] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3351), 1, - anon_sym_DOT, + ACTIONS(3361), 1, + sym_keyword_rewrite, STATE(1488), 2, sym_comment, sym_marginalia, - [51393] = 4, + [51553] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3353), 1, - sym_natural_number, + ACTIONS(3363), 1, + anon_sym_RPAREN, STATE(1489), 2, sym_comment, sym_marginalia, - [51407] = 4, + [51567] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3355), 1, - sym_keyword_null, + ACTIONS(3365), 1, + sym_keyword_delete, STATE(1490), 2, sym_comment, sym_marginalia, - [51421] = 4, + [51581] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3357), 1, - sym_keyword_into, + ACTIONS(3367), 1, + sym_keyword_from, STATE(1491), 2, sym_comment, sym_marginalia, - [51435] = 4, + [51595] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3359), 1, - sym_keyword_cascade, + ACTIONS(3369), 1, + sym_natural_number, STATE(1492), 2, sym_comment, sym_marginalia, - [51449] = 4, + [51609] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3361), 1, - sym_keyword_delete, + ACTIONS(3371), 1, + sym_natural_number, STATE(1493), 2, sym_comment, sym_marginalia, - [51463] = 4, + [51623] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3363), 1, - sym_keyword_always, + ACTIONS(3373), 1, + anon_sym_COMMA, STATE(1494), 2, sym_comment, sym_marginalia, - [51477] = 4, + [51637] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3365), 1, - sym_keyword_delete, + ACTIONS(3375), 1, + anon_sym_RPAREN, STATE(1495), 2, sym_comment, sym_marginalia, - [51491] = 4, + [51651] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3367), 1, + ACTIONS(3377), 1, anon_sym_RPAREN, STATE(1496), 2, sym_comment, sym_marginalia, - [51505] = 4, + [51665] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3369), 1, + ACTIONS(3379), 1, anon_sym_RPAREN, STATE(1497), 2, sym_comment, sym_marginalia, - [51519] = 4, + [51679] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3371), 1, - anon_sym_RPAREN, + ACTIONS(3381), 1, + sym_natural_number, STATE(1498), 2, sym_comment, sym_marginalia, - [51533] = 4, + [51693] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3373), 1, + ACTIONS(3383), 1, anon_sym_RPAREN, STATE(1499), 2, sym_comment, sym_marginalia, - [51547] = 4, + [51707] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3375), 1, - sym_keyword_statistics, + ACTIONS(3385), 1, + anon_sym_RPAREN, STATE(1500), 2, sym_comment, sym_marginalia, - [51561] = 4, + [51721] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3377), 1, - sym_natural_number, + ACTIONS(3387), 1, + aux_sym_keyword_timestamp_base_token3, STATE(1501), 2, sym_comment, sym_marginalia, - [51575] = 4, + [51735] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2963), 1, - anon_sym_LPAREN, + ACTIONS(3389), 1, + aux_sym_keyword_timestamp_base_token3, STATE(1502), 2, sym_comment, sym_marginalia, - [51589] = 4, + [51749] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3379), 1, + ACTIONS(3391), 1, anon_sym_RPAREN, STATE(1503), 2, sym_comment, sym_marginalia, - [51603] = 4, + [51763] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, - anon_sym_SLASH_STAR, - ACTIONS(3381), 1, - anon_sym_RPAREN, + anon_sym_SLASH_STAR, + ACTIONS(3393), 1, + sym_keyword_key, STATE(1504), 2, sym_comment, sym_marginalia, - [51617] = 4, + [51777] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3383), 1, - sym_keyword_metadata, + ACTIONS(3395), 1, + sym_natural_number, STATE(1505), 2, sym_comment, sym_marginalia, - [51631] = 4, + [51791] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3385), 1, + ACTIONS(3397), 1, anon_sym_RPAREN, STATE(1506), 2, sym_comment, sym_marginalia, - [51645] = 4, + [51805] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3387), 1, - aux_sym_keyword_timestamp_token3, + ACTIONS(3399), 1, + anon_sym_RPAREN, STATE(1507), 2, sym_comment, sym_marginalia, - [51659] = 4, + [51819] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3389), 1, - aux_sym_keyword_timestamp_token3, + ACTIONS(3401), 1, + sym_keyword_transaction, STATE(1508), 2, sym_comment, sym_marginalia, - [51673] = 4, + [51833] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3391), 1, + ACTIONS(3403), 1, anon_sym_RPAREN, STATE(1509), 2, sym_comment, sym_marginalia, - [51687] = 4, + [51847] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3393), 1, + ACTIONS(3405), 1, anon_sym_RPAREN, STATE(1510), 2, sym_comment, sym_marginalia, - [51701] = 4, + [51861] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3395), 1, + ACTIONS(3407), 1, anon_sym_RPAREN, STATE(1511), 2, sym_comment, sym_marginalia, - [51715] = 4, + [51875] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3397), 1, - anon_sym_RBRACK, + ACTIONS(3409), 1, + anon_sym_RPAREN, STATE(1512), 2, sym_comment, sym_marginalia, - [51729] = 4, + [51889] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3399), 1, - anon_sym_RPAREN, + ACTIONS(3411), 1, + sym_keyword_using, STATE(1513), 2, sym_comment, sym_marginalia, - [51743] = 4, + [51903] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3401), 1, - anon_sym_LPAREN, + ACTIONS(3413), 1, + anon_sym_RPAREN, STATE(1514), 2, sym_comment, sym_marginalia, - [51757] = 4, + [51917] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3403), 1, - anon_sym_RPAREN, + ACTIONS(3415), 1, + sym_natural_number, STATE(1515), 2, sym_comment, sym_marginalia, - [51771] = 4, + [51931] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3405), 1, + ACTIONS(3417), 1, anon_sym_RPAREN, STATE(1516), 2, sym_comment, sym_marginalia, - [51785] = 4, + [51945] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3407), 1, + ACTIONS(3419), 1, anon_sym_RPAREN, STATE(1517), 2, sym_comment, sym_marginalia, - [51799] = 4, + [51959] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3409), 1, - anon_sym_RPAREN, + ACTIONS(3421), 1, + sym_keyword_to, STATE(1518), 2, sym_comment, sym_marginalia, - [51813] = 4, + [51973] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3411), 1, + ACTIONS(3423), 1, anon_sym_RPAREN, STATE(1519), 2, sym_comment, sym_marginalia, - [51827] = 4, + [51987] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3413), 1, - anon_sym_RPAREN, + ACTIONS(3425), 1, + aux_sym_keyword_timestamp_base_token3, STATE(1520), 2, sym_comment, sym_marginalia, - [51841] = 4, + [52001] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3415), 1, - anon_sym_RPAREN, + ACTIONS(3427), 1, + aux_sym_keyword_timestamp_base_token3, STATE(1521), 2, sym_comment, sym_marginalia, - [51855] = 4, + [52015] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3417), 1, + ACTIONS(3429), 1, anon_sym_RPAREN, STATE(1522), 2, sym_comment, sym_marginalia, - [51869] = 4, + [52029] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3419), 1, - anon_sym_RBRACK, + ACTIONS(3431), 1, + anon_sym_RPAREN, STATE(1523), 2, sym_comment, sym_marginalia, - [51883] = 4, + [52043] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3421), 1, - anon_sym_DOT, + ACTIONS(3433), 1, + anon_sym_RPAREN, STATE(1524), 2, sym_comment, sym_marginalia, - [51897] = 4, + [52057] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3423), 1, - anon_sym_LPAREN, + ACTIONS(3435), 1, + anon_sym_RPAREN, STATE(1525), 2, sym_comment, sym_marginalia, - [51911] = 4, + [52071] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3425), 1, - sym_natural_number, + ACTIONS(3437), 1, + anon_sym_RPAREN, STATE(1526), 2, sym_comment, sym_marginalia, - [51925] = 4, + [52085] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3427), 1, - aux_sym_parameter_token1, + ACTIONS(3439), 1, + anon_sym_RBRACK, STATE(1527), 2, sym_comment, sym_marginalia, - [51939] = 4, + [52099] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3429), 1, - sym_natural_number, + ACTIONS(3441), 1, + anon_sym_RPAREN, STATE(1528), 2, sym_comment, sym_marginalia, - [51953] = 4, + [52113] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(2489), 1, - sym_keyword_to, + ACTIONS(3443), 1, + sym_keyword_statistics, STATE(1529), 2, sym_comment, sym_marginalia, - [51967] = 4, + [52127] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(654), 1, - sym_natural_number, + ACTIONS(3445), 1, + anon_sym_RPAREN, STATE(1530), 2, sym_comment, sym_marginalia, - [51981] = 4, + [52141] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3431), 1, - anon_sym_DQUOTE, + ACTIONS(3447), 1, + anon_sym_RPAREN, STATE(1531), 2, sym_comment, sym_marginalia, - [51995] = 4, + [52155] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3433), 1, - anon_sym_SQUOTE, + ACTIONS(3449), 1, + anon_sym_RPAREN, STATE(1532), 2, sym_comment, sym_marginalia, - [52009] = 4, + [52169] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3435), 1, - anon_sym_BQUOTE, + ACTIONS(3451), 1, + anon_sym_RPAREN, STATE(1533), 2, sym_comment, sym_marginalia, - [52023] = 4, + [52183] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3437), 1, + ACTIONS(3453), 1, anon_sym_RPAREN, STATE(1534), 2, sym_comment, sym_marginalia, - [52037] = 4, + [52197] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3439), 1, - anon_sym_DOT, + ACTIONS(3455), 1, + anon_sym_RPAREN, STATE(1535), 2, sym_comment, sym_marginalia, - [52051] = 4, + [52211] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3441), 1, - ts_builtin_sym_end, + ACTIONS(3457), 1, + anon_sym_RPAREN, STATE(1536), 2, sym_comment, sym_marginalia, - [52065] = 4, + [52225] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3443), 1, - sym_keyword_data, + ACTIONS(3459), 1, + anon_sym_RPAREN, STATE(1537), 2, sym_comment, sym_marginalia, - [52079] = 4, + [52239] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3445), 1, - anon_sym_RPAREN, + ACTIONS(3461), 1, + sym_natural_number, STATE(1538), 2, sym_comment, sym_marginalia, - [52093] = 4, + [52253] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3447), 1, - anon_sym_RPAREN, + ACTIONS(3463), 1, + anon_sym_DOT, STATE(1539), 2, sym_comment, sym_marginalia, - [52107] = 4, + [52267] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3449), 1, - anon_sym_EQ, + ACTIONS(3465), 1, + sym_keyword_type, STATE(1540), 2, sym_comment, sym_marginalia, - [52121] = 4, + [52281] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3451), 1, - anon_sym_EQ, + ACTIONS(3467), 1, + sym_natural_number, STATE(1541), 2, sym_comment, sym_marginalia, - [52135] = 4, + [52295] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3453), 1, - anon_sym_DQUOTE, + ACTIONS(3469), 1, + aux_sym_parameter_token1, STATE(1542), 2, sym_comment, sym_marginalia, - [52149] = 4, + [52309] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3455), 1, - anon_sym_BQUOTE, + ACTIONS(3471), 1, + sym_keyword_to, STATE(1543), 2, sym_comment, sym_marginalia, - [52163] = 4, + [52323] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3457), 1, - sym_keyword_stats, + ACTIONS(3473), 1, + anon_sym_RPAREN, STATE(1544), 2, sym_comment, sym_marginalia, - [52177] = 4, - ACTIONS(3041), 1, + [52337] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3459), 1, - aux_sym__double_quote_string_token1, + ACTIONS(658), 1, + sym_natural_number, STATE(1545), 2, sym_comment, sym_marginalia, - [52191] = 4, + [52351] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3461), 1, - sym_natural_number, + ACTIONS(3475), 1, + anon_sym_DQUOTE, STATE(1546), 2, sym_comment, sym_marginalia, - [52205] = 4, + [52365] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3463), 1, - sym__identifier, + ACTIONS(3477), 1, + anon_sym_SQUOTE, STATE(1547), 2, sym_comment, sym_marginalia, - [52219] = 4, + [52379] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(297), 1, - sym_keyword_table, + ACTIONS(3479), 1, + anon_sym_BQUOTE, STATE(1548), 2, sym_comment, sym_marginalia, - [52233] = 4, + [52393] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3465), 1, - anon_sym_RPAREN, + ACTIONS(3481), 1, + sym_keyword_minvalue, STATE(1549), 2, sym_comment, sym_marginalia, - [52247] = 4, + [52407] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3467), 1, - sym_keyword_not, + ACTIONS(3483), 1, + anon_sym_DOT, STATE(1550), 2, sym_comment, sym_marginalia, - [52261] = 4, + [52421] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3469), 1, - sym_keyword_set, + ACTIONS(3485), 1, + anon_sym_LPAREN, STATE(1551), 2, sym_comment, sym_marginalia, - [52275] = 4, + [52435] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3471), 1, - anon_sym_DOT, + ACTIONS(3487), 1, + sym_keyword_to, STATE(1552), 2, sym_comment, sym_marginalia, - [52289] = 4, + [52449] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3473), 1, - anon_sym_LPAREN, + ACTIONS(3489), 1, + anon_sym_RPAREN, STATE(1553), 2, sym_comment, sym_marginalia, - [52303] = 4, + [52463] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3475), 1, - anon_sym_LPAREN, + ACTIONS(3491), 1, + sym_keyword_as, STATE(1554), 2, sym_comment, sym_marginalia, - [52317] = 4, + [52477] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3477), 1, - sym_natural_number, + ACTIONS(3493), 1, + anon_sym_LPAREN, STATE(1555), 2, sym_comment, sym_marginalia, - [52331] = 4, + [52491] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3479), 1, - sym_natural_number, + ACTIONS(3495), 1, + sym_keyword_cascade, STATE(1556), 2, sym_comment, sym_marginalia, - [52345] = 4, + [52505] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3481), 1, - sym_natural_number, + ACTIONS(3497), 1, + anon_sym_DQUOTE, STATE(1557), 2, sym_comment, sym_marginalia, - [52359] = 4, + [52519] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3483), 1, - sym_natural_number, + ACTIONS(3499), 1, + anon_sym_BQUOTE, STATE(1558), 2, sym_comment, sym_marginalia, - [52373] = 4, + [52533] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3485), 1, - sym_natural_number, + ACTIONS(3501), 1, + sym_keyword_delete, STATE(1559), 2, sym_comment, sym_marginalia, - [52387] = 4, - ACTIONS(3), 1, + [52547] = 4, + ACTIONS(3187), 1, anon_sym_DASH_DASH, - ACTIONS(5), 1, + ACTIONS(3189), 1, anon_sym_SLASH_STAR, - ACTIONS(3487), 1, - sym_natural_number, + ACTIONS(3503), 1, + aux_sym__double_quote_string_token1, STATE(1560), 2, sym_comment, sym_marginalia, - [52401] = 4, - ACTIONS(3), 1, + [52561] = 4, + ACTIONS(3187), 1, anon_sym_DASH_DASH, - ACTIONS(5), 1, + ACTIONS(3189), 1, anon_sym_SLASH_STAR, - ACTIONS(3489), 1, - sym_natural_number, + ACTIONS(3505), 1, + aux_sym__single_quote_string_token1, STATE(1561), 2, sym_comment, sym_marginalia, - [52415] = 4, + [52575] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3491), 1, - sym_natural_number, + ACTIONS(3507), 1, + sym__identifier, STATE(1562), 2, sym_comment, sym_marginalia, - [52429] = 4, + [52589] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3493), 1, - sym_keyword_type, + ACTIONS(2877), 1, + anon_sym_SEMI, STATE(1563), 2, sym_comment, sym_marginalia, - [52443] = 4, + [52603] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3495), 1, - sym_natural_number, + ACTIONS(3509), 1, + sym_keyword_delete, STATE(1564), 2, sym_comment, sym_marginalia, - [52457] = 4, + [52617] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3497), 1, - aux_sym_keyword_time_token1, + ACTIONS(3511), 1, + sym_keyword_by, STATE(1565), 2, sym_comment, sym_marginalia, - [52471] = 4, + [52631] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3499), 1, - aux_sym_keyword_time_token1, + ACTIONS(3513), 1, + sym_natural_number, STATE(1566), 2, sym_comment, sym_marginalia, - [52485] = 4, + [52645] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3501), 1, - sym_natural_number, + ACTIONS(3515), 1, + anon_sym_RPAREN, STATE(1567), 2, sym_comment, sym_marginalia, - [52499] = 4, + [52659] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3503), 1, - sym_natural_number, + ACTIONS(3517), 1, + sym_keyword_set, STATE(1568), 2, sym_comment, sym_marginalia, - [52513] = 4, + [52673] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3505), 1, - sym_natural_number, + ACTIONS(3481), 1, + sym_keyword_maxvalue, STATE(1569), 2, sym_comment, sym_marginalia, - [52527] = 4, + [52687] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3507), 1, + ACTIONS(3519), 1, sym_natural_number, STATE(1570), 2, sym_comment, sym_marginalia, - [52541] = 4, + [52701] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3509), 1, + ACTIONS(3521), 1, sym_natural_number, STATE(1571), 2, sym_comment, sym_marginalia, - [52555] = 4, + [52715] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3511), 1, + ACTIONS(3523), 1, sym_natural_number, STATE(1572), 2, sym_comment, sym_marginalia, - [52569] = 4, + [52729] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3513), 1, + ACTIONS(3525), 1, sym_natural_number, STATE(1573), 2, sym_comment, sym_marginalia, - [52583] = 4, + [52743] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3515), 1, + ACTIONS(3527), 1, sym_natural_number, STATE(1574), 2, sym_comment, sym_marginalia, - [52597] = 4, + [52757] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3517), 1, + ACTIONS(3529), 1, sym_natural_number, STATE(1575), 2, sym_comment, sym_marginalia, - [52611] = 4, + [52771] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3519), 1, + ACTIONS(3531), 1, sym_natural_number, STATE(1576), 2, sym_comment, sym_marginalia, - [52625] = 4, + [52785] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3521), 1, + ACTIONS(3533), 1, sym_natural_number, STATE(1577), 2, sym_comment, sym_marginalia, - [52639] = 4, + [52799] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3523), 1, + ACTIONS(3535), 1, sym_natural_number, STATE(1578), 2, sym_comment, sym_marginalia, - [52653] = 4, + [52813] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3525), 1, - anon_sym_RPAREN, + ACTIONS(3537), 1, + aux_sym_keyword_time_token1, STATE(1579), 2, sym_comment, sym_marginalia, - [52667] = 4, - ACTIONS(3041), 1, + [52827] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3527), 1, - aux_sym__double_quote_string_token1, + ACTIONS(3539), 1, + aux_sym_keyword_time_token1, STATE(1580), 2, sym_comment, sym_marginalia, - [52681] = 4, - ACTIONS(3041), 1, + [52841] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3529), 1, - aux_sym__single_quote_string_token1, + ACTIONS(3541), 1, + sym_natural_number, STATE(1581), 2, sym_comment, sym_marginalia, - [52695] = 4, + [52855] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3531), 1, - sym__identifier, + ACTIONS(3543), 1, + sym_natural_number, STATE(1582), 2, sym_comment, sym_marginalia, - [52709] = 4, + [52869] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3533), 1, - sym_keyword_by, + ACTIONS(3545), 1, + sym_natural_number, STATE(1583), 2, sym_comment, sym_marginalia, - [52723] = 4, + [52883] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3535), 1, - anon_sym_EQ, + ACTIONS(3547), 1, + sym_natural_number, STATE(1584), 2, sym_comment, sym_marginalia, - [52737] = 4, + [52897] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3537), 1, - sym_keyword_statistics, + ACTIONS(3549), 1, + sym_natural_number, STATE(1585), 2, sym_comment, sym_marginalia, - [52751] = 4, - ACTIONS(3041), 1, + [52911] = 4, + ACTIONS(3), 1, anon_sym_DASH_DASH, - ACTIONS(3043), 1, + ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3539), 1, - aux_sym__double_quote_string_token1, + ACTIONS(3551), 1, + sym_natural_number, STATE(1586), 2, sym_comment, sym_marginalia, - [52765] = 4, + [52925] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3541), 1, - sym__identifier, + ACTIONS(3553), 1, + sym_natural_number, STATE(1587), 2, sym_comment, sym_marginalia, - [52779] = 4, + [52939] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3543), 1, - sym_keyword_set, + ACTIONS(3555), 1, + sym_natural_number, STATE(1588), 2, sym_comment, sym_marginalia, - [52793] = 4, + [52953] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3545), 1, - anon_sym_RPAREN, + ACTIONS(3557), 1, + sym_natural_number, STATE(1589), 2, sym_comment, sym_marginalia, - [52807] = 4, + [52967] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3547), 1, - sym_keyword_exists, + ACTIONS(3559), 1, + sym_natural_number, STATE(1590), 2, sym_comment, sym_marginalia, - [52821] = 4, + [52981] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3549), 1, - sym_keyword_on, + ACTIONS(3561), 1, + sym_natural_number, STATE(1591), 2, sym_comment, sym_marginalia, - [52835] = 4, + [52995] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3551), 1, - anon_sym_LPAREN, + ACTIONS(3563), 1, + sym_natural_number, STATE(1592), 2, sym_comment, sym_marginalia, - [52849] = 4, + [53009] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3553), 1, - anon_sym_LPAREN, + ACTIONS(3565), 1, + sym_natural_number, STATE(1593), 2, sym_comment, sym_marginalia, - [52863] = 4, + [53023] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3555), 1, - anon_sym_LPAREN, + ACTIONS(3567), 1, + sym_natural_number, STATE(1594), 2, sym_comment, sym_marginalia, - [52877] = 4, + [53037] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3557), 1, - anon_sym_COMMA, + ACTIONS(3569), 1, + sym_keyword_into, STATE(1595), 2, sym_comment, sym_marginalia, - [52891] = 4, + [53051] = 4, + ACTIONS(3187), 1, + anon_sym_DASH_DASH, + ACTIONS(3189), 1, + anon_sym_SLASH_STAR, + ACTIONS(3571), 1, + aux_sym__double_quote_string_token1, + STATE(1596), 2, + sym_comment, + sym_marginalia, + [53065] = 4, + ACTIONS(3187), 1, + anon_sym_DASH_DASH, + ACTIONS(3189), 1, + anon_sym_SLASH_STAR, + ACTIONS(3573), 1, + aux_sym__single_quote_string_token1, + STATE(1597), 2, + sym_comment, + sym_marginalia, + [53079] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3559), 1, + ACTIONS(3575), 1, + sym__identifier, + STATE(1598), 2, + sym_comment, + sym_marginalia, + [53093] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3577), 1, + anon_sym_LPAREN, + STATE(1599), 2, + sym_comment, + sym_marginalia, + [53107] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3579), 1, + sym_natural_number, + STATE(1600), 2, + sym_comment, + sym_marginalia, + [53121] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2733), 1, + sym_keyword_to, + STATE(1601), 2, + sym_comment, + sym_marginalia, + [53135] = 4, + ACTIONS(3187), 1, + anon_sym_DASH_DASH, + ACTIONS(3189), 1, + anon_sym_SLASH_STAR, + ACTIONS(3581), 1, + aux_sym__double_quote_string_token1, + STATE(1602), 2, + sym_comment, + sym_marginalia, + [53149] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3583), 1, + sym__identifier, + STATE(1603), 2, + sym_comment, + sym_marginalia, + [53163] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3585), 1, + sym_keyword_from, + STATE(1604), 2, + sym_comment, + sym_marginalia, + [53177] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(2953), 1, + sym_natural_number, + STATE(1605), 2, + sym_comment, + sym_marginalia, + [53191] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3587), 1, + sym__identifier, + STATE(1606), 2, + sym_comment, + sym_marginalia, + [53205] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3589), 1, + sym_keyword_to, + STATE(1607), 2, + sym_comment, + sym_marginalia, + [53219] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3591), 1, + anon_sym_LPAREN, + STATE(1608), 2, + sym_comment, + sym_marginalia, + [53233] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3593), 1, + anon_sym_LPAREN, + STATE(1609), 2, + sym_comment, + sym_marginalia, + [53247] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3595), 1, + anon_sym_LPAREN, + STATE(1610), 2, + sym_comment, + sym_marginalia, + [53261] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3597), 1, + sym_keyword_null, + STATE(1611), 2, + sym_comment, + sym_marginalia, + [53275] = 4, + ACTIONS(3), 1, + anon_sym_DASH_DASH, + ACTIONS(5), 1, + anon_sym_SLASH_STAR, + ACTIONS(3599), 1, anon_sym_COMMA, - STATE(1596), 2, + STATE(1612), 2, sym_comment, sym_marginalia, - [52905] = 4, + [53289] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3561), 1, + ACTIONS(3601), 1, anon_sym_COMMA, - STATE(1597), 2, + STATE(1613), 2, sym_comment, sym_marginalia, - [52919] = 4, + [53303] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3563), 1, + ACTIONS(3603), 1, anon_sym_COMMA, - STATE(1598), 2, + STATE(1614), 2, sym_comment, sym_marginalia, - [52933] = 4, + [53317] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3565), 1, + ACTIONS(3605), 1, anon_sym_COMMA, - STATE(1599), 2, + STATE(1615), 2, sym_comment, sym_marginalia, - [52947] = 4, + [53331] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3567), 1, - anon_sym_RPAREN, - STATE(1600), 2, + ACTIONS(3607), 1, + anon_sym_RBRACK, + STATE(1616), 2, sym_comment, sym_marginalia, - [52961] = 4, + [53345] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3569), 1, - sym_keyword_table, - STATE(1601), 2, + ACTIONS(2052), 1, + anon_sym_RPAREN, + STATE(1617), 2, sym_comment, sym_marginalia, - [52975] = 4, + [53359] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3047), 1, - sym_keyword_minvalue, - STATE(1602), 2, + ACTIONS(3609), 1, + sym_natural_number, + STATE(1618), 2, sym_comment, sym_marginalia, - [52989] = 4, + [53373] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3571), 1, + ACTIONS(3611), 1, sym_natural_number, - STATE(1603), 2, + STATE(1619), 2, sym_comment, sym_marginalia, - [53003] = 4, + [53387] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3573), 1, + ACTIONS(3613), 1, sym_natural_number, - STATE(1604), 2, + STATE(1620), 2, sym_comment, sym_marginalia, - [53017] = 4, + [53401] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3575), 1, + ACTIONS(3615), 1, sym_natural_number, - STATE(1605), 2, + STATE(1621), 2, sym_comment, sym_marginalia, - [53031] = 4, + [53415] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3577), 1, + ACTIONS(3617), 1, sym_natural_number, - STATE(1606), 2, + STATE(1622), 2, sym_comment, sym_marginalia, - [53045] = 4, + [53429] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3579), 1, + ACTIONS(3619), 1, sym_natural_number, - STATE(1607), 2, + STATE(1623), 2, sym_comment, sym_marginalia, - [53059] = 4, + [53443] = 4, ACTIONS(3), 1, anon_sym_DASH_DASH, ACTIONS(5), 1, anon_sym_SLASH_STAR, - ACTIONS(3581), 1, + ACTIONS(3621), 1, sym_natural_number, - STATE(1608), 2, + STATE(1624), 2, sym_comment, sym_marginalia, - [53073] = 1, - ACTIONS(3583), 1, + [53457] = 1, + ACTIONS(3623), 1, ts_builtin_sym_end, - [53077] = 1, - ACTIONS(3585), 1, + [53461] = 1, + ACTIONS(3625), 1, ts_builtin_sym_end, }; @@ -54207,21 +54589,21 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(25)] = 216, [SMALL_STATE(26)] = 287, [SMALL_STATE(27)] = 384, - [SMALL_STATE(28)] = 485, - [SMALL_STATE(29)] = 606, - [SMALL_STATE(30)] = 681, - [SMALL_STATE(31)] = 784, - [SMALL_STATE(32)] = 889, - [SMALL_STATE(33)] = 980, - [SMALL_STATE(34)] = 1063, - [SMALL_STATE(35)] = 1142, - [SMALL_STATE(36)] = 1219, + [SMALL_STATE(28)] = 505, + [SMALL_STATE(29)] = 580, + [SMALL_STATE(30)] = 683, + [SMALL_STATE(31)] = 788, + [SMALL_STATE(32)] = 883, + [SMALL_STATE(33)] = 962, + [SMALL_STATE(34)] = 1053, + [SMALL_STATE(35)] = 1136, + [SMALL_STATE(36)] = 1213, [SMALL_STATE(37)] = 1314, [SMALL_STATE(38)] = 1415, [SMALL_STATE(39)] = 1533, [SMALL_STATE(40)] = 1648, - [SMALL_STATE(41)] = 1717, - [SMALL_STATE(42)] = 1786, + [SMALL_STATE(41)] = 1763, + [SMALL_STATE(42)] = 1832, [SMALL_STATE(43)] = 1901, [SMALL_STATE(44)] = 1967, [SMALL_STATE(45)] = 2033, @@ -54231,26 +54613,26 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(49)] = 2297, [SMALL_STATE(50)] = 2363, [SMALL_STATE(51)] = 2464, - [SMALL_STATE(52)] = 2559, - [SMALL_STATE(53)] = 2650, - [SMALL_STATE(54)] = 2747, - [SMALL_STATE(55)] = 2846, - [SMALL_STATE(56)] = 2917, - [SMALL_STATE(57)] = 2982, - [SMALL_STATE(58)] = 3077, - [SMALL_STATE(59)] = 3162, - [SMALL_STATE(60)] = 3251, - [SMALL_STATE(61)] = 3324, - [SMALL_STATE(62)] = 3401, - [SMALL_STATE(63)] = 3464, + [SMALL_STATE(52)] = 2537, + [SMALL_STATE(53)] = 2628, + [SMALL_STATE(54)] = 2727, + [SMALL_STATE(55)] = 2812, + [SMALL_STATE(56)] = 2889, + [SMALL_STATE(57)] = 2984, + [SMALL_STATE(58)] = 3079, + [SMALL_STATE(59)] = 3176, + [SMALL_STATE(60)] = 3245, + [SMALL_STATE(61)] = 3334, + [SMALL_STATE(62)] = 3397, + [SMALL_STATE(63)] = 3468, [SMALL_STATE(64)] = 3533, - [SMALL_STATE(65)] = 3595, - [SMALL_STATE(66)] = 3657, - [SMALL_STATE(67)] = 3719, - [SMALL_STATE(68)] = 3783, - [SMALL_STATE(69)] = 3897, - [SMALL_STATE(70)] = 3961, - [SMALL_STATE(71)] = 4023, + [SMALL_STATE(65)] = 3597, + [SMALL_STATE(66)] = 3659, + [SMALL_STATE(67)] = 3723, + [SMALL_STATE(68)] = 3787, + [SMALL_STATE(69)] = 3849, + [SMALL_STATE(70)] = 3963, + [SMALL_STATE(71)] = 4025, [SMALL_STATE(72)] = 4087, [SMALL_STATE(73)] = 4148, [SMALL_STATE(74)] = 4209, @@ -54277,26 +54659,26 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(95)] = 5490, [SMALL_STATE(96)] = 5551, [SMALL_STATE(97)] = 5644, - [SMALL_STATE(98)] = 5739, - [SMALL_STATE(99)] = 5804, - [SMALL_STATE(100)] = 5873, - [SMALL_STATE(101)] = 5954, - [SMALL_STATE(102)] = 6027, - [SMALL_STATE(103)] = 6094, - [SMALL_STATE(104)] = 6179, - [SMALL_STATE(105)] = 6266, - [SMALL_STATE(106)] = 6357, - [SMALL_STATE(107)] = 6448, + [SMALL_STATE(98)] = 5735, + [SMALL_STATE(99)] = 5846, + [SMALL_STATE(100)] = 5911, + [SMALL_STATE(101)] = 5978, + [SMALL_STATE(102)] = 6073, + [SMALL_STATE(103)] = 6158, + [SMALL_STATE(104)] = 6227, + [SMALL_STATE(105)] = 6308, + [SMALL_STATE(106)] = 6381, + [SMALL_STATE(107)] = 6468, [SMALL_STATE(108)] = 6559, - [SMALL_STATE(109)] = 6623, - [SMALL_STATE(110)] = 6723, - [SMALL_STATE(111)] = 6785, - [SMALL_STATE(112)] = 6845, - [SMALL_STATE(113)] = 6907, + [SMALL_STATE(109)] = 6619, + [SMALL_STATE(110)] = 6681, + [SMALL_STATE(111)] = 6743, + [SMALL_STATE(112)] = 6805, + [SMALL_STATE(113)] = 6869, [SMALL_STATE(114)] = 6969, - [SMALL_STATE(115)] = 7026, - [SMALL_STATE(116)] = 7085, - [SMALL_STATE(117)] = 7142, + [SMALL_STATE(115)] = 7090, + [SMALL_STATE(116)] = 7147, + [SMALL_STATE(117)] = 7206, [SMALL_STATE(118)] = 7263, [SMALL_STATE(119)] = 7319, [SMALL_STATE(120)] = 7375, @@ -54304,9 +54686,9 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(122)] = 7487, [SMALL_STATE(123)] = 7543, [SMALL_STATE(124)] = 7599, - [SMALL_STATE(125)] = 7717, - [SMALL_STATE(126)] = 7773, - [SMALL_STATE(127)] = 7829, + [SMALL_STATE(125)] = 7655, + [SMALL_STATE(126)] = 7711, + [SMALL_STATE(127)] = 7767, [SMALL_STATE(128)] = 7885, [SMALL_STATE(129)] = 7941, [SMALL_STATE(130)] = 7997, @@ -54316,36 +54698,36 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(134)] = 8256, [SMALL_STATE(135)] = 8352, [SMALL_STATE(136)] = 8415, - [SMALL_STATE(137)] = 8508, - [SMALL_STATE(138)] = 8601, + [SMALL_STATE(137)] = 8504, + [SMALL_STATE(138)] = 8597, [SMALL_STATE(139)] = 8690, [SMALL_STATE(140)] = 8783, [SMALL_STATE(141)] = 8876, [SMALL_STATE(142)] = 8965, [SMALL_STATE(143)] = 9058, - [SMALL_STATE(144)] = 9151, - [SMALL_STATE(145)] = 9240, - [SMALL_STATE(146)] = 9333, - [SMALL_STATE(147)] = 9410, + [SMALL_STATE(144)] = 9147, + [SMALL_STATE(145)] = 9232, + [SMALL_STATE(146)] = 9319, + [SMALL_STATE(147)] = 9378, [SMALL_STATE(148)] = 9471, - [SMALL_STATE(149)] = 9556, - [SMALL_STATE(150)] = 9643, - [SMALL_STATE(151)] = 9702, - [SMALL_STATE(152)] = 9769, - [SMALL_STATE(153)] = 9844, + [SMALL_STATE(149)] = 9546, + [SMALL_STATE(150)] = 9613, + [SMALL_STATE(151)] = 9674, + [SMALL_STATE(152)] = 9751, + [SMALL_STATE(153)] = 9830, [SMALL_STATE(154)] = 9923, [SMALL_STATE(155)] = 10006, [SMALL_STATE(156)] = 10089, [SMALL_STATE(157)] = 10182, - [SMALL_STATE(158)] = 10236, - [SMALL_STATE(159)] = 10288, - [SMALL_STATE(160)] = 10342, - [SMALL_STATE(161)] = 10396, - [SMALL_STATE(162)] = 10448, - [SMALL_STATE(163)] = 10502, - [SMALL_STATE(164)] = 10590, - [SMALL_STATE(165)] = 10642, - [SMALL_STATE(166)] = 10694, + [SMALL_STATE(158)] = 10234, + [SMALL_STATE(159)] = 10286, + [SMALL_STATE(160)] = 10374, + [SMALL_STATE(161)] = 10462, + [SMALL_STATE(162)] = 10514, + [SMALL_STATE(163)] = 10568, + [SMALL_STATE(164)] = 10622, + [SMALL_STATE(165)] = 10676, + [SMALL_STATE(166)] = 10728, [SMALL_STATE(167)] = 10782, [SMALL_STATE(168)] = 10834, [SMALL_STATE(169)] = 10885, @@ -54356,39 +54738,39 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(174)] = 11248, [SMALL_STATE(175)] = 11299, [SMALL_STATE(176)] = 11350, - [SMALL_STATE(177)] = 11437, - [SMALL_STATE(178)] = 11488, - [SMALL_STATE(179)] = 11539, - [SMALL_STATE(180)] = 11590, - [SMALL_STATE(181)] = 11641, + [SMALL_STATE(177)] = 11405, + [SMALL_STATE(178)] = 11492, + [SMALL_STATE(179)] = 11543, + [SMALL_STATE(180)] = 11594, + [SMALL_STATE(181)] = 11645, [SMALL_STATE(182)] = 11696, [SMALL_STATE(183)] = 11747, - [SMALL_STATE(184)] = 11798, - [SMALL_STATE(185)] = 11849, - [SMALL_STATE(186)] = 11900, - [SMALL_STATE(187)] = 11951, - [SMALL_STATE(188)] = 12006, - [SMALL_STATE(189)] = 12057, - [SMALL_STATE(190)] = 12108, - [SMALL_STATE(191)] = 12159, - [SMALL_STATE(192)] = 12210, - [SMALL_STATE(193)] = 12297, - [SMALL_STATE(194)] = 12384, - [SMALL_STATE(195)] = 12471, - [SMALL_STATE(196)] = 12526, + [SMALL_STATE(184)] = 11834, + [SMALL_STATE(185)] = 11885, + [SMALL_STATE(186)] = 11972, + [SMALL_STATE(187)] = 12059, + [SMALL_STATE(188)] = 12110, + [SMALL_STATE(189)] = 12165, + [SMALL_STATE(190)] = 12216, + [SMALL_STATE(191)] = 12267, + [SMALL_STATE(192)] = 12322, + [SMALL_STATE(193)] = 12409, + [SMALL_STATE(194)] = 12460, + [SMALL_STATE(195)] = 12511, + [SMALL_STATE(196)] = 12562, [SMALL_STATE(197)] = 12613, [SMALL_STATE(198)] = 12664, - [SMALL_STATE(199)] = 12715, - [SMALL_STATE(200)] = 12766, - [SMALL_STATE(201)] = 12817, - [SMALL_STATE(202)] = 12868, + [SMALL_STATE(199)] = 12751, + [SMALL_STATE(200)] = 12802, + [SMALL_STATE(201)] = 12853, + [SMALL_STATE(202)] = 12904, [SMALL_STATE(203)] = 12955, - [SMALL_STATE(204)] = 13042, - [SMALL_STATE(205)] = 13097, - [SMALL_STATE(206)] = 13184, - [SMALL_STATE(207)] = 13271, - [SMALL_STATE(208)] = 13358, - [SMALL_STATE(209)] = 13445, + [SMALL_STATE(204)] = 13006, + [SMALL_STATE(205)] = 13061, + [SMALL_STATE(206)] = 13148, + [SMALL_STATE(207)] = 13235, + [SMALL_STATE(208)] = 13322, + [SMALL_STATE(209)] = 13409, [SMALL_STATE(210)] = 13496, [SMALL_STATE(211)] = 13580, [SMALL_STATE(212)] = 13664, @@ -54403,29 +54785,29 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(221)] = 14480, [SMALL_STATE(222)] = 14584, [SMALL_STATE(223)] = 14688, - [SMALL_STATE(224)] = 14789, - [SMALL_STATE(225)] = 14890, - [SMALL_STATE(226)] = 14935, - [SMALL_STATE(227)] = 15036, - [SMALL_STATE(228)] = 15081, - [SMALL_STATE(229)] = 15130, - [SMALL_STATE(230)] = 15179, - [SMALL_STATE(231)] = 15280, - [SMALL_STATE(232)] = 15329, - [SMALL_STATE(233)] = 15430, + [SMALL_STATE(224)] = 14737, + [SMALL_STATE(225)] = 14782, + [SMALL_STATE(226)] = 14883, + [SMALL_STATE(227)] = 14932, + [SMALL_STATE(228)] = 14977, + [SMALL_STATE(229)] = 15078, + [SMALL_STATE(230)] = 15123, + [SMALL_STATE(231)] = 15224, + [SMALL_STATE(232)] = 15325, + [SMALL_STATE(233)] = 15426, [SMALL_STATE(234)] = 15475, [SMALL_STATE(235)] = 15576, [SMALL_STATE(236)] = 15674, [SMALL_STATE(237)] = 15772, [SMALL_STATE(238)] = 15870, - [SMALL_STATE(239)] = 15965, + [SMALL_STATE(239)] = 15947, [SMALL_STATE(240)] = 16042, [SMALL_STATE(241)] = 16137, - [SMALL_STATE(242)] = 16232, - [SMALL_STATE(243)] = 16327, - [SMALL_STATE(244)] = 16404, - [SMALL_STATE(245)] = 16481, - [SMALL_STATE(246)] = 16524, + [SMALL_STATE(242)] = 16180, + [SMALL_STATE(243)] = 16275, + [SMALL_STATE(244)] = 16352, + [SMALL_STATE(245)] = 16395, + [SMALL_STATE(246)] = 16472, [SMALL_STATE(247)] = 16567, [SMALL_STATE(248)] = 16659, [SMALL_STATE(249)] = 16751, @@ -54508,3047 +54890,3083 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(326)] = 23613, [SMALL_STATE(327)] = 23702, [SMALL_STATE(328)] = 23750, - [SMALL_STATE(329)] = 23795, - [SMALL_STATE(330)] = 23840, - [SMALL_STATE(331)] = 23889, + [SMALL_STATE(329)] = 23793, + [SMALL_STATE(330)] = 23838, + [SMALL_STATE(331)] = 23883, [SMALL_STATE(332)] = 23928, - [SMALL_STATE(333)] = 23973, - [SMALL_STATE(334)] = 24031, - [SMALL_STATE(335)] = 24073, - [SMALL_STATE(336)] = 24133, - [SMALL_STATE(337)] = 24175, - [SMALL_STATE(338)] = 24217, - [SMALL_STATE(339)] = 24259, - [SMALL_STATE(340)] = 24319, - [SMALL_STATE(341)] = 24361, - [SMALL_STATE(342)] = 24403, - [SMALL_STATE(343)] = 24442, - [SMALL_STATE(344)] = 24481, - [SMALL_STATE(345)] = 24518, - [SMALL_STATE(346)] = 24557, - [SMALL_STATE(347)] = 24596, - [SMALL_STATE(348)] = 24635, - [SMALL_STATE(349)] = 24674, - [SMALL_STATE(350)] = 24713, - [SMALL_STATE(351)] = 24752, - [SMALL_STATE(352)] = 24793, - [SMALL_STATE(353)] = 24832, - [SMALL_STATE(354)] = 24871, - [SMALL_STATE(355)] = 24910, - [SMALL_STATE(356)] = 24949, - [SMALL_STATE(357)] = 24988, - [SMALL_STATE(358)] = 25027, - [SMALL_STATE(359)] = 25066, - [SMALL_STATE(360)] = 25105, - [SMALL_STATE(361)] = 25148, - [SMALL_STATE(362)] = 25187, - [SMALL_STATE(363)] = 25226, - [SMALL_STATE(364)] = 25262, - [SMALL_STATE(365)] = 25298, - [SMALL_STATE(366)] = 25334, - [SMALL_STATE(367)] = 25370, - [SMALL_STATE(368)] = 25406, - [SMALL_STATE(369)] = 25442, - [SMALL_STATE(370)] = 25478, - [SMALL_STATE(371)] = 25514, - [SMALL_STATE(372)] = 25550, - [SMALL_STATE(373)] = 25586, - [SMALL_STATE(374)] = 25622, - [SMALL_STATE(375)] = 25658, - [SMALL_STATE(376)] = 25694, - [SMALL_STATE(377)] = 25730, - [SMALL_STATE(378)] = 25766, - [SMALL_STATE(379)] = 25802, - [SMALL_STATE(380)] = 25838, - [SMALL_STATE(381)] = 25874, - [SMALL_STATE(382)] = 25910, - [SMALL_STATE(383)] = 25946, - [SMALL_STATE(384)] = 25982, - [SMALL_STATE(385)] = 26018, - [SMALL_STATE(386)] = 26054, - [SMALL_STATE(387)] = 26090, - [SMALL_STATE(388)] = 26126, - [SMALL_STATE(389)] = 26162, - [SMALL_STATE(390)] = 26198, - [SMALL_STATE(391)] = 26234, - [SMALL_STATE(392)] = 26270, - [SMALL_STATE(393)] = 26306, - [SMALL_STATE(394)] = 26342, - [SMALL_STATE(395)] = 26378, - [SMALL_STATE(396)] = 26414, - [SMALL_STATE(397)] = 26454, - [SMALL_STATE(398)] = 26490, - [SMALL_STATE(399)] = 26526, - [SMALL_STATE(400)] = 26562, - [SMALL_STATE(401)] = 26598, - [SMALL_STATE(402)] = 26634, - [SMALL_STATE(403)] = 26670, - [SMALL_STATE(404)] = 26706, - [SMALL_STATE(405)] = 26742, - [SMALL_STATE(406)] = 26778, - [SMALL_STATE(407)] = 26814, - [SMALL_STATE(408)] = 26850, - [SMALL_STATE(409)] = 26886, - [SMALL_STATE(410)] = 26922, - [SMALL_STATE(411)] = 26958, - [SMALL_STATE(412)] = 26994, - [SMALL_STATE(413)] = 27030, - [SMALL_STATE(414)] = 27066, - [SMALL_STATE(415)] = 27101, - [SMALL_STATE(416)] = 27136, - [SMALL_STATE(417)] = 27205, - [SMALL_STATE(418)] = 27238, - [SMALL_STATE(419)] = 27273, - [SMALL_STATE(420)] = 27307, - [SMALL_STATE(421)] = 27341, - [SMALL_STATE(422)] = 27378, - [SMALL_STATE(423)] = 27415, - [SMALL_STATE(424)] = 27452, - [SMALL_STATE(425)] = 27489, - [SMALL_STATE(426)] = 27526, - [SMALL_STATE(427)] = 27563, - [SMALL_STATE(428)] = 27600, - [SMALL_STATE(429)] = 27637, - [SMALL_STATE(430)] = 27676, - [SMALL_STATE(431)] = 27713, - [SMALL_STATE(432)] = 27750, - [SMALL_STATE(433)] = 27787, - [SMALL_STATE(434)] = 27824, - [SMALL_STATE(435)] = 27861, - [SMALL_STATE(436)] = 27898, - [SMALL_STATE(437)] = 27935, - [SMALL_STATE(438)] = 27972, - [SMALL_STATE(439)] = 28037, - [SMALL_STATE(440)] = 28074, - [SMALL_STATE(441)] = 28111, - [SMALL_STATE(442)] = 28148, - [SMALL_STATE(443)] = 28188, - [SMALL_STATE(444)] = 28224, - [SMALL_STATE(445)] = 28260, - [SMALL_STATE(446)] = 28290, - [SMALL_STATE(447)] = 28322, - [SMALL_STATE(448)] = 28380, - [SMALL_STATE(449)] = 28416, - [SMALL_STATE(450)] = 28447, - [SMALL_STATE(451)] = 28478, - [SMALL_STATE(452)] = 28511, - [SMALL_STATE(453)] = 28544, - [SMALL_STATE(454)] = 28577, - [SMALL_STATE(455)] = 28608, - [SMALL_STATE(456)] = 28639, - [SMALL_STATE(457)] = 28670, - [SMALL_STATE(458)] = 28701, - [SMALL_STATE(459)] = 28732, - [SMALL_STATE(460)] = 28763, - [SMALL_STATE(461)] = 28794, - [SMALL_STATE(462)] = 28825, - [SMALL_STATE(463)] = 28856, - [SMALL_STATE(464)] = 28913, - [SMALL_STATE(465)] = 28944, - [SMALL_STATE(466)] = 28975, - [SMALL_STATE(467)] = 29006, - [SMALL_STATE(468)] = 29037, - [SMALL_STATE(469)] = 29068, - [SMALL_STATE(470)] = 29099, - [SMALL_STATE(471)] = 29130, - [SMALL_STATE(472)] = 29161, - [SMALL_STATE(473)] = 29192, - [SMALL_STATE(474)] = 29223, - [SMALL_STATE(475)] = 29254, - [SMALL_STATE(476)] = 29285, - [SMALL_STATE(477)] = 29316, - [SMALL_STATE(478)] = 29347, - [SMALL_STATE(479)] = 29404, - [SMALL_STATE(480)] = 29435, - [SMALL_STATE(481)] = 29468, - [SMALL_STATE(482)] = 29499, - [SMALL_STATE(483)] = 29530, - [SMALL_STATE(484)] = 29561, - [SMALL_STATE(485)] = 29592, - [SMALL_STATE(486)] = 29623, - [SMALL_STATE(487)] = 29654, - [SMALL_STATE(488)] = 29685, - [SMALL_STATE(489)] = 29716, - [SMALL_STATE(490)] = 29747, - [SMALL_STATE(491)] = 29778, - [SMALL_STATE(492)] = 29811, - [SMALL_STATE(493)] = 29842, - [SMALL_STATE(494)] = 29875, - [SMALL_STATE(495)] = 29905, - [SMALL_STATE(496)] = 29935, - [SMALL_STATE(497)] = 29989, - [SMALL_STATE(498)] = 30043, - [SMALL_STATE(499)] = 30071, - [SMALL_STATE(500)] = 30101, - [SMALL_STATE(501)] = 30155, - [SMALL_STATE(502)] = 30185, - [SMALL_STATE(503)] = 30215, - [SMALL_STATE(504)] = 30245, - [SMALL_STATE(505)] = 30275, - [SMALL_STATE(506)] = 30305, - [SMALL_STATE(507)] = 30335, - [SMALL_STATE(508)] = 30365, - [SMALL_STATE(509)] = 30397, - [SMALL_STATE(510)] = 30431, - [SMALL_STATE(511)] = 30461, - [SMALL_STATE(512)] = 30491, - [SMALL_STATE(513)] = 30521, - [SMALL_STATE(514)] = 30551, - [SMALL_STATE(515)] = 30581, - [SMALL_STATE(516)] = 30611, - [SMALL_STATE(517)] = 30641, - [SMALL_STATE(518)] = 30671, - [SMALL_STATE(519)] = 30698, - [SMALL_STATE(520)] = 30749, - [SMALL_STATE(521)] = 30776, - [SMALL_STATE(522)] = 30803, - [SMALL_STATE(523)] = 30830, - [SMALL_STATE(524)] = 30857, - [SMALL_STATE(525)] = 30884, - [SMALL_STATE(526)] = 30911, - [SMALL_STATE(527)] = 30938, - [SMALL_STATE(528)] = 30965, - [SMALL_STATE(529)] = 30992, - [SMALL_STATE(530)] = 31019, - [SMALL_STATE(531)] = 31046, - [SMALL_STATE(532)] = 31073, - [SMALL_STATE(533)] = 31100, - [SMALL_STATE(534)] = 31127, - [SMALL_STATE(535)] = 31154, - [SMALL_STATE(536)] = 31181, - [SMALL_STATE(537)] = 31232, - [SMALL_STATE(538)] = 31259, - [SMALL_STATE(539)] = 31286, - [SMALL_STATE(540)] = 31313, - [SMALL_STATE(541)] = 31340, - [SMALL_STATE(542)] = 31367, - [SMALL_STATE(543)] = 31394, - [SMALL_STATE(544)] = 31421, - [SMALL_STATE(545)] = 31448, - [SMALL_STATE(546)] = 31475, - [SMALL_STATE(547)] = 31506, - [SMALL_STATE(548)] = 31533, - [SMALL_STATE(549)] = 31560, - [SMALL_STATE(550)] = 31587, - [SMALL_STATE(551)] = 31614, - [SMALL_STATE(552)] = 31641, - [SMALL_STATE(553)] = 31668, - [SMALL_STATE(554)] = 31695, - [SMALL_STATE(555)] = 31722, - [SMALL_STATE(556)] = 31773, - [SMALL_STATE(557)] = 31800, - [SMALL_STATE(558)] = 31827, - [SMALL_STATE(559)] = 31854, - [SMALL_STATE(560)] = 31905, - [SMALL_STATE(561)] = 31932, - [SMALL_STATE(562)] = 31959, - [SMALL_STATE(563)] = 31986, - [SMALL_STATE(564)] = 32013, - [SMALL_STATE(565)] = 32040, - [SMALL_STATE(566)] = 32067, - [SMALL_STATE(567)] = 32094, - [SMALL_STATE(568)] = 32121, - [SMALL_STATE(569)] = 32172, - [SMALL_STATE(570)] = 32199, - [SMALL_STATE(571)] = 32250, - [SMALL_STATE(572)] = 32277, - [SMALL_STATE(573)] = 32308, - [SMALL_STATE(574)] = 32335, - [SMALL_STATE(575)] = 32362, - [SMALL_STATE(576)] = 32389, - [SMALL_STATE(577)] = 32417, - [SMALL_STATE(578)] = 32465, - [SMALL_STATE(579)] = 32491, - [SMALL_STATE(580)] = 32519, - [SMALL_STATE(581)] = 32547, - [SMALL_STATE(582)] = 32573, - [SMALL_STATE(583)] = 32619, - [SMALL_STATE(584)] = 32665, - [SMALL_STATE(585)] = 32713, - [SMALL_STATE(586)] = 32741, - [SMALL_STATE(587)] = 32789, - [SMALL_STATE(588)] = 32817, - [SMALL_STATE(589)] = 32865, - [SMALL_STATE(590)] = 32891, - [SMALL_STATE(591)] = 32937, - [SMALL_STATE(592)] = 32985, - [SMALL_STATE(593)] = 33013, - [SMALL_STATE(594)] = 33038, - [SMALL_STATE(595)] = 33063, - [SMALL_STATE(596)] = 33106, - [SMALL_STATE(597)] = 33131, - [SMALL_STATE(598)] = 33156, - [SMALL_STATE(599)] = 33181, - [SMALL_STATE(600)] = 33206, - [SMALL_STATE(601)] = 33251, - [SMALL_STATE(602)] = 33296, - [SMALL_STATE(603)] = 33321, - [SMALL_STATE(604)] = 33346, - [SMALL_STATE(605)] = 33371, - [SMALL_STATE(606)] = 33396, - [SMALL_STATE(607)] = 33436, - [SMALL_STATE(608)] = 33476, - [SMALL_STATE(609)] = 33516, - [SMALL_STATE(610)] = 33556, - [SMALL_STATE(611)] = 33597, - [SMALL_STATE(612)] = 33638, - [SMALL_STATE(613)] = 33675, - [SMALL_STATE(614)] = 33712, - [SMALL_STATE(615)] = 33749, - [SMALL_STATE(616)] = 33790, - [SMALL_STATE(617)] = 33814, - [SMALL_STATE(618)] = 33850, - [SMALL_STATE(619)] = 33874, - [SMALL_STATE(620)] = 33898, - [SMALL_STATE(621)] = 33922, - [SMALL_STATE(622)] = 33946, - [SMALL_STATE(623)] = 33970, - [SMALL_STATE(624)] = 34008, - [SMALL_STATE(625)] = 34042, - [SMALL_STATE(626)] = 34066, - [SMALL_STATE(627)] = 34090, - [SMALL_STATE(628)] = 34124, - [SMALL_STATE(629)] = 34157, - [SMALL_STATE(630)] = 34192, - [SMALL_STATE(631)] = 34227, - [SMALL_STATE(632)] = 34248, - [SMALL_STATE(633)] = 34283, - [SMALL_STATE(634)] = 34318, - [SMALL_STATE(635)] = 34353, - [SMALL_STATE(636)] = 34388, - [SMALL_STATE(637)] = 34423, - [SMALL_STATE(638)] = 34458, - [SMALL_STATE(639)] = 34493, - [SMALL_STATE(640)] = 34528, - [SMALL_STATE(641)] = 34563, - [SMALL_STATE(642)] = 34596, - [SMALL_STATE(643)] = 34631, - [SMALL_STATE(644)] = 34666, - [SMALL_STATE(645)] = 34701, - [SMALL_STATE(646)] = 34736, - [SMALL_STATE(647)] = 34769, - [SMALL_STATE(648)] = 34804, - [SMALL_STATE(649)] = 34839, - [SMALL_STATE(650)] = 34870, - [SMALL_STATE(651)] = 34905, - [SMALL_STATE(652)] = 34940, - [SMALL_STATE(653)] = 34975, - [SMALL_STATE(654)] = 34996, - [SMALL_STATE(655)] = 35031, - [SMALL_STATE(656)] = 35066, - [SMALL_STATE(657)] = 35101, - [SMALL_STATE(658)] = 35136, - [SMALL_STATE(659)] = 35167, - [SMALL_STATE(660)] = 35198, - [SMALL_STATE(661)] = 35233, - [SMALL_STATE(662)] = 35268, - [SMALL_STATE(663)] = 35299, - [SMALL_STATE(664)] = 35334, - [SMALL_STATE(665)] = 35369, - [SMALL_STATE(666)] = 35404, - [SMALL_STATE(667)] = 35439, - [SMALL_STATE(668)] = 35474, - [SMALL_STATE(669)] = 35507, - [SMALL_STATE(670)] = 35539, - [SMALL_STATE(671)] = 35571, - [SMALL_STATE(672)] = 35603, - [SMALL_STATE(673)] = 35635, - [SMALL_STATE(674)] = 35663, - [SMALL_STATE(675)] = 35695, - [SMALL_STATE(676)] = 35727, - [SMALL_STATE(677)] = 35759, - [SMALL_STATE(678)] = 35791, - [SMALL_STATE(679)] = 35819, - [SMALL_STATE(680)] = 35847, - [SMALL_STATE(681)] = 35879, - [SMALL_STATE(682)] = 35911, - [SMALL_STATE(683)] = 35943, - [SMALL_STATE(684)] = 35975, - [SMALL_STATE(685)] = 36001, - [SMALL_STATE(686)] = 36033, - [SMALL_STATE(687)] = 36065, - [SMALL_STATE(688)] = 36097, - [SMALL_STATE(689)] = 36125, - [SMALL_STATE(690)] = 36157, - [SMALL_STATE(691)] = 36189, - [SMALL_STATE(692)] = 36217, - [SMALL_STATE(693)] = 36245, - [SMALL_STATE(694)] = 36277, - [SMALL_STATE(695)] = 36309, - [SMALL_STATE(696)] = 36335, - [SMALL_STATE(697)] = 36367, - [SMALL_STATE(698)] = 36399, - [SMALL_STATE(699)] = 36431, - [SMALL_STATE(700)] = 36463, - [SMALL_STATE(701)] = 36495, - [SMALL_STATE(702)] = 36527, - [SMALL_STATE(703)] = 36556, - [SMALL_STATE(704)] = 36577, - [SMALL_STATE(705)] = 36606, - [SMALL_STATE(706)] = 36635, - [SMALL_STATE(707)] = 36662, - [SMALL_STATE(708)] = 36691, - [SMALL_STATE(709)] = 36720, - [SMALL_STATE(710)] = 36745, - [SMALL_STATE(711)] = 36774, - [SMALL_STATE(712)] = 36803, - [SMALL_STATE(713)] = 36832, - [SMALL_STATE(714)] = 36859, - [SMALL_STATE(715)] = 36878, - [SMALL_STATE(716)] = 36907, - [SMALL_STATE(717)] = 36936, - [SMALL_STATE(718)] = 36965, - [SMALL_STATE(719)] = 36994, - [SMALL_STATE(720)] = 37023, - [SMALL_STATE(721)] = 37048, - [SMALL_STATE(722)] = 37073, - [SMALL_STATE(723)] = 37102, - [SMALL_STATE(724)] = 37131, - [SMALL_STATE(725)] = 37160, - [SMALL_STATE(726)] = 37179, - [SMALL_STATE(727)] = 37208, - [SMALL_STATE(728)] = 37237, - [SMALL_STATE(729)] = 37262, - [SMALL_STATE(730)] = 37287, - [SMALL_STATE(731)] = 37316, - [SMALL_STATE(732)] = 37343, - [SMALL_STATE(733)] = 37372, - [SMALL_STATE(734)] = 37397, - [SMALL_STATE(735)] = 37426, - [SMALL_STATE(736)] = 37455, - [SMALL_STATE(737)] = 37480, - [SMALL_STATE(738)] = 37499, - [SMALL_STATE(739)] = 37528, - [SMALL_STATE(740)] = 37551, - [SMALL_STATE(741)] = 37580, - [SMALL_STATE(742)] = 37609, - [SMALL_STATE(743)] = 37636, - [SMALL_STATE(744)] = 37665, - [SMALL_STATE(745)] = 37694, - [SMALL_STATE(746)] = 37721, - [SMALL_STATE(747)] = 37746, - [SMALL_STATE(748)] = 37765, - [SMALL_STATE(749)] = 37794, - [SMALL_STATE(750)] = 37823, - [SMALL_STATE(751)] = 37852, - [SMALL_STATE(752)] = 37877, - [SMALL_STATE(753)] = 37904, - [SMALL_STATE(754)] = 37923, - [SMALL_STATE(755)] = 37948, - [SMALL_STATE(756)] = 37967, - [SMALL_STATE(757)] = 37996, - [SMALL_STATE(758)] = 38023, - [SMALL_STATE(759)] = 38050, - [SMALL_STATE(760)] = 38079, - [SMALL_STATE(761)] = 38108, - [SMALL_STATE(762)] = 38137, - [SMALL_STATE(763)] = 38162, - [SMALL_STATE(764)] = 38191, - [SMALL_STATE(765)] = 38220, - [SMALL_STATE(766)] = 38249, - [SMALL_STATE(767)] = 38278, - [SMALL_STATE(768)] = 38307, - [SMALL_STATE(769)] = 38336, - [SMALL_STATE(770)] = 38365, - [SMALL_STATE(771)] = 38388, - [SMALL_STATE(772)] = 38417, - [SMALL_STATE(773)] = 38446, - [SMALL_STATE(774)] = 38471, - [SMALL_STATE(775)] = 38500, - [SMALL_STATE(776)] = 38529, - [SMALL_STATE(777)] = 38558, - [SMALL_STATE(778)] = 38587, - [SMALL_STATE(779)] = 38616, - [SMALL_STATE(780)] = 38645, - [SMALL_STATE(781)] = 38674, - [SMALL_STATE(782)] = 38695, - [SMALL_STATE(783)] = 38724, - [SMALL_STATE(784)] = 38753, - [SMALL_STATE(785)] = 38782, - [SMALL_STATE(786)] = 38801, - [SMALL_STATE(787)] = 38826, - [SMALL_STATE(788)] = 38855, - [SMALL_STATE(789)] = 38884, - [SMALL_STATE(790)] = 38909, - [SMALL_STATE(791)] = 38938, - [SMALL_STATE(792)] = 38963, - [SMALL_STATE(793)] = 38992, - [SMALL_STATE(794)] = 39017, - [SMALL_STATE(795)] = 39046, - [SMALL_STATE(796)] = 39075, - [SMALL_STATE(797)] = 39100, - [SMALL_STATE(798)] = 39129, - [SMALL_STATE(799)] = 39158, - [SMALL_STATE(800)] = 39187, - [SMALL_STATE(801)] = 39214, - [SMALL_STATE(802)] = 39243, - [SMALL_STATE(803)] = 39272, - [SMALL_STATE(804)] = 39299, - [SMALL_STATE(805)] = 39328, - [SMALL_STATE(806)] = 39357, - [SMALL_STATE(807)] = 39381, - [SMALL_STATE(808)] = 39401, - [SMALL_STATE(809)] = 39425, - [SMALL_STATE(810)] = 39451, - [SMALL_STATE(811)] = 39477, - [SMALL_STATE(812)] = 39497, - [SMALL_STATE(813)] = 39523, - [SMALL_STATE(814)] = 39545, - [SMALL_STATE(815)] = 39571, - [SMALL_STATE(816)] = 39589, - [SMALL_STATE(817)] = 39607, - [SMALL_STATE(818)] = 39633, - [SMALL_STATE(819)] = 39653, - [SMALL_STATE(820)] = 39679, - [SMALL_STATE(821)] = 39705, - [SMALL_STATE(822)] = 39731, - [SMALL_STATE(823)] = 39757, - [SMALL_STATE(824)] = 39783, - [SMALL_STATE(825)] = 39809, - [SMALL_STATE(826)] = 39835, - [SMALL_STATE(827)] = 39861, - [SMALL_STATE(828)] = 39887, - [SMALL_STATE(829)] = 39913, - [SMALL_STATE(830)] = 39937, - [SMALL_STATE(831)] = 39959, - [SMALL_STATE(832)] = 39983, - [SMALL_STATE(833)] = 40007, - [SMALL_STATE(834)] = 40033, - [SMALL_STATE(835)] = 40059, - [SMALL_STATE(836)] = 40083, - [SMALL_STATE(837)] = 40109, - [SMALL_STATE(838)] = 40135, - [SMALL_STATE(839)] = 40155, - [SMALL_STATE(840)] = 40181, - [SMALL_STATE(841)] = 40207, - [SMALL_STATE(842)] = 40233, - [SMALL_STATE(843)] = 40259, - [SMALL_STATE(844)] = 40285, - [SMALL_STATE(845)] = 40311, - [SMALL_STATE(846)] = 40335, - [SMALL_STATE(847)] = 40361, - [SMALL_STATE(848)] = 40385, - [SMALL_STATE(849)] = 40407, - [SMALL_STATE(850)] = 40431, - [SMALL_STATE(851)] = 40457, - [SMALL_STATE(852)] = 40477, - [SMALL_STATE(853)] = 40495, - [SMALL_STATE(854)] = 40515, - [SMALL_STATE(855)] = 40541, - [SMALL_STATE(856)] = 40565, - [SMALL_STATE(857)] = 40591, - [SMALL_STATE(858)] = 40617, - [SMALL_STATE(859)] = 40643, - [SMALL_STATE(860)] = 40669, - [SMALL_STATE(861)] = 40691, - [SMALL_STATE(862)] = 40717, - [SMALL_STATE(863)] = 40743, - [SMALL_STATE(864)] = 40767, - [SMALL_STATE(865)] = 40791, - [SMALL_STATE(866)] = 40813, - [SMALL_STATE(867)] = 40839, - [SMALL_STATE(868)] = 40861, - [SMALL_STATE(869)] = 40883, - [SMALL_STATE(870)] = 40901, - [SMALL_STATE(871)] = 40927, - [SMALL_STATE(872)] = 40951, - [SMALL_STATE(873)] = 40977, - [SMALL_STATE(874)] = 41003, - [SMALL_STATE(875)] = 41025, - [SMALL_STATE(876)] = 41043, - [SMALL_STATE(877)] = 41069, - [SMALL_STATE(878)] = 41087, - [SMALL_STATE(879)] = 41109, - [SMALL_STATE(880)] = 41135, - [SMALL_STATE(881)] = 41157, - [SMALL_STATE(882)] = 41179, - [SMALL_STATE(883)] = 41201, - [SMALL_STATE(884)] = 41225, - [SMALL_STATE(885)] = 41247, - [SMALL_STATE(886)] = 41271, - [SMALL_STATE(887)] = 41297, - [SMALL_STATE(888)] = 41317, - [SMALL_STATE(889)] = 41339, - [SMALL_STATE(890)] = 41365, - [SMALL_STATE(891)] = 41391, - [SMALL_STATE(892)] = 41415, - [SMALL_STATE(893)] = 41439, - [SMALL_STATE(894)] = 41461, - [SMALL_STATE(895)] = 41487, - [SMALL_STATE(896)] = 41511, - [SMALL_STATE(897)] = 41537, - [SMALL_STATE(898)] = 41559, - [SMALL_STATE(899)] = 41581, - [SMALL_STATE(900)] = 41607, - [SMALL_STATE(901)] = 41633, - [SMALL_STATE(902)] = 41659, - [SMALL_STATE(903)] = 41683, - [SMALL_STATE(904)] = 41709, - [SMALL_STATE(905)] = 41731, - [SMALL_STATE(906)] = 41757, - [SMALL_STATE(907)] = 41779, - [SMALL_STATE(908)] = 41803, - [SMALL_STATE(909)] = 41827, - [SMALL_STATE(910)] = 41853, - [SMALL_STATE(911)] = 41877, - [SMALL_STATE(912)] = 41899, - [SMALL_STATE(913)] = 41925, - [SMALL_STATE(914)] = 41951, - [SMALL_STATE(915)] = 41975, - [SMALL_STATE(916)] = 41995, - [SMALL_STATE(917)] = 42021, - [SMALL_STATE(918)] = 42043, - [SMALL_STATE(919)] = 42063, - [SMALL_STATE(920)] = 42089, - [SMALL_STATE(921)] = 42115, - [SMALL_STATE(922)] = 42135, - [SMALL_STATE(923)] = 42155, - [SMALL_STATE(924)] = 42181, - [SMALL_STATE(925)] = 42207, - [SMALL_STATE(926)] = 42227, - [SMALL_STATE(927)] = 42253, - [SMALL_STATE(928)] = 42274, - [SMALL_STATE(929)] = 42297, - [SMALL_STATE(930)] = 42318, - [SMALL_STATE(931)] = 42339, - [SMALL_STATE(932)] = 42358, - [SMALL_STATE(933)] = 42381, - [SMALL_STATE(934)] = 42402, - [SMALL_STATE(935)] = 42423, - [SMALL_STATE(936)] = 42444, - [SMALL_STATE(937)] = 42465, - [SMALL_STATE(938)] = 42486, - [SMALL_STATE(939)] = 42507, - [SMALL_STATE(940)] = 42528, - [SMALL_STATE(941)] = 42551, - [SMALL_STATE(942)] = 42568, - [SMALL_STATE(943)] = 42587, - [SMALL_STATE(944)] = 42608, - [SMALL_STATE(945)] = 42625, - [SMALL_STATE(946)] = 42644, - [SMALL_STATE(947)] = 42667, - [SMALL_STATE(948)] = 42684, - [SMALL_STATE(949)] = 42701, - [SMALL_STATE(950)] = 42724, - [SMALL_STATE(951)] = 42741, - [SMALL_STATE(952)] = 42758, - [SMALL_STATE(953)] = 42781, - [SMALL_STATE(954)] = 42804, - [SMALL_STATE(955)] = 42821, - [SMALL_STATE(956)] = 42844, - [SMALL_STATE(957)] = 42867, - [SMALL_STATE(958)] = 42884, - [SMALL_STATE(959)] = 42905, - [SMALL_STATE(960)] = 42926, - [SMALL_STATE(961)] = 42943, - [SMALL_STATE(962)] = 42964, - [SMALL_STATE(963)] = 42985, - [SMALL_STATE(964)] = 43008, - [SMALL_STATE(965)] = 43029, - [SMALL_STATE(966)] = 43052, - [SMALL_STATE(967)] = 43075, - [SMALL_STATE(968)] = 43094, - [SMALL_STATE(969)] = 43115, - [SMALL_STATE(970)] = 43136, - [SMALL_STATE(971)] = 43157, - [SMALL_STATE(972)] = 43178, - [SMALL_STATE(973)] = 43199, - [SMALL_STATE(974)] = 43220, - [SMALL_STATE(975)] = 43243, - [SMALL_STATE(976)] = 43264, - [SMALL_STATE(977)] = 43285, - [SMALL_STATE(978)] = 43302, - [SMALL_STATE(979)] = 43319, - [SMALL_STATE(980)] = 43336, - [SMALL_STATE(981)] = 43353, - [SMALL_STATE(982)] = 43372, - [SMALL_STATE(983)] = 43389, - [SMALL_STATE(984)] = 43410, - [SMALL_STATE(985)] = 43431, - [SMALL_STATE(986)] = 43454, - [SMALL_STATE(987)] = 43475, - [SMALL_STATE(988)] = 43492, - [SMALL_STATE(989)] = 43509, - [SMALL_STATE(990)] = 43529, - [SMALL_STATE(991)] = 43549, - [SMALL_STATE(992)] = 43567, - [SMALL_STATE(993)] = 43587, - [SMALL_STATE(994)] = 43603, - [SMALL_STATE(995)] = 43619, - [SMALL_STATE(996)] = 43639, - [SMALL_STATE(997)] = 43659, - [SMALL_STATE(998)] = 43679, - [SMALL_STATE(999)] = 43699, - [SMALL_STATE(1000)] = 43717, - [SMALL_STATE(1001)] = 43735, - [SMALL_STATE(1002)] = 43755, - [SMALL_STATE(1003)] = 43771, - [SMALL_STATE(1004)] = 43791, - [SMALL_STATE(1005)] = 43809, - [SMALL_STATE(1006)] = 43827, - [SMALL_STATE(1007)] = 43843, - [SMALL_STATE(1008)] = 43861, - [SMALL_STATE(1009)] = 43879, - [SMALL_STATE(1010)] = 43895, - [SMALL_STATE(1011)] = 43911, - [SMALL_STATE(1012)] = 43927, - [SMALL_STATE(1013)] = 43943, - [SMALL_STATE(1014)] = 43959, - [SMALL_STATE(1015)] = 43979, - [SMALL_STATE(1016)] = 43999, - [SMALL_STATE(1017)] = 44019, - [SMALL_STATE(1018)] = 44039, - [SMALL_STATE(1019)] = 44059, - [SMALL_STATE(1020)] = 44077, - [SMALL_STATE(1021)] = 44097, - [SMALL_STATE(1022)] = 44113, - [SMALL_STATE(1023)] = 44129, - [SMALL_STATE(1024)] = 44145, - [SMALL_STATE(1025)] = 44161, - [SMALL_STATE(1026)] = 44181, - [SMALL_STATE(1027)] = 44197, - [SMALL_STATE(1028)] = 44213, - [SMALL_STATE(1029)] = 44229, - [SMALL_STATE(1030)] = 44247, - [SMALL_STATE(1031)] = 44267, - [SMALL_STATE(1032)] = 44285, - [SMALL_STATE(1033)] = 44303, - [SMALL_STATE(1034)] = 44319, - [SMALL_STATE(1035)] = 44335, - [SMALL_STATE(1036)] = 44355, - [SMALL_STATE(1037)] = 44375, - [SMALL_STATE(1038)] = 44393, - [SMALL_STATE(1039)] = 44411, - [SMALL_STATE(1040)] = 44427, - [SMALL_STATE(1041)] = 44447, - [SMALL_STATE(1042)] = 44467, - [SMALL_STATE(1043)] = 44485, - [SMALL_STATE(1044)] = 44505, - [SMALL_STATE(1045)] = 44523, - [SMALL_STATE(1046)] = 44543, - [SMALL_STATE(1047)] = 44563, - [SMALL_STATE(1048)] = 44583, - [SMALL_STATE(1049)] = 44603, - [SMALL_STATE(1050)] = 44623, - [SMALL_STATE(1051)] = 44643, - [SMALL_STATE(1052)] = 44661, - [SMALL_STATE(1053)] = 44681, - [SMALL_STATE(1054)] = 44701, - [SMALL_STATE(1055)] = 44719, - [SMALL_STATE(1056)] = 44737, - [SMALL_STATE(1057)] = 44753, - [SMALL_STATE(1058)] = 44769, - [SMALL_STATE(1059)] = 44789, - [SMALL_STATE(1060)] = 44807, - [SMALL_STATE(1061)] = 44825, - [SMALL_STATE(1062)] = 44841, - [SMALL_STATE(1063)] = 44861, - [SMALL_STATE(1064)] = 44879, - [SMALL_STATE(1065)] = 44899, - [SMALL_STATE(1066)] = 44919, - [SMALL_STATE(1067)] = 44939, - [SMALL_STATE(1068)] = 44957, - [SMALL_STATE(1069)] = 44973, - [SMALL_STATE(1070)] = 44989, - [SMALL_STATE(1071)] = 45009, - [SMALL_STATE(1072)] = 45029, - [SMALL_STATE(1073)] = 45047, - [SMALL_STATE(1074)] = 45067, - [SMALL_STATE(1075)] = 45083, - [SMALL_STATE(1076)] = 45099, - [SMALL_STATE(1077)] = 45119, - [SMALL_STATE(1078)] = 45135, - [SMALL_STATE(1079)] = 45151, - [SMALL_STATE(1080)] = 45167, - [SMALL_STATE(1081)] = 45183, - [SMALL_STATE(1082)] = 45199, - [SMALL_STATE(1083)] = 45215, - [SMALL_STATE(1084)] = 45233, - [SMALL_STATE(1085)] = 45249, - [SMALL_STATE(1086)] = 45265, - [SMALL_STATE(1087)] = 45281, - [SMALL_STATE(1088)] = 45297, - [SMALL_STATE(1089)] = 45317, - [SMALL_STATE(1090)] = 45337, - [SMALL_STATE(1091)] = 45353, - [SMALL_STATE(1092)] = 45369, - [SMALL_STATE(1093)] = 45385, - [SMALL_STATE(1094)] = 45401, - [SMALL_STATE(1095)] = 45421, - [SMALL_STATE(1096)] = 45437, - [SMALL_STATE(1097)] = 45453, - [SMALL_STATE(1098)] = 45469, - [SMALL_STATE(1099)] = 45485, - [SMALL_STATE(1100)] = 45501, - [SMALL_STATE(1101)] = 45517, - [SMALL_STATE(1102)] = 45533, - [SMALL_STATE(1103)] = 45553, - [SMALL_STATE(1104)] = 45569, - [SMALL_STATE(1105)] = 45585, - [SMALL_STATE(1106)] = 45601, - [SMALL_STATE(1107)] = 45621, - [SMALL_STATE(1108)] = 45637, - [SMALL_STATE(1109)] = 45655, - [SMALL_STATE(1110)] = 45673, - [SMALL_STATE(1111)] = 45693, - [SMALL_STATE(1112)] = 45713, - [SMALL_STATE(1113)] = 45733, - [SMALL_STATE(1114)] = 45749, - [SMALL_STATE(1115)] = 45765, - [SMALL_STATE(1116)] = 45783, - [SMALL_STATE(1117)] = 45799, - [SMALL_STATE(1118)] = 45819, - [SMALL_STATE(1119)] = 45835, - [SMALL_STATE(1120)] = 45853, - [SMALL_STATE(1121)] = 45873, - [SMALL_STATE(1122)] = 45889, - [SMALL_STATE(1123)] = 45909, - [SMALL_STATE(1124)] = 45929, - [SMALL_STATE(1125)] = 45949, - [SMALL_STATE(1126)] = 45969, - [SMALL_STATE(1127)] = 45987, - [SMALL_STATE(1128)] = 46005, - [SMALL_STATE(1129)] = 46025, - [SMALL_STATE(1130)] = 46045, - [SMALL_STATE(1131)] = 46065, - [SMALL_STATE(1132)] = 46085, - [SMALL_STATE(1133)] = 46103, - [SMALL_STATE(1134)] = 46123, - [SMALL_STATE(1135)] = 46141, - [SMALL_STATE(1136)] = 46159, - [SMALL_STATE(1137)] = 46176, - [SMALL_STATE(1138)] = 46193, - [SMALL_STATE(1139)] = 46210, - [SMALL_STATE(1140)] = 46227, - [SMALL_STATE(1141)] = 46244, - [SMALL_STATE(1142)] = 46259, - [SMALL_STATE(1143)] = 46274, - [SMALL_STATE(1144)] = 46289, - [SMALL_STATE(1145)] = 46304, - [SMALL_STATE(1146)] = 46319, - [SMALL_STATE(1147)] = 46336, - [SMALL_STATE(1148)] = 46351, - [SMALL_STATE(1149)] = 46368, - [SMALL_STATE(1150)] = 46383, - [SMALL_STATE(1151)] = 46398, - [SMALL_STATE(1152)] = 46413, - [SMALL_STATE(1153)] = 46428, - [SMALL_STATE(1154)] = 46443, - [SMALL_STATE(1155)] = 46460, - [SMALL_STATE(1156)] = 46475, - [SMALL_STATE(1157)] = 46492, - [SMALL_STATE(1158)] = 46507, - [SMALL_STATE(1159)] = 46522, - [SMALL_STATE(1160)] = 46537, - [SMALL_STATE(1161)] = 46554, - [SMALL_STATE(1162)] = 46569, - [SMALL_STATE(1163)] = 46584, - [SMALL_STATE(1164)] = 46601, - [SMALL_STATE(1165)] = 46618, - [SMALL_STATE(1166)] = 46633, - [SMALL_STATE(1167)] = 46648, - [SMALL_STATE(1168)] = 46663, - [SMALL_STATE(1169)] = 46678, - [SMALL_STATE(1170)] = 46693, - [SMALL_STATE(1171)] = 46708, - [SMALL_STATE(1172)] = 46723, - [SMALL_STATE(1173)] = 46738, - [SMALL_STATE(1174)] = 46753, - [SMALL_STATE(1175)] = 46770, - [SMALL_STATE(1176)] = 46785, - [SMALL_STATE(1177)] = 46800, - [SMALL_STATE(1178)] = 46815, - [SMALL_STATE(1179)] = 46830, - [SMALL_STATE(1180)] = 46845, - [SMALL_STATE(1181)] = 46860, - [SMALL_STATE(1182)] = 46875, - [SMALL_STATE(1183)] = 46892, - [SMALL_STATE(1184)] = 46907, - [SMALL_STATE(1185)] = 46922, - [SMALL_STATE(1186)] = 46937, - [SMALL_STATE(1187)] = 46952, - [SMALL_STATE(1188)] = 46967, - [SMALL_STATE(1189)] = 46982, - [SMALL_STATE(1190)] = 46999, - [SMALL_STATE(1191)] = 47014, - [SMALL_STATE(1192)] = 47029, - [SMALL_STATE(1193)] = 47044, - [SMALL_STATE(1194)] = 47059, - [SMALL_STATE(1195)] = 47074, - [SMALL_STATE(1196)] = 47089, - [SMALL_STATE(1197)] = 47104, - [SMALL_STATE(1198)] = 47119, - [SMALL_STATE(1199)] = 47134, - [SMALL_STATE(1200)] = 47149, - [SMALL_STATE(1201)] = 47164, - [SMALL_STATE(1202)] = 47179, - [SMALL_STATE(1203)] = 47194, - [SMALL_STATE(1204)] = 47209, - [SMALL_STATE(1205)] = 47224, - [SMALL_STATE(1206)] = 47239, - [SMALL_STATE(1207)] = 47254, - [SMALL_STATE(1208)] = 47269, - [SMALL_STATE(1209)] = 47286, - [SMALL_STATE(1210)] = 47301, - [SMALL_STATE(1211)] = 47316, - [SMALL_STATE(1212)] = 47331, - [SMALL_STATE(1213)] = 47346, - [SMALL_STATE(1214)] = 47361, - [SMALL_STATE(1215)] = 47378, - [SMALL_STATE(1216)] = 47393, - [SMALL_STATE(1217)] = 47410, - [SMALL_STATE(1218)] = 47425, - [SMALL_STATE(1219)] = 47440, - [SMALL_STATE(1220)] = 47455, - [SMALL_STATE(1221)] = 47470, - [SMALL_STATE(1222)] = 47485, - [SMALL_STATE(1223)] = 47500, - [SMALL_STATE(1224)] = 47517, - [SMALL_STATE(1225)] = 47532, - [SMALL_STATE(1226)] = 47547, - [SMALL_STATE(1227)] = 47562, - [SMALL_STATE(1228)] = 47577, - [SMALL_STATE(1229)] = 47592, - [SMALL_STATE(1230)] = 47607, - [SMALL_STATE(1231)] = 47622, - [SMALL_STATE(1232)] = 47637, - [SMALL_STATE(1233)] = 47652, - [SMALL_STATE(1234)] = 47669, - [SMALL_STATE(1235)] = 47684, - [SMALL_STATE(1236)] = 47699, - [SMALL_STATE(1237)] = 47716, - [SMALL_STATE(1238)] = 47733, - [SMALL_STATE(1239)] = 47748, - [SMALL_STATE(1240)] = 47763, - [SMALL_STATE(1241)] = 47780, - [SMALL_STATE(1242)] = 47795, - [SMALL_STATE(1243)] = 47810, - [SMALL_STATE(1244)] = 47827, - [SMALL_STATE(1245)] = 47844, - [SMALL_STATE(1246)] = 47859, - [SMALL_STATE(1247)] = 47874, - [SMALL_STATE(1248)] = 47891, - [SMALL_STATE(1249)] = 47906, - [SMALL_STATE(1250)] = 47923, - [SMALL_STATE(1251)] = 47938, - [SMALL_STATE(1252)] = 47955, - [SMALL_STATE(1253)] = 47970, - [SMALL_STATE(1254)] = 47985, - [SMALL_STATE(1255)] = 48002, - [SMALL_STATE(1256)] = 48019, - [SMALL_STATE(1257)] = 48034, - [SMALL_STATE(1258)] = 48051, - [SMALL_STATE(1259)] = 48066, - [SMALL_STATE(1260)] = 48081, - [SMALL_STATE(1261)] = 48098, - [SMALL_STATE(1262)] = 48113, - [SMALL_STATE(1263)] = 48128, - [SMALL_STATE(1264)] = 48143, - [SMALL_STATE(1265)] = 48158, - [SMALL_STATE(1266)] = 48173, - [SMALL_STATE(1267)] = 48188, - [SMALL_STATE(1268)] = 48203, - [SMALL_STATE(1269)] = 48218, - [SMALL_STATE(1270)] = 48233, - [SMALL_STATE(1271)] = 48248, - [SMALL_STATE(1272)] = 48265, - [SMALL_STATE(1273)] = 48280, - [SMALL_STATE(1274)] = 48295, - [SMALL_STATE(1275)] = 48310, - [SMALL_STATE(1276)] = 48325, - [SMALL_STATE(1277)] = 48340, - [SMALL_STATE(1278)] = 48357, - [SMALL_STATE(1279)] = 48372, - [SMALL_STATE(1280)] = 48389, - [SMALL_STATE(1281)] = 48404, - [SMALL_STATE(1282)] = 48421, - [SMALL_STATE(1283)] = 48436, - [SMALL_STATE(1284)] = 48451, - [SMALL_STATE(1285)] = 48466, - [SMALL_STATE(1286)] = 48483, - [SMALL_STATE(1287)] = 48500, - [SMALL_STATE(1288)] = 48515, - [SMALL_STATE(1289)] = 48530, - [SMALL_STATE(1290)] = 48547, - [SMALL_STATE(1291)] = 48564, - [SMALL_STATE(1292)] = 48581, - [SMALL_STATE(1293)] = 48598, - [SMALL_STATE(1294)] = 48615, - [SMALL_STATE(1295)] = 48630, - [SMALL_STATE(1296)] = 48647, - [SMALL_STATE(1297)] = 48662, - [SMALL_STATE(1298)] = 48679, - [SMALL_STATE(1299)] = 48694, - [SMALL_STATE(1300)] = 48711, - [SMALL_STATE(1301)] = 48726, - [SMALL_STATE(1302)] = 48741, - [SMALL_STATE(1303)] = 48756, - [SMALL_STATE(1304)] = 48771, - [SMALL_STATE(1305)] = 48786, - [SMALL_STATE(1306)] = 48803, - [SMALL_STATE(1307)] = 48820, - [SMALL_STATE(1308)] = 48835, - [SMALL_STATE(1309)] = 48850, - [SMALL_STATE(1310)] = 48867, - [SMALL_STATE(1311)] = 48884, - [SMALL_STATE(1312)] = 48899, - [SMALL_STATE(1313)] = 48914, - [SMALL_STATE(1314)] = 48931, - [SMALL_STATE(1315)] = 48948, - [SMALL_STATE(1316)] = 48963, - [SMALL_STATE(1317)] = 48978, - [SMALL_STATE(1318)] = 48993, - [SMALL_STATE(1319)] = 49008, - [SMALL_STATE(1320)] = 49023, - [SMALL_STATE(1321)] = 49040, - [SMALL_STATE(1322)] = 49055, - [SMALL_STATE(1323)] = 49069, - [SMALL_STATE(1324)] = 49083, - [SMALL_STATE(1325)] = 49097, - [SMALL_STATE(1326)] = 49111, - [SMALL_STATE(1327)] = 49125, - [SMALL_STATE(1328)] = 49139, - [SMALL_STATE(1329)] = 49153, - [SMALL_STATE(1330)] = 49167, - [SMALL_STATE(1331)] = 49181, - [SMALL_STATE(1332)] = 49195, - [SMALL_STATE(1333)] = 49209, - [SMALL_STATE(1334)] = 49223, - [SMALL_STATE(1335)] = 49237, - [SMALL_STATE(1336)] = 49251, - [SMALL_STATE(1337)] = 49265, - [SMALL_STATE(1338)] = 49279, - [SMALL_STATE(1339)] = 49293, - [SMALL_STATE(1340)] = 49307, - [SMALL_STATE(1341)] = 49321, - [SMALL_STATE(1342)] = 49335, - [SMALL_STATE(1343)] = 49349, - [SMALL_STATE(1344)] = 49363, - [SMALL_STATE(1345)] = 49377, - [SMALL_STATE(1346)] = 49391, - [SMALL_STATE(1347)] = 49405, - [SMALL_STATE(1348)] = 49419, - [SMALL_STATE(1349)] = 49433, - [SMALL_STATE(1350)] = 49447, - [SMALL_STATE(1351)] = 49461, - [SMALL_STATE(1352)] = 49475, - [SMALL_STATE(1353)] = 49489, - [SMALL_STATE(1354)] = 49503, - [SMALL_STATE(1355)] = 49517, - [SMALL_STATE(1356)] = 49531, - [SMALL_STATE(1357)] = 49545, - [SMALL_STATE(1358)] = 49559, - [SMALL_STATE(1359)] = 49573, - [SMALL_STATE(1360)] = 49587, - [SMALL_STATE(1361)] = 49601, - [SMALL_STATE(1362)] = 49615, - [SMALL_STATE(1363)] = 49629, - [SMALL_STATE(1364)] = 49643, - [SMALL_STATE(1365)] = 49657, - [SMALL_STATE(1366)] = 49671, - [SMALL_STATE(1367)] = 49685, - [SMALL_STATE(1368)] = 49699, - [SMALL_STATE(1369)] = 49713, - [SMALL_STATE(1370)] = 49727, - [SMALL_STATE(1371)] = 49741, - [SMALL_STATE(1372)] = 49755, - [SMALL_STATE(1373)] = 49769, - [SMALL_STATE(1374)] = 49783, - [SMALL_STATE(1375)] = 49797, - [SMALL_STATE(1376)] = 49811, - [SMALL_STATE(1377)] = 49825, - [SMALL_STATE(1378)] = 49839, - [SMALL_STATE(1379)] = 49853, - [SMALL_STATE(1380)] = 49867, - [SMALL_STATE(1381)] = 49881, - [SMALL_STATE(1382)] = 49895, - [SMALL_STATE(1383)] = 49909, - [SMALL_STATE(1384)] = 49923, - [SMALL_STATE(1385)] = 49937, - [SMALL_STATE(1386)] = 49951, - [SMALL_STATE(1387)] = 49965, - [SMALL_STATE(1388)] = 49979, - [SMALL_STATE(1389)] = 49993, - [SMALL_STATE(1390)] = 50007, - [SMALL_STATE(1391)] = 50021, - [SMALL_STATE(1392)] = 50035, - [SMALL_STATE(1393)] = 50049, - [SMALL_STATE(1394)] = 50063, - [SMALL_STATE(1395)] = 50077, - [SMALL_STATE(1396)] = 50091, - [SMALL_STATE(1397)] = 50105, - [SMALL_STATE(1398)] = 50119, - [SMALL_STATE(1399)] = 50133, - [SMALL_STATE(1400)] = 50147, - [SMALL_STATE(1401)] = 50161, - [SMALL_STATE(1402)] = 50175, - [SMALL_STATE(1403)] = 50189, - [SMALL_STATE(1404)] = 50203, - [SMALL_STATE(1405)] = 50217, - [SMALL_STATE(1406)] = 50231, - [SMALL_STATE(1407)] = 50245, - [SMALL_STATE(1408)] = 50259, - [SMALL_STATE(1409)] = 50273, - [SMALL_STATE(1410)] = 50287, - [SMALL_STATE(1411)] = 50301, - [SMALL_STATE(1412)] = 50315, - [SMALL_STATE(1413)] = 50329, - [SMALL_STATE(1414)] = 50343, - [SMALL_STATE(1415)] = 50357, - [SMALL_STATE(1416)] = 50371, - [SMALL_STATE(1417)] = 50385, - [SMALL_STATE(1418)] = 50399, - [SMALL_STATE(1419)] = 50413, - [SMALL_STATE(1420)] = 50427, - [SMALL_STATE(1421)] = 50441, - [SMALL_STATE(1422)] = 50455, - [SMALL_STATE(1423)] = 50469, - [SMALL_STATE(1424)] = 50483, - [SMALL_STATE(1425)] = 50497, - [SMALL_STATE(1426)] = 50511, - [SMALL_STATE(1427)] = 50525, - [SMALL_STATE(1428)] = 50539, - [SMALL_STATE(1429)] = 50553, - [SMALL_STATE(1430)] = 50567, - [SMALL_STATE(1431)] = 50581, - [SMALL_STATE(1432)] = 50595, - [SMALL_STATE(1433)] = 50609, - [SMALL_STATE(1434)] = 50623, - [SMALL_STATE(1435)] = 50637, - [SMALL_STATE(1436)] = 50651, - [SMALL_STATE(1437)] = 50665, - [SMALL_STATE(1438)] = 50679, - [SMALL_STATE(1439)] = 50693, - [SMALL_STATE(1440)] = 50707, - [SMALL_STATE(1441)] = 50721, - [SMALL_STATE(1442)] = 50735, - [SMALL_STATE(1443)] = 50749, - [SMALL_STATE(1444)] = 50763, - [SMALL_STATE(1445)] = 50777, - [SMALL_STATE(1446)] = 50791, - [SMALL_STATE(1447)] = 50805, - [SMALL_STATE(1448)] = 50819, - [SMALL_STATE(1449)] = 50833, - [SMALL_STATE(1450)] = 50847, - [SMALL_STATE(1451)] = 50861, - [SMALL_STATE(1452)] = 50875, - [SMALL_STATE(1453)] = 50889, - [SMALL_STATE(1454)] = 50903, - [SMALL_STATE(1455)] = 50917, - [SMALL_STATE(1456)] = 50931, - [SMALL_STATE(1457)] = 50945, - [SMALL_STATE(1458)] = 50959, - [SMALL_STATE(1459)] = 50973, - [SMALL_STATE(1460)] = 50987, - [SMALL_STATE(1461)] = 51001, - [SMALL_STATE(1462)] = 51015, - [SMALL_STATE(1463)] = 51029, - [SMALL_STATE(1464)] = 51043, - [SMALL_STATE(1465)] = 51057, - [SMALL_STATE(1466)] = 51071, - [SMALL_STATE(1467)] = 51085, - [SMALL_STATE(1468)] = 51099, - [SMALL_STATE(1469)] = 51113, - [SMALL_STATE(1470)] = 51127, - [SMALL_STATE(1471)] = 51141, - [SMALL_STATE(1472)] = 51155, - [SMALL_STATE(1473)] = 51169, - [SMALL_STATE(1474)] = 51183, - [SMALL_STATE(1475)] = 51197, - [SMALL_STATE(1476)] = 51211, - [SMALL_STATE(1477)] = 51225, - [SMALL_STATE(1478)] = 51239, - [SMALL_STATE(1479)] = 51253, - [SMALL_STATE(1480)] = 51267, - [SMALL_STATE(1481)] = 51281, - [SMALL_STATE(1482)] = 51295, - [SMALL_STATE(1483)] = 51309, - [SMALL_STATE(1484)] = 51323, - [SMALL_STATE(1485)] = 51337, - [SMALL_STATE(1486)] = 51351, - [SMALL_STATE(1487)] = 51365, - [SMALL_STATE(1488)] = 51379, - [SMALL_STATE(1489)] = 51393, - [SMALL_STATE(1490)] = 51407, - [SMALL_STATE(1491)] = 51421, - [SMALL_STATE(1492)] = 51435, - [SMALL_STATE(1493)] = 51449, - [SMALL_STATE(1494)] = 51463, - [SMALL_STATE(1495)] = 51477, - [SMALL_STATE(1496)] = 51491, - [SMALL_STATE(1497)] = 51505, - [SMALL_STATE(1498)] = 51519, - [SMALL_STATE(1499)] = 51533, - [SMALL_STATE(1500)] = 51547, - [SMALL_STATE(1501)] = 51561, - [SMALL_STATE(1502)] = 51575, - [SMALL_STATE(1503)] = 51589, - [SMALL_STATE(1504)] = 51603, - [SMALL_STATE(1505)] = 51617, - [SMALL_STATE(1506)] = 51631, - [SMALL_STATE(1507)] = 51645, - [SMALL_STATE(1508)] = 51659, - [SMALL_STATE(1509)] = 51673, - [SMALL_STATE(1510)] = 51687, - [SMALL_STATE(1511)] = 51701, - [SMALL_STATE(1512)] = 51715, - [SMALL_STATE(1513)] = 51729, - [SMALL_STATE(1514)] = 51743, - [SMALL_STATE(1515)] = 51757, - [SMALL_STATE(1516)] = 51771, - [SMALL_STATE(1517)] = 51785, - [SMALL_STATE(1518)] = 51799, - [SMALL_STATE(1519)] = 51813, - [SMALL_STATE(1520)] = 51827, - [SMALL_STATE(1521)] = 51841, - [SMALL_STATE(1522)] = 51855, - [SMALL_STATE(1523)] = 51869, - [SMALL_STATE(1524)] = 51883, - [SMALL_STATE(1525)] = 51897, - [SMALL_STATE(1526)] = 51911, - [SMALL_STATE(1527)] = 51925, - [SMALL_STATE(1528)] = 51939, - [SMALL_STATE(1529)] = 51953, - [SMALL_STATE(1530)] = 51967, - [SMALL_STATE(1531)] = 51981, - [SMALL_STATE(1532)] = 51995, - [SMALL_STATE(1533)] = 52009, - [SMALL_STATE(1534)] = 52023, - [SMALL_STATE(1535)] = 52037, - [SMALL_STATE(1536)] = 52051, - [SMALL_STATE(1537)] = 52065, - [SMALL_STATE(1538)] = 52079, - [SMALL_STATE(1539)] = 52093, - [SMALL_STATE(1540)] = 52107, - [SMALL_STATE(1541)] = 52121, - [SMALL_STATE(1542)] = 52135, - [SMALL_STATE(1543)] = 52149, - [SMALL_STATE(1544)] = 52163, - [SMALL_STATE(1545)] = 52177, - [SMALL_STATE(1546)] = 52191, - [SMALL_STATE(1547)] = 52205, - [SMALL_STATE(1548)] = 52219, - [SMALL_STATE(1549)] = 52233, - [SMALL_STATE(1550)] = 52247, - [SMALL_STATE(1551)] = 52261, - [SMALL_STATE(1552)] = 52275, - [SMALL_STATE(1553)] = 52289, - [SMALL_STATE(1554)] = 52303, - [SMALL_STATE(1555)] = 52317, - [SMALL_STATE(1556)] = 52331, - [SMALL_STATE(1557)] = 52345, - [SMALL_STATE(1558)] = 52359, - [SMALL_STATE(1559)] = 52373, - [SMALL_STATE(1560)] = 52387, - [SMALL_STATE(1561)] = 52401, - [SMALL_STATE(1562)] = 52415, - [SMALL_STATE(1563)] = 52429, - [SMALL_STATE(1564)] = 52443, - [SMALL_STATE(1565)] = 52457, - [SMALL_STATE(1566)] = 52471, - [SMALL_STATE(1567)] = 52485, - [SMALL_STATE(1568)] = 52499, - [SMALL_STATE(1569)] = 52513, - [SMALL_STATE(1570)] = 52527, - [SMALL_STATE(1571)] = 52541, - [SMALL_STATE(1572)] = 52555, - [SMALL_STATE(1573)] = 52569, - [SMALL_STATE(1574)] = 52583, - [SMALL_STATE(1575)] = 52597, - [SMALL_STATE(1576)] = 52611, - [SMALL_STATE(1577)] = 52625, - [SMALL_STATE(1578)] = 52639, - [SMALL_STATE(1579)] = 52653, - [SMALL_STATE(1580)] = 52667, - [SMALL_STATE(1581)] = 52681, - [SMALL_STATE(1582)] = 52695, - [SMALL_STATE(1583)] = 52709, - [SMALL_STATE(1584)] = 52723, - [SMALL_STATE(1585)] = 52737, - [SMALL_STATE(1586)] = 52751, - [SMALL_STATE(1587)] = 52765, - [SMALL_STATE(1588)] = 52779, - [SMALL_STATE(1589)] = 52793, - [SMALL_STATE(1590)] = 52807, - [SMALL_STATE(1591)] = 52821, - [SMALL_STATE(1592)] = 52835, - [SMALL_STATE(1593)] = 52849, - [SMALL_STATE(1594)] = 52863, - [SMALL_STATE(1595)] = 52877, - [SMALL_STATE(1596)] = 52891, - [SMALL_STATE(1597)] = 52905, - [SMALL_STATE(1598)] = 52919, - [SMALL_STATE(1599)] = 52933, - [SMALL_STATE(1600)] = 52947, - [SMALL_STATE(1601)] = 52961, - [SMALL_STATE(1602)] = 52975, - [SMALL_STATE(1603)] = 52989, - [SMALL_STATE(1604)] = 53003, - [SMALL_STATE(1605)] = 53017, - [SMALL_STATE(1606)] = 53031, - [SMALL_STATE(1607)] = 53045, - [SMALL_STATE(1608)] = 53059, - [SMALL_STATE(1609)] = 53073, - [SMALL_STATE(1610)] = 53077, + [SMALL_STATE(333)] = 23967, + [SMALL_STATE(334)] = 24016, + [SMALL_STATE(335)] = 24058, + [SMALL_STATE(336)] = 24116, + [SMALL_STATE(337)] = 24158, + [SMALL_STATE(338)] = 24200, + [SMALL_STATE(339)] = 24242, + [SMALL_STATE(340)] = 24302, + [SMALL_STATE(341)] = 24344, + [SMALL_STATE(342)] = 24404, + [SMALL_STATE(343)] = 24443, + [SMALL_STATE(344)] = 24482, + [SMALL_STATE(345)] = 24521, + [SMALL_STATE(346)] = 24560, + [SMALL_STATE(347)] = 24599, + [SMALL_STATE(348)] = 24638, + [SMALL_STATE(349)] = 24677, + [SMALL_STATE(350)] = 24714, + [SMALL_STATE(351)] = 24755, + [SMALL_STATE(352)] = 24792, + [SMALL_STATE(353)] = 24831, + [SMALL_STATE(354)] = 24870, + [SMALL_STATE(355)] = 24913, + [SMALL_STATE(356)] = 24952, + [SMALL_STATE(357)] = 24991, + [SMALL_STATE(358)] = 25028, + [SMALL_STATE(359)] = 25067, + [SMALL_STATE(360)] = 25104, + [SMALL_STATE(361)] = 25143, + [SMALL_STATE(362)] = 25182, + [SMALL_STATE(363)] = 25221, + [SMALL_STATE(364)] = 25260, + [SMALL_STATE(365)] = 25299, + [SMALL_STATE(366)] = 25338, + [SMALL_STATE(367)] = 25377, + [SMALL_STATE(368)] = 25416, + [SMALL_STATE(369)] = 25452, + [SMALL_STATE(370)] = 25488, + [SMALL_STATE(371)] = 25524, + [SMALL_STATE(372)] = 25560, + [SMALL_STATE(373)] = 25596, + [SMALL_STATE(374)] = 25632, + [SMALL_STATE(375)] = 25668, + [SMALL_STATE(376)] = 25704, + [SMALL_STATE(377)] = 25740, + [SMALL_STATE(378)] = 25776, + [SMALL_STATE(379)] = 25812, + [SMALL_STATE(380)] = 25848, + [SMALL_STATE(381)] = 25884, + [SMALL_STATE(382)] = 25920, + [SMALL_STATE(383)] = 25956, + [SMALL_STATE(384)] = 25992, + [SMALL_STATE(385)] = 26028, + [SMALL_STATE(386)] = 26064, + [SMALL_STATE(387)] = 26100, + [SMALL_STATE(388)] = 26136, + [SMALL_STATE(389)] = 26172, + [SMALL_STATE(390)] = 26208, + [SMALL_STATE(391)] = 26244, + [SMALL_STATE(392)] = 26280, + [SMALL_STATE(393)] = 26316, + [SMALL_STATE(394)] = 26352, + [SMALL_STATE(395)] = 26388, + [SMALL_STATE(396)] = 26424, + [SMALL_STATE(397)] = 26460, + [SMALL_STATE(398)] = 26496, + [SMALL_STATE(399)] = 26532, + [SMALL_STATE(400)] = 26568, + [SMALL_STATE(401)] = 26604, + [SMALL_STATE(402)] = 26640, + [SMALL_STATE(403)] = 26676, + [SMALL_STATE(404)] = 26712, + [SMALL_STATE(405)] = 26748, + [SMALL_STATE(406)] = 26784, + [SMALL_STATE(407)] = 26820, + [SMALL_STATE(408)] = 26856, + [SMALL_STATE(409)] = 26892, + [SMALL_STATE(410)] = 26928, + [SMALL_STATE(411)] = 26964, + [SMALL_STATE(412)] = 27000, + [SMALL_STATE(413)] = 27036, + [SMALL_STATE(414)] = 27072, + [SMALL_STATE(415)] = 27112, + [SMALL_STATE(416)] = 27148, + [SMALL_STATE(417)] = 27184, + [SMALL_STATE(418)] = 27220, + [SMALL_STATE(419)] = 27253, + [SMALL_STATE(420)] = 27288, + [SMALL_STATE(421)] = 27323, + [SMALL_STATE(422)] = 27392, + [SMALL_STATE(423)] = 27427, + [SMALL_STATE(424)] = 27461, + [SMALL_STATE(425)] = 27495, + [SMALL_STATE(426)] = 27532, + [SMALL_STATE(427)] = 27569, + [SMALL_STATE(428)] = 27606, + [SMALL_STATE(429)] = 27643, + [SMALL_STATE(430)] = 27680, + [SMALL_STATE(431)] = 27717, + [SMALL_STATE(432)] = 27754, + [SMALL_STATE(433)] = 27791, + [SMALL_STATE(434)] = 27828, + [SMALL_STATE(435)] = 27865, + [SMALL_STATE(436)] = 27902, + [SMALL_STATE(437)] = 27939, + [SMALL_STATE(438)] = 27976, + [SMALL_STATE(439)] = 28013, + [SMALL_STATE(440)] = 28052, + [SMALL_STATE(441)] = 28117, + [SMALL_STATE(442)] = 28154, + [SMALL_STATE(443)] = 28191, + [SMALL_STATE(444)] = 28228, + [SMALL_STATE(445)] = 28265, + [SMALL_STATE(446)] = 28302, + [SMALL_STATE(447)] = 28334, + [SMALL_STATE(448)] = 28392, + [SMALL_STATE(449)] = 28422, + [SMALL_STATE(450)] = 28458, + [SMALL_STATE(451)] = 28492, + [SMALL_STATE(452)] = 28528, + [SMALL_STATE(453)] = 28568, + [SMALL_STATE(454)] = 28604, + [SMALL_STATE(455)] = 28635, + [SMALL_STATE(456)] = 28666, + [SMALL_STATE(457)] = 28697, + [SMALL_STATE(458)] = 28728, + [SMALL_STATE(459)] = 28759, + [SMALL_STATE(460)] = 28790, + [SMALL_STATE(461)] = 28821, + [SMALL_STATE(462)] = 28852, + [SMALL_STATE(463)] = 28883, + [SMALL_STATE(464)] = 28914, + [SMALL_STATE(465)] = 28947, + [SMALL_STATE(466)] = 29004, + [SMALL_STATE(467)] = 29035, + [SMALL_STATE(468)] = 29066, + [SMALL_STATE(469)] = 29097, + [SMALL_STATE(470)] = 29128, + [SMALL_STATE(471)] = 29159, + [SMALL_STATE(472)] = 29192, + [SMALL_STATE(473)] = 29223, + [SMALL_STATE(474)] = 29256, + [SMALL_STATE(475)] = 29287, + [SMALL_STATE(476)] = 29320, + [SMALL_STATE(477)] = 29377, + [SMALL_STATE(478)] = 29408, + [SMALL_STATE(479)] = 29439, + [SMALL_STATE(480)] = 29470, + [SMALL_STATE(481)] = 29501, + [SMALL_STATE(482)] = 29532, + [SMALL_STATE(483)] = 29563, + [SMALL_STATE(484)] = 29594, + [SMALL_STATE(485)] = 29625, + [SMALL_STATE(486)] = 29656, + [SMALL_STATE(487)] = 29687, + [SMALL_STATE(488)] = 29718, + [SMALL_STATE(489)] = 29749, + [SMALL_STATE(490)] = 29780, + [SMALL_STATE(491)] = 29811, + [SMALL_STATE(492)] = 29842, + [SMALL_STATE(493)] = 29873, + [SMALL_STATE(494)] = 29904, + [SMALL_STATE(495)] = 29935, + [SMALL_STATE(496)] = 29966, + [SMALL_STATE(497)] = 29997, + [SMALL_STATE(498)] = 30030, + [SMALL_STATE(499)] = 30060, + [SMALL_STATE(500)] = 30090, + [SMALL_STATE(501)] = 30144, + [SMALL_STATE(502)] = 30198, + [SMALL_STATE(503)] = 30252, + [SMALL_STATE(504)] = 30282, + [SMALL_STATE(505)] = 30312, + [SMALL_STATE(506)] = 30342, + [SMALL_STATE(507)] = 30372, + [SMALL_STATE(508)] = 30402, + [SMALL_STATE(509)] = 30432, + [SMALL_STATE(510)] = 30462, + [SMALL_STATE(511)] = 30490, + [SMALL_STATE(512)] = 30518, + [SMALL_STATE(513)] = 30548, + [SMALL_STATE(514)] = 30578, + [SMALL_STATE(515)] = 30608, + [SMALL_STATE(516)] = 30638, + [SMALL_STATE(517)] = 30668, + [SMALL_STATE(518)] = 30698, + [SMALL_STATE(519)] = 30728, + [SMALL_STATE(520)] = 30762, + [SMALL_STATE(521)] = 30792, + [SMALL_STATE(522)] = 30822, + [SMALL_STATE(523)] = 30854, + [SMALL_STATE(524)] = 30882, + [SMALL_STATE(525)] = 30910, + [SMALL_STATE(526)] = 30940, + [SMALL_STATE(527)] = 30970, + [SMALL_STATE(528)] = 30997, + [SMALL_STATE(529)] = 31024, + [SMALL_STATE(530)] = 31051, + [SMALL_STATE(531)] = 31078, + [SMALL_STATE(532)] = 31105, + [SMALL_STATE(533)] = 31132, + [SMALL_STATE(534)] = 31183, + [SMALL_STATE(535)] = 31210, + [SMALL_STATE(536)] = 31237, + [SMALL_STATE(537)] = 31264, + [SMALL_STATE(538)] = 31315, + [SMALL_STATE(539)] = 31342, + [SMALL_STATE(540)] = 31369, + [SMALL_STATE(541)] = 31396, + [SMALL_STATE(542)] = 31427, + [SMALL_STATE(543)] = 31478, + [SMALL_STATE(544)] = 31529, + [SMALL_STATE(545)] = 31556, + [SMALL_STATE(546)] = 31583, + [SMALL_STATE(547)] = 31610, + [SMALL_STATE(548)] = 31637, + [SMALL_STATE(549)] = 31664, + [SMALL_STATE(550)] = 31691, + [SMALL_STATE(551)] = 31718, + [SMALL_STATE(552)] = 31745, + [SMALL_STATE(553)] = 31772, + [SMALL_STATE(554)] = 31799, + [SMALL_STATE(555)] = 31826, + [SMALL_STATE(556)] = 31877, + [SMALL_STATE(557)] = 31904, + [SMALL_STATE(558)] = 31931, + [SMALL_STATE(559)] = 31958, + [SMALL_STATE(560)] = 31985, + [SMALL_STATE(561)] = 32012, + [SMALL_STATE(562)] = 32039, + [SMALL_STATE(563)] = 32066, + [SMALL_STATE(564)] = 32093, + [SMALL_STATE(565)] = 32120, + [SMALL_STATE(566)] = 32147, + [SMALL_STATE(567)] = 32174, + [SMALL_STATE(568)] = 32201, + [SMALL_STATE(569)] = 32228, + [SMALL_STATE(570)] = 32255, + [SMALL_STATE(571)] = 32282, + [SMALL_STATE(572)] = 32309, + [SMALL_STATE(573)] = 32336, + [SMALL_STATE(574)] = 32363, + [SMALL_STATE(575)] = 32390, + [SMALL_STATE(576)] = 32421, + [SMALL_STATE(577)] = 32448, + [SMALL_STATE(578)] = 32475, + [SMALL_STATE(579)] = 32502, + [SMALL_STATE(580)] = 32529, + [SMALL_STATE(581)] = 32556, + [SMALL_STATE(582)] = 32583, + [SMALL_STATE(583)] = 32634, + [SMALL_STATE(584)] = 32661, + [SMALL_STATE(585)] = 32707, + [SMALL_STATE(586)] = 32755, + [SMALL_STATE(587)] = 32803, + [SMALL_STATE(588)] = 32829, + [SMALL_STATE(589)] = 32855, + [SMALL_STATE(590)] = 32901, + [SMALL_STATE(591)] = 32927, + [SMALL_STATE(592)] = 32975, + [SMALL_STATE(593)] = 33021, + [SMALL_STATE(594)] = 33069, + [SMALL_STATE(595)] = 33097, + [SMALL_STATE(596)] = 33125, + [SMALL_STATE(597)] = 33173, + [SMALL_STATE(598)] = 33201, + [SMALL_STATE(599)] = 33229, + [SMALL_STATE(600)] = 33257, + [SMALL_STATE(601)] = 33285, + [SMALL_STATE(602)] = 33328, + [SMALL_STATE(603)] = 33353, + [SMALL_STATE(604)] = 33378, + [SMALL_STATE(605)] = 33403, + [SMALL_STATE(606)] = 33448, + [SMALL_STATE(607)] = 33473, + [SMALL_STATE(608)] = 33498, + [SMALL_STATE(609)] = 33523, + [SMALL_STATE(610)] = 33548, + [SMALL_STATE(611)] = 33573, + [SMALL_STATE(612)] = 33598, + [SMALL_STATE(613)] = 33623, + [SMALL_STATE(614)] = 33668, + [SMALL_STATE(615)] = 33708, + [SMALL_STATE(616)] = 33748, + [SMALL_STATE(617)] = 33788, + [SMALL_STATE(618)] = 33828, + [SMALL_STATE(619)] = 33865, + [SMALL_STATE(620)] = 33906, + [SMALL_STATE(621)] = 33947, + [SMALL_STATE(622)] = 33984, + [SMALL_STATE(623)] = 34021, + [SMALL_STATE(624)] = 34062, + [SMALL_STATE(625)] = 34086, + [SMALL_STATE(626)] = 34124, + [SMALL_STATE(627)] = 34148, + [SMALL_STATE(628)] = 34172, + [SMALL_STATE(629)] = 34208, + [SMALL_STATE(630)] = 34232, + [SMALL_STATE(631)] = 34266, + [SMALL_STATE(632)] = 34290, + [SMALL_STATE(633)] = 34314, + [SMALL_STATE(634)] = 34348, + [SMALL_STATE(635)] = 34372, + [SMALL_STATE(636)] = 34396, + [SMALL_STATE(637)] = 34431, + [SMALL_STATE(638)] = 34466, + [SMALL_STATE(639)] = 34497, + [SMALL_STATE(640)] = 34532, + [SMALL_STATE(641)] = 34567, + [SMALL_STATE(642)] = 34602, + [SMALL_STATE(643)] = 34623, + [SMALL_STATE(644)] = 34658, + [SMALL_STATE(645)] = 34693, + [SMALL_STATE(646)] = 34726, + [SMALL_STATE(647)] = 34761, + [SMALL_STATE(648)] = 34796, + [SMALL_STATE(649)] = 34831, + [SMALL_STATE(650)] = 34862, + [SMALL_STATE(651)] = 34897, + [SMALL_STATE(652)] = 34932, + [SMALL_STATE(653)] = 34967, + [SMALL_STATE(654)] = 35002, + [SMALL_STATE(655)] = 35037, + [SMALL_STATE(656)] = 35072, + [SMALL_STATE(657)] = 35107, + [SMALL_STATE(658)] = 35140, + [SMALL_STATE(659)] = 35175, + [SMALL_STATE(660)] = 35206, + [SMALL_STATE(661)] = 35241, + [SMALL_STATE(662)] = 35274, + [SMALL_STATE(663)] = 35309, + [SMALL_STATE(664)] = 35344, + [SMALL_STATE(665)] = 35379, + [SMALL_STATE(666)] = 35412, + [SMALL_STATE(667)] = 35447, + [SMALL_STATE(668)] = 35482, + [SMALL_STATE(669)] = 35503, + [SMALL_STATE(670)] = 35538, + [SMALL_STATE(671)] = 35573, + [SMALL_STATE(672)] = 35608, + [SMALL_STATE(673)] = 35639, + [SMALL_STATE(674)] = 35674, + [SMALL_STATE(675)] = 35709, + [SMALL_STATE(676)] = 35744, + [SMALL_STATE(677)] = 35779, + [SMALL_STATE(678)] = 35807, + [SMALL_STATE(679)] = 35839, + [SMALL_STATE(680)] = 35871, + [SMALL_STATE(681)] = 35903, + [SMALL_STATE(682)] = 35935, + [SMALL_STATE(683)] = 35967, + [SMALL_STATE(684)] = 35993, + [SMALL_STATE(685)] = 36021, + [SMALL_STATE(686)] = 36049, + [SMALL_STATE(687)] = 36081, + [SMALL_STATE(688)] = 36113, + [SMALL_STATE(689)] = 36139, + [SMALL_STATE(690)] = 36171, + [SMALL_STATE(691)] = 36199, + [SMALL_STATE(692)] = 36231, + [SMALL_STATE(693)] = 36263, + [SMALL_STATE(694)] = 36295, + [SMALL_STATE(695)] = 36327, + [SMALL_STATE(696)] = 36359, + [SMALL_STATE(697)] = 36391, + [SMALL_STATE(698)] = 36423, + [SMALL_STATE(699)] = 36455, + [SMALL_STATE(700)] = 36487, + [SMALL_STATE(701)] = 36519, + [SMALL_STATE(702)] = 36551, + [SMALL_STATE(703)] = 36583, + [SMALL_STATE(704)] = 36611, + [SMALL_STATE(705)] = 36639, + [SMALL_STATE(706)] = 36671, + [SMALL_STATE(707)] = 36703, + [SMALL_STATE(708)] = 36735, + [SMALL_STATE(709)] = 36767, + [SMALL_STATE(710)] = 36799, + [SMALL_STATE(711)] = 36826, + [SMALL_STATE(712)] = 36849, + [SMALL_STATE(713)] = 36878, + [SMALL_STATE(714)] = 36905, + [SMALL_STATE(715)] = 36934, + [SMALL_STATE(716)] = 36955, + [SMALL_STATE(717)] = 36984, + [SMALL_STATE(718)] = 37009, + [SMALL_STATE(719)] = 37038, + [SMALL_STATE(720)] = 37067, + [SMALL_STATE(721)] = 37096, + [SMALL_STATE(722)] = 37117, + [SMALL_STATE(723)] = 37146, + [SMALL_STATE(724)] = 37175, + [SMALL_STATE(725)] = 37204, + [SMALL_STATE(726)] = 37233, + [SMALL_STATE(727)] = 37262, + [SMALL_STATE(728)] = 37291, + [SMALL_STATE(729)] = 37316, + [SMALL_STATE(730)] = 37345, + [SMALL_STATE(731)] = 37374, + [SMALL_STATE(732)] = 37403, + [SMALL_STATE(733)] = 37432, + [SMALL_STATE(734)] = 37457, + [SMALL_STATE(735)] = 37486, + [SMALL_STATE(736)] = 37511, + [SMALL_STATE(737)] = 37540, + [SMALL_STATE(738)] = 37565, + [SMALL_STATE(739)] = 37590, + [SMALL_STATE(740)] = 37619, + [SMALL_STATE(741)] = 37648, + [SMALL_STATE(742)] = 37673, + [SMALL_STATE(743)] = 37702, + [SMALL_STATE(744)] = 37731, + [SMALL_STATE(745)] = 37760, + [SMALL_STATE(746)] = 37789, + [SMALL_STATE(747)] = 37818, + [SMALL_STATE(748)] = 37837, + [SMALL_STATE(749)] = 37866, + [SMALL_STATE(750)] = 37895, + [SMALL_STATE(751)] = 37922, + [SMALL_STATE(752)] = 37951, + [SMALL_STATE(753)] = 37980, + [SMALL_STATE(754)] = 38009, + [SMALL_STATE(755)] = 38038, + [SMALL_STATE(756)] = 38067, + [SMALL_STATE(757)] = 38092, + [SMALL_STATE(758)] = 38111, + [SMALL_STATE(759)] = 38140, + [SMALL_STATE(760)] = 38169, + [SMALL_STATE(761)] = 38198, + [SMALL_STATE(762)] = 38225, + [SMALL_STATE(763)] = 38254, + [SMALL_STATE(764)] = 38283, + [SMALL_STATE(765)] = 38308, + [SMALL_STATE(766)] = 38333, + [SMALL_STATE(767)] = 38362, + [SMALL_STATE(768)] = 38391, + [SMALL_STATE(769)] = 38420, + [SMALL_STATE(770)] = 38439, + [SMALL_STATE(771)] = 38468, + [SMALL_STATE(772)] = 38497, + [SMALL_STATE(773)] = 38524, + [SMALL_STATE(774)] = 38553, + [SMALL_STATE(775)] = 38572, + [SMALL_STATE(776)] = 38591, + [SMALL_STATE(777)] = 38610, + [SMALL_STATE(778)] = 38639, + [SMALL_STATE(779)] = 38668, + [SMALL_STATE(780)] = 38697, + [SMALL_STATE(781)] = 38726, + [SMALL_STATE(782)] = 38755, + [SMALL_STATE(783)] = 38784, + [SMALL_STATE(784)] = 38813, + [SMALL_STATE(785)] = 38842, + [SMALL_STATE(786)] = 38867, + [SMALL_STATE(787)] = 38892, + [SMALL_STATE(788)] = 38917, + [SMALL_STATE(789)] = 38946, + [SMALL_STATE(790)] = 38965, + [SMALL_STATE(791)] = 38990, + [SMALL_STATE(792)] = 39019, + [SMALL_STATE(793)] = 39048, + [SMALL_STATE(794)] = 39077, + [SMALL_STATE(795)] = 39106, + [SMALL_STATE(796)] = 39135, + [SMALL_STATE(797)] = 39162, + [SMALL_STATE(798)] = 39191, + [SMALL_STATE(799)] = 39220, + [SMALL_STATE(800)] = 39249, + [SMALL_STATE(801)] = 39278, + [SMALL_STATE(802)] = 39307, + [SMALL_STATE(803)] = 39330, + [SMALL_STATE(804)] = 39359, + [SMALL_STATE(805)] = 39384, + [SMALL_STATE(806)] = 39413, + [SMALL_STATE(807)] = 39442, + [SMALL_STATE(808)] = 39467, + [SMALL_STATE(809)] = 39494, + [SMALL_STATE(810)] = 39521, + [SMALL_STATE(811)] = 39546, + [SMALL_STATE(812)] = 39573, + [SMALL_STATE(813)] = 39600, + [SMALL_STATE(814)] = 39629, + [SMALL_STATE(815)] = 39649, + [SMALL_STATE(816)] = 39673, + [SMALL_STATE(817)] = 39697, + [SMALL_STATE(818)] = 39723, + [SMALL_STATE(819)] = 39749, + [SMALL_STATE(820)] = 39775, + [SMALL_STATE(821)] = 39799, + [SMALL_STATE(822)] = 39825, + [SMALL_STATE(823)] = 39847, + [SMALL_STATE(824)] = 39869, + [SMALL_STATE(825)] = 39891, + [SMALL_STATE(826)] = 39911, + [SMALL_STATE(827)] = 39931, + [SMALL_STATE(828)] = 39953, + [SMALL_STATE(829)] = 39975, + [SMALL_STATE(830)] = 39999, + [SMALL_STATE(831)] = 40025, + [SMALL_STATE(832)] = 40051, + [SMALL_STATE(833)] = 40077, + [SMALL_STATE(834)] = 40099, + [SMALL_STATE(835)] = 40121, + [SMALL_STATE(836)] = 40147, + [SMALL_STATE(837)] = 40171, + [SMALL_STATE(838)] = 40195, + [SMALL_STATE(839)] = 40221, + [SMALL_STATE(840)] = 40247, + [SMALL_STATE(841)] = 40269, + [SMALL_STATE(842)] = 40295, + [SMALL_STATE(843)] = 40317, + [SMALL_STATE(844)] = 40339, + [SMALL_STATE(845)] = 40365, + [SMALL_STATE(846)] = 40389, + [SMALL_STATE(847)] = 40415, + [SMALL_STATE(848)] = 40441, + [SMALL_STATE(849)] = 40465, + [SMALL_STATE(850)] = 40491, + [SMALL_STATE(851)] = 40517, + [SMALL_STATE(852)] = 40543, + [SMALL_STATE(853)] = 40569, + [SMALL_STATE(854)] = 40595, + [SMALL_STATE(855)] = 40621, + [SMALL_STATE(856)] = 40647, + [SMALL_STATE(857)] = 40669, + [SMALL_STATE(858)] = 40693, + [SMALL_STATE(859)] = 40717, + [SMALL_STATE(860)] = 40741, + [SMALL_STATE(861)] = 40761, + [SMALL_STATE(862)] = 40787, + [SMALL_STATE(863)] = 40811, + [SMALL_STATE(864)] = 40833, + [SMALL_STATE(865)] = 40857, + [SMALL_STATE(866)] = 40877, + [SMALL_STATE(867)] = 40897, + [SMALL_STATE(868)] = 40921, + [SMALL_STATE(869)] = 40947, + [SMALL_STATE(870)] = 40971, + [SMALL_STATE(871)] = 40997, + [SMALL_STATE(872)] = 41023, + [SMALL_STATE(873)] = 41047, + [SMALL_STATE(874)] = 41067, + [SMALL_STATE(875)] = 41089, + [SMALL_STATE(876)] = 41115, + [SMALL_STATE(877)] = 41141, + [SMALL_STATE(878)] = 41163, + [SMALL_STATE(879)] = 41189, + [SMALL_STATE(880)] = 41215, + [SMALL_STATE(881)] = 41241, + [SMALL_STATE(882)] = 41267, + [SMALL_STATE(883)] = 41291, + [SMALL_STATE(884)] = 41313, + [SMALL_STATE(885)] = 41333, + [SMALL_STATE(886)] = 41351, + [SMALL_STATE(887)] = 41371, + [SMALL_STATE(888)] = 41391, + [SMALL_STATE(889)] = 41409, + [SMALL_STATE(890)] = 41435, + [SMALL_STATE(891)] = 41457, + [SMALL_STATE(892)] = 41475, + [SMALL_STATE(893)] = 41493, + [SMALL_STATE(894)] = 41519, + [SMALL_STATE(895)] = 41545, + [SMALL_STATE(896)] = 41571, + [SMALL_STATE(897)] = 41597, + [SMALL_STATE(898)] = 41623, + [SMALL_STATE(899)] = 41649, + [SMALL_STATE(900)] = 41675, + [SMALL_STATE(901)] = 41701, + [SMALL_STATE(902)] = 41727, + [SMALL_STATE(903)] = 41753, + [SMALL_STATE(904)] = 41779, + [SMALL_STATE(905)] = 41805, + [SMALL_STATE(906)] = 41829, + [SMALL_STATE(907)] = 41847, + [SMALL_STATE(908)] = 41873, + [SMALL_STATE(909)] = 41897, + [SMALL_STATE(910)] = 41923, + [SMALL_STATE(911)] = 41949, + [SMALL_STATE(912)] = 41975, + [SMALL_STATE(913)] = 42001, + [SMALL_STATE(914)] = 42027, + [SMALL_STATE(915)] = 42053, + [SMALL_STATE(916)] = 42079, + [SMALL_STATE(917)] = 42105, + [SMALL_STATE(918)] = 42129, + [SMALL_STATE(919)] = 42149, + [SMALL_STATE(920)] = 42167, + [SMALL_STATE(921)] = 42189, + [SMALL_STATE(922)] = 42211, + [SMALL_STATE(923)] = 42233, + [SMALL_STATE(924)] = 42259, + [SMALL_STATE(925)] = 42279, + [SMALL_STATE(926)] = 42305, + [SMALL_STATE(927)] = 42331, + [SMALL_STATE(928)] = 42357, + [SMALL_STATE(929)] = 42379, + [SMALL_STATE(930)] = 42403, + [SMALL_STATE(931)] = 42429, + [SMALL_STATE(932)] = 42455, + [SMALL_STATE(933)] = 42479, + [SMALL_STATE(934)] = 42501, + [SMALL_STATE(935)] = 42525, + [SMALL_STATE(936)] = 42542, + [SMALL_STATE(937)] = 42565, + [SMALL_STATE(938)] = 42586, + [SMALL_STATE(939)] = 42609, + [SMALL_STATE(940)] = 42630, + [SMALL_STATE(941)] = 42647, + [SMALL_STATE(942)] = 42670, + [SMALL_STATE(943)] = 42691, + [SMALL_STATE(944)] = 42712, + [SMALL_STATE(945)] = 42731, + [SMALL_STATE(946)] = 42754, + [SMALL_STATE(947)] = 42777, + [SMALL_STATE(948)] = 42798, + [SMALL_STATE(949)] = 42819, + [SMALL_STATE(950)] = 42840, + [SMALL_STATE(951)] = 42863, + [SMALL_STATE(952)] = 42886, + [SMALL_STATE(953)] = 42903, + [SMALL_STATE(954)] = 42924, + [SMALL_STATE(955)] = 42943, + [SMALL_STATE(956)] = 42966, + [SMALL_STATE(957)] = 42983, + [SMALL_STATE(958)] = 43000, + [SMALL_STATE(959)] = 43017, + [SMALL_STATE(960)] = 43040, + [SMALL_STATE(961)] = 43057, + [SMALL_STATE(962)] = 43078, + [SMALL_STATE(963)] = 43095, + [SMALL_STATE(964)] = 43116, + [SMALL_STATE(965)] = 43133, + [SMALL_STATE(966)] = 43154, + [SMALL_STATE(967)] = 43175, + [SMALL_STATE(968)] = 43196, + [SMALL_STATE(969)] = 43217, + [SMALL_STATE(970)] = 43238, + [SMALL_STATE(971)] = 43261, + [SMALL_STATE(972)] = 43282, + [SMALL_STATE(973)] = 43303, + [SMALL_STATE(974)] = 43326, + [SMALL_STATE(975)] = 43345, + [SMALL_STATE(976)] = 43362, + [SMALL_STATE(977)] = 43379, + [SMALL_STATE(978)] = 43396, + [SMALL_STATE(979)] = 43415, + [SMALL_STATE(980)] = 43436, + [SMALL_STATE(981)] = 43453, + [SMALL_STATE(982)] = 43476, + [SMALL_STATE(983)] = 43495, + [SMALL_STATE(984)] = 43516, + [SMALL_STATE(985)] = 43537, + [SMALL_STATE(986)] = 43558, + [SMALL_STATE(987)] = 43579, + [SMALL_STATE(988)] = 43600, + [SMALL_STATE(989)] = 43617, + [SMALL_STATE(990)] = 43638, + [SMALL_STATE(991)] = 43659, + [SMALL_STATE(992)] = 43680, + [SMALL_STATE(993)] = 43697, + [SMALL_STATE(994)] = 43718, + [SMALL_STATE(995)] = 43741, + [SMALL_STATE(996)] = 43758, + [SMALL_STATE(997)] = 43781, + [SMALL_STATE(998)] = 43797, + [SMALL_STATE(999)] = 43813, + [SMALL_STATE(1000)] = 43831, + [SMALL_STATE(1001)] = 43851, + [SMALL_STATE(1002)] = 43867, + [SMALL_STATE(1003)] = 43887, + [SMALL_STATE(1004)] = 43903, + [SMALL_STATE(1005)] = 43921, + [SMALL_STATE(1006)] = 43939, + [SMALL_STATE(1007)] = 43959, + [SMALL_STATE(1008)] = 43979, + [SMALL_STATE(1009)] = 43997, + [SMALL_STATE(1010)] = 44017, + [SMALL_STATE(1011)] = 44033, + [SMALL_STATE(1012)] = 44051, + [SMALL_STATE(1013)] = 44067, + [SMALL_STATE(1014)] = 44083, + [SMALL_STATE(1015)] = 44103, + [SMALL_STATE(1016)] = 44121, + [SMALL_STATE(1017)] = 44139, + [SMALL_STATE(1018)] = 44159, + [SMALL_STATE(1019)] = 44175, + [SMALL_STATE(1020)] = 44191, + [SMALL_STATE(1021)] = 44209, + [SMALL_STATE(1022)] = 44229, + [SMALL_STATE(1023)] = 44249, + [SMALL_STATE(1024)] = 44269, + [SMALL_STATE(1025)] = 44285, + [SMALL_STATE(1026)] = 44303, + [SMALL_STATE(1027)] = 44321, + [SMALL_STATE(1028)] = 44337, + [SMALL_STATE(1029)] = 44355, + [SMALL_STATE(1030)] = 44375, + [SMALL_STATE(1031)] = 44391, + [SMALL_STATE(1032)] = 44407, + [SMALL_STATE(1033)] = 44427, + [SMALL_STATE(1034)] = 44443, + [SMALL_STATE(1035)] = 44459, + [SMALL_STATE(1036)] = 44479, + [SMALL_STATE(1037)] = 44497, + [SMALL_STATE(1038)] = 44517, + [SMALL_STATE(1039)] = 44533, + [SMALL_STATE(1040)] = 44549, + [SMALL_STATE(1041)] = 44567, + [SMALL_STATE(1042)] = 44583, + [SMALL_STATE(1043)] = 44603, + [SMALL_STATE(1044)] = 44623, + [SMALL_STATE(1045)] = 44639, + [SMALL_STATE(1046)] = 44655, + [SMALL_STATE(1047)] = 44673, + [SMALL_STATE(1048)] = 44693, + [SMALL_STATE(1049)] = 44709, + [SMALL_STATE(1050)] = 44729, + [SMALL_STATE(1051)] = 44749, + [SMALL_STATE(1052)] = 44765, + [SMALL_STATE(1053)] = 44785, + [SMALL_STATE(1054)] = 44801, + [SMALL_STATE(1055)] = 44821, + [SMALL_STATE(1056)] = 44841, + [SMALL_STATE(1057)] = 44861, + [SMALL_STATE(1058)] = 44879, + [SMALL_STATE(1059)] = 44895, + [SMALL_STATE(1060)] = 44911, + [SMALL_STATE(1061)] = 44931, + [SMALL_STATE(1062)] = 44947, + [SMALL_STATE(1063)] = 44963, + [SMALL_STATE(1064)] = 44981, + [SMALL_STATE(1065)] = 45001, + [SMALL_STATE(1066)] = 45017, + [SMALL_STATE(1067)] = 45033, + [SMALL_STATE(1068)] = 45049, + [SMALL_STATE(1069)] = 45065, + [SMALL_STATE(1070)] = 45085, + [SMALL_STATE(1071)] = 45101, + [SMALL_STATE(1072)] = 45119, + [SMALL_STATE(1073)] = 45139, + [SMALL_STATE(1074)] = 45157, + [SMALL_STATE(1075)] = 45177, + [SMALL_STATE(1076)] = 45193, + [SMALL_STATE(1077)] = 45211, + [SMALL_STATE(1078)] = 45227, + [SMALL_STATE(1079)] = 45243, + [SMALL_STATE(1080)] = 45263, + [SMALL_STATE(1081)] = 45279, + [SMALL_STATE(1082)] = 45295, + [SMALL_STATE(1083)] = 45315, + [SMALL_STATE(1084)] = 45333, + [SMALL_STATE(1085)] = 45353, + [SMALL_STATE(1086)] = 45369, + [SMALL_STATE(1087)] = 45385, + [SMALL_STATE(1088)] = 45403, + [SMALL_STATE(1089)] = 45423, + [SMALL_STATE(1090)] = 45439, + [SMALL_STATE(1091)] = 45457, + [SMALL_STATE(1092)] = 45477, + [SMALL_STATE(1093)] = 45493, + [SMALL_STATE(1094)] = 45511, + [SMALL_STATE(1095)] = 45531, + [SMALL_STATE(1096)] = 45551, + [SMALL_STATE(1097)] = 45571, + [SMALL_STATE(1098)] = 45591, + [SMALL_STATE(1099)] = 45609, + [SMALL_STATE(1100)] = 45625, + [SMALL_STATE(1101)] = 45645, + [SMALL_STATE(1102)] = 45661, + [SMALL_STATE(1103)] = 45679, + [SMALL_STATE(1104)] = 45699, + [SMALL_STATE(1105)] = 45717, + [SMALL_STATE(1106)] = 45737, + [SMALL_STATE(1107)] = 45753, + [SMALL_STATE(1108)] = 45769, + [SMALL_STATE(1109)] = 45785, + [SMALL_STATE(1110)] = 45805, + [SMALL_STATE(1111)] = 45821, + [SMALL_STATE(1112)] = 45837, + [SMALL_STATE(1113)] = 45853, + [SMALL_STATE(1114)] = 45873, + [SMALL_STATE(1115)] = 45889, + [SMALL_STATE(1116)] = 45905, + [SMALL_STATE(1117)] = 45925, + [SMALL_STATE(1118)] = 45945, + [SMALL_STATE(1119)] = 45963, + [SMALL_STATE(1120)] = 45983, + [SMALL_STATE(1121)] = 46003, + [SMALL_STATE(1122)] = 46019, + [SMALL_STATE(1123)] = 46035, + [SMALL_STATE(1124)] = 46053, + [SMALL_STATE(1125)] = 46071, + [SMALL_STATE(1126)] = 46091, + [SMALL_STATE(1127)] = 46111, + [SMALL_STATE(1128)] = 46131, + [SMALL_STATE(1129)] = 46147, + [SMALL_STATE(1130)] = 46167, + [SMALL_STATE(1131)] = 46187, + [SMALL_STATE(1132)] = 46207, + [SMALL_STATE(1133)] = 46227, + [SMALL_STATE(1134)] = 46247, + [SMALL_STATE(1135)] = 46263, + [SMALL_STATE(1136)] = 46281, + [SMALL_STATE(1137)] = 46299, + [SMALL_STATE(1138)] = 46319, + [SMALL_STATE(1139)] = 46337, + [SMALL_STATE(1140)] = 46353, + [SMALL_STATE(1141)] = 46373, + [SMALL_STATE(1142)] = 46393, + [SMALL_STATE(1143)] = 46413, + [SMALL_STATE(1144)] = 46431, + [SMALL_STATE(1145)] = 46446, + [SMALL_STATE(1146)] = 46461, + [SMALL_STATE(1147)] = 46476, + [SMALL_STATE(1148)] = 46491, + [SMALL_STATE(1149)] = 46506, + [SMALL_STATE(1150)] = 46523, + [SMALL_STATE(1151)] = 46538, + [SMALL_STATE(1152)] = 46555, + [SMALL_STATE(1153)] = 46570, + [SMALL_STATE(1154)] = 46585, + [SMALL_STATE(1155)] = 46602, + [SMALL_STATE(1156)] = 46617, + [SMALL_STATE(1157)] = 46634, + [SMALL_STATE(1158)] = 46649, + [SMALL_STATE(1159)] = 46666, + [SMALL_STATE(1160)] = 46681, + [SMALL_STATE(1161)] = 46698, + [SMALL_STATE(1162)] = 46713, + [SMALL_STATE(1163)] = 46728, + [SMALL_STATE(1164)] = 46743, + [SMALL_STATE(1165)] = 46758, + [SMALL_STATE(1166)] = 46773, + [SMALL_STATE(1167)] = 46788, + [SMALL_STATE(1168)] = 46803, + [SMALL_STATE(1169)] = 46818, + [SMALL_STATE(1170)] = 46833, + [SMALL_STATE(1171)] = 46848, + [SMALL_STATE(1172)] = 46863, + [SMALL_STATE(1173)] = 46878, + [SMALL_STATE(1174)] = 46893, + [SMALL_STATE(1175)] = 46910, + [SMALL_STATE(1176)] = 46925, + [SMALL_STATE(1177)] = 46940, + [SMALL_STATE(1178)] = 46955, + [SMALL_STATE(1179)] = 46970, + [SMALL_STATE(1180)] = 46985, + [SMALL_STATE(1181)] = 47000, + [SMALL_STATE(1182)] = 47015, + [SMALL_STATE(1183)] = 47030, + [SMALL_STATE(1184)] = 47045, + [SMALL_STATE(1185)] = 47060, + [SMALL_STATE(1186)] = 47075, + [SMALL_STATE(1187)] = 47090, + [SMALL_STATE(1188)] = 47105, + [SMALL_STATE(1189)] = 47120, + [SMALL_STATE(1190)] = 47135, + [SMALL_STATE(1191)] = 47150, + [SMALL_STATE(1192)] = 47165, + [SMALL_STATE(1193)] = 47180, + [SMALL_STATE(1194)] = 47195, + [SMALL_STATE(1195)] = 47210, + [SMALL_STATE(1196)] = 47225, + [SMALL_STATE(1197)] = 47240, + [SMALL_STATE(1198)] = 47257, + [SMALL_STATE(1199)] = 47272, + [SMALL_STATE(1200)] = 47287, + [SMALL_STATE(1201)] = 47302, + [SMALL_STATE(1202)] = 47317, + [SMALL_STATE(1203)] = 47334, + [SMALL_STATE(1204)] = 47351, + [SMALL_STATE(1205)] = 47366, + [SMALL_STATE(1206)] = 47383, + [SMALL_STATE(1207)] = 47400, + [SMALL_STATE(1208)] = 47417, + [SMALL_STATE(1209)] = 47432, + [SMALL_STATE(1210)] = 47447, + [SMALL_STATE(1211)] = 47462, + [SMALL_STATE(1212)] = 47477, + [SMALL_STATE(1213)] = 47492, + [SMALL_STATE(1214)] = 47507, + [SMALL_STATE(1215)] = 47522, + [SMALL_STATE(1216)] = 47539, + [SMALL_STATE(1217)] = 47554, + [SMALL_STATE(1218)] = 47569, + [SMALL_STATE(1219)] = 47584, + [SMALL_STATE(1220)] = 47601, + [SMALL_STATE(1221)] = 47618, + [SMALL_STATE(1222)] = 47635, + [SMALL_STATE(1223)] = 47652, + [SMALL_STATE(1224)] = 47667, + [SMALL_STATE(1225)] = 47684, + [SMALL_STATE(1226)] = 47701, + [SMALL_STATE(1227)] = 47716, + [SMALL_STATE(1228)] = 47731, + [SMALL_STATE(1229)] = 47746, + [SMALL_STATE(1230)] = 47763, + [SMALL_STATE(1231)] = 47778, + [SMALL_STATE(1232)] = 47793, + [SMALL_STATE(1233)] = 47810, + [SMALL_STATE(1234)] = 47825, + [SMALL_STATE(1235)] = 47840, + [SMALL_STATE(1236)] = 47855, + [SMALL_STATE(1237)] = 47870, + [SMALL_STATE(1238)] = 47887, + [SMALL_STATE(1239)] = 47902, + [SMALL_STATE(1240)] = 47919, + [SMALL_STATE(1241)] = 47934, + [SMALL_STATE(1242)] = 47949, + [SMALL_STATE(1243)] = 47964, + [SMALL_STATE(1244)] = 47979, + [SMALL_STATE(1245)] = 47994, + [SMALL_STATE(1246)] = 48009, + [SMALL_STATE(1247)] = 48024, + [SMALL_STATE(1248)] = 48039, + [SMALL_STATE(1249)] = 48054, + [SMALL_STATE(1250)] = 48069, + [SMALL_STATE(1251)] = 48084, + [SMALL_STATE(1252)] = 48099, + [SMALL_STATE(1253)] = 48116, + [SMALL_STATE(1254)] = 48133, + [SMALL_STATE(1255)] = 48150, + [SMALL_STATE(1256)] = 48167, + [SMALL_STATE(1257)] = 48182, + [SMALL_STATE(1258)] = 48197, + [SMALL_STATE(1259)] = 48212, + [SMALL_STATE(1260)] = 48229, + [SMALL_STATE(1261)] = 48244, + [SMALL_STATE(1262)] = 48261, + [SMALL_STATE(1263)] = 48276, + [SMALL_STATE(1264)] = 48291, + [SMALL_STATE(1265)] = 48306, + [SMALL_STATE(1266)] = 48321, + [SMALL_STATE(1267)] = 48336, + [SMALL_STATE(1268)] = 48353, + [SMALL_STATE(1269)] = 48368, + [SMALL_STATE(1270)] = 48383, + [SMALL_STATE(1271)] = 48398, + [SMALL_STATE(1272)] = 48413, + [SMALL_STATE(1273)] = 48430, + [SMALL_STATE(1274)] = 48445, + [SMALL_STATE(1275)] = 48460, + [SMALL_STATE(1276)] = 48475, + [SMALL_STATE(1277)] = 48492, + [SMALL_STATE(1278)] = 48507, + [SMALL_STATE(1279)] = 48522, + [SMALL_STATE(1280)] = 48537, + [SMALL_STATE(1281)] = 48554, + [SMALL_STATE(1282)] = 48569, + [SMALL_STATE(1283)] = 48584, + [SMALL_STATE(1284)] = 48599, + [SMALL_STATE(1285)] = 48616, + [SMALL_STATE(1286)] = 48631, + [SMALL_STATE(1287)] = 48648, + [SMALL_STATE(1288)] = 48663, + [SMALL_STATE(1289)] = 48678, + [SMALL_STATE(1290)] = 48695, + [SMALL_STATE(1291)] = 48710, + [SMALL_STATE(1292)] = 48725, + [SMALL_STATE(1293)] = 48740, + [SMALL_STATE(1294)] = 48757, + [SMALL_STATE(1295)] = 48774, + [SMALL_STATE(1296)] = 48791, + [SMALL_STATE(1297)] = 48806, + [SMALL_STATE(1298)] = 48821, + [SMALL_STATE(1299)] = 48836, + [SMALL_STATE(1300)] = 48853, + [SMALL_STATE(1301)] = 48870, + [SMALL_STATE(1302)] = 48887, + [SMALL_STATE(1303)] = 48902, + [SMALL_STATE(1304)] = 48919, + [SMALL_STATE(1305)] = 48934, + [SMALL_STATE(1306)] = 48949, + [SMALL_STATE(1307)] = 48964, + [SMALL_STATE(1308)] = 48979, + [SMALL_STATE(1309)] = 48994, + [SMALL_STATE(1310)] = 49009, + [SMALL_STATE(1311)] = 49026, + [SMALL_STATE(1312)] = 49043, + [SMALL_STATE(1313)] = 49060, + [SMALL_STATE(1314)] = 49075, + [SMALL_STATE(1315)] = 49090, + [SMALL_STATE(1316)] = 49107, + [SMALL_STATE(1317)] = 49122, + [SMALL_STATE(1318)] = 49137, + [SMALL_STATE(1319)] = 49154, + [SMALL_STATE(1320)] = 49171, + [SMALL_STATE(1321)] = 49186, + [SMALL_STATE(1322)] = 49203, + [SMALL_STATE(1323)] = 49218, + [SMALL_STATE(1324)] = 49235, + [SMALL_STATE(1325)] = 49250, + [SMALL_STATE(1326)] = 49265, + [SMALL_STATE(1327)] = 49280, + [SMALL_STATE(1328)] = 49297, + [SMALL_STATE(1329)] = 49312, + [SMALL_STATE(1330)] = 49327, + [SMALL_STATE(1331)] = 49341, + [SMALL_STATE(1332)] = 49355, + [SMALL_STATE(1333)] = 49369, + [SMALL_STATE(1334)] = 49383, + [SMALL_STATE(1335)] = 49397, + [SMALL_STATE(1336)] = 49411, + [SMALL_STATE(1337)] = 49425, + [SMALL_STATE(1338)] = 49439, + [SMALL_STATE(1339)] = 49453, + [SMALL_STATE(1340)] = 49467, + [SMALL_STATE(1341)] = 49481, + [SMALL_STATE(1342)] = 49495, + [SMALL_STATE(1343)] = 49509, + [SMALL_STATE(1344)] = 49523, + [SMALL_STATE(1345)] = 49537, + [SMALL_STATE(1346)] = 49551, + [SMALL_STATE(1347)] = 49565, + [SMALL_STATE(1348)] = 49579, + [SMALL_STATE(1349)] = 49593, + [SMALL_STATE(1350)] = 49607, + [SMALL_STATE(1351)] = 49621, + [SMALL_STATE(1352)] = 49635, + [SMALL_STATE(1353)] = 49649, + [SMALL_STATE(1354)] = 49663, + [SMALL_STATE(1355)] = 49677, + [SMALL_STATE(1356)] = 49691, + [SMALL_STATE(1357)] = 49705, + [SMALL_STATE(1358)] = 49719, + [SMALL_STATE(1359)] = 49733, + [SMALL_STATE(1360)] = 49747, + [SMALL_STATE(1361)] = 49761, + [SMALL_STATE(1362)] = 49775, + [SMALL_STATE(1363)] = 49789, + [SMALL_STATE(1364)] = 49803, + [SMALL_STATE(1365)] = 49817, + [SMALL_STATE(1366)] = 49831, + [SMALL_STATE(1367)] = 49845, + [SMALL_STATE(1368)] = 49859, + [SMALL_STATE(1369)] = 49873, + [SMALL_STATE(1370)] = 49887, + [SMALL_STATE(1371)] = 49901, + [SMALL_STATE(1372)] = 49915, + [SMALL_STATE(1373)] = 49929, + [SMALL_STATE(1374)] = 49943, + [SMALL_STATE(1375)] = 49957, + [SMALL_STATE(1376)] = 49971, + [SMALL_STATE(1377)] = 49985, + [SMALL_STATE(1378)] = 49999, + [SMALL_STATE(1379)] = 50013, + [SMALL_STATE(1380)] = 50027, + [SMALL_STATE(1381)] = 50041, + [SMALL_STATE(1382)] = 50055, + [SMALL_STATE(1383)] = 50069, + [SMALL_STATE(1384)] = 50083, + [SMALL_STATE(1385)] = 50097, + [SMALL_STATE(1386)] = 50111, + [SMALL_STATE(1387)] = 50125, + [SMALL_STATE(1388)] = 50139, + [SMALL_STATE(1389)] = 50153, + [SMALL_STATE(1390)] = 50167, + [SMALL_STATE(1391)] = 50181, + [SMALL_STATE(1392)] = 50195, + [SMALL_STATE(1393)] = 50209, + [SMALL_STATE(1394)] = 50223, + [SMALL_STATE(1395)] = 50237, + [SMALL_STATE(1396)] = 50251, + [SMALL_STATE(1397)] = 50265, + [SMALL_STATE(1398)] = 50279, + [SMALL_STATE(1399)] = 50293, + [SMALL_STATE(1400)] = 50307, + [SMALL_STATE(1401)] = 50321, + [SMALL_STATE(1402)] = 50335, + [SMALL_STATE(1403)] = 50349, + [SMALL_STATE(1404)] = 50363, + [SMALL_STATE(1405)] = 50377, + [SMALL_STATE(1406)] = 50391, + [SMALL_STATE(1407)] = 50405, + [SMALL_STATE(1408)] = 50419, + [SMALL_STATE(1409)] = 50433, + [SMALL_STATE(1410)] = 50447, + [SMALL_STATE(1411)] = 50461, + [SMALL_STATE(1412)] = 50475, + [SMALL_STATE(1413)] = 50489, + [SMALL_STATE(1414)] = 50503, + [SMALL_STATE(1415)] = 50517, + [SMALL_STATE(1416)] = 50531, + [SMALL_STATE(1417)] = 50545, + [SMALL_STATE(1418)] = 50559, + [SMALL_STATE(1419)] = 50573, + [SMALL_STATE(1420)] = 50587, + [SMALL_STATE(1421)] = 50601, + [SMALL_STATE(1422)] = 50615, + [SMALL_STATE(1423)] = 50629, + [SMALL_STATE(1424)] = 50643, + [SMALL_STATE(1425)] = 50657, + [SMALL_STATE(1426)] = 50671, + [SMALL_STATE(1427)] = 50685, + [SMALL_STATE(1428)] = 50699, + [SMALL_STATE(1429)] = 50713, + [SMALL_STATE(1430)] = 50727, + [SMALL_STATE(1431)] = 50741, + [SMALL_STATE(1432)] = 50755, + [SMALL_STATE(1433)] = 50769, + [SMALL_STATE(1434)] = 50783, + [SMALL_STATE(1435)] = 50797, + [SMALL_STATE(1436)] = 50811, + [SMALL_STATE(1437)] = 50825, + [SMALL_STATE(1438)] = 50839, + [SMALL_STATE(1439)] = 50853, + [SMALL_STATE(1440)] = 50867, + [SMALL_STATE(1441)] = 50881, + [SMALL_STATE(1442)] = 50895, + [SMALL_STATE(1443)] = 50909, + [SMALL_STATE(1444)] = 50923, + [SMALL_STATE(1445)] = 50937, + [SMALL_STATE(1446)] = 50951, + [SMALL_STATE(1447)] = 50965, + [SMALL_STATE(1448)] = 50979, + [SMALL_STATE(1449)] = 50993, + [SMALL_STATE(1450)] = 51007, + [SMALL_STATE(1451)] = 51021, + [SMALL_STATE(1452)] = 51035, + [SMALL_STATE(1453)] = 51049, + [SMALL_STATE(1454)] = 51063, + [SMALL_STATE(1455)] = 51077, + [SMALL_STATE(1456)] = 51091, + [SMALL_STATE(1457)] = 51105, + [SMALL_STATE(1458)] = 51119, + [SMALL_STATE(1459)] = 51133, + [SMALL_STATE(1460)] = 51147, + [SMALL_STATE(1461)] = 51161, + [SMALL_STATE(1462)] = 51175, + [SMALL_STATE(1463)] = 51189, + [SMALL_STATE(1464)] = 51203, + [SMALL_STATE(1465)] = 51217, + [SMALL_STATE(1466)] = 51231, + [SMALL_STATE(1467)] = 51245, + [SMALL_STATE(1468)] = 51259, + [SMALL_STATE(1469)] = 51273, + [SMALL_STATE(1470)] = 51287, + [SMALL_STATE(1471)] = 51301, + [SMALL_STATE(1472)] = 51315, + [SMALL_STATE(1473)] = 51329, + [SMALL_STATE(1474)] = 51343, + [SMALL_STATE(1475)] = 51357, + [SMALL_STATE(1476)] = 51371, + [SMALL_STATE(1477)] = 51385, + [SMALL_STATE(1478)] = 51399, + [SMALL_STATE(1479)] = 51413, + [SMALL_STATE(1480)] = 51427, + [SMALL_STATE(1481)] = 51441, + [SMALL_STATE(1482)] = 51455, + [SMALL_STATE(1483)] = 51469, + [SMALL_STATE(1484)] = 51483, + [SMALL_STATE(1485)] = 51497, + [SMALL_STATE(1486)] = 51511, + [SMALL_STATE(1487)] = 51525, + [SMALL_STATE(1488)] = 51539, + [SMALL_STATE(1489)] = 51553, + [SMALL_STATE(1490)] = 51567, + [SMALL_STATE(1491)] = 51581, + [SMALL_STATE(1492)] = 51595, + [SMALL_STATE(1493)] = 51609, + [SMALL_STATE(1494)] = 51623, + [SMALL_STATE(1495)] = 51637, + [SMALL_STATE(1496)] = 51651, + [SMALL_STATE(1497)] = 51665, + [SMALL_STATE(1498)] = 51679, + [SMALL_STATE(1499)] = 51693, + [SMALL_STATE(1500)] = 51707, + [SMALL_STATE(1501)] = 51721, + [SMALL_STATE(1502)] = 51735, + [SMALL_STATE(1503)] = 51749, + [SMALL_STATE(1504)] = 51763, + [SMALL_STATE(1505)] = 51777, + [SMALL_STATE(1506)] = 51791, + [SMALL_STATE(1507)] = 51805, + [SMALL_STATE(1508)] = 51819, + [SMALL_STATE(1509)] = 51833, + [SMALL_STATE(1510)] = 51847, + [SMALL_STATE(1511)] = 51861, + [SMALL_STATE(1512)] = 51875, + [SMALL_STATE(1513)] = 51889, + [SMALL_STATE(1514)] = 51903, + [SMALL_STATE(1515)] = 51917, + [SMALL_STATE(1516)] = 51931, + [SMALL_STATE(1517)] = 51945, + [SMALL_STATE(1518)] = 51959, + [SMALL_STATE(1519)] = 51973, + [SMALL_STATE(1520)] = 51987, + [SMALL_STATE(1521)] = 52001, + [SMALL_STATE(1522)] = 52015, + [SMALL_STATE(1523)] = 52029, + [SMALL_STATE(1524)] = 52043, + [SMALL_STATE(1525)] = 52057, + [SMALL_STATE(1526)] = 52071, + [SMALL_STATE(1527)] = 52085, + [SMALL_STATE(1528)] = 52099, + [SMALL_STATE(1529)] = 52113, + [SMALL_STATE(1530)] = 52127, + [SMALL_STATE(1531)] = 52141, + [SMALL_STATE(1532)] = 52155, + [SMALL_STATE(1533)] = 52169, + [SMALL_STATE(1534)] = 52183, + [SMALL_STATE(1535)] = 52197, + [SMALL_STATE(1536)] = 52211, + [SMALL_STATE(1537)] = 52225, + [SMALL_STATE(1538)] = 52239, + [SMALL_STATE(1539)] = 52253, + [SMALL_STATE(1540)] = 52267, + [SMALL_STATE(1541)] = 52281, + [SMALL_STATE(1542)] = 52295, + [SMALL_STATE(1543)] = 52309, + [SMALL_STATE(1544)] = 52323, + [SMALL_STATE(1545)] = 52337, + [SMALL_STATE(1546)] = 52351, + [SMALL_STATE(1547)] = 52365, + [SMALL_STATE(1548)] = 52379, + [SMALL_STATE(1549)] = 52393, + [SMALL_STATE(1550)] = 52407, + [SMALL_STATE(1551)] = 52421, + [SMALL_STATE(1552)] = 52435, + [SMALL_STATE(1553)] = 52449, + [SMALL_STATE(1554)] = 52463, + [SMALL_STATE(1555)] = 52477, + [SMALL_STATE(1556)] = 52491, + [SMALL_STATE(1557)] = 52505, + [SMALL_STATE(1558)] = 52519, + [SMALL_STATE(1559)] = 52533, + [SMALL_STATE(1560)] = 52547, + [SMALL_STATE(1561)] = 52561, + [SMALL_STATE(1562)] = 52575, + [SMALL_STATE(1563)] = 52589, + [SMALL_STATE(1564)] = 52603, + [SMALL_STATE(1565)] = 52617, + [SMALL_STATE(1566)] = 52631, + [SMALL_STATE(1567)] = 52645, + [SMALL_STATE(1568)] = 52659, + [SMALL_STATE(1569)] = 52673, + [SMALL_STATE(1570)] = 52687, + [SMALL_STATE(1571)] = 52701, + [SMALL_STATE(1572)] = 52715, + [SMALL_STATE(1573)] = 52729, + [SMALL_STATE(1574)] = 52743, + [SMALL_STATE(1575)] = 52757, + [SMALL_STATE(1576)] = 52771, + [SMALL_STATE(1577)] = 52785, + [SMALL_STATE(1578)] = 52799, + [SMALL_STATE(1579)] = 52813, + [SMALL_STATE(1580)] = 52827, + [SMALL_STATE(1581)] = 52841, + [SMALL_STATE(1582)] = 52855, + [SMALL_STATE(1583)] = 52869, + [SMALL_STATE(1584)] = 52883, + [SMALL_STATE(1585)] = 52897, + [SMALL_STATE(1586)] = 52911, + [SMALL_STATE(1587)] = 52925, + [SMALL_STATE(1588)] = 52939, + [SMALL_STATE(1589)] = 52953, + [SMALL_STATE(1590)] = 52967, + [SMALL_STATE(1591)] = 52981, + [SMALL_STATE(1592)] = 52995, + [SMALL_STATE(1593)] = 53009, + [SMALL_STATE(1594)] = 53023, + [SMALL_STATE(1595)] = 53037, + [SMALL_STATE(1596)] = 53051, + [SMALL_STATE(1597)] = 53065, + [SMALL_STATE(1598)] = 53079, + [SMALL_STATE(1599)] = 53093, + [SMALL_STATE(1600)] = 53107, + [SMALL_STATE(1601)] = 53121, + [SMALL_STATE(1602)] = 53135, + [SMALL_STATE(1603)] = 53149, + [SMALL_STATE(1604)] = 53163, + [SMALL_STATE(1605)] = 53177, + [SMALL_STATE(1606)] = 53191, + [SMALL_STATE(1607)] = 53205, + [SMALL_STATE(1608)] = 53219, + [SMALL_STATE(1609)] = 53233, + [SMALL_STATE(1610)] = 53247, + [SMALL_STATE(1611)] = 53261, + [SMALL_STATE(1612)] = 53275, + [SMALL_STATE(1613)] = 53289, + [SMALL_STATE(1614)] = 53303, + [SMALL_STATE(1615)] = 53317, + [SMALL_STATE(1616)] = 53331, + [SMALL_STATE(1617)] = 53345, + [SMALL_STATE(1618)] = 53359, + [SMALL_STATE(1619)] = 53373, + [SMALL_STATE(1620)] = 53387, + [SMALL_STATE(1621)] = 53401, + [SMALL_STATE(1622)] = 53415, + [SMALL_STATE(1623)] = 53429, + [SMALL_STATE(1624)] = 53443, + [SMALL_STATE(1625)] = 53457, + [SMALL_STATE(1626)] = 53461, }; static const TSParseActionEntry ts_parse_actions[] = { [0] = {.entry = {.count = 0, .reusable = false}}, [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), - [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1357), - [5] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1441), + [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1487), + [5] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1396), [7] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_program, 0, 0, 0), - [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(218), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1342), - [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1371), - [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(805), - [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(756), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(583), - [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1491), - [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(713), - [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(612), - [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1548), + [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(219), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1491), + [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1368), + [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(758), + [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(716), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(584), + [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1595), + [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(750), + [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(622), + [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1480), [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(38), - [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(613), - [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1293), - [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1473), - [37] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1037), - [39] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1038), - [41] = {.entry = {.count = 1, .reusable = true}}, SHIFT(614), - [43] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1309), - [45] = {.entry = {.count = 1, .reusable = true}}, SHIFT(667), + [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(618), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1225), + [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1508), + [37] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1073), + [39] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1143), + [41] = {.entry = {.count = 1, .reusable = true}}, SHIFT(621), + [43] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1156), + [45] = {.entry = {.count = 1, .reusable = true}}, SHIFT(639), [47] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__double_quote_string, 3, 0, 0), [49] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__double_quote_string, 3, 0, 0), - [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_identifier, 3, 0, 0), - [53] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_identifier, 3, 0, 0), - [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_identifier, 1, 0, 0), - [57] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_identifier, 1, 0, 0), - [59] = {.entry = {.count = 1, .reusable = false}}, SHIFT(382), - [61] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1436), - [63] = {.entry = {.count = 1, .reusable = false}}, SHIFT(699), + [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_identifier, 1, 0, 0), + [53] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_identifier, 1, 0, 0), + [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_identifier, 3, 0, 0), + [57] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_identifier, 3, 0, 0), + [59] = {.entry = {.count = 1, .reusable = false}}, SHIFT(406), + [61] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1504), + [63] = {.entry = {.count = 1, .reusable = false}}, SHIFT(692), [65] = {.entry = {.count = 1, .reusable = false}}, SHIFT(899), - [67] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1286), - [69] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1259), - [71] = {.entry = {.count = 1, .reusable = false}}, SHIFT(829), - [73] = {.entry = {.count = 1, .reusable = false}}, SHIFT(369), - [75] = {.entry = {.count = 1, .reusable = false}}, SHIFT(340), - [77] = {.entry = {.count = 1, .reusable = false}}, SHIFT(353), - [79] = {.entry = {.count = 1, .reusable = false}}, SHIFT(354), - [81] = {.entry = {.count = 1, .reusable = false}}, SHIFT(370), - [83] = {.entry = {.count = 1, .reusable = false}}, SHIFT(371), - [85] = {.entry = {.count = 1, .reusable = false}}, SHIFT(372), - [87] = {.entry = {.count = 1, .reusable = false}}, SHIFT(373), - [89] = {.entry = {.count = 1, .reusable = false}}, SHIFT(374), - [91] = {.entry = {.count = 1, .reusable = false}}, SHIFT(375), - [93] = {.entry = {.count = 1, .reusable = false}}, SHIFT(376), - [95] = {.entry = {.count = 1, .reusable = false}}, SHIFT(377), - [97] = {.entry = {.count = 1, .reusable = false}}, SHIFT(355), - [99] = {.entry = {.count = 1, .reusable = false}}, SHIFT(357), - [101] = {.entry = {.count = 1, .reusable = false}}, SHIFT(331), - [103] = {.entry = {.count = 1, .reusable = false}}, SHIFT(332), + [67] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1206), + [69] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1228), + [71] = {.entry = {.count = 1, .reusable = false}}, SHIFT(858), + [73] = {.entry = {.count = 1, .reusable = false}}, SHIFT(396), + [75] = {.entry = {.count = 1, .reusable = false}}, SHIFT(337), + [77] = {.entry = {.count = 1, .reusable = false}}, SHIFT(364), + [79] = {.entry = {.count = 1, .reusable = false}}, SHIFT(352), + [81] = {.entry = {.count = 1, .reusable = false}}, SHIFT(397), + [83] = {.entry = {.count = 1, .reusable = false}}, SHIFT(398), + [85] = {.entry = {.count = 1, .reusable = false}}, SHIFT(399), + [87] = {.entry = {.count = 1, .reusable = false}}, SHIFT(400), + [89] = {.entry = {.count = 1, .reusable = false}}, SHIFT(401), + [91] = {.entry = {.count = 1, .reusable = false}}, SHIFT(402), + [93] = {.entry = {.count = 1, .reusable = false}}, SHIFT(403), + [95] = {.entry = {.count = 1, .reusable = false}}, SHIFT(404), + [97] = {.entry = {.count = 1, .reusable = false}}, SHIFT(365), + [99] = {.entry = {.count = 1, .reusable = false}}, SHIFT(358), + [101] = {.entry = {.count = 1, .reusable = false}}, SHIFT(332), + [103] = {.entry = {.count = 1, .reusable = false}}, SHIFT(331), [105] = {.entry = {.count = 1, .reusable = false}}, SHIFT(327), - [107] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1502), - [109] = {.entry = {.count = 1, .reusable = false}}, SHIFT(361), - [111] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1514), - [113] = {.entry = {.count = 1, .reusable = false}}, SHIFT(359), - [115] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1525), - [117] = {.entry = {.count = 1, .reusable = false}}, SHIFT(348), - [119] = {.entry = {.count = 1, .reusable = false}}, SHIFT(344), - [121] = {.entry = {.count = 1, .reusable = false}}, SHIFT(336), - [123] = {.entry = {.count = 1, .reusable = false}}, SHIFT(380), - [125] = {.entry = {.count = 1, .reusable = false}}, SHIFT(381), - [127] = {.entry = {.count = 1, .reusable = false}}, SHIFT(562), - [129] = {.entry = {.count = 1, .reusable = false}}, SHIFT(910), - [131] = {.entry = {.count = 1, .reusable = false}}, SHIFT(549), - [133] = {.entry = {.count = 1, .reusable = false}}, SHIFT(493), + [107] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1371), + [109] = {.entry = {.count = 1, .reusable = false}}, SHIFT(366), + [111] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1377), + [113] = {.entry = {.count = 1, .reusable = false}}, SHIFT(367), + [115] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1383), + [117] = {.entry = {.count = 1, .reusable = false}}, SHIFT(343), + [119] = {.entry = {.count = 1, .reusable = false}}, SHIFT(357), + [121] = {.entry = {.count = 1, .reusable = false}}, SHIFT(328), + [123] = {.entry = {.count = 1, .reusable = false}}, SHIFT(349), + [125] = {.entry = {.count = 1, .reusable = false}}, SHIFT(405), + [127] = {.entry = {.count = 1, .reusable = false}}, SHIFT(572), + [129] = {.entry = {.count = 1, .reusable = false}}, SHIFT(929), + [131] = {.entry = {.count = 1, .reusable = false}}, SHIFT(539), + [133] = {.entry = {.count = 1, .reusable = false}}, SHIFT(464), [135] = {.entry = {.count = 1, .reusable = false}}, SHIFT(503), [137] = {.entry = {.count = 1, .reusable = false}}, SHIFT(504), - [139] = {.entry = {.count = 1, .reusable = false}}, SHIFT(550), - [141] = {.entry = {.count = 1, .reusable = false}}, SHIFT(551), - [143] = {.entry = {.count = 1, .reusable = false}}, SHIFT(552), - [145] = {.entry = {.count = 1, .reusable = false}}, SHIFT(553), - [147] = {.entry = {.count = 1, .reusable = false}}, SHIFT(554), - [149] = {.entry = {.count = 1, .reusable = false}}, SHIFT(556), - [151] = {.entry = {.count = 1, .reusable = false}}, SHIFT(557), - [153] = {.entry = {.count = 1, .reusable = false}}, SHIFT(558), + [139] = {.entry = {.count = 1, .reusable = false}}, SHIFT(546), + [141] = {.entry = {.count = 1, .reusable = false}}, SHIFT(547), + [143] = {.entry = {.count = 1, .reusable = false}}, SHIFT(559), + [145] = {.entry = {.count = 1, .reusable = false}}, SHIFT(531), + [147] = {.entry = {.count = 1, .reusable = false}}, SHIFT(532), + [149] = {.entry = {.count = 1, .reusable = false}}, SHIFT(534), + [151] = {.entry = {.count = 1, .reusable = false}}, SHIFT(535), + [153] = {.entry = {.count = 1, .reusable = false}}, SHIFT(536), [155] = {.entry = {.count = 1, .reusable = false}}, SHIFT(505), [157] = {.entry = {.count = 1, .reusable = false}}, SHIFT(506), - [159] = {.entry = {.count = 1, .reusable = false}}, SHIFT(445), - [161] = {.entry = {.count = 1, .reusable = false}}, SHIFT(444), - [163] = {.entry = {.count = 1, .reusable = false}}, SHIFT(429), - [165] = {.entry = {.count = 1, .reusable = false}}, SHIFT(510), - [167] = {.entry = {.count = 1, .reusable = false}}, SHIFT(513), - [169] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1592), - [171] = {.entry = {.count = 1, .reusable = false}}, SHIFT(517), - [173] = {.entry = {.count = 1, .reusable = false}}, SHIFT(498), - [175] = {.entry = {.count = 1, .reusable = false}}, SHIFT(480), - [177] = {.entry = {.count = 1, .reusable = false}}, SHIFT(560), - [179] = {.entry = {.count = 1, .reusable = false}}, SHIFT(561), - [181] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), - [183] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(218), - [186] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1342), - [189] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1371), - [192] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(805), - [195] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(756), - [198] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(583), - [201] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1491), - [204] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(713), - [207] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(612), - [210] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1548), - [213] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(38), - [216] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(613), - [219] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1293), - [222] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1473), - [225] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1037), - [228] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1038), - [231] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(614), - [234] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1309), - [237] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(667), - [240] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_program, 1, 0, 0), + [159] = {.entry = {.count = 1, .reusable = false}}, SHIFT(448), + [161] = {.entry = {.count = 1, .reusable = false}}, SHIFT(449), + [163] = {.entry = {.count = 1, .reusable = false}}, SHIFT(439), + [165] = {.entry = {.count = 1, .reusable = false}}, SHIFT(507), + [167] = {.entry = {.count = 1, .reusable = false}}, SHIFT(508), + [169] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1608), + [171] = {.entry = {.count = 1, .reusable = false}}, SHIFT(509), + [173] = {.entry = {.count = 1, .reusable = false}}, SHIFT(510), + [175] = {.entry = {.count = 1, .reusable = false}}, SHIFT(450), + [177] = {.entry = {.count = 1, .reusable = false}}, SHIFT(511), + [179] = {.entry = {.count = 1, .reusable = false}}, SHIFT(560), + [181] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_program, 1, 0, 0), + [183] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), + [185] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(219), + [188] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1491), + [191] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1368), + [194] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(758), + [197] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(716), + [200] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(584), + [203] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1595), + [206] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(750), + [209] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(622), + [212] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1480), + [215] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(38), + [218] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(618), + [221] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1225), + [224] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1508), + [227] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1073), + [230] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1143), + [233] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(621), + [236] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(1156), + [239] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_program_repeat1, 2, 0, 0), SHIFT_REPEAT(639), [242] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__single_quote_string, 3, 0, 0), [244] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__single_quote_string, 3, 0, 0), - [246] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer, 1, 0, 0), - [248] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_integer, 1, 0, 0), - [250] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal_string, 1, 0, 0), - [252] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal_string, 1, 0, 0), + [246] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal_string, 1, 0, 0), + [248] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal_string, 1, 0, 0), + [250] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer, 1, 0, 0), + [252] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_integer, 1, 0, 0), [254] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer, 2, 0, 0), [256] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_integer, 2, 0, 0), [258] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary_expression, 3, 0, 36), [260] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_binary_expression, 3, 0, 36), - [262] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1109), - [264] = {.entry = {.count = 1, .reusable = true}}, SHIFT(242), - [266] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(803), - [269] = {.entry = {.count = 1, .reusable = false}}, SHIFT(279), - [271] = {.entry = {.count = 1, .reusable = true}}, SHIFT(280), - [273] = {.entry = {.count = 1, .reusable = true}}, SHIFT(279), - [275] = {.entry = {.count = 1, .reusable = false}}, SHIFT(280), - [277] = {.entry = {.count = 1, .reusable = true}}, SHIFT(281), - [279] = {.entry = {.count = 1, .reusable = false}}, SHIFT(281), - [281] = {.entry = {.count = 1, .reusable = true}}, SHIFT(282), - [283] = {.entry = {.count = 1, .reusable = true}}, SHIFT(283), - [285] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_between_expression, 6, 0, 105), - [287] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_between_expression, 6, 0, 105), - [289] = {.entry = {.count = 1, .reusable = true}}, SHIFT(803), - [291] = {.entry = {.count = 1, .reusable = true}}, SHIFT(587), - [293] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1475), - [295] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), - [297] = {.entry = {.count = 1, .reusable = true}}, SHIFT(759), - [299] = {.entry = {.count = 1, .reusable = true}}, SHIFT(320), - [301] = {.entry = {.count = 1, .reusable = true}}, SHIFT(277), - [303] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_between_expression, 5, 0, 77), - [305] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_between_expression, 5, 0, 77), - [307] = {.entry = {.count = 1, .reusable = true}}, SHIFT(28), + [262] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1118), + [264] = {.entry = {.count = 1, .reusable = true}}, SHIFT(246), + [266] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(808), + [269] = {.entry = {.count = 1, .reusable = false}}, SHIFT(289), + [271] = {.entry = {.count = 1, .reusable = true}}, SHIFT(290), + [273] = {.entry = {.count = 1, .reusable = true}}, SHIFT(289), + [275] = {.entry = {.count = 1, .reusable = false}}, SHIFT(290), + [277] = {.entry = {.count = 1, .reusable = true}}, SHIFT(291), + [279] = {.entry = {.count = 1, .reusable = false}}, SHIFT(291), + [281] = {.entry = {.count = 1, .reusable = true}}, SHIFT(292), + [283] = {.entry = {.count = 1, .reusable = true}}, SHIFT(293), + [285] = {.entry = {.count = 1, .reusable = true}}, SHIFT(40), + [287] = {.entry = {.count = 1, .reusable = true}}, SHIFT(754), + [289] = {.entry = {.count = 1, .reusable = true}}, SHIFT(808), + [291] = {.entry = {.count = 1, .reusable = true}}, SHIFT(318), + [293] = {.entry = {.count = 1, .reusable = true}}, SHIFT(600), + [295] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1363), + [297] = {.entry = {.count = 1, .reusable = true}}, SHIFT(326), + [299] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_between_expression, 5, 0, 77), + [301] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_between_expression, 5, 0, 77), + [303] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_between_expression, 6, 0, 105), + [305] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_between_expression, 6, 0, 105), + [307] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), [309] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), - [311] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 20), - [313] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 20), - [315] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), - [317] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal_number, 2, 0, 0), - [319] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal_number, 2, 0, 0), - [321] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), - [323] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal_number, 3, 0, 0), - [325] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal_number, 3, 0, 0), + [311] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal_number, 2, 0, 0), + [313] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal_number, 2, 0, 0), + [315] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), + [317] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 20), + [319] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 20), + [321] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), + [323] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 10), + [325] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 10), [327] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 9), [329] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 9), - [331] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 19), - [333] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 19), - [335] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 10), - [337] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 10), - [339] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 8), - [341] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 8), - [343] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 21), - [345] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 21), + [331] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal_number, 3, 0, 0), + [333] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal_number, 3, 0, 0), + [335] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 19), + [337] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 19), + [339] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 21), + [341] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 21), + [343] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_literal, 1, 0, 8), + [345] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_literal, 1, 0, 8), [347] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_unary_expression, 2, 0, 133), [349] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_unary_expression, 2, 0, 133), - [351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(278), - [353] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1031), - [355] = {.entry = {.count = 1, .reusable = false}}, SHIFT(240), - [357] = {.entry = {.count = 1, .reusable = false}}, SHIFT(752), - [359] = {.entry = {.count = 1, .reusable = false}}, SHIFT(587), - [361] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1475), - [363] = {.entry = {.count = 1, .reusable = false}}, SHIFT(267), - [365] = {.entry = {.count = 1, .reusable = true}}, SHIFT(268), - [367] = {.entry = {.count = 1, .reusable = true}}, SHIFT(267), - [369] = {.entry = {.count = 1, .reusable = false}}, SHIFT(268), - [371] = {.entry = {.count = 1, .reusable = true}}, SHIFT(270), - [373] = {.entry = {.count = 1, .reusable = false}}, SHIFT(270), - [375] = {.entry = {.count = 1, .reusable = true}}, SHIFT(271), - [377] = {.entry = {.count = 1, .reusable = true}}, SHIFT(272), - [379] = {.entry = {.count = 2, .reusable = false}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(752), - [382] = {.entry = {.count = 1, .reusable = false}}, SHIFT(261), - [384] = {.entry = {.count = 1, .reusable = false}}, SHIFT(258), - [386] = {.entry = {.count = 1, .reusable = true}}, SHIFT(91), - [388] = {.entry = {.count = 1, .reusable = false}}, SHIFT(17), - [390] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_term, 1, 0, 15), - [392] = {.entry = {.count = 1, .reusable = false}}, SHIFT(822), - [394] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1126), - [396] = {.entry = {.count = 1, .reusable = false}}, SHIFT(292), - [398] = {.entry = {.count = 1, .reusable = false}}, SHIFT(293), - [400] = {.entry = {.count = 1, .reusable = false}}, SHIFT(241), - [402] = {.entry = {.count = 1, .reusable = false}}, SHIFT(745), - [404] = {.entry = {.count = 1, .reusable = false}}, SHIFT(323), - [406] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_term, 1, 0, 15), - [408] = {.entry = {.count = 1, .reusable = false}}, SHIFT(294), - [410] = {.entry = {.count = 1, .reusable = true}}, SHIFT(295), - [412] = {.entry = {.count = 1, .reusable = true}}, SHIFT(294), - [414] = {.entry = {.count = 1, .reusable = false}}, SHIFT(295), - [416] = {.entry = {.count = 1, .reusable = true}}, SHIFT(296), - [418] = {.entry = {.count = 1, .reusable = false}}, SHIFT(296), - [420] = {.entry = {.count = 1, .reusable = true}}, SHIFT(297), - [422] = {.entry = {.count = 1, .reusable = true}}, SHIFT(298), - [424] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1545), - [426] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1547), - [428] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_field, 1, 0, 23), - [430] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_field, 1, 0, 23), - [432] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_object_reference, 1, 0, 22), SHIFT(836), - [435] = {.entry = {.count = 1, .reusable = true}}, SHIFT(67), - [437] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter, 1, 0, 0), - [439] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter, 1, 0, 0), - [441] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_field, 3, 0, 31), - [443] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_field, 3, 0, 31), - [445] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 13), - [447] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 13), - [449] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 14), - [451] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 14), - [453] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter, 2, 0, 0), - [455] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter, 2, 0, 0), - [457] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 16), - [459] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 16), - [461] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 17), - [463] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 17), - [465] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 18), - [467] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 18), - [469] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 3, 0, 34), - [471] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 3, 0, 34), - [473] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2, 0, 0), - [475] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_list, 2, 0, 0), - [477] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_field, 5, 0, 74), - [479] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_field, 5, 0, 74), - [481] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_subquery, 3, 0, 0), - [483] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_subquery, 3, 0, 0), - [485] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, 0, 76), - [487] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_list, 3, 0, 76), - [489] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 4, 0, 103), - [491] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_list, 4, 0, 103), - [493] = {.entry = {.count = 2, .reusable = false}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(745), - [496] = {.entry = {.count = 1, .reusable = false}}, SHIFT(4), - [498] = {.entry = {.count = 1, .reusable = false}}, SHIFT(824), - [500] = {.entry = {.count = 1, .reusable = false}}, SHIFT(260), - [502] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1462), - [504] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1470), - [506] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_object_reference, 1, 0, 22), - [508] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_object_reference, 1, 0, 22), REDUCE(sym_qualified_field, 1, 0, 23), - [511] = {.entry = {.count = 1, .reusable = true}}, SHIFT(852), - [513] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 1, 0, 0), - [515] = {.entry = {.count = 1, .reusable = true}}, SHIFT(945), - [517] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__inner_default_expression, 1, 0, 0), - [519] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__inner_default_expression, 1, 0, 0), - [521] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_object_reference, 1, 0, 22), - [523] = {.entry = {.count = 1, .reusable = true}}, SHIFT(836), - [525] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_object_reference, 3, 0, 37), - [527] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_object_reference, 3, 0, 37), - [529] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1409), - [531] = {.entry = {.count = 1, .reusable = false}}, SHIFT(288), - [533] = {.entry = {.count = 1, .reusable = false}}, SHIFT(485), - [535] = {.entry = {.count = 1, .reusable = false}}, SHIFT(48), - [537] = {.entry = {.count = 1, .reusable = false}}, SHIFT(44), - [539] = {.entry = {.count = 1, .reusable = false}}, SHIFT(46), - [541] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1281), - [543] = {.entry = {.count = 1, .reusable = true}}, SHIFT(251), - [545] = {.entry = {.count = 1, .reusable = true}}, SHIFT(84), - [547] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1352), - [549] = {.entry = {.count = 1, .reusable = true}}, SHIFT(131), - [551] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1385), - [553] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1247), - [555] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1463), - [557] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), - [559] = {.entry = {.count = 1, .reusable = true}}, SHIFT(288), - [561] = {.entry = {.count = 1, .reusable = false}}, SHIFT(316), - [563] = {.entry = {.count = 1, .reusable = false}}, SHIFT(76), - [565] = {.entry = {.count = 1, .reusable = false}}, SHIFT(72), - [567] = {.entry = {.count = 1, .reusable = false}}, SHIFT(92), - [569] = {.entry = {.count = 1, .reusable = true}}, SHIFT(117), - [571] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1453), - [573] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1271), - [575] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1580), - [577] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1322), - [579] = {.entry = {.count = 1, .reusable = true}}, SHIFT(64), - [581] = {.entry = {.count = 1, .reusable = true}}, SHIFT(316), + [351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(287), + [353] = {.entry = {.count = 1, .reusable = false}}, SHIFT(239), + [355] = {.entry = {.count = 1, .reusable = true}}, SHIFT(278), + [357] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1016), + [359] = {.entry = {.count = 2, .reusable = false}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(796), + [362] = {.entry = {.count = 1, .reusable = false}}, SHIFT(272), + [364] = {.entry = {.count = 1, .reusable = true}}, SHIFT(274), + [366] = {.entry = {.count = 1, .reusable = true}}, SHIFT(272), + [368] = {.entry = {.count = 1, .reusable = false}}, SHIFT(274), + [370] = {.entry = {.count = 1, .reusable = true}}, SHIFT(275), + [372] = {.entry = {.count = 1, .reusable = false}}, SHIFT(275), + [374] = {.entry = {.count = 1, .reusable = true}}, SHIFT(314), + [376] = {.entry = {.count = 1, .reusable = false}}, SHIFT(281), + [378] = {.entry = {.count = 1, .reusable = false}}, SHIFT(796), + [380] = {.entry = {.count = 1, .reusable = false}}, SHIFT(309), + [382] = {.entry = {.count = 1, .reusable = false}}, SHIFT(600), + [384] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1363), + [386] = {.entry = {.count = 1, .reusable = true}}, SHIFT(93), + [388] = {.entry = {.count = 1, .reusable = true}}, SHIFT(64), + [390] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_field, 1, 0, 23), + [392] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_field, 1, 0, 23), + [394] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_object_reference, 1, 0, 22), SHIFT(895), + [397] = {.entry = {.count = 1, .reusable = false}}, SHIFT(17), + [399] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_term, 1, 0, 15), + [401] = {.entry = {.count = 1, .reusable = false}}, SHIFT(893), + [403] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1135), + [405] = {.entry = {.count = 1, .reusable = false}}, SHIFT(263), + [407] = {.entry = {.count = 1, .reusable = false}}, SHIFT(264), + [409] = {.entry = {.count = 1, .reusable = false}}, SHIFT(242), + [411] = {.entry = {.count = 1, .reusable = false}}, SHIFT(811), + [413] = {.entry = {.count = 1, .reusable = false}}, SHIFT(323), + [415] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_term, 1, 0, 15), + [417] = {.entry = {.count = 1, .reusable = false}}, SHIFT(265), + [419] = {.entry = {.count = 1, .reusable = true}}, SHIFT(266), + [421] = {.entry = {.count = 1, .reusable = true}}, SHIFT(265), + [423] = {.entry = {.count = 1, .reusable = false}}, SHIFT(266), + [425] = {.entry = {.count = 1, .reusable = true}}, SHIFT(267), + [427] = {.entry = {.count = 1, .reusable = false}}, SHIFT(267), + [429] = {.entry = {.count = 1, .reusable = true}}, SHIFT(268), + [431] = {.entry = {.count = 1, .reusable = true}}, SHIFT(269), + [433] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1560), + [435] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1562), + [437] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 4, 0, 103), + [439] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_list, 4, 0, 103), + [441] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 16), + [443] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 16), + [445] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_field, 3, 0, 31), + [447] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_field, 3, 0, 31), + [449] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 17), + [451] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 17), + [453] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 18), + [455] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 18), + [457] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter, 1, 0, 0), + [459] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter, 1, 0, 0), + [461] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2, 0, 0), + [463] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_list, 2, 0, 0), + [465] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_field, 5, 0, 74), + [467] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_field, 5, 0, 74), + [469] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_subquery, 3, 0, 0), + [471] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_subquery, 3, 0, 0), + [473] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, 0, 76), + [475] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_list, 3, 0, 76), + [477] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter, 2, 0, 0), + [479] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter, 2, 0, 0), + [481] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 13), + [483] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 13), + [485] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 14), + [487] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 1, 0, 14), + [489] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 3, 0, 34), + [491] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression, 3, 0, 34), + [493] = {.entry = {.count = 1, .reusable = false}}, SHIFT(3), + [495] = {.entry = {.count = 1, .reusable = false}}, SHIFT(868), + [497] = {.entry = {.count = 1, .reusable = false}}, SHIFT(284), + [499] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1422), + [501] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1606), + [503] = {.entry = {.count = 2, .reusable = false}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(811), + [506] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__inner_default_expression, 1, 0, 0), + [508] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__inner_default_expression, 1, 0, 0), + [510] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_object_reference, 1, 0, 22), + [512] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_object_reference, 1, 0, 22), REDUCE(sym_qualified_field, 1, 0, 23), + [515] = {.entry = {.count = 1, .reusable = true}}, SHIFT(906), + [517] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 1, 0, 0), + [519] = {.entry = {.count = 1, .reusable = true}}, SHIFT(954), + [521] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1555), + [523] = {.entry = {.count = 1, .reusable = false}}, SHIFT(257), + [525] = {.entry = {.count = 1, .reusable = false}}, SHIFT(493), + [527] = {.entry = {.count = 1, .reusable = false}}, SHIFT(49), + [529] = {.entry = {.count = 1, .reusable = false}}, SHIFT(44), + [531] = {.entry = {.count = 1, .reusable = false}}, SHIFT(43), + [533] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1319), + [535] = {.entry = {.count = 1, .reusable = true}}, SHIFT(248), + [537] = {.entry = {.count = 1, .reusable = true}}, SHIFT(85), + [539] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1358), + [541] = {.entry = {.count = 1, .reusable = true}}, SHIFT(119), + [543] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1374), + [545] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1272), + [547] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1423), + [549] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), + [551] = {.entry = {.count = 1, .reusable = true}}, SHIFT(257), + [553] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_object_reference, 3, 0, 37), + [555] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_object_reference, 3, 0, 37), + [557] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_object_reference, 1, 0, 22), + [559] = {.entry = {.count = 1, .reusable = true}}, SHIFT(895), + [561] = {.entry = {.count = 1, .reusable = false}}, SHIFT(255), + [563] = {.entry = {.count = 1, .reusable = false}}, SHIFT(81), + [565] = {.entry = {.count = 1, .reusable = false}}, SHIFT(83), + [567] = {.entry = {.count = 1, .reusable = false}}, SHIFT(94), + [569] = {.entry = {.count = 1, .reusable = true}}, SHIFT(114), + [571] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1465), + [573] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1294), + [575] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1596), + [577] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1561), + [579] = {.entry = {.count = 1, .reusable = true}}, SHIFT(65), + [581] = {.entry = {.count = 1, .reusable = true}}, SHIFT(255), [583] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 3, 0, 83), - [585] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1031), - [587] = {.entry = {.count = 1, .reusable = true}}, SHIFT(258), - [589] = {.entry = {.count = 1, .reusable = true}}, SHIFT(260), - [591] = {.entry = {.count = 1, .reusable = true}}, SHIFT(240), - [593] = {.entry = {.count = 1, .reusable = true}}, SHIFT(752), - [595] = {.entry = {.count = 1, .reusable = true}}, SHIFT(261), - [597] = {.entry = {.count = 1, .reusable = true}}, SHIFT(304), - [599] = {.entry = {.count = 1, .reusable = true}}, SHIFT(305), - [601] = {.entry = {.count = 1, .reusable = true}}, SHIFT(238), - [603] = {.entry = {.count = 1, .reusable = true}}, SHIFT(800), + [585] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1016), + [587] = {.entry = {.count = 1, .reusable = true}}, SHIFT(281), + [589] = {.entry = {.count = 1, .reusable = true}}, SHIFT(284), + [591] = {.entry = {.count = 1, .reusable = true}}, SHIFT(239), + [593] = {.entry = {.count = 1, .reusable = true}}, SHIFT(796), + [595] = {.entry = {.count = 1, .reusable = true}}, SHIFT(309), + [597] = {.entry = {.count = 1, .reusable = true}}, SHIFT(295), + [599] = {.entry = {.count = 1, .reusable = true}}, SHIFT(296), + [601] = {.entry = {.count = 1, .reusable = true}}, SHIFT(240), + [603] = {.entry = {.count = 1, .reusable = true}}, SHIFT(812), [605] = {.entry = {.count = 1, .reusable = true}}, SHIFT(325), - [607] = {.entry = {.count = 1, .reusable = true}}, SHIFT(110), - [609] = {.entry = {.count = 1, .reusable = true}}, SHIFT(289), - [611] = {.entry = {.count = 1, .reusable = false}}, SHIFT(306), - [613] = {.entry = {.count = 1, .reusable = true}}, SHIFT(252), - [615] = {.entry = {.count = 1, .reusable = true}}, SHIFT(306), - [617] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), - [619] = {.entry = {.count = 1, .reusable = false}}, SHIFT(252), - [621] = {.entry = {.count = 1, .reusable = true}}, SHIFT(307), - [623] = {.entry = {.count = 1, .reusable = false}}, SHIFT(307), - [625] = {.entry = {.count = 1, .reusable = true}}, SHIFT(308), - [627] = {.entry = {.count = 1, .reusable = true}}, SHIFT(309), - [629] = {.entry = {.count = 1, .reusable = true}}, SHIFT(460), - [631] = {.entry = {.count = 1, .reusable = true}}, SHIFT(264), - [633] = {.entry = {.count = 1, .reusable = true}}, SHIFT(123), - [635] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_where, 2, 0, 53), - [637] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1208), - [639] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 6, 0, 90), - [641] = {.entry = {.count = 1, .reusable = true}}, SHIFT(233), + [607] = {.entry = {.count = 1, .reusable = true}}, SHIFT(111), + [609] = {.entry = {.count = 1, .reusable = true}}, SHIFT(276), + [611] = {.entry = {.count = 1, .reusable = false}}, SHIFT(298), + [613] = {.entry = {.count = 1, .reusable = true}}, SHIFT(299), + [615] = {.entry = {.count = 1, .reusable = true}}, SHIFT(298), + [617] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [619] = {.entry = {.count = 1, .reusable = false}}, SHIFT(299), + [621] = {.entry = {.count = 1, .reusable = true}}, SHIFT(300), + [623] = {.entry = {.count = 1, .reusable = false}}, SHIFT(300), + [625] = {.entry = {.count = 1, .reusable = true}}, SHIFT(301), + [627] = {.entry = {.count = 1, .reusable = true}}, SHIFT(302), + [629] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 6, 0, 90), + [631] = {.entry = {.count = 1, .reusable = true}}, SHIFT(125), + [633] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1299), + [635] = {.entry = {.count = 1, .reusable = true}}, SHIFT(469), + [637] = {.entry = {.count = 1, .reusable = true}}, SHIFT(256), + [639] = {.entry = {.count = 1, .reusable = true}}, SHIFT(224), + [641] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_where, 2, 0, 53), [643] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 5, 0, 64), - [645] = {.entry = {.count = 1, .reusable = true}}, SHIFT(87), - [647] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(800), - [650] = {.entry = {.count = 1, .reusable = true}}, SHIFT(200), - [652] = {.entry = {.count = 1, .reusable = true}}, SHIFT(160), - [654] = {.entry = {.count = 1, .reusable = true}}, SHIFT(189), - [656] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_repeat1, 2, 0, 76), - [658] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_repeat1, 2, 0, 0), - [660] = {.entry = {.count = 1, .reusable = true}}, SHIFT(188), - [662] = {.entry = {.count = 1, .reusable = true}}, SHIFT(658), - [664] = {.entry = {.count = 1, .reusable = true}}, SHIFT(228), - [666] = {.entry = {.count = 1, .reusable = false}}, SHIFT(555), - [668] = {.entry = {.count = 1, .reusable = true}}, SHIFT(122), - [670] = {.entry = {.count = 1, .reusable = true}}, SHIFT(16), - [672] = {.entry = {.count = 1, .reusable = true}}, SHIFT(246), - [674] = {.entry = {.count = 1, .reusable = true}}, SHIFT(231), - [676] = {.entry = {.count = 1, .reusable = true}}, SHIFT(83), - [678] = {.entry = {.count = 1, .reusable = true}}, SHIFT(649), - [680] = {.entry = {.count = 1, .reusable = true}}, SHIFT(229), - [682] = {.entry = {.count = 1, .reusable = true}}, SHIFT(245), - [684] = {.entry = {.count = 1, .reusable = true}}, SHIFT(318), - [686] = {.entry = {.count = 1, .reusable = true}}, SHIFT(290), - [688] = {.entry = {.count = 1, .reusable = true}}, SHIFT(301), - [690] = {.entry = {.count = 1, .reusable = true}}, SHIFT(286), - [692] = {.entry = {.count = 1, .reusable = true}}, SHIFT(326), - [694] = {.entry = {.count = 1, .reusable = true}}, SHIFT(317), - [696] = {.entry = {.count = 1, .reusable = true}}, SHIFT(273), - [698] = {.entry = {.count = 1, .reusable = true}}, SHIFT(302), - [700] = {.entry = {.count = 1, .reusable = false}}, SHIFT(230), - [702] = {.entry = {.count = 1, .reusable = true}}, SHIFT(303), - [704] = {.entry = {.count = 1, .reusable = true}}, SHIFT(737), - [706] = {.entry = {.count = 1, .reusable = false}}, SHIFT(218), - [708] = {.entry = {.count = 1, .reusable = true}}, SHIFT(125), - [710] = {.entry = {.count = 1, .reusable = true}}, SHIFT(197), - [712] = {.entry = {.count = 1, .reusable = false}}, SHIFT(167), - [714] = {.entry = {.count = 1, .reusable = false}}, SHIFT(236), - [716] = {.entry = {.count = 1, .reusable = false}}, SHIFT(172), - [718] = {.entry = {.count = 1, .reusable = false}}, SHIFT(173), - [720] = {.entry = {.count = 1, .reusable = false}}, SHIFT(174), - [722] = {.entry = {.count = 1, .reusable = true}}, SHIFT(322), - [724] = {.entry = {.count = 1, .reusable = true}}, SHIFT(427), - [726] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1526), - [728] = {.entry = {.count = 1, .reusable = true}}, SHIFT(175), - [730] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1527), - [732] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1297), - [734] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1586), - [736] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1581), - [738] = {.entry = {.count = 1, .reusable = true}}, SHIFT(158), - [740] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1587), + [645] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_binary_expression, 3, 0, 36), SHIFT(812), + [648] = {.entry = {.count = 1, .reusable = true}}, SHIFT(88), + [650] = {.entry = {.count = 1, .reusable = true}}, SHIFT(202), + [652] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_repeat1, 2, 0, 0), + [654] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_repeat1, 2, 0, 76), + [656] = {.entry = {.count = 1, .reusable = true}}, SHIFT(166), + [658] = {.entry = {.count = 1, .reusable = true}}, SHIFT(194), + [660] = {.entry = {.count = 1, .reusable = true}}, SHIFT(672), + [662] = {.entry = {.count = 1, .reusable = true}}, SHIFT(130), + [664] = {.entry = {.count = 1, .reusable = false}}, SHIFT(543), + [666] = {.entry = {.count = 1, .reusable = true}}, SHIFT(241), + [668] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), + [670] = {.entry = {.count = 1, .reusable = true}}, SHIFT(638), + [672] = {.entry = {.count = 1, .reusable = true}}, SHIFT(244), + [674] = {.entry = {.count = 1, .reusable = true}}, SHIFT(233), + [676] = {.entry = {.count = 1, .reusable = true}}, SHIFT(92), + [678] = {.entry = {.count = 1, .reusable = true}}, SHIFT(223), + [680] = {.entry = {.count = 1, .reusable = true}}, SHIFT(193), + [682] = {.entry = {.count = 1, .reusable = true}}, SHIFT(226), + [684] = {.entry = {.count = 1, .reusable = true}}, SHIFT(308), + [686] = {.entry = {.count = 1, .reusable = true}}, SHIFT(254), + [688] = {.entry = {.count = 1, .reusable = true}}, SHIFT(277), + [690] = {.entry = {.count = 1, .reusable = true}}, SHIFT(305), + [692] = {.entry = {.count = 1, .reusable = true}}, SHIFT(286), + [694] = {.entry = {.count = 1, .reusable = true}}, SHIFT(288), + [696] = {.entry = {.count = 1, .reusable = true}}, SHIFT(311), + [698] = {.entry = {.count = 1, .reusable = true}}, SHIFT(312), + [700] = {.entry = {.count = 1, .reusable = false}}, SHIFT(219), + [702] = {.entry = {.count = 1, .reusable = true}}, SHIFT(321), + [704] = {.entry = {.count = 1, .reusable = true}}, SHIFT(199), + [706] = {.entry = {.count = 1, .reusable = false}}, SHIFT(225), + [708] = {.entry = {.count = 1, .reusable = true}}, SHIFT(789), + [710] = {.entry = {.count = 1, .reusable = false}}, SHIFT(167), + [712] = {.entry = {.count = 1, .reusable = false}}, SHIFT(236), + [714] = {.entry = {.count = 1, .reusable = false}}, SHIFT(172), + [716] = {.entry = {.count = 1, .reusable = false}}, SHIFT(173), + [718] = {.entry = {.count = 1, .reusable = false}}, SHIFT(174), + [720] = {.entry = {.count = 1, .reusable = true}}, SHIFT(322), + [722] = {.entry = {.count = 1, .reusable = true}}, SHIFT(426), + [724] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1541), + [726] = {.entry = {.count = 1, .reusable = true}}, SHIFT(175), + [728] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1542), + [730] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1315), + [732] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1602), + [734] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1597), + [736] = {.entry = {.count = 1, .reusable = true}}, SHIFT(161), + [738] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1603), + [740] = {.entry = {.count = 1, .reusable = true}}, SHIFT(121), [742] = {.entry = {.count = 1, .reusable = false}}, SHIFT(237), - [744] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1455), - [746] = {.entry = {.count = 1, .reusable = false}}, SHIFT(546), - [748] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1383), - [750] = {.entry = {.count = 1, .reusable = false}}, SHIFT(712), - [752] = {.entry = {.count = 1, .reusable = false}}, SHIFT(657), + [744] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1477), + [746] = {.entry = {.count = 1, .reusable = false}}, SHIFT(783), + [748] = {.entry = {.count = 1, .reusable = false}}, SHIFT(650), + [750] = {.entry = {.count = 1, .reusable = false}}, SHIFT(625), + [752] = {.entry = {.count = 1, .reusable = false}}, SHIFT(651), [754] = {.entry = {.count = 1, .reusable = false}}, SHIFT(623), - [756] = {.entry = {.count = 1, .reusable = false}}, SHIFT(647), - [758] = {.entry = {.count = 1, .reusable = false}}, SHIFT(611), - [760] = {.entry = {.count = 1, .reusable = false}}, SHIFT(648), - [762] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1550), - [764] = {.entry = {.count = 1, .reusable = false}}, SHIFT(683), - [766] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1434), - [768] = {.entry = {.count = 1, .reusable = false}}, SHIFT(70), - [770] = {.entry = {.count = 1, .reusable = true}}, SHIFT(319), - [772] = {.entry = {.count = 1, .reusable = true}}, SHIFT(73), - [774] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1454), - [776] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1582), - [778] = {.entry = {.count = 1, .reusable = true}}, SHIFT(457), - [780] = {.entry = {.count = 1, .reusable = true}}, SHIFT(259), - [782] = {.entry = {.count = 1, .reusable = true}}, SHIFT(265), - [784] = {.entry = {.count = 1, .reusable = true}}, SHIFT(269), - [786] = {.entry = {.count = 1, .reusable = true}}, SHIFT(312), - [788] = {.entry = {.count = 1, .reusable = true}}, SHIFT(253), + [756] = {.entry = {.count = 1, .reusable = false}}, SHIFT(653), + [758] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1337), + [760] = {.entry = {.count = 1, .reusable = false}}, SHIFT(689), + [762] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1607), + [764] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1391), + [766] = {.entry = {.count = 1, .reusable = false}}, SHIFT(575), + [768] = {.entry = {.count = 1, .reusable = false}}, SHIFT(68), + [770] = {.entry = {.count = 1, .reusable = true}}, SHIFT(317), + [772] = {.entry = {.count = 1, .reusable = true}}, SHIFT(78), + [774] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1466), + [776] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1598), + [778] = {.entry = {.count = 1, .reusable = true}}, SHIFT(487), + [780] = {.entry = {.count = 1, .reusable = true}}, SHIFT(258), + [782] = {.entry = {.count = 1, .reusable = true}}, SHIFT(259), + [784] = {.entry = {.count = 1, .reusable = true}}, SHIFT(280), + [786] = {.entry = {.count = 1, .reusable = true}}, SHIFT(313), + [788] = {.entry = {.count = 1, .reusable = true}}, SHIFT(252), [790] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 1, 0, 0), [792] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 1, 0, 0), - [794] = {.entry = {.count = 1, .reusable = true}}, SHIFT(343), - [796] = {.entry = {.count = 1, .reusable = true}}, SHIFT(394), - [798] = {.entry = {.count = 1, .reusable = true}}, SHIFT(328), - [800] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1476), - [802] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 2, 0, 0), - [804] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 2, 0, 0), - [806] = {.entry = {.count = 1, .reusable = true}}, SHIFT(358), - [808] = {.entry = {.count = 1, .reusable = true}}, SHIFT(405), - [810] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1354), - [812] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type, 1, 0, 67), - [814] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type, 1, 0, 67), - [816] = {.entry = {.count = 1, .reusable = true}}, SHIFT(396), - [818] = {.entry = {.count = 1, .reusable = true}}, SHIFT(955), - [820] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_real, 1, 0, 0), - [822] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_real, 1, 0, 0), - [824] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 1, 0, 0), - [826] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 1, 0, 0), - [828] = {.entry = {.count = 1, .reusable = true}}, SHIFT(347), - [830] = {.entry = {.count = 1, .reusable = true}}, SHIFT(393), - [832] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1471), - [834] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), - [836] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(469), - [839] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(1436), - [842] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(909), - [845] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(1490), - [848] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(470), - [851] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(1494), - [854] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(124), - [857] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(914), - [860] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 6, 0, 151), - [862] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 6, 0, 151), - [864] = {.entry = {.count = 1, .reusable = true}}, SHIFT(349), - [866] = {.entry = {.count = 1, .reusable = true}}, SHIFT(400), - [868] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definition, 2, 0, 66), - [870] = {.entry = {.count = 1, .reusable = true}}, SHIFT(469), - [872] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1436), - [874] = {.entry = {.count = 1, .reusable = false}}, SHIFT(909), - [876] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1490), - [878] = {.entry = {.count = 1, .reusable = true}}, SHIFT(470), - [880] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1494), - [882] = {.entry = {.count = 1, .reusable = true}}, SHIFT(124), - [884] = {.entry = {.count = 1, .reusable = true}}, SHIFT(914), - [886] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamp, 1, 0, 0), - [888] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamp, 1, 0, 0), - [890] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1481), - [892] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1482), - [894] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 6, 0, 151), - [896] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 6, 0, 151), - [898] = {.entry = {.count = 1, .reusable = true}}, SHIFT(345), - [900] = {.entry = {.count = 1, .reusable = true}}, SHIFT(403), - [902] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 7, 0, 156), - [904] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 7, 0, 156), - [906] = {.entry = {.count = 1, .reusable = true}}, SHIFT(350), - [908] = {.entry = {.count = 1, .reusable = true}}, SHIFT(411), - [910] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definition, 3, 0, 96), - [912] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 1, 0, 0), - [914] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 1, 0, 0), - [916] = {.entry = {.count = 1, .reusable = true}}, SHIFT(342), - [918] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1465), - [920] = {.entry = {.count = 1, .reusable = true}}, SHIFT(352), - [922] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1457), - [924] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 2, 0, 0), - [926] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 2, 0, 0), - [928] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1489), - [930] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_time, 1, 0, 0), - [932] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_time, 1, 0, 0), - [934] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 7, 0, 151), - [936] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 7, 0, 151), - [938] = {.entry = {.count = 1, .reusable = true}}, SHIFT(412), - [940] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_time, 1, 0, 0), - [942] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_time, 1, 0, 0), - [944] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1487), - [946] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 2, 0, 0), - [948] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 2, 0, 0), - [950] = {.entry = {.count = 1, .reusable = true}}, SHIFT(363), - [952] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_datetimeoffset, 1, 0, 0), - [954] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_datetimeoffset, 1, 0, 0), - [956] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1608), - [958] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 7, 0, 151), - [960] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 7, 0, 151), - [962] = {.entry = {.count = 1, .reusable = true}}, SHIFT(409), - [964] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 8, 0, 156), - [966] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 8, 0, 156), - [968] = {.entry = {.count = 1, .reusable = true}}, SHIFT(366), - [970] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), - [972] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), - [974] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), SHIFT_REPEAT(955), - [977] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 3, 0, 0), - [979] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 3, 0, 0), - [981] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1390), - [983] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary, 1, 0, 0), - [985] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_binary, 1, 0, 0), - [987] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1466), - [989] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_varbinary, 1, 0, 0), - [991] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_varbinary, 1, 0, 0), - [993] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1467), - [995] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal, 1, 0, 0), - [997] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal, 1, 0, 0), - [999] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1468), - [1001] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_numeric, 1, 0, 0), - [1003] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_numeric, 1, 0, 0), - [1005] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1469), - [1007] = {.entry = {.count = 1, .reusable = true}}, SHIFT(402), - [1009] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nvarchar, 1, 0, 0), - [1011] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nvarchar, 1, 0, 0), - [1013] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1478), - [1015] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_size_definition, 1, 0, 97), - [1017] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array_size_definition, 1, 0, 97), - [1019] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nchar, 1, 0, 0), - [1021] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nchar, 1, 0, 0), - [1023] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1477), - [1025] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1452), - [1027] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 3, 0, 0), - [1029] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 3, 0, 0), - [1031] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamp, 4, 0, 0), - [1033] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamp, 4, 0, 0), - [1035] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_char, 4, 0, 132), - [1037] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_char, 4, 0, 132), - [1039] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 9, 0, 156), - [1041] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 9, 0, 156), - [1043] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_varchar, 4, 0, 132), - [1045] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_varchar, 4, 0, 132), - [1047] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_time, 4, 0, 130), - [1049] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_time, 4, 0, 130), - [1051] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type_kind, 1, 0, 0), - [1053] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type_kind, 1, 0, 0), - [1055] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_smallserial, 1, 0, 0), - [1057] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_smallserial, 1, 0, 0), - [1059] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_serial, 1, 0, 0), - [1061] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_serial, 1, 0, 0), - [1063] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_bigserial, 1, 0, 0), - [1065] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_bigserial, 1, 0, 0), - [1067] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_tinyint, 1, 0, 0), - [1069] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_tinyint, 1, 0, 0), - [1071] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_smallint, 1, 0, 0), - [1073] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_smallint, 1, 0, 0), - [1075] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_mediumint, 1, 0, 0), - [1077] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_mediumint, 1, 0, 0), - [1079] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_int, 1, 0, 0), - [1081] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_int, 1, 0, 0), - [1083] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_bigint, 1, 0, 0), - [1085] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_bigint, 1, 0, 0), - [1087] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 5, 0, 142), - [1089] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 5, 0, 142), - [1091] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_enum, 5, 0, 144), - [1093] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_enum, 5, 0, 144), - [1095] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamptz, 1, 0, 0), - [1097] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamptz, 1, 0, 0), - [1099] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type_kind, 1, 0, 65), - [1101] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type_kind, 1, 0, 65), - [1103] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tinyint, 1, 0, 0), - [1105] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tinyint, 1, 0, 0), - [1107] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_smallint, 1, 0, 0), - [1109] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_smallint, 1, 0, 0), - [1111] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_mediumint, 1, 0, 0), - [1113] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_mediumint, 1, 0, 0), - [1115] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_int, 1, 0, 0), - [1117] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_int, 1, 0, 0), - [1119] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bigint, 1, 0, 0), - [1121] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bigint, 1, 0, 0), - [1123] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamptz, 4, 0, 0), - [1125] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamptz, 4, 0, 0), + [794] = {.entry = {.count = 1, .reusable = true}}, SHIFT(342), + [796] = {.entry = {.count = 1, .reusable = true}}, SHIFT(413), + [798] = {.entry = {.count = 1, .reusable = true}}, SHIFT(329), + [800] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1340), + [802] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamp_base, 1, 0, 0), + [804] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamp_base, 1, 0, 0), + [806] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1345), + [808] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1346), + [810] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 2, 0, 0), + [812] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 2, 0, 0), + [814] = {.entry = {.count = 1, .reusable = true}}, SHIFT(348), + [816] = {.entry = {.count = 1, .reusable = true}}, SHIFT(416), + [818] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1624), + [820] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 1, 0, 0), + [822] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 1, 0, 0), + [824] = {.entry = {.count = 1, .reusable = true}}, SHIFT(346), + [826] = {.entry = {.count = 1, .reusable = true}}, SHIFT(412), + [828] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1336), + [830] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_real, 1, 0, 0), + [832] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_real, 1, 0, 0), + [834] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type, 1, 0, 67), + [836] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type, 1, 0, 67), + [838] = {.entry = {.count = 1, .reusable = true}}, SHIFT(414), + [840] = {.entry = {.count = 1, .reusable = true}}, SHIFT(981), + [842] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 6, 0, 151), + [844] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 6, 0, 151), + [846] = {.entry = {.count = 1, .reusable = true}}, SHIFT(360), + [848] = {.entry = {.count = 1, .reusable = true}}, SHIFT(391), + [850] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), + [852] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(481), + [855] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(1504), + [858] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(907), + [861] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(1355), + [864] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(482), + [867] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(1357), + [870] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(127), + [873] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 2, 0, 118), SHIFT_REPEAT(908), + [876] = {.entry = {.count = 1, .reusable = true}}, SHIFT(347), + [878] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1481), + [880] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 1, 0, 0), + [882] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 1, 0, 0), + [884] = {.entry = {.count = 1, .reusable = true}}, SHIFT(344), + [886] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1618), + [888] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 6, 0, 151), + [890] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 6, 0, 151), + [892] = {.entry = {.count = 1, .reusable = true}}, SHIFT(356), + [894] = {.entry = {.count = 1, .reusable = true}}, SHIFT(390), + [896] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definition, 3, 0, 96), + [898] = {.entry = {.count = 1, .reusable = true}}, SHIFT(481), + [900] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1504), + [902] = {.entry = {.count = 1, .reusable = false}}, SHIFT(907), + [904] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1355), + [906] = {.entry = {.count = 1, .reusable = true}}, SHIFT(482), + [908] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1357), + [910] = {.entry = {.count = 1, .reusable = true}}, SHIFT(127), + [912] = {.entry = {.count = 1, .reusable = true}}, SHIFT(908), + [914] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 7, 0, 156), + [916] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 7, 0, 156), + [918] = {.entry = {.count = 1, .reusable = true}}, SHIFT(362), + [920] = {.entry = {.count = 1, .reusable = true}}, SHIFT(393), + [922] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definition, 2, 0, 66), + [924] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_datetimeoffset, 1, 0, 0), + [926] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_datetimeoffset, 1, 0, 0), + [928] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1344), + [930] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 2, 0, 0), + [932] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 2, 0, 0), + [934] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1482), + [936] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_timestamptz, 1, 0, 0), + [938] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_timestamptz, 1, 0, 0), + [940] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1352), + [942] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 2, 0, 0), + [944] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 2, 0, 0), + [946] = {.entry = {.count = 1, .reusable = true}}, SHIFT(415), + [948] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 3, 0, 0), + [950] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 3, 0, 0), + [952] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1456), + [954] = {.entry = {.count = 1, .reusable = true}}, SHIFT(374), + [956] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamptz_base, 1, 0, 0), + [958] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamptz_base, 1, 0, 0), + [960] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), + [962] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), + [964] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), SHIFT_REPEAT(981), + [967] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamp_base, 4, 0, 0), + [969] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamp_base, 4, 0, 0), + [971] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_varbinary, 1, 0, 0), + [973] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_varbinary, 1, 0, 0), + [975] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1331), + [977] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_time, 1, 0, 0), + [979] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_time, 1, 0, 0), + [981] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1349), + [983] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_size_definition, 1, 0, 97), + [985] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array_size_definition, 1, 0, 97), + [987] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1479), + [989] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 7, 0, 151), + [991] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 7, 0, 151), + [993] = {.entry = {.count = 1, .reusable = true}}, SHIFT(392), + [995] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_time, 1, 0, 0), + [997] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_time, 1, 0, 0), + [999] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_numeric, 1, 0, 0), + [1001] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_numeric, 1, 0, 0), + [1003] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1333), + [1005] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_timestamptz_base, 4, 0, 0), + [1007] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_timestamptz_base, 4, 0, 0), + [1009] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 7, 0, 151), + [1011] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 7, 0, 151), + [1013] = {.entry = {.count = 1, .reusable = true}}, SHIFT(394), + [1015] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_timestamp, 1, 0, 0), + [1017] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_timestamp, 1, 0, 0), + [1019] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1351), + [1021] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 8, 0, 156), + [1023] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 8, 0, 156), + [1025] = {.entry = {.count = 1, .reusable = true}}, SHIFT(395), + [1027] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary, 1, 0, 0), + [1029] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_binary, 1, 0, 0), + [1031] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1493), + [1033] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal, 1, 0, 0), + [1035] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal, 1, 0, 0), + [1037] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1332), + [1039] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nchar, 1, 0, 0), + [1041] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nchar, 1, 0, 0), + [1043] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1341), + [1045] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nvarchar, 1, 0, 0), + [1047] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nvarchar, 1, 0, 0), + [1049] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1342), + [1051] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 8, 0, 164), + [1053] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 8, 0, 164), + [1055] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 4, 0, 129), + [1057] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 4, 0, 129), + [1059] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary, 4, 0, 129), + [1061] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_binary, 4, 0, 129), + [1063] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_varbinary, 4, 0, 129), + [1065] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_varbinary, 4, 0, 129), + [1067] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_numeric, 4, 0, 129), + [1069] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_numeric, 4, 0, 129), + [1071] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 4, 0, 129), + [1073] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 4, 0, 129), + [1075] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 4, 0, 0), + [1077] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 4, 0, 0), + [1079] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nchar, 4, 0, 130), + [1081] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nchar, 4, 0, 130), + [1083] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nvarchar, 4, 0, 130), + [1085] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nvarchar, 4, 0, 130), + [1087] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_enum, 4, 0, 131), + [1089] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_enum, 4, 0, 131), + [1091] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_datetimeoffset, 4, 0, 130), + [1093] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_datetimeoffset, 4, 0, 130), + [1095] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_char, 4, 0, 132), + [1097] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_char, 4, 0, 132), + [1099] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_varchar, 4, 0, 132), + [1101] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_varchar, 4, 0, 132), + [1103] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_time, 4, 0, 129), + [1105] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_time, 4, 0, 129), + [1107] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_timestamp, 4, 0, 129), + [1109] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_timestamp, 4, 0, 129), + [1111] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_timestamptz, 4, 0, 129), + [1113] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_timestamptz, 4, 0, 129), + [1115] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 5, 0, 142), + [1117] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 5, 0, 142), + [1119] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_enum, 5, 0, 144), + [1121] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_enum, 5, 0, 144), + [1123] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal, 6, 0, 151), + [1125] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal, 6, 0, 151), [1127] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_numeric, 6, 0, 151), [1129] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_numeric, 6, 0, 151), - [1131] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bit, 4, 0, 129), - [1133] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bit, 4, 0, 129), - [1135] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary, 4, 0, 129), - [1137] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_binary, 4, 0, 129), - [1139] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_varbinary, 4, 0, 129), - [1141] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_varbinary, 4, 0, 129), - [1143] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal, 4, 0, 129), - [1145] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal, 4, 0, 129), - [1147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_size_definition, 1, 0, 0), - [1149] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array_size_definition, 1, 0, 0), - [1151] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 7, 0, 156), - [1153] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 7, 0, 156), - [1155] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_numeric, 4, 0, 129), - [1157] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_numeric, 4, 0, 129), - [1159] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 4, 0, 129), - [1161] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 4, 0, 129), - [1163] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 4, 0, 0), - [1165] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 4, 0, 0), - [1167] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nchar, 4, 0, 130), - [1169] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nchar, 4, 0, 130), - [1171] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_nvarchar, 4, 0, 130), - [1173] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_nvarchar, 4, 0, 130), - [1175] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_enum, 4, 0, 131), - [1177] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_enum, 4, 0, 131), - [1179] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 8, 0, 164), - [1181] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 8, 0, 164), - [1183] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 8, 0, 151), - [1185] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 8, 0, 151), - [1187] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_datetimeoffset, 4, 0, 130), - [1189] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_datetimeoffset, 4, 0, 130), - [1191] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 8, 0, 151), - [1193] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 8, 0, 151), - [1195] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal, 6, 0, 151), - [1197] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal, 6, 0, 151), - [1199] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__array_size_definition, 3, 0, 134), - [1201] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__array_size_definition, 3, 0, 134), - [1203] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__array_size_definition, 2, 0, 0), - [1205] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__array_size_definition, 2, 0, 0), - [1207] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 3, 0, 0), - [1209] = {.entry = {.count = 1, .reusable = false}}, SHIFT(705), - [1211] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1440), - [1213] = {.entry = {.count = 1, .reusable = false}}, SHIFT(458), - [1215] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1442), - [1217] = {.entry = {.count = 1, .reusable = false}}, SHIFT(706), - [1219] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1447), - [1221] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1448), - [1223] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1450), - [1225] = {.entry = {.count = 1, .reusable = false}}, SHIFT(707), - [1227] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 1, 0, 97), - [1229] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_array_size_definition_repeat1, 1, 0, 97), - [1231] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_size_definition, 2, 0, 119), - [1233] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array_size_definition, 2, 0, 119), - [1235] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type, 2, 0, 67), - [1237] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type, 2, 0, 67), - [1239] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 167), - [1241] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 167), - [1243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1358), - [1245] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 171), - [1247] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 171), - [1249] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 152), - [1251] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 152), - [1253] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 157), - [1255] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 157), - [1257] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 172), - [1259] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 172), - [1261] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 168), - [1263] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 168), + [1131] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 7, 0, 156), + [1133] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 7, 0, 156), + [1135] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 8, 0, 151), + [1137] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 8, 0, 151), + [1139] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 8, 0, 151), + [1141] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 8, 0, 151), + [1143] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double, 9, 0, 156), + [1145] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_double, 9, 0, 156), + [1147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type_kind, 1, 0, 0), + [1149] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type_kind, 1, 0, 0), + [1151] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_smallserial, 1, 0, 0), + [1153] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_smallserial, 1, 0, 0), + [1155] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_serial, 1, 0, 0), + [1157] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_serial, 1, 0, 0), + [1159] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_bigserial, 1, 0, 0), + [1161] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_bigserial, 1, 0, 0), + [1163] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_tinyint, 1, 0, 0), + [1165] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_tinyint, 1, 0, 0), + [1167] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_smallint, 1, 0, 0), + [1169] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_smallint, 1, 0, 0), + [1171] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_mediumint, 1, 0, 0), + [1173] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_mediumint, 1, 0, 0), + [1175] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_int, 1, 0, 0), + [1177] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_int, 1, 0, 0), + [1179] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_bigint, 1, 0, 0), + [1181] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_bigint, 1, 0, 0), + [1183] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type_kind, 1, 0, 65), + [1185] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type_kind, 1, 0, 65), + [1187] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tinyint, 1, 0, 0), + [1189] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tinyint, 1, 0, 0), + [1191] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_smallint, 1, 0, 0), + [1193] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_smallint, 1, 0, 0), + [1195] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_mediumint, 1, 0, 0), + [1197] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_mediumint, 1, 0, 0), + [1199] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_int, 1, 0, 0), + [1201] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_int, 1, 0, 0), + [1203] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bigint, 1, 0, 0), + [1205] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_bigint, 1, 0, 0), + [1207] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_size_definition, 1, 0, 0), + [1209] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array_size_definition, 1, 0, 0), + [1211] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 3, 0, 0), + [1213] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_float, 3, 0, 0), + [1215] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_decimal, 4, 0, 129), + [1217] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_decimal, 4, 0, 129), + [1219] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__array_size_definition, 3, 0, 134), + [1221] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__array_size_definition, 3, 0, 134), + [1223] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__array_size_definition, 2, 0, 0), + [1225] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__array_size_definition, 2, 0, 0), + [1227] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 3, 0, 0), + [1229] = {.entry = {.count = 1, .reusable = false}}, SHIFT(755), + [1231] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1393), + [1233] = {.entry = {.count = 1, .reusable = false}}, SHIFT(455), + [1235] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1404), + [1237] = {.entry = {.count = 1, .reusable = false}}, SHIFT(809), + [1239] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1414), + [1241] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1418), + [1243] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1425), + [1245] = {.entry = {.count = 1, .reusable = false}}, SHIFT(751), + [1247] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 1, 0, 97), + [1249] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_array_size_definition_repeat1, 1, 0, 97), + [1251] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_data_type, 2, 0, 67), + [1253] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_data_type, 2, 0, 67), + [1255] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_size_definition, 2, 0, 119), + [1257] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array_size_definition, 2, 0, 119), + [1259] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 5, 0, 152), + [1261] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 5, 0, 152), + [1263] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1551), [1265] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 3, 0, 0), [1267] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 3, 0, 0), [1269] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 5, 0, 157), [1271] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 5, 0, 157), - [1273] = {.entry = {.count = 1, .reusable = true}}, SHIFT(501), - [1275] = {.entry = {.count = 1, .reusable = true}}, SHIFT(571), - [1277] = {.entry = {.count = 1, .reusable = true}}, SHIFT(448), - [1279] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1603), - [1281] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 167), - [1283] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 167), - [1285] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 166), - [1287] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 166), - [1289] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 9, 0, 174), - [1291] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 9, 0, 174), - [1293] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 5, 0, 152), - [1295] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 5, 0, 152), - [1297] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 173), - [1299] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 173), - [1301] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 5, 0, 159), - [1303] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 5, 0, 159), - [1305] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 171), - [1307] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 171), - [1309] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 174), - [1311] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 174), - [1313] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1143), - [1315] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 4, 0, 152), - [1317] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 4, 0, 152), - [1319] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 173), - [1321] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 173), - [1323] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 157), - [1325] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 157), - [1327] = {.entry = {.count = 1, .reusable = true}}, SHIFT(572), - [1329] = {.entry = {.count = 1, .reusable = true}}, SHIFT(985), - [1331] = {.entry = {.count = 1, .reusable = true}}, SHIFT(516), - [1333] = {.entry = {.count = 1, .reusable = true}}, SHIFT(569), - [1335] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1560), - [1337] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__primary_key, 2, 0, 0), - [1339] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__primary_key, 2, 0, 0), - [1341] = {.entry = {.count = 1, .reusable = true}}, SHIFT(495), - [1343] = {.entry = {.count = 1, .reusable = true}}, SHIFT(574), - [1345] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1606), - [1347] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__not_null, 2, 0, 0), - [1349] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__not_null, 2, 0, 0), - [1351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(494), - [1353] = {.entry = {.count = 1, .reusable = true}}, SHIFT(542), - [1355] = {.entry = {.count = 1, .reusable = true}}, SHIFT(499), - [1357] = {.entry = {.count = 1, .reusable = true}}, SHIFT(543), - [1359] = {.entry = {.count = 1, .reusable = true}}, SHIFT(507), - [1361] = {.entry = {.count = 1, .reusable = true}}, SHIFT(575), - [1363] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 159), - [1365] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 159), - [1367] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 9, 0, 171), - [1369] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 9, 0, 171), - [1371] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 4, 0, 0), - [1373] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 4, 0, 0), - [1375] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array, 3, 0, 0), - [1377] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array, 3, 0, 0), - [1379] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_with, 1, 0, 0), - [1381] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_with, 1, 0, 0), - [1383] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__default_expression, 4, 0, 0), - [1385] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__default_expression, 4, 0, 0), - [1387] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array, 4, 0, 0), - [1389] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array, 4, 0, 0), - [1391] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 4, 0, 0), - [1393] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 4, 0, 0), - [1395] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1132), - [1397] = {.entry = {.count = 1, .reusable = true}}, SHIFT(496), - [1399] = {.entry = {.count = 1, .reusable = true}}, SHIFT(497), - [1401] = {.entry = {.count = 1, .reusable = true}}, SHIFT(500), - [1403] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1583), - [1405] = {.entry = {.count = 1, .reusable = true}}, SHIFT(840), - [1407] = {.entry = {.count = 1, .reusable = true}}, SHIFT(841), - [1409] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [1411] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1350), - [1413] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1442), - [1415] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1434), - [1417] = {.entry = {.count = 1, .reusable = true}}, SHIFT(602), - [1419] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1014), - [1421] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 9, 0, 173), - [1423] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 9, 0, 173), - [1425] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 10, 0, 174), - [1427] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 10, 0, 174), - [1429] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_direction, 1, 0, 0), - [1431] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_direction, 1, 0, 0), - [1433] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 1, 0, 0), - [1435] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 1, 0, 0), - [1437] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 1, 0, 94), - [1439] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 1, 0, 94), - [1441] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 1, 0, 95), - [1443] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_column_definition_repeat1, 1, 0, 95), - [1445] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 152), - [1447] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 152), - [1449] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 168), - [1451] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 168), - [1453] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 166), - [1455] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 166), - [1457] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array, 5, 0, 0), - [1459] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array, 5, 0, 0), - [1461] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1044), - [1463] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1565), - [1465] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1566), - [1467] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_filter_expression, 4, 0, 0), - [1469] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_filter_expression, 4, 0, 0), - [1471] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 2, 0, 0), - [1473] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 2, 0, 0), - [1475] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 157), - [1477] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 157), - [1479] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__default_expression, 2, 0, 0), - [1481] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__default_expression, 2, 0, 0), - [1483] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__column_comment, 2, 0, 117), - [1485] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__column_comment, 2, 0, 117), - [1487] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 172), - [1489] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 172), + [1273] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 5, 0, 159), + [1275] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 5, 0, 159), + [1277] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 157), + [1279] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 157), + [1281] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 166), + [1283] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 166), + [1285] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 167), + [1287] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 167), + [1289] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 152), + [1291] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 152), + [1293] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 168), + [1295] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 168), + [1297] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 4, 0, 152), + [1299] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 4, 0, 152), + [1301] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 171), + [1303] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 171), + [1305] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 157), + [1307] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 157), + [1309] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 172), + [1311] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 172), + [1313] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 173), + [1315] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 173), + [1317] = {.entry = {.count = 1, .reusable = true}}, SHIFT(518), + [1319] = {.entry = {.count = 1, .reusable = true}}, SHIFT(540), + [1321] = {.entry = {.count = 1, .reusable = true}}, SHIFT(453), + [1323] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1619), + [1325] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1281), + [1327] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 171), + [1329] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 171), + [1331] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 174), + [1333] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 174), + [1335] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 167), + [1337] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 167), + [1339] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 173), + [1341] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 173), + [1343] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 9, 0, 174), + [1345] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 9, 0, 174), + [1347] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__primary_key, 2, 0, 0), + [1349] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__primary_key, 2, 0, 0), + [1351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(517), + [1353] = {.entry = {.count = 1, .reusable = true}}, SHIFT(538), + [1355] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1575), + [1357] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1579), + [1359] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1580), + [1361] = {.entry = {.count = 1, .reusable = true}}, SHIFT(541), + [1363] = {.entry = {.count = 1, .reusable = true}}, SHIFT(994), + [1365] = {.entry = {.count = 1, .reusable = true}}, SHIFT(521), + [1367] = {.entry = {.count = 1, .reusable = true}}, SHIFT(545), + [1369] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1622), + [1371] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 9, 0, 171), + [1373] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 9, 0, 171), + [1375] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_with, 1, 0, 0), + [1377] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_with, 1, 0, 0), + [1379] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 166), + [1381] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 166), + [1383] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_filter_expression, 4, 0, 0), + [1385] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_filter_expression, 4, 0, 0), + [1387] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_implicit_cast, 3, 0, 0), + [1389] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_implicit_cast, 3, 0, 0), + [1391] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_cast, 6, 0, 165), + [1393] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_cast, 6, 0, 165), + [1395] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 152), + [1397] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 152), + [1399] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 7, 0, 168), + [1401] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 7, 0, 168), + [1403] = {.entry = {.count = 1, .reusable = true}}, SHIFT(516), + [1405] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1570), + [1407] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1025), + [1409] = {.entry = {.count = 1, .reusable = true}}, SHIFT(500), + [1411] = {.entry = {.count = 1, .reusable = true}}, SHIFT(501), + [1413] = {.entry = {.count = 1, .reusable = true}}, SHIFT(502), + [1415] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1362), + [1417] = {.entry = {.count = 1, .reusable = true}}, SHIFT(909), + [1419] = {.entry = {.count = 1, .reusable = true}}, SHIFT(910), + [1421] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [1423] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1367), + [1425] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1404), + [1427] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1607), + [1429] = {.entry = {.count = 1, .reusable = true}}, SHIFT(608), + [1431] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1079), + [1433] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 6, 0, 159), + [1435] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 6, 0, 159), + [1437] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array, 4, 0, 0), + [1439] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array, 4, 0, 0), + [1441] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 4, 0, 0), + [1443] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 4, 0, 0), + [1445] = {.entry = {.count = 1, .reusable = true}}, SHIFT(520), + [1447] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1621), + [1449] = {.entry = {.count = 1, .reusable = true}}, SHIFT(525), + [1451] = {.entry = {.count = 1, .reusable = true}}, SHIFT(573), + [1453] = {.entry = {.count = 1, .reusable = true}}, SHIFT(499), + [1455] = {.entry = {.count = 1, .reusable = true}}, SHIFT(579), + [1457] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1071), + [1459] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__default_expression, 4, 0, 0), + [1461] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__default_expression, 4, 0, 0), + [1463] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 4, 0, 0), + [1465] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 4, 0, 0), + [1467] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 157), + [1469] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 157), + [1471] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 172), + [1473] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 172), + [1475] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_direction, 1, 0, 0), + [1477] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_direction, 1, 0, 0), + [1479] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 1, 0, 0), + [1481] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 1, 0, 0), + [1483] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 1, 0, 94), + [1485] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 1, 0, 94), + [1487] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_definition_repeat1, 1, 0, 95), + [1489] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_column_definition_repeat1, 1, 0, 95), [1491] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 8, 0, 167), [1493] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 8, 0, 167), - [1495] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_implicit_cast, 3, 0, 0), - [1497] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_implicit_cast, 3, 0, 0), - [1499] = {.entry = {.count = 1, .reusable = true}}, SHIFT(511), - [1501] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1605), - [1503] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_cast, 6, 0, 165), - [1505] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_cast, 6, 0, 165), - [1507] = {.entry = {.count = 1, .reusable = true}}, SHIFT(515), - [1509] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1555), - [1511] = {.entry = {.count = 1, .reusable = true}}, SHIFT(545), - [1513] = {.entry = {.count = 1, .reusable = true}}, SHIFT(526), - [1515] = {.entry = {.count = 1, .reusable = true}}, SHIFT(519), - [1517] = {.entry = {.count = 1, .reusable = true}}, SHIFT(48), - [1519] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), - [1521] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), - [1523] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1602), - [1525] = {.entry = {.count = 1, .reusable = true}}, SHIFT(547), - [1527] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1323), - [1529] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1569), - [1531] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1556), - [1533] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1557), - [1535] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1558), - [1537] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1559), - [1539] = {.entry = {.count = 1, .reusable = true}}, SHIFT(548), - [1541] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), SHIFT_REPEAT(985), - [1544] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1561), - [1546] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1607), - [1548] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1604), - [1550] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1562), - [1552] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1570), - [1554] = {.entry = {.count = 1, .reusable = true}}, SHIFT(573), - [1556] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1564), - [1558] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_is_not, 2, 0, 0), - [1560] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1343), - [1562] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_is_not, 2, 0, 0), - [1564] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_not_similar_to, 3, 0, 0), - [1566] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_similar_to, 3, 0, 0), - [1568] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 4, 0, 0), - [1570] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_distinct_from, 3, 0, 0), - [1572] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_distinct_from, 3, 0, 0), - [1574] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_not_like, 2, 0, 0), - [1576] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_like, 2, 0, 0), - [1578] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), - [1580] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(496), - [1583] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(497), - [1586] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(500), - [1589] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(1583), - [1592] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(840), - [1595] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(841), - [1598] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(7), - [1601] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(1350), - [1604] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(602), - [1607] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(1014), - [1610] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 1, 0, 0), - [1612] = {.entry = {.count = 1, .reusable = false}}, SHIFT(595), - [1614] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1121), - [1616] = {.entry = {.count = 1, .reusable = false}}, SHIFT(609), - [1618] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 4, 0, 46), - [1620] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_not_distinct_from, 4, 0, 0), - [1622] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_distinct_from, 4, 0, 0), - [1624] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 5, 0, 62), - [1626] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_like, 1, 0, 0), - [1628] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_like, 1, 0, 0), - [1630] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 4, 0, 47), - [1632] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), - [1634] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(4), - [1637] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(706), - [1640] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1447), - [1643] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1448), - [1646] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1450), - [1649] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1462), - [1652] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1470), - [1655] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 5, 0, 68), - [1657] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_similar_to, 2, 0, 0), - [1659] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_similar_to, 2, 0, 0), - [1661] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 70), - [1663] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 69), - [1665] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 2, 0, 0), - [1667] = {.entry = {.count = 1, .reusable = false}}, SHIFT(607), - [1669] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 71), - [1671] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 3, 0, 0), - [1673] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 3, 0, 98), - [1675] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 3, 0, 99), - [1677] = {.entry = {.count = 1, .reusable = false}}, SHIFT(837), - [1679] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1540), - [1681] = {.entry = {.count = 1, .reusable = false}}, SHIFT(961), - [1683] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 1, 0, 0), - [1685] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 0), - [1687] = {.entry = {.count = 1, .reusable = true}}, SHIFT(699), - [1689] = {.entry = {.count = 1, .reusable = true}}, SHIFT(899), - [1691] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1259), - [1693] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 3, 0, 0), - [1695] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), - [1697] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1294), - [1699] = {.entry = {.count = 1, .reusable = true}}, SHIFT(672), - [1701] = {.entry = {.count = 1, .reusable = false}}, SHIFT(663), - [1703] = {.entry = {.count = 1, .reusable = false}}, SHIFT(819), - [1705] = {.entry = {.count = 1, .reusable = true}}, SHIFT(743), - [1707] = {.entry = {.count = 1, .reusable = true}}, SHIFT(630), - [1709] = {.entry = {.count = 1, .reusable = true}}, SHIFT(633), - [1711] = {.entry = {.count = 1, .reusable = true}}, SHIFT(638), - [1713] = {.entry = {.count = 1, .reusable = true}}, SHIFT(677), - [1715] = {.entry = {.count = 1, .reusable = true}}, SHIFT(890), - [1717] = {.entry = {.count = 1, .reusable = true}}, SHIFT(905), - [1719] = {.entry = {.count = 1, .reusable = true}}, SHIFT(916), - [1721] = {.entry = {.count = 1, .reusable = true}}, SHIFT(669), - [1723] = {.entry = {.count = 1, .reusable = true}}, SHIFT(666), - [1725] = {.entry = {.count = 1, .reusable = true}}, SHIFT(634), - [1727] = {.entry = {.count = 1, .reusable = true}}, SHIFT(636), - [1729] = {.entry = {.count = 1, .reusable = true}}, SHIFT(650), - [1731] = {.entry = {.count = 1, .reusable = true}}, SHIFT(652), - [1733] = {.entry = {.count = 1, .reusable = true}}, SHIFT(680), - [1735] = {.entry = {.count = 1, .reusable = true}}, SHIFT(681), - [1737] = {.entry = {.count = 1, .reusable = false}}, SHIFT(813), - [1739] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1241), - [1741] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 85), - [1743] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 85), - [1745] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat2, 2, 0, 0), - [1747] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 86), - [1749] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 86), - [1751] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 1, 0, 45), - [1753] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 1, 0, 45), - [1755] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 2, 0, 0), - [1757] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 2, 0, 0), - [1759] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 1, 0, 44), - [1761] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 1, 0, 44), - [1763] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 2, 0, 60), - [1765] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 2, 0, 60), - [1767] = {.entry = {.count = 1, .reusable = false}}, SHIFT(643), - [1769] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1590), - [1771] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1383), - [1773] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1393), - [1775] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1394), - [1777] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1254), - [1779] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1102), - [1781] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 0), - [1783] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 0), - [1785] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 87), - [1787] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 87), - [1789] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), SHIFT_REPEAT(4), - [1792] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), - [1794] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), SHIFT_REPEAT(1462), - [1797] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), SHIFT_REPEAT(1470), - [1800] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alias_name, 1, 0, 28), - [1802] = {.entry = {.count = 1, .reusable = false}}, SHIFT(313), - [1804] = {.entry = {.count = 1, .reusable = false}}, SHIFT(701), - [1806] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1360), - [1808] = {.entry = {.count = 1, .reusable = true}}, SHIFT(555), - [1810] = {.entry = {.count = 1, .reusable = true}}, SHIFT(845), - [1812] = {.entry = {.count = 1, .reusable = true}}, SHIFT(439), - [1814] = {.entry = {.count = 1, .reusable = true}}, SHIFT(234), - [1816] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1202), - [1818] = {.entry = {.count = 1, .reusable = false}}, SHIFT(291), - [1820] = {.entry = {.count = 1, .reusable = true}}, SHIFT(949), - [1822] = {.entry = {.count = 1, .reusable = false}}, SHIFT(668), - [1824] = {.entry = {.count = 1, .reusable = true}}, SHIFT(685), - [1826] = {.entry = {.count = 1, .reusable = true}}, SHIFT(458), - [1828] = {.entry = {.count = 1, .reusable = true}}, SHIFT(730), - [1830] = {.entry = {.count = 1, .reusable = false}}, SHIFT(690), - [1832] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 5, 0, 162), - [1834] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1101), - [1836] = {.entry = {.count = 1, .reusable = true}}, SHIFT(940), - [1838] = {.entry = {.count = 1, .reusable = true}}, SHIFT(642), - [1840] = {.entry = {.count = 1, .reusable = true}}, SHIFT(262), - [1842] = {.entry = {.count = 1, .reusable = false}}, SHIFT(698), - [1844] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alias_name, 2, 0, 35), - [1846] = {.entry = {.count = 1, .reusable = false}}, SHIFT(689), - [1848] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 6, 0, 170), - [1850] = {.entry = {.count = 1, .reusable = true}}, SHIFT(994), - [1852] = {.entry = {.count = 1, .reusable = true}}, SHIFT(946), - [1854] = {.entry = {.count = 1, .reusable = true}}, SHIFT(655), - [1856] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 4, 0, 0), - [1858] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1011), - [1860] = {.entry = {.count = 1, .reusable = true}}, SHIFT(932), - [1862] = {.entry = {.count = 1, .reusable = true}}, SHIFT(656), - [1864] = {.entry = {.count = 1, .reusable = true}}, SHIFT(864), - [1866] = {.entry = {.count = 1, .reusable = true}}, SHIFT(428), - [1868] = {.entry = {.count = 1, .reusable = true}}, SHIFT(224), - [1870] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 3, 0, 0), - [1872] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1075), - [1874] = {.entry = {.count = 1, .reusable = true}}, SHIFT(928), - [1876] = {.entry = {.count = 1, .reusable = true}}, SHIFT(644), - [1878] = {.entry = {.count = 1, .reusable = false}}, SHIFT(670), - [1880] = {.entry = {.count = 1, .reusable = false}}, SHIFT(724), - [1882] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1341), - [1884] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1121), - [1886] = {.entry = {.count = 1, .reusable = true}}, SHIFT(760), - [1888] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), - [1890] = {.entry = {.count = 1, .reusable = true}}, SHIFT(675), - [1892] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 4, 0, 0), - [1894] = {.entry = {.count = 1, .reusable = false}}, SHIFT(825), - [1896] = {.entry = {.count = 1, .reusable = false}}, SHIFT(741), - [1898] = {.entry = {.count = 1, .reusable = true}}, SHIFT(683), - [1900] = {.entry = {.count = 1, .reusable = false}}, SHIFT(858), - [1902] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1198), - [1904] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 5, 0, 0), - [1906] = {.entry = {.count = 1, .reusable = false}}, SHIFT(597), - [1908] = {.entry = {.count = 1, .reusable = false}}, SHIFT(876), - [1910] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1252), - [1912] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__truncate_statement_repeat1, 2, 0, 0), - [1914] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__truncate_statement_repeat1, 2, 0, 0), SHIFT_REPEAT(760), - [1917] = {.entry = {.count = 1, .reusable = true}}, SHIFT(620), - [1919] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1220), - [1921] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 8, 0, 0), - [1923] = {.entry = {.count = 1, .reusable = true}}, SHIFT(823), - [1925] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1256), - [1927] = {.entry = {.count = 1, .reusable = false}}, SHIFT(810), - [1929] = {.entry = {.count = 1, .reusable = true}}, SHIFT(674), - [1931] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1388), - [1933] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1388), - [1935] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1601), - [1937] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_columns, 3, 0, 0), - [1939] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 1, 0, 0), - [1941] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1033), - [1943] = {.entry = {.count = 1, .reusable = true}}, SHIFT(827), - [1945] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 4, 0, 113), - [1947] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_columns, 4, 0, 0), - [1949] = {.entry = {.count = 1, .reusable = true}}, SHIFT(871), - [1951] = {.entry = {.count = 1, .reusable = true}}, SHIFT(433), - [1953] = {.entry = {.count = 1, .reusable = true}}, SHIFT(226), - [1955] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 10, 0, 0), - [1957] = {.entry = {.count = 1, .reusable = true}}, SHIFT(879), - [1959] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 4, 0, 0), - [1961] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1177), - [1963] = {.entry = {.count = 1, .reusable = true}}, SHIFT(697), - [1965] = {.entry = {.count = 1, .reusable = true}}, SHIFT(772), - [1967] = {.entry = {.count = 1, .reusable = true}}, SHIFT(891), - [1969] = {.entry = {.count = 1, .reusable = true}}, SHIFT(441), - [1971] = {.entry = {.count = 1, .reusable = true}}, SHIFT(232), - [1973] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 4, 0, 50), - [1975] = {.entry = {.count = 1, .reusable = true}}, SHIFT(774), - [1977] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 4, 0, 0), - [1979] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_all_fields, 1, 0, 0), - [1981] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_values, 2, 0, 57), - [1983] = {.entry = {.count = 1, .reusable = true}}, SHIFT(687), - [1985] = {.entry = {.count = 1, .reusable = true}}, SHIFT(625), - [1987] = {.entry = {.count = 1, .reusable = false}}, SHIFT(416), - [1989] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1337), - [1991] = {.entry = {.count = 1, .reusable = true}}, SHIFT(324), - [1993] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1397), - [1995] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 2, 0, 0), - [1997] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_all_fields, 3, 0, 0), - [1999] = {.entry = {.count = 1, .reusable = true}}, SHIFT(747), - [2001] = {.entry = {.count = 1, .reusable = true}}, SHIFT(167), - [2003] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 2, 0, 0), - [2005] = {.entry = {.count = 1, .reusable = true}}, SHIFT(257), - [2007] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_term, 1, 0, 12), - [2009] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 6, 0, 0), - [2011] = {.entry = {.count = 1, .reusable = true}}, SHIFT(833), - [2013] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_term, 2, 0, 27), - [2015] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 7, 0, 0), - [2017] = {.entry = {.count = 1, .reusable = true}}, SHIFT(859), - [2019] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1263), - [2021] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_values, 1, 0, 42), - [2023] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1274), - [2025] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 5, 0, 74), - [2027] = {.entry = {.count = 1, .reusable = true}}, SHIFT(715), - [2029] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_set_values_repeat1, 2, 0, 82), - [2031] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_set_values_repeat1, 2, 0, 82), SHIFT_REPEAT(687), - [2034] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 1, 0, 23), - [2036] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 3, 0, 31), - [2038] = {.entry = {.count = 1, .reusable = true}}, SHIFT(734), - [2040] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 3, 0, 89), - [2042] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 3, 0, 0), - [2044] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 3, 0, 0), - [2046] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 5, 0, 127), - [2048] = {.entry = {.count = 1, .reusable = true}}, SHIFT(287), - [2050] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1276), - [2052] = {.entry = {.count = 1, .reusable = true}}, SHIFT(321), - [2054] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 3, 0, 0), - [2056] = {.entry = {.count = 1, .reusable = true}}, SHIFT(717), - [2058] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 4, 0, 90), - [2060] = {.entry = {.count = 1, .reusable = true}}, SHIFT(726), - [2062] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__vacuum_option, 1, 0, 0), - [2064] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1113), - [2066] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_option, 1, 0, 0), - [2068] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_list, 4, 0, 108), - [2070] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 2, 0, 0), - [2072] = {.entry = {.count = 1, .reusable = true}}, SHIFT(799), - [2074] = {.entry = {.count = 1, .reusable = true}}, SHIFT(70), - [2076] = {.entry = {.count = 1, .reusable = true}}, SHIFT(331), - [2078] = {.entry = {.count = 1, .reusable = false}}, SHIFT(362), - [2080] = {.entry = {.count = 1, .reusable = true}}, SHIFT(341), - [2082] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 9, 0, 0), - [2084] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 10, 0, 139), - [2086] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 10, 0, 149), - [2088] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 5, 0, 0), - [2090] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1399), - [2092] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1325), - [2094] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1163), - [2096] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1164), - [2098] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1334), - [2100] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 8, 0, 123), - [2102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 11, 0, 149), - [2104] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 6, 0, 64), - [2106] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1493), - [2108] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 6, 0, 0), - [2110] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1495), - [2112] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 6, 0, 0), - [2114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1395), - [2116] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1396), - [2118] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 5, 0, 0), - [2120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1431), - [2122] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1433), - [2124] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 4, 0, 49), - [2126] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_view, 4, 0, 0), - [2128] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_sequence, 4, 0, 0), - [2130] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 1, 0, 0), - [2132] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_typed_row_value_expr_list, 2, 0, 78), - [2134] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1216), - [2136] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_list, 3, 0, 79), - [2138] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_set_values_repeat1, 2, 0, 81), - [2140] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__merge_statement_repeat1, 2, 0, 0), - [2142] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__merge_statement_repeat1, 2, 0, 0), SHIFT_REPEAT(1208), - [2145] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 3, 0, 30), - [2147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_type, 4, 0, 0), - [2149] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_view, 3, 0, 0), - [2151] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 4, 0, 0), - [2153] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1193), - [2155] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_sequence, 3, 0, 0), - [2157] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 12, 0, 163), - [2159] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 7, 0, 90), - [2161] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1347), - [2163] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_schema, 4, 0, 0), - [2165] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 9, 0, 139), + [1495] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array, 3, 0, 0), + [1497] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array, 3, 0, 0), + [1499] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 10, 0, 174), + [1501] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 10, 0, 174), + [1503] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array, 5, 0, 0), + [1505] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_array, 5, 0, 0), + [1507] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_constraint, 2, 0, 0), + [1509] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_column_constraint, 2, 0, 0), + [1511] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__not_null, 2, 0, 0), + [1513] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__not_null, 2, 0, 0), + [1515] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__default_expression, 2, 0, 0), + [1517] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__default_expression, 2, 0, 0), + [1519] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__column_comment, 2, 0, 117), + [1521] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__column_comment, 2, 0, 117), + [1523] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_invocation, 9, 0, 173), + [1525] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_invocation, 9, 0, 173), + [1527] = {.entry = {.count = 1, .reusable = true}}, SHIFT(526), + [1529] = {.entry = {.count = 1, .reusable = true}}, SHIFT(527), + [1531] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1583), + [1533] = {.entry = {.count = 1, .reusable = true}}, SHIFT(581), + [1535] = {.entry = {.count = 1, .reusable = true}}, SHIFT(533), + [1537] = {.entry = {.count = 1, .reusable = true}}, SHIFT(49), + [1539] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), + [1541] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), + [1543] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1549), + [1545] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1569), + [1547] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1571), + [1549] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1572), + [1551] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1573), + [1553] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1574), + [1555] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1576), + [1557] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1577), + [1559] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1578), + [1561] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1584), + [1563] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1585), + [1565] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1620), + [1567] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1586), + [1569] = {.entry = {.count = 1, .reusable = true}}, SHIFT(544), + [1571] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1623), + [1573] = {.entry = {.count = 1, .reusable = true}}, SHIFT(554), + [1575] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_size_definition_repeat1, 2, 0, 120), SHIFT_REPEAT(994), + [1578] = {.entry = {.count = 1, .reusable = true}}, SHIFT(577), + [1580] = {.entry = {.count = 1, .reusable = true}}, SHIFT(580), + [1582] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_is_not, 2, 0, 0), + [1584] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1385), + [1586] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_is_not, 2, 0, 0), + [1588] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 1, 0, 0), + [1590] = {.entry = {.count = 1, .reusable = false}}, SHIFT(601), + [1592] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1012), + [1594] = {.entry = {.count = 1, .reusable = false}}, SHIFT(617), + [1596] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 4, 0, 47), + [1598] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 4, 0, 0), + [1600] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), + [1602] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(500), + [1605] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(501), + [1608] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(502), + [1611] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(1362), + [1614] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(909), + [1617] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(910), + [1620] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(6), + [1623] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(1367), + [1626] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(608), + [1629] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 72), SHIFT_REPEAT(1079), + [1632] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 5, 0, 62), + [1634] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), + [1636] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(3), + [1639] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(809), + [1642] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1414), + [1645] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1418), + [1648] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1425), + [1651] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1422), + [1654] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 2, 0, 63), SHIFT_REPEAT(1606), + [1657] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 5, 0, 68), + [1659] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_not_distinct_from, 4, 0, 0), + [1661] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_distinct_from, 4, 0, 0), + [1663] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_distinct_from, 3, 0, 0), + [1665] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_distinct_from, 3, 0, 0), + [1667] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 4, 0, 46), + [1669] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_not_similar_to, 3, 0, 0), + [1671] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_similar_to, 3, 0, 0), + [1673] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_not_like, 2, 0, 0), + [1675] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_like, 2, 0, 0), + [1677] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_similar_to, 2, 0, 0), + [1679] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_similar_to, 2, 0, 0), + [1681] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_keyword_like, 1, 0, 0), + [1683] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_like, 1, 0, 0), + [1685] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 2, 0, 0), + [1687] = {.entry = {.count = 1, .reusable = false}}, SHIFT(616), + [1689] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 70), + [1691] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 3, 0, 99), + [1693] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 0), + [1695] = {.entry = {.count = 1, .reusable = false}}, SHIFT(916), + [1697] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1395), + [1699] = {.entry = {.count = 1, .reusable = false}}, SHIFT(984), + [1701] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 71), + [1703] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 1, 0, 0), + [1705] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 2, 0, 69), + [1707] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 3, 0, 0), + [1709] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_sequence_repeat1, 3, 0, 98), + [1711] = {.entry = {.count = 1, .reusable = true}}, SHIFT(692), + [1713] = {.entry = {.count = 1, .reusable = true}}, SHIFT(899), + [1715] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1228), + [1717] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 3, 0, 0), + [1719] = {.entry = {.count = 1, .reusable = true}}, SHIFT(702), + [1721] = {.entry = {.count = 1, .reusable = true}}, SHIFT(666), + [1723] = {.entry = {.count = 1, .reusable = true}}, SHIFT(667), + [1725] = {.entry = {.count = 1, .reusable = true}}, SHIFT(669), + [1727] = {.entry = {.count = 1, .reusable = true}}, SHIFT(670), + [1729] = {.entry = {.count = 1, .reusable = true}}, SHIFT(671), + [1731] = {.entry = {.count = 1, .reusable = true}}, SHIFT(707), + [1733] = {.entry = {.count = 1, .reusable = true}}, SHIFT(709), + [1735] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [1737] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1192), + [1739] = {.entry = {.count = 1, .reusable = true}}, SHIFT(701), + [1741] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1260), + [1743] = {.entry = {.count = 1, .reusable = false}}, SHIFT(833), + [1745] = {.entry = {.count = 1, .reusable = true}}, SHIFT(744), + [1747] = {.entry = {.count = 1, .reusable = true}}, SHIFT(641), + [1749] = {.entry = {.count = 1, .reusable = true}}, SHIFT(643), + [1751] = {.entry = {.count = 1, .reusable = true}}, SHIFT(648), + [1753] = {.entry = {.count = 1, .reusable = true}}, SHIFT(691), + [1755] = {.entry = {.count = 1, .reusable = true}}, SHIFT(901), + [1757] = {.entry = {.count = 1, .reusable = true}}, SHIFT(902), + [1759] = {.entry = {.count = 1, .reusable = true}}, SHIFT(903), + [1761] = {.entry = {.count = 1, .reusable = false}}, SHIFT(637), + [1763] = {.entry = {.count = 1, .reusable = false}}, SHIFT(850), + [1765] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 86), + [1767] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 86), + [1769] = {.entry = {.count = 1, .reusable = false}}, SHIFT(675), + [1771] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1361), + [1773] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 2, 0, 0), + [1775] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 2, 0, 0), + [1777] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_role_repeat1, 1, 0, 44), + [1779] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_alter_role_repeat1, 1, 0, 44), + [1781] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat2, 2, 0, 0), + [1783] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 2, 0, 60), + [1785] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 2, 0, 60), + [1787] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), SHIFT_REPEAT(3), + [1790] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), + [1792] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), SHIFT_REPEAT(1422), + [1795] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 2, 0, 0), SHIFT_REPEAT(1606), + [1798] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 87), + [1800] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 87), + [1802] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 1, 0, 45), + [1804] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 1, 0, 45), + [1806] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1477), + [1808] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1410), + [1810] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1411), + [1812] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1267), + [1814] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1095), + [1816] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 0), + [1818] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 0), + [1820] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__role_options, 3, 0, 85), + [1822] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__role_options, 3, 0, 85), + [1824] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 6, 0, 170), + [1826] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1003), + [1828] = {.entry = {.count = 1, .reusable = true}}, SHIFT(955), + [1830] = {.entry = {.count = 1, .reusable = true}}, SHIFT(652), + [1832] = {.entry = {.count = 1, .reusable = true}}, SHIFT(273), + [1834] = {.entry = {.count = 1, .reusable = false}}, SHIFT(794), + [1836] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1476), + [1838] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1565), + [1840] = {.entry = {.count = 1, .reusable = true}}, SHIFT(543), + [1842] = {.entry = {.count = 1, .reusable = true}}, SHIFT(867), + [1844] = {.entry = {.count = 1, .reusable = true}}, SHIFT(427), + [1846] = {.entry = {.count = 1, .reusable = true}}, SHIFT(230), + [1848] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alias_name, 1, 0, 28), + [1850] = {.entry = {.count = 1, .reusable = false}}, SHIFT(661), + [1852] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 4, 0, 0), + [1854] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1031), + [1856] = {.entry = {.count = 1, .reusable = true}}, SHIFT(945), + [1858] = {.entry = {.count = 1, .reusable = true}}, SHIFT(673), + [1860] = {.entry = {.count = 1, .reusable = false}}, SHIFT(708), + [1862] = {.entry = {.count = 1, .reusable = false}}, SHIFT(696), + [1864] = {.entry = {.count = 1, .reusable = false}}, SHIFT(697), + [1866] = {.entry = {.count = 1, .reusable = true}}, SHIFT(862), + [1868] = {.entry = {.count = 1, .reusable = true}}, SHIFT(434), + [1870] = {.entry = {.count = 1, .reusable = true}}, SHIFT(232), + [1872] = {.entry = {.count = 1, .reusable = false}}, SHIFT(678), + [1874] = {.entry = {.count = 1, .reusable = true}}, SHIFT(687), + [1876] = {.entry = {.count = 1, .reusable = true}}, SHIFT(455), + [1878] = {.entry = {.count = 1, .reusable = true}}, SHIFT(773), + [1880] = {.entry = {.count = 1, .reusable = false}}, SHIFT(262), + [1882] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 3, 0, 0), + [1884] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1075), + [1886] = {.entry = {.count = 1, .reusable = true}}, SHIFT(938), + [1888] = {.entry = {.count = 1, .reusable = true}}, SHIFT(646), + [1890] = {.entry = {.count = 1, .reusable = true}}, SHIFT(936), + [1892] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1195), + [1894] = {.entry = {.count = 1, .reusable = false}}, SHIFT(285), + [1896] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alias_name, 2, 0, 35), + [1898] = {.entry = {.count = 1, .reusable = false}}, SHIFT(693), + [1900] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 5, 0, 162), + [1902] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1092), + [1904] = {.entry = {.count = 1, .reusable = true}}, SHIFT(950), + [1906] = {.entry = {.count = 1, .reusable = true}}, SHIFT(636), + [1908] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1012), + [1910] = {.entry = {.count = 1, .reusable = true}}, SHIFT(779), + [1912] = {.entry = {.count = 1, .reusable = false}}, SHIFT(915), + [1914] = {.entry = {.count = 1, .reusable = true}}, SHIFT(689), + [1916] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 5, 0, 0), + [1918] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 4, 0, 0), + [1920] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), + [1922] = {.entry = {.count = 1, .reusable = false}}, SHIFT(880), + [1924] = {.entry = {.count = 1, .reusable = false}}, SHIFT(851), + [1926] = {.entry = {.count = 1, .reusable = false}}, SHIFT(778), + [1928] = {.entry = {.count = 1, .reusable = true}}, SHIFT(705), + [1930] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1324), + [1932] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1189), + [1934] = {.entry = {.count = 1, .reusable = false}}, SHIFT(610), + [1936] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_values, 2, 0, 57), + [1938] = {.entry = {.count = 1, .reusable = true}}, SHIFT(699), + [1940] = {.entry = {.count = 1, .reusable = true}}, SHIFT(682), + [1942] = {.entry = {.count = 1, .reusable = true}}, SHIFT(782), + [1944] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__truncate_statement_repeat1, 2, 0, 0), + [1946] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__truncate_statement_repeat1, 2, 0, 0), SHIFT_REPEAT(779), + [1949] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 5, 0, 127), + [1951] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1106), + [1953] = {.entry = {.count = 1, .reusable = true}}, SHIFT(854), + [1955] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_set_values_repeat1, 2, 0, 82), + [1957] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_set_values_repeat1, 2, 0, 82), SHIFT_REPEAT(699), + [1960] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1250), + [1962] = {.entry = {.count = 1, .reusable = true}}, SHIFT(934), + [1964] = {.entry = {.count = 1, .reusable = true}}, SHIFT(429), + [1966] = {.entry = {.count = 1, .reusable = true}}, SHIFT(231), + [1968] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 2, 0, 0), + [1970] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 3, 0, 89), + [1972] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 3, 0, 0), + [1974] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 3, 0, 0), + [1976] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 1, 0, 0), + [1978] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 3, 0, 31), + [1980] = {.entry = {.count = 1, .reusable = true}}, SHIFT(718), + [1982] = {.entry = {.count = 1, .reusable = false}}, SHIFT(421), + [1984] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_term, 2, 0, 27), + [1986] = {.entry = {.count = 1, .reusable = true}}, SHIFT(679), + [1988] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1440), + [1990] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1440), + [1992] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1445), + [1994] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1180), + [1996] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 2, 0, 0), + [1998] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_columns, 4, 0, 0), + [2000] = {.entry = {.count = 1, .reusable = true}}, SHIFT(167), + [2002] = {.entry = {.count = 1, .reusable = true}}, SHIFT(776), + [2004] = {.entry = {.count = 1, .reusable = true}}, SHIFT(634), + [2006] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1326), + [2008] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 6, 0, 0), + [2010] = {.entry = {.count = 1, .reusable = true}}, SHIFT(818), + [2012] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 8, 0, 0), + [2014] = {.entry = {.count = 1, .reusable = true}}, SHIFT(855), + [2016] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_term, 1, 0, 12), + [2018] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1162), + [2020] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 1, 0, 23), + [2022] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_columns, 3, 0, 0), + [2024] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_all_fields, 3, 0, 0), + [2026] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1182), + [2028] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1256), + [2030] = {.entry = {.count = 1, .reusable = false}}, SHIFT(846), + [2032] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 4, 0, 113), + [2034] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 4, 0, 0), + [2036] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 4, 0, 0), + [2038] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_all_fields, 1, 0, 0), + [2040] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 5, 0, 74), + [2042] = {.entry = {.count = 1, .reusable = true}}, SHIFT(766), + [2044] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1415), + [2046] = {.entry = {.count = 1, .reusable = true}}, SHIFT(279), + [2048] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1417), + [2050] = {.entry = {.count = 1, .reusable = true}}, SHIFT(869), + [2052] = {.entry = {.count = 1, .reusable = true}}, SHIFT(425), + [2054] = {.entry = {.count = 1, .reusable = true}}, SHIFT(234), + [2056] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_values, 1, 0, 42), + [2058] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 10, 0, 0), + [2060] = {.entry = {.count = 1, .reusable = true}}, SHIFT(870), + [2062] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 4, 0, 50), + [2064] = {.entry = {.count = 1, .reusable = true}}, SHIFT(791), + [2066] = {.entry = {.count = 1, .reusable = true}}, SHIFT(319), + [2068] = {.entry = {.count = 1, .reusable = true}}, SHIFT(626), + [2070] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 7, 0, 0), + [2072] = {.entry = {.count = 1, .reusable = true}}, SHIFT(839), + [2074] = {.entry = {.count = 1, .reusable = true}}, SHIFT(324), + [2076] = {.entry = {.count = 1, .reusable = true}}, SHIFT(253), + [2078] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 4, 0, 90), + [2080] = {.entry = {.count = 1, .reusable = true}}, SHIFT(760), + [2082] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 4, 0, 0), + [2084] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1432), + [2086] = {.entry = {.count = 1, .reusable = true}}, SHIFT(676), + [2088] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 8, 0, 123), + [2090] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 3, 0, 30), + [2092] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_column, 1, 0, 102), + [2094] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_typed_row_value_expr_list, 1, 0, 55), + [2096] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1205), + [2098] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 3, 0, 64), + [2100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(771), + [2102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 3, 0, 0), + [2104] = {.entry = {.count = 1, .reusable = true}}, SHIFT(777), + [2106] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_view, 3, 0, 0), + [2108] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_sequence, 3, 0, 0), + [2110] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__vacuum_option, 1, 0, 0), + [2112] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1070), + [2114] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_option, 1, 0, 0), + [2116] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_type, 3, 0, 0), + [2118] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 3, 0, 0), + [2120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1317), + [2122] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_schema, 3, 0, 0), + [2124] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__merge_statement_repeat1, 2, 0, 0), + [2126] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__merge_statement_repeat1, 2, 0, 0), SHIFT_REPEAT(1299), + [2129] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 9, 0, 139), + [2131] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 3, 0, 0), + [2133] = {.entry = {.count = 1, .reusable = true}}, SHIFT(662), + [2135] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 9, 0, 0), + [2137] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 10, 0, 139), + [2139] = {.entry = {.count = 1, .reusable = true}}, SHIFT(332), + [2141] = {.entry = {.count = 1, .reusable = false}}, SHIFT(355), + [2143] = {.entry = {.count = 1, .reusable = true}}, SHIFT(336), + [2145] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 10, 0, 149), + [2147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 5, 0, 0), + [2149] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1394), + [2151] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 11, 0, 149), + [2153] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 6, 0, 64), + [2155] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1559), + [2157] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 6, 0, 0), + [2159] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1564), + [2161] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__merge_statement, 12, 0, 163), + [2163] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 7, 0, 90), + [2165] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1490), [2167] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_by, 3, 0, 0), [2169] = {.entry = {.count = 1, .reusable = true}}, SHIFT(249), - [2171] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 4, 0, 0), - [2173] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1414), - [2175] = {.entry = {.count = 1, .reusable = true}}, SHIFT(664), - [2177] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_type, 3, 0, 0), - [2179] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 12, 0, 0), - [2181] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 3, 0, 0), - [2183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1235), - [2185] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_schema, 3, 0, 0), - [2187] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_typed_row_value_expr_list, 1, 0, 55), - [2189] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 3, 0, 0), - [2191] = {.entry = {.count = 1, .reusable = true}}, SHIFT(639), - [2193] = {.entry = {.count = 1, .reusable = true}}, SHIFT(445), - [2195] = {.entry = {.count = 1, .reusable = false}}, SHIFT(512), - [2197] = {.entry = {.count = 1, .reusable = true}}, SHIFT(491), - [2199] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_by, 4, 0, 0), - [2201] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 2, 0, 0), - [2203] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1210), - [2205] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_column, 1, 0, 102), - [2207] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_typed_row_value_expr_list_repeat1, 2, 0, 107), - [2209] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_typed_row_value_expr_list_repeat1, 2, 0, 107), SHIFT_REPEAT(1216), - [2212] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_order_by_repeat1, 2, 0, 0), - [2214] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_order_by_repeat1, 2, 0, 0), SHIFT_REPEAT(249), - [2217] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 3, 0, 0), - [2219] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1230), - [2221] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 3, 0, 64), - [2223] = {.entry = {.count = 1, .reusable = true}}, SHIFT(716), - [2225] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1137), - [2227] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1156), - [2229] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1365), - [2231] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 2, 0, 33), - [2233] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1111), - [2235] = {.entry = {.count = 1, .reusable = true}}, SHIFT(761), - [2237] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 6, 0, 0), - [2239] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 2, 0, 158), - [2241] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 7, 0, 121), - [2243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1182), - [2245] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 7, 0, 0), - [2247] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1353), - [2249] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1203), - [2251] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 7, 0, 0), - [2253] = {.entry = {.count = 1, .reusable = true}}, SHIFT(671), - [2255] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 4, 0, 0), - [2257] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 3, 0, 152), - [2259] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 3, 0, 51), - [2261] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 8, 0, 0), - [2263] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__rename_statement_repeat1, 2, 0, 0), - [2265] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__rename_statement_repeat1, 2, 0, 0), SHIFT_REPEAT(671), - [2268] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 7, 0, 122), - [2270] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column, 1, 0, 0), - [2272] = {.entry = {.count = 1, .reusable = false}}, SHIFT(922), - [2274] = {.entry = {.count = 1, .reusable = true}}, SHIFT(922), - [2276] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 9, 0, 64), - [2278] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 9, 0, 0), - [2280] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_not_exists, 3, 0, 0), - [2282] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1228), - [2284] = {.entry = {.count = 1, .reusable = true}}, SHIFT(447), - [2286] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 10, 0, 90), - [2288] = {.entry = {.count = 1, .reusable = true}}, SHIFT(415), - [2290] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 5, 0, 0), - [2292] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_update_statement, 4, 0, 41), - [2294] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_table, 5, 0, 0), - [2296] = {.entry = {.count = 1, .reusable = true}}, SHIFT(244), - [2298] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_typed_row_value_expr_list_repeat1, 2, 0, 106), - [2300] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1374), - [2302] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 1, 0, 102), - [2304] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 9, 0, 138), - [2306] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1550), - [2308] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 6, 0, 100), - [2310] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1189), - [2312] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 5, 0, 0), - [2314] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 8, 0, 0), - [2316] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1505), - [2318] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1147), - [2320] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 5, 0, 0), - [2322] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 8, 0, 138), - [2324] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 8, 0, 0), - [2326] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 8, 0, 122), - [2328] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1316), - [2330] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_table, 6, 0, 0), - [2332] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 6, 0, 0), - [2334] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__constraint_literal, 4, 0, 64), - [2336] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraint, 1, 0, 91), - [2338] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraint, 1, 0, 92), - [2340] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_table_repeat1, 2, 0, 0), - [2342] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_table_repeat1, 2, 0, 0), SHIFT_REPEAT(244), - [2345] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_primary_key_constraint, 2, 0, 115), - [2347] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_table, 4, 0, 0), - [2349] = {.entry = {.count = 1, .reusable = true}}, SHIFT(581), - [2351] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 3, 0, 0), - [2353] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_relation, 1, 0, 32), - [2355] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 4, 0, 0), - [2357] = {.entry = {.count = 1, .reusable = true}}, SHIFT(379), - [2359] = {.entry = {.count = 1, .reusable = true}}, SHIFT(832), - [2361] = {.entry = {.count = 1, .reusable = true}}, SHIFT(247), - [2363] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat2, 2, 0, 0), SHIFT_REPEAT(672), - [2366] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 7, 0, 162), - [2368] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 7, 0, 170), - [2370] = {.entry = {.count = 1, .reusable = true}}, SHIFT(431), - [2372] = {.entry = {.count = 1, .reusable = true}}, SHIFT(223), - [2374] = {.entry = {.count = 1, .reusable = true}}, SHIFT(568), - [2376] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_limit, 2, 0, 0), - [2378] = {.entry = {.count = 1, .reusable = true}}, SHIFT(421), - [2380] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_ordered_columns_repeat1, 2, 0, 0), - [2382] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_ordered_columns_repeat1, 2, 0, 0), SHIFT_REPEAT(682), - [2385] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__vacuum_table_repeat1, 2, 0, 0), - [2387] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__vacuum_table_repeat1, 2, 0, 0), SHIFT_REPEAT(777), - [2390] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1158), - [2392] = {.entry = {.count = 1, .reusable = true}}, SHIFT(777), - [2394] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 8, 0, 170), - [2396] = {.entry = {.count = 1, .reusable = true}}, SHIFT(426), - [2398] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 2, 0, 160), - [2400] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 2, 0, 160), SHIFT_REPEAT(223), - [2403] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1410), - [2405] = {.entry = {.count = 1, .reusable = true}}, SHIFT(438), - [2407] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__merge_statement_repeat1, 1, 0, 0), - [2409] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_repeat1, 2, 0, 104), - [2411] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_repeat1, 2, 0, 104), SHIFT_REPEAT(289), - [2414] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 4, 0, 31), - [2416] = {.entry = {.count = 1, .reusable = true}}, SHIFT(775), - [2418] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 9, 0, 170), - [2420] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 9, 0, 175), - [2422] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 5, 0, 0), - [2424] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__partition_spec, 4, 0, 0), - [2426] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 10, 0, 175), - [2428] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1061), - [2430] = {.entry = {.count = 1, .reusable = true}}, SHIFT(601), - [2432] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraints, 3, 0, 124), - [2434] = {.entry = {.count = 1, .reusable = true}}, SHIFT(608), - [2436] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1089), - [2438] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1243), - [2440] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), - [2442] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_expression, 2, 0, 0), - [2444] = {.entry = {.count = 1, .reusable = true}}, SHIFT(235), - [2446] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 5, 0, 90), - [2448] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 5, 0, 126), - [2450] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_column, 2, 0, 64), - [2452] = {.entry = {.count = 1, .reusable = true}}, SHIFT(477), - [2454] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 5, 0, 113), - [2456] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 5, 0, 0), - [2458] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 5, 0, 0), - [2460] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_list_repeat1, 2, 0, 109), - [2462] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_list_repeat1, 2, 0, 109), SHIFT_REPEAT(780), - [2465] = {.entry = {.count = 1, .reusable = true}}, SHIFT(714), - [2467] = {.entry = {.count = 1, .reusable = true}}, SHIFT(682), - [2469] = {.entry = {.count = 1, .reusable = true}}, SHIFT(219), - [2471] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_position, 1, 0, 0), - [2473] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1012), - [2475] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_expression, 1, 0, 0), - [2477] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_commit_transaction, 1, 0, 0), - [2479] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1258), - [2481] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rollback_transaction, 1, 0, 0), - [2483] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1270), - [2485] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rename_column, 5, 0, 128), - [2487] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraints, 2, 0, 110), - [2489] = {.entry = {.count = 1, .reusable = true}}, SHIFT(776), - [2491] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1369), - [2493] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1370), - [2495] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_definitions_repeat1, 2, 0, 0), - [2497] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definitions_repeat1, 2, 0, 0), SHIFT_REPEAT(771), - [2500] = {.entry = {.count = 1, .reusable = true}}, SHIFT(422), - [2502] = {.entry = {.count = 1, .reusable = true}}, SHIFT(920), - [2504] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1312), - [2506] = {.entry = {.count = 1, .reusable = true}}, SHIFT(814), - [2508] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1328), - [2510] = {.entry = {.count = 1, .reusable = true}}, SHIFT(255), - [2512] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1330), - [2514] = {.entry = {.count = 1, .reusable = true}}, SHIFT(222), - [2516] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1552), - [2518] = {.entry = {.count = 1, .reusable = true}}, SHIFT(919), - [2520] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 6, 0, 74), - [2522] = {.entry = {.count = 1, .reusable = true}}, SHIFT(764), - [2524] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1300), - [2526] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1301), - [2528] = {.entry = {.count = 1, .reusable = true}}, SHIFT(821), - [2530] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_select_expression_repeat1, 2, 0, 0), - [2532] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_select_expression_repeat1, 2, 0, 0), SHIFT_REPEAT(235), - [2535] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat1, 2, 0, 0), - [2537] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat1, 2, 0, 0), SHIFT_REPEAT(814), - [2540] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 4, 0, 64), - [2542] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 4, 0, 112), - [2544] = {.entry = {.count = 1, .reusable = true}}, SHIFT(425), - [2546] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 5, 0, 50), - [2548] = {.entry = {.count = 1, .reusable = true}}, SHIFT(740), - [2550] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 5, 0, 0), - [2552] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1229), - [2554] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__partition_spec, 5, 0, 0), - [2556] = {.entry = {.count = 1, .reusable = true}}, SHIFT(435), - [2558] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__partition_spec_repeat1, 2, 0, 0), - [2560] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__partition_spec_repeat1, 2, 0, 0), SHIFT_REPEAT(601), - [2563] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1261), - [2565] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1201), - [2567] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat2, 2, 0, 145), - [2569] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat2, 2, 0, 145), SHIFT_REPEAT(821), - [2572] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 4, 0, 75), - [2574] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_table_names, 3, 0, 0), - [2576] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1415), - [2578] = {.entry = {.count = 1, .reusable = true}}, SHIFT(130), - [2580] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 10, 0, 0), - [2582] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1219), - [2584] = {.entry = {.count = 1, .reusable = true}}, SHIFT(434), - [2586] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 4, 0, 89), - [2588] = {.entry = {.count = 1, .reusable = true}}, SHIFT(816), - [2590] = {.entry = {.count = 1, .reusable = true}}, SHIFT(780), - [2592] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_insert_values, 3, 0, 80), - [2594] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_exists, 2, 0, 0), - [2596] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_column, 4, 0, 114), - [2598] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 3, 0, 52), - [2600] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rename_object, 3, 0, 0), - [2602] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_constraints_repeat1, 2, 0, 140), - [2604] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_constraints_repeat1, 2, 0, 140), SHIFT_REPEAT(608), - [2607] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 7, 0, 150), - [2609] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_schema, 3, 0, 88), - [2611] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1046), - [2613] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1160), - [2615] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), - [2617] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1363), - [2619] = {.entry = {.count = 1, .reusable = true}}, SHIFT(314), - [2621] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1430), - [2623] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 6, 0, 141), - [2625] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 6, 0, 127), - [2627] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_constraint, 4, 0, 0), - [2629] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_statement, 2, 0, 25), - [2631] = {.entry = {.count = 1, .reusable = true}}, SHIFT(725), - [2633] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_column, 3, 0, 90), - [2635] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_dml_read_stmt, 1, 0, 0), - [2637] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_constraint, 3, 0, 0), - [2639] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 6, 0, 162), - [2641] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1174), - [2643] = {.entry = {.count = 1, .reusable = true}}, SHIFT(741), - [2645] = {.entry = {.count = 1, .reusable = true}}, SHIFT(857), - [2647] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 6, 0, 0), - [2649] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_ownership, 3, 0, 0), - [2651] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1168), - [2653] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_position, 2, 0, 93), - [2655] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_enum_repeat1, 2, 0, 145), - [2657] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_enum_repeat1, 2, 0, 145), SHIFT_REPEAT(832), - [2660] = {.entry = {.count = 1, .reusable = true}}, SHIFT(221), - [2662] = {.entry = {.count = 1, .reusable = true}}, SHIFT(437), - [2664] = {.entry = {.count = 1, .reusable = true}}, SHIFT(735), - [2666] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1528), - [2668] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1529), - [2670] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_option, 2, 0, 0), - [2672] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_insert_values, 2, 0, 54), - [2674] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 3, 0, 0), - [2676] = {.entry = {.count = 1, .reusable = true}}, SHIFT(686), - [2678] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__alter_specifications, 1, 0, 0), - [2680] = {.entry = {.count = 1, .reusable = true}}, SHIFT(315), - [2682] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rename_column, 4, 0, 116), - [2684] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 2, 0, 0), - [2686] = {.entry = {.count = 1, .reusable = true}}, SHIFT(700), - [2688] = {.entry = {.count = 1, .reusable = true}}, SHIFT(89), - [2690] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__drop_behavior, 1, 0, 0), - [2692] = {.entry = {.count = 1, .reusable = true}}, SHIFT(875), - [2694] = {.entry = {.count = 1, .reusable = true}}, SHIFT(529), - [2696] = {.entry = {.count = 1, .reusable = true}}, SHIFT(537), - [2698] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1175), - [2700] = {.entry = {.count = 1, .reusable = true}}, SHIFT(220), - [2702] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_repeat1, 2, 0, 0), SHIFT_REPEAT(264), - [2705] = {.entry = {.count = 1, .reusable = true}}, SHIFT(201), - [2707] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1206), - [2709] = {.entry = {.count = 1, .reusable = true}}, SHIFT(844), - [2711] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1152), - [2713] = {.entry = {.count = 1, .reusable = true}}, SHIFT(407), - [2715] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 9, 0, 0), - [2717] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1321), - [2719] = {.entry = {.count = 1, .reusable = true}}, SHIFT(704), - [2721] = {.entry = {.count = 1, .reusable = true}}, SHIFT(850), - [2723] = {.entry = {.count = 1, .reusable = true}}, SHIFT(768), - [2725] = {.entry = {.count = 1, .reusable = true}}, SHIFT(417), - [2727] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 4, 0, 43), - [2729] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_configuration, 3, 0, 45), - [2731] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_configuration, 3, 0, 111), - [2733] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 1), - [2735] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 2), - [2737] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_view, 5, 0, 0), - [2739] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 4, 0, 30), - [2741] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 5, 0, 0), - [2743] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__alter_statement, 1, 0, 0), - [2745] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 3), - [2747] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1338), - [2749] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1339), - [2751] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_statement, 1, 0, 0), - [2753] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 7, 0, 0), - [2755] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1021), - [2757] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_copy_from, 4, 0, 40), - [2759] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 4), - [2761] = {.entry = {.count = 1, .reusable = true}}, SHIFT(923), - [2763] = {.entry = {.count = 1, .reusable = true}}, SHIFT(804), - [2765] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1546), - [2767] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1480), - [2769] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 5, 0, 0), - [2771] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 8, 0, 0), - [2773] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_update_statement, 5, 0, 56), - [2775] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 4, 0, 152), - [2777] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 8, 0, 135), - [2779] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 10, 0, 153), - [2781] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 13, 0, 0), - [2783] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 5, 0, 0), - [2785] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 5, 0, 73), - [2787] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 6, 0, 50), - [2789] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 8, 0, 136), - [2791] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 5, 0, 49), - [2793] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_view, 5, 0, 0), - [2795] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_sequence, 5, 0, 0), - [2797] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 3, 0, 137), - [2799] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 5, 0, 31), - [2801] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_type, 5, 0, 0), - [2803] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_schema, 5, 0, 0), - [2805] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 7, 0, 0), - [2807] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 7, 0, 0), - [2809] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 5, 0, 0), - [2811] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 2, 0, 0), - [2813] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 10, 0, 154), - [2815] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 11, 0, 161), - [2817] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 5, 0, 58), - [2819] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 1, 0, 5), - [2821] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 10, 0, 155), - [2823] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_file_path, 1, 0, 0), - [2825] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1223), - [2827] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1376), - [2829] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1413), - [2831] = {.entry = {.count = 1, .reusable = true}}, SHIFT(988), - [2833] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 8, 0, 74), - [2835] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_insert_statement, 4, 0, 39), - [2837] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 3, 0, 29), - [2839] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_role, 3, 0, 0), - [2841] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 5, 0, 59), - [2843] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 11, 0, 0), - [2845] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 11, 0, 0), - [2847] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 5, 0, 0), - [2849] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ddl_stmt, 1, 0, 0), - [2851] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 2, 0, 24), - [2853] = {.entry = {.count = 1, .reusable = true}}, SHIFT(662), - [2855] = {.entry = {.count = 1, .reusable = true}}, SHIFT(263), - [2857] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 6, 0, 31), + [2171] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 12, 0, 0), + [2173] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 5, 0, 0), + [2175] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1398), + [2177] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1399), + [2179] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_by, 4, 0, 0), + [2181] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 2, 0, 0), + [2183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1144), + [2185] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_order_by_repeat1, 2, 0, 0), + [2187] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_order_by_repeat1, 2, 0, 0), SHIFT_REPEAT(249), + [2190] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 3, 0, 0), + [2192] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1190), + [2194] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat1, 1, 0, 0), + [2196] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_typed_row_value_expr_list, 2, 0, 78), + [2198] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_list, 3, 0, 79), + [2200] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_set_values_repeat1, 2, 0, 81), + [2202] = {.entry = {.count = 1, .reusable = true}}, SHIFT(68), + [2204] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1605), + [2206] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1149), + [2208] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1151), + [2210] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1384), + [2212] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 6, 0, 0), + [2214] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1441), + [2216] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1364), + [2218] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_typed_row_value_expr_list_repeat1, 2, 0, 107), + [2220] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_typed_row_value_expr_list_repeat1, 2, 0, 107), SHIFT_REPEAT(1205), + [2223] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_list, 4, 0, 108), + [2225] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 4, 0, 49), + [2227] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_view, 4, 0, 0), + [2229] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_sequence, 4, 0, 0), + [2231] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 2, 0, 0), + [2233] = {.entry = {.count = 1, .reusable = true}}, SHIFT(801), + [2235] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1253), + [2237] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1255), + [2239] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1402), + [2241] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_type, 4, 0, 0), + [2243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(448), + [2245] = {.entry = {.count = 1, .reusable = false}}, SHIFT(514), + [2247] = {.entry = {.count = 1, .reusable = true}}, SHIFT(471), + [2249] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 4, 0, 0), + [2251] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1179), + [2253] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_schema, 4, 0, 0), + [2255] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 4, 0, 0), + [2257] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 7, 0, 0), + [2259] = {.entry = {.count = 1, .reusable = true}}, SHIFT(700), + [2261] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1037), + [2263] = {.entry = {.count = 1, .reusable = true}}, SHIFT(730), + [2265] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 4, 0, 0), + [2267] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_not_exists, 3, 0, 0), + [2269] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1211), + [2271] = {.entry = {.count = 1, .reusable = true}}, SHIFT(447), + [2273] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 2, 0, 158), + [2275] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__rename_statement_repeat1, 2, 0, 0), + [2277] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__rename_statement_repeat1, 2, 0, 0), SHIFT_REPEAT(700), + [2280] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 7, 0, 122), + [2282] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 3, 0, 152), + [2284] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_update_statement, 4, 0, 41), + [2286] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1337), + [2288] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 8, 0, 0), + [2290] = {.entry = {.count = 1, .reusable = false}}, SHIFT(887), + [2292] = {.entry = {.count = 1, .reusable = true}}, SHIFT(887), + [2294] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 9, 0, 64), + [2296] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 9, 0, 0), + [2298] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__key_constraint, 10, 0, 90), + [2300] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 5, 0, 0), + [2302] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_relation, 1, 0, 32), + [2304] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 2, 0, 33), + [2306] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_order_target, 5, 0, 0), + [2308] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 8, 0, 0), + [2310] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1366), + [2312] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1196), + [2314] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 5, 0, 0), + [2316] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 8, 0, 138), + [2318] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 8, 0, 0), + [2320] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 8, 0, 122), + [2322] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1279), + [2324] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_table, 5, 0, 0), + [2326] = {.entry = {.count = 1, .reusable = true}}, SHIFT(243), + [2328] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_table, 6, 0, 0), + [2330] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 7, 0, 121), + [2332] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1239), + [2334] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraint, 1, 0, 91), + [2336] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraint, 1, 0, 92), + [2338] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_table_repeat1, 2, 0, 0), + [2340] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_table_repeat1, 2, 0, 0), SHIFT_REPEAT(243), + [2343] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_table, 4, 0, 0), + [2345] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__constraint_literal, 4, 0, 64), + [2347] = {.entry = {.count = 1, .reusable = true}}, SHIFT(420), + [2349] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 6, 0, 100), + [2351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1203), + [2353] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 3, 0, 0), + [2355] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1568), + [2357] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 1, 0, 102), + [2359] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 6, 0, 0), + [2361] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 6, 0, 0), + [2363] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_typed_row_value_expr_list_repeat1, 2, 0, 106), + [2365] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 3, 0, 51), + [2367] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 7, 0, 0), + [2369] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1397), + [2371] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1274), + [2373] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_primary_key_constraint, 2, 0, 115), + [2375] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_statement, 9, 0, 138), + [2377] = {.entry = {.count = 1, .reusable = true}}, SHIFT(590), + [2379] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column, 1, 0, 0), + [2381] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_column, 3, 0, 90), + [2383] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_dml_read_stmt, 1, 0, 0), + [2385] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_repeat1, 2, 0, 0), SHIFT_REPEAT(256), + [2388] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1209), + [2390] = {.entry = {.count = 1, .reusable = true}}, SHIFT(817), + [2392] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 7, 0, 162), + [2394] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraints, 3, 0, 124), + [2396] = {.entry = {.count = 1, .reusable = true}}, SHIFT(614), + [2398] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 7, 0, 170), + [2400] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_select_expression_repeat1, 2, 0, 0), + [2402] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_select_expression_repeat1, 2, 0, 0), SHIFT_REPEAT(235), + [2405] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 5, 0, 50), + [2407] = {.entry = {.count = 1, .reusable = true}}, SHIFT(767), + [2409] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_expression, 2, 0, 0), + [2411] = {.entry = {.count = 1, .reusable = true}}, SHIFT(235), + [2413] = {.entry = {.count = 1, .reusable = true}}, SHIFT(430), + [2415] = {.entry = {.count = 1, .reusable = true}}, SHIFT(228), + [2417] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 5, 0, 0), + [2419] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1266), + [2421] = {.entry = {.count = 1, .reusable = true}}, SHIFT(555), + [2423] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_limit, 2, 0, 0), + [2425] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__partition_spec, 5, 0, 0), + [2427] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__partition_spec_repeat1, 2, 0, 0), + [2429] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__partition_spec_repeat1, 2, 0, 0), SHIFT_REPEAT(613), + [2432] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__drop_behavior, 1, 0, 0), + [2434] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 8, 0, 170), + [2436] = {.entry = {.count = 1, .reusable = true}}, SHIFT(431), + [2438] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_ordered_columns_repeat1, 2, 0, 0), + [2440] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_ordered_columns_repeat1, 2, 0, 0), SHIFT_REPEAT(686), + [2443] = {.entry = {.count = 1, .reusable = true}}, SHIFT(222), + [2445] = {.entry = {.count = 1, .reusable = true}}, SHIFT(428), + [2447] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 9, 0, 170), + [2449] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 9, 0, 175), + [2451] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1439), + [2453] = {.entry = {.count = 1, .reusable = true}}, SHIFT(440), + [2455] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1269), + [2457] = {.entry = {.count = 1, .reusable = true}}, SHIFT(800), + [2459] = {.entry = {.count = 1, .reusable = true}}, SHIFT(433), + [2461] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 10, 0, 175), + [2463] = {.entry = {.count = 1, .reusable = true}}, SHIFT(911), + [2465] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1246), + [2467] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 2, 0, 160), + [2469] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 2, 0, 160), SHIFT_REPEAT(228), + [2472] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 4, 0, 75), + [2474] = {.entry = {.count = 1, .reusable = true}}, SHIFT(118), + [2476] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 5, 0, 0), + [2478] = {.entry = {.count = 1, .reusable = true}}, SHIFT(919), + [2480] = {.entry = {.count = 1, .reusable = true}}, SHIFT(720), + [2482] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_insert_values, 3, 0, 80), + [2484] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 5, 0, 90), + [2486] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1302), + [2488] = {.entry = {.count = 1, .reusable = true}}, SHIFT(853), + [2490] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat2, 2, 0, 145), + [2492] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat2, 2, 0, 145), SHIFT_REPEAT(853), + [2495] = {.entry = {.count = 1, .reusable = true}}, SHIFT(247), + [2497] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rename_object, 3, 0, 0), + [2499] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 5, 0, 126), + [2501] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_schema, 3, 0, 88), + [2503] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1105), + [2505] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1284), + [2507] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [2509] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1447), + [2511] = {.entry = {.count = 1, .reusable = true}}, SHIFT(307), + [2513] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1449), + [2515] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_exists, 2, 0, 0), + [2517] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 10, 0, 0), + [2519] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1308), + [2521] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_expression, 1, 0, 0), + [2523] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1043), + [2525] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1222), + [2527] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [2529] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_constraint, 3, 0, 0), + [2531] = {.entry = {.count = 1, .reusable = true}}, SHIFT(435), + [2533] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_constraints_repeat1, 2, 0, 140), + [2535] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_constraints_repeat1, 2, 0, 140), SHIFT_REPEAT(614), + [2538] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_ownership, 3, 0, 0), + [2540] = {.entry = {.count = 1, .reusable = true}}, SHIFT(437), + [2542] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_position, 2, 0, 93), + [2544] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 2, 0, 0), + [2546] = {.entry = {.count = 1, .reusable = true}}, SHIFT(694), + [2548] = {.entry = {.count = 1, .reusable = true}}, SHIFT(221), + [2550] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1461), + [2552] = {.entry = {.count = 1, .reusable = true}}, SHIFT(861), + [2554] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__alter_specifications, 1, 0, 0), + [2556] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_insert_values, 2, 0, 54), + [2558] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 6, 0, 141), + [2560] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 6, 0, 127), + [2562] = {.entry = {.count = 1, .reusable = true}}, SHIFT(725), + [2564] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1600), + [2566] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1601), + [2568] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_option, 2, 0, 0), + [2570] = {.entry = {.count = 1, .reusable = true}}, SHIFT(871), + [2572] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1304), + [2574] = {.entry = {.count = 1, .reusable = true}}, SHIFT(757), + [2576] = {.entry = {.count = 1, .reusable = true}}, SHIFT(686), + [2578] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_commit_transaction, 1, 0, 0), + [2580] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1152), + [2582] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1433), + [2584] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 3, 0, 0), + [2586] = {.entry = {.count = 1, .reusable = true}}, SHIFT(695), + [2588] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 7, 0, 150), + [2590] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 5, 0, 113), + [2592] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_modify_column, 5, 0, 0), + [2594] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_column, 2, 0, 64), + [2596] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_enum_repeat1, 2, 0, 145), + [2598] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_enum_repeat1, 2, 0, 145), SHIFT_REPEAT(829), + [2601] = {.entry = {.count = 1, .reusable = true}}, SHIFT(438), + [2603] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_column, 5, 0, 0), + [2605] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_from, 3, 0, 52), + [2607] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__compute_stats_repeat2, 2, 0, 0), SHIFT_REPEAT(701), + [2610] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1089), + [2612] = {.entry = {.count = 1, .reusable = true}}, SHIFT(613), + [2614] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__partition_spec, 4, 0, 0), + [2616] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 6, 0, 74), + [2618] = {.entry = {.count = 1, .reusable = true}}, SHIFT(719), + [2620] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 6, 0, 162), + [2622] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__vacuum_table_repeat1, 2, 0, 0), + [2624] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__vacuum_table_repeat1, 2, 0, 0), SHIFT_REPEAT(800), + [2627] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1329), + [2629] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1160), + [2631] = {.entry = {.count = 1, .reusable = true}}, SHIFT(778), + [2633] = {.entry = {.count = 1, .reusable = true}}, SHIFT(879), + [2635] = {.entry = {.count = 1, .reusable = true}}, SHIFT(385), + [2637] = {.entry = {.count = 1, .reusable = true}}, SHIFT(829), + [2639] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_repeat1, 2, 0, 104), + [2641] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_repeat1, 2, 0, 104), SHIFT_REPEAT(276), + [2644] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_statement, 2, 0, 25), + [2646] = {.entry = {.count = 1, .reusable = true}}, SHIFT(775), + [2648] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_when_clause, 6, 0, 0), + [2650] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_list_repeat1, 2, 0, 109), + [2652] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_list_repeat1, 2, 0, 109), SHIFT_REPEAT(720), + [2655] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constraints, 2, 0, 110), + [2657] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_definitions_repeat1, 2, 0, 0), + [2659] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_column_definitions_repeat1, 2, 0, 0), SHIFT_REPEAT(792), + [2662] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1611), + [2664] = {.entry = {.count = 1, .reusable = true}}, SHIFT(283), + [2666] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1354), + [2668] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_position, 1, 0, 0), + [2670] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 4, 0, 64), + [2672] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_column, 4, 0, 112), + [2674] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1234), + [2676] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_change_column, 4, 0, 89), + [2678] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_column, 4, 0, 114), + [2680] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_add_constraint, 4, 0, 0), + [2682] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1238), + [2684] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1010), + [2686] = {.entry = {.count = 1, .reusable = true}}, SHIFT(220), + [2688] = {.entry = {.count = 1, .reusable = true}}, SHIFT(490), + [2690] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1186), + [2692] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rename_column, 5, 0, 128), + [2694] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rename_column, 4, 0, 116), + [2696] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 9, 0, 0), + [2698] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1242), + [2700] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 4, 0, 31), + [2702] = {.entry = {.count = 1, .reusable = true}}, SHIFT(795), + [2704] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1187), + [2706] = {.entry = {.count = 1, .reusable = true}}, SHIFT(377), + [2708] = {.entry = {.count = 1, .reusable = true}}, SHIFT(310), + [2710] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__rename_table_names, 3, 0, 0), + [2712] = {.entry = {.count = 1, .reusable = true}}, SHIFT(72), + [2714] = {.entry = {.count = 1, .reusable = true}}, SHIFT(442), + [2716] = {.entry = {.count = 1, .reusable = true}}, SHIFT(557), + [2718] = {.entry = {.count = 1, .reusable = true}}, SHIFT(567), + [2720] = {.entry = {.count = 1, .reusable = true}}, SHIFT(891), + [2722] = {.entry = {.count = 1, .reusable = true}}, SHIFT(218), + [2724] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat1, 2, 0, 0), + [2726] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat1, 2, 0, 0), SHIFT_REPEAT(817), + [2729] = {.entry = {.count = 1, .reusable = true}}, SHIFT(203), + [2731] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__merge_statement_repeat1, 1, 0, 0), + [2733] = {.entry = {.count = 1, .reusable = true}}, SHIFT(797), + [2735] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1498), + [2737] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1518), + [2739] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rollback_transaction, 1, 0, 0), + [2741] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1166), + [2743] = {.entry = {.count = 1, .reusable = true}}, SHIFT(935), + [2745] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_column, 2, 0, 102), + [2747] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_copy_from, 4, 0, 40), + [2749] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_file_path, 1, 0, 0), + [2751] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_copy_to, 4, 0, 0), + [2753] = {.entry = {.count = 1, .reusable = true}}, SHIFT(912), + [2755] = {.entry = {.count = 1, .reusable = true}}, SHIFT(813), + [2757] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1375), + [2759] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1376), + [2761] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_commit_transaction, 2, 0, 0), + [2763] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 5, 0, 0), + [2765] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 3, 0, 158), + [2767] = {.entry = {.count = 1, .reusable = true}}, SHIFT(806), + [2769] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1403), + [2771] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 3, 0, 29), + [2773] = {.entry = {.count = 1, .reusable = true}}, SHIFT(710), + [2775] = {.entry = {.count = 1, .reusable = true}}, SHIFT(772), + [2777] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat2, 4, 0, 169), + [2779] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_enum_repeat1, 2, 0, 143), + [2781] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 5, 0, 0), + [2783] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 5, 0, 73), + [2785] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_statement, 1, 0, 0), + [2787] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rollback_transaction, 2, 0, 0), + [2789] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 5, 0, 58), + [2791] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definitions, 5, 0, 0), + [2793] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 5, 0, 49), + [2795] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 4, 0, 152), + [2797] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_view, 5, 0, 0), + [2799] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_sequence, 5, 0, 0), + [2801] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 13, 0, 0), + [2803] = {.entry = {.count = 1, .reusable = true}}, SHIFT(752), + [2805] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 5, 0, 59), + [2807] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 5, 0, 31), + [2809] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ddl_stmt, 1, 0, 7), + [2811] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_type, 5, 0, 0), + [2813] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 5, 0, 0), + [2815] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_role, 3, 0, 0), + [2817] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 8, 0, 0), + [2819] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 7, 0, 0), + [2821] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_schema, 5, 0, 0), + [2823] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 9, 0, 146), + [2825] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 9, 0, 0), + [2827] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 9, 0, 147), + [2829] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 8, 0, 125), + [2831] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 5, 0, 0), + [2833] = {.entry = {.count = 1, .reusable = true}}, SHIFT(964), + [2835] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 9, 0, 148), + [2837] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 4, 0, 0), + [2839] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 7, 0, 74), + [2841] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_statement, 1, 0, 0), + [2843] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 4, 0, 43), + [2845] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 7, 0, 50), + [2847] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1599), + [2849] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_char, 1, 0, 0), + [2851] = {.entry = {.count = 1, .reusable = true}}, SHIFT(649), + [2853] = {.entry = {.count = 1, .reusable = true}}, SHIFT(260), + [2855] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 5, 0, 61), + [2857] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 8, 0, 0), [2859] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__truncate_statement, 6, 0, 0), - [2861] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ddl_stmt, 1, 0, 7), - [2863] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definitions, 3, 0, 0), - [2865] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 6, 0, 0), - [2867] = {.entry = {.count = 1, .reusable = true}}, SHIFT(957), - [2869] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 6, 0, 84), - [2871] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_constraints_repeat1, 2, 0, 110), - [2873] = {.entry = {.count = 1, .reusable = true}}, SHIFT(708), - [2875] = {.entry = {.count = 1, .reusable = true}}, SHIFT(711), - [2877] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_begin_transaction, 2, 0, 0), - [2879] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_copy_to, 4, 0, 0), - [2881] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1056), - [2883] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 5, 0, 61), - [2885] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ordered_column, 2, 0, 102), - [2887] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1384), - [2889] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25), - [2891] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 7, 0, 74), - [2893] = {.entry = {.count = 1, .reusable = true}}, SHIFT(635), - [2895] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 4, 0, 0), - [2897] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 4, 0, 0), - [2899] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definitions, 5, 0, 0), - [2901] = {.entry = {.count = 1, .reusable = true}}, SHIFT(966), - [2903] = {.entry = {.count = 1, .reusable = true}}, SHIFT(856), - [2905] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 8, 0, 0), - [2907] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_commit_transaction, 2, 0, 0), - [2909] = {.entry = {.count = 1, .reusable = true}}, SHIFT(676), - [2911] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 6, 0, 0), - [2913] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_role, 8, 0, 125), - [2915] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 6, 0, 0), - [2917] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 7, 0, 50), - [2919] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_enum_repeat1, 2, 0, 143), - [2921] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_delete_statement, 4, 0, 38), - [2923] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 4, 0, 0), - [2925] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_rollback_transaction, 2, 0, 0), - [2927] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1458), - [2929] = {.entry = {.count = 1, .reusable = true}}, SHIFT(66), - [2931] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_list_repeat1, 2, 0, 79), - [2933] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_schema, 6, 0, 0), - [2935] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 6, 0, 0), - [2937] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 7, 0, 0), - [2939] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 7, 0, 0), - [2941] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_invocation_repeat1, 3, 0, 158), - [2943] = {.entry = {.count = 1, .reusable = true}}, SHIFT(659), - [2945] = {.entry = {.count = 1, .reusable = true}}, SHIFT(266), - [2947] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ddl_stmt, 1, 0, 6), - [2949] = {.entry = {.count = 1, .reusable = true}}, SHIFT(250), - [2951] = {.entry = {.count = 1, .reusable = true}}, SHIFT(965), - [2953] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 4, 0, 0), - [2955] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 4, 0, 48), - [2957] = {.entry = {.count = 1, .reusable = true}}, SHIFT(395), - [2959] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1400), - [2961] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1451), - [2963] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_char, 1, 0, 0), - [2965] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_view, 4, 0, 0), - [2967] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_alter_index_repeat2, 4, 0, 169), - [2969] = {.entry = {.count = 1, .reusable = true}}, SHIFT(523), - [2971] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1571), - [2973] = {.entry = {.count = 1, .reusable = true}}, SHIFT(524), - [2975] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1572), - [2977] = {.entry = {.count = 1, .reusable = true}}, SHIFT(525), - [2979] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1573), - [2981] = {.entry = {.count = 1, .reusable = false}}, SHIFT(654), - [2983] = {.entry = {.count = 1, .reusable = true}}, SHIFT(654), - [2985] = {.entry = {.count = 1, .reusable = true}}, SHIFT(399), - [2987] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1402), - [2989] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 4, 0, 0), - [2991] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1530), - [2993] = {.entry = {.count = 1, .reusable = true}}, SHIFT(161), - [2995] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 9, 0, 146), - [2997] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 9, 0, 0), - [2999] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 9, 0, 147), - [3001] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_dml_write_stmt, 1, 0, 0), - [3003] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_role, 4, 0, 0), - [3005] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 6, 0, 101), - [3007] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1472), - [3009] = {.entry = {.count = 1, .reusable = true}}, SHIFT(401), - [3011] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1408), - [3013] = {.entry = {.count = 1, .reusable = true}}, SHIFT(723), - [3015] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1544), - [3017] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1336), - [3019] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), - [3021] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 6, 0, 0), - [3023] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1535), - [3025] = {.entry = {.count = 1, .reusable = true}}, SHIFT(757), - [3027] = {.entry = {.count = 1, .reusable = true}}, SHIFT(758), - [3029] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_copy_stmt, 1, 0, 0), - [3031] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definitions, 4, 0, 0), - [3033] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 9, 0, 148), - [3035] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 4, 0, 0), - [3037] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_statement, 1, 0, 0), - [3039] = {.entry = {.count = 1, .reusable = true}}, SHIFT(665), - [3041] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1357), - [3043] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1441), - [3045] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1460), - [3047] = {.entry = {.count = 1, .reusable = true}}, SHIFT(597), - [3049] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1171), - [3051] = {.entry = {.count = 1, .reusable = true}}, SHIFT(536), - [3053] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1382), - [3055] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1084), - [3057] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), - [3059] = {.entry = {.count = 1, .reusable = true}}, SHIFT(397), - [3061] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1405), - [3063] = {.entry = {.count = 1, .reusable = true}}, SHIFT(398), - [3065] = {.entry = {.count = 1, .reusable = true}}, SHIFT(802), - [3067] = {.entry = {.count = 1, .reusable = true}}, SHIFT(114), - [3069] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1563), - [3071] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_in, 2, 0, 0), - [3073] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1444), - [3075] = {.entry = {.count = 1, .reusable = true}}, SHIFT(798), - [3077] = {.entry = {.count = 1, .reusable = true}}, SHIFT(778), - [3079] = {.entry = {.count = 1, .reusable = true}}, SHIFT(585), - [3081] = {.entry = {.count = 1, .reusable = true}}, SHIFT(338), - [3083] = {.entry = {.count = 1, .reusable = true}}, SHIFT(947), - [3085] = {.entry = {.count = 1, .reusable = true}}, SHIFT(948), - [3087] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1381), - [3089] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select, 3, 0, 26), - [3091] = {.entry = {.count = 1, .reusable = true}}, SHIFT(436), - [3093] = {.entry = {.count = 1, .reusable = true}}, SHIFT(603), - [3095] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1537), - [3097] = {.entry = {.count = 1, .reusable = true}}, SHIFT(47), - [3099] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1134), - [3101] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1411), - [3103] = {.entry = {.count = 1, .reusable = true}}, SHIFT(855), - [3105] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1422), - [3107] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1610), - [3109] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1146), - [3111] = {.entry = {.count = 1, .reusable = true}}, SHIFT(404), - [3113] = {.entry = {.count = 1, .reusable = true}}, SHIFT(248), - [3115] = {.entry = {.count = 1, .reusable = true}}, SHIFT(406), - [3117] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_offset, 2, 0, 0), - [3119] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1024), - [3121] = {.entry = {.count = 1, .reusable = true}}, SHIFT(410), - [3123] = {.entry = {.count = 1, .reusable = true}}, SHIFT(769), - [3125] = {.entry = {.count = 1, .reusable = true}}, SHIFT(388), - [3127] = {.entry = {.count = 1, .reusable = true}}, SHIFT(440), - [3129] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1446), - [3131] = {.entry = {.count = 1, .reusable = true}}, SHIFT(794), - [3133] = {.entry = {.count = 1, .reusable = true}}, SHIFT(779), - [3135] = {.entry = {.count = 1, .reusable = true}}, SHIFT(738), - [3137] = {.entry = {.count = 1, .reusable = true}}, SHIFT(364), - [3139] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_character, 1, 0, 0), - [3141] = {.entry = {.count = 1, .reusable = true}}, SHIFT(866), - [3143] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1279), - [3145] = {.entry = {.count = 1, .reusable = true}}, SHIFT(570), - [3147] = {.entry = {.count = 1, .reusable = true}}, SHIFT(365), - [3149] = {.entry = {.count = 1, .reusable = true}}, SHIFT(990), - [3151] = {.entry = {.count = 1, .reusable = true}}, SHIFT(367), - [3153] = {.entry = {.count = 1, .reusable = true}}, SHIFT(954), - [3155] = {.entry = {.count = 1, .reusable = true}}, SHIFT(929), - [3157] = {.entry = {.count = 1, .reusable = true}}, SHIFT(809), - [3159] = {.entry = {.count = 1, .reusable = true}}, SHIFT(120), - [3161] = {.entry = {.count = 1, .reusable = true}}, SHIFT(432), - [3163] = {.entry = {.count = 1, .reusable = true}}, SHIFT(368), - [3165] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__temporary, 1, 0, 0), - [3167] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1418), - [3169] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1420), - [3171] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1421), - [3173] = {.entry = {.count = 1, .reusable = true}}, SHIFT(378), - [3175] = {.entry = {.count = 1, .reusable = true}}, SHIFT(854), - [3177] = {.entry = {.count = 1, .reusable = true}}, SHIFT(696), - [3179] = {.entry = {.count = 1, .reusable = true}}, SHIFT(969), - [3181] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1135), - [3183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(576), - [3185] = {.entry = {.count = 1, .reusable = true}}, SHIFT(839), - [3187] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1492), - [3189] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1423), - [3191] = {.entry = {.count = 1, .reusable = true}}, SHIFT(641), - [3193] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1424), - [3195] = {.entry = {.count = 1, .reusable = true}}, SHIFT(313), - [3197] = {.entry = {.count = 1, .reusable = true}}, SHIFT(950), - [3199] = {.entry = {.count = 1, .reusable = true}}, SHIFT(408), - [3201] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [3203] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1426), - [3205] = {.entry = {.count = 1, .reusable = true}}, SHIFT(256), - [3207] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1143), - [3209] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1427), - [3211] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), - [3213] = {.entry = {.count = 1, .reusable = true}}, SHIFT(861), - [3215] = {.entry = {.count = 1, .reusable = true}}, SHIFT(600), - [3217] = {.entry = {.count = 1, .reusable = true}}, SHIFT(863), - [3219] = {.entry = {.count = 1, .reusable = true}}, SHIFT(492), - [3221] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1355), - [3223] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1331), - [3225] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [3227] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1332), - [3229] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1333), - [3231] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1428), - [3233] = {.entry = {.count = 1, .reusable = true}}, SHIFT(413), - [3235] = {.entry = {.count = 1, .reusable = true}}, SHIFT(389), - [3237] = {.entry = {.count = 1, .reusable = true}}, SHIFT(334), - [3239] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1344), - [3241] = {.entry = {.count = 1, .reusable = true}}, SHIFT(337), - [3243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), - [3245] = {.entry = {.count = 1, .reusable = true}}, SHIFT(933), - [3247] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1253), - [3249] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1032), - [3251] = {.entry = {.count = 1, .reusable = true}}, SHIFT(826), - [3253] = {.entry = {.count = 1, .reusable = true}}, SHIFT(710), - [3255] = {.entry = {.count = 1, .reusable = true}}, SHIFT(446), - [3257] = {.entry = {.count = 1, .reusable = true}}, SHIFT(423), - [3259] = {.entry = {.count = 1, .reusable = true}}, SHIFT(924), - [3261] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1485), - [3263] = {.entry = {.count = 1, .reusable = true}}, SHIFT(900), - [3265] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1324), - [3267] = {.entry = {.count = 1, .reusable = true}}, SHIFT(846), - [3269] = {.entry = {.count = 1, .reusable = true}}, SHIFT(766), - [3271] = {.entry = {.count = 1, .reusable = true}}, SHIFT(742), - [3273] = {.entry = {.count = 1, .reusable = true}}, SHIFT(808), - [3275] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1200), - [3277] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1015), - [3279] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_varchar, 2, 0, 0), - [3281] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1389), - [3283] = {.entry = {.count = 1, .reusable = true}}, SHIFT(95), - [3285] = {.entry = {.count = 1, .reusable = true}}, SHIFT(79), - [3287] = {.entry = {.count = 1, .reusable = true}}, SHIFT(579), - [3289] = {.entry = {.count = 1, .reusable = true}}, SHIFT(750), - [3291] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1391), - [3293] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), - [3295] = {.entry = {.count = 1, .reusable = true}}, SHIFT(93), - [3297] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), - [3299] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1406), - [3301] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1412), - [3303] = {.entry = {.count = 1, .reusable = true}}, SHIFT(459), - [3305] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1496), - [3307] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1534), - [3309] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1539), - [3311] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1285), - [3313] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1295), - [3315] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1419), - [3317] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1306), - [3319] = {.entry = {.count = 1, .reusable = true}}, SHIFT(834), - [3321] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1238), - [3323] = {.entry = {.count = 1, .reusable = true}}, SHIFT(828), - [3325] = {.entry = {.count = 1, .reusable = true}}, SHIFT(592), - [3327] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1356), - [3329] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1359), - [3331] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1361), - [3333] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select, 2, 0, 11), - [3335] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1585), - [3337] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1366), - [3339] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1373), - [3341] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1378), - [3343] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1380), - [3345] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1609), - [3347] = {.entry = {.count = 1, .reusable = true}}, SHIFT(86), - [3349] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1387), - [3351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(748), - [3353] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1392), - [3355] = {.entry = {.count = 1, .reusable = true}}, SHIFT(449), - [3357] = {.entry = {.count = 1, .reusable = true}}, SHIFT(801), - [3359] = {.entry = {.count = 1, .reusable = true}}, SHIFT(941), - [3361] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1345), - [3363] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1398), - [3365] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1346), - [3367] = {.entry = {.count = 1, .reusable = true}}, SHIFT(390), - [3369] = {.entry = {.count = 1, .reusable = true}}, SHIFT(520), - [3371] = {.entry = {.count = 1, .reusable = true}}, SHIFT(521), - [3373] = {.entry = {.count = 1, .reusable = true}}, SHIFT(522), - [3375] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1449), - [3377] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1298), - [3379] = {.entry = {.count = 1, .reusable = true}}, SHIFT(527), - [3381] = {.entry = {.count = 1, .reusable = true}}, SHIFT(528), - [3383] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1072), - [3385] = {.entry = {.count = 1, .reusable = true}}, SHIFT(530), - [3387] = {.entry = {.count = 1, .reusable = true}}, SHIFT(531), - [3389] = {.entry = {.count = 1, .reusable = true}}, SHIFT(532), - [3391] = {.entry = {.count = 1, .reusable = true}}, SHIFT(533), - [3393] = {.entry = {.count = 1, .reusable = true}}, SHIFT(534), - [3395] = {.entry = {.count = 1, .reusable = true}}, SHIFT(535), - [3397] = {.entry = {.count = 1, .reusable = true}}, SHIFT(578), - [3399] = {.entry = {.count = 1, .reusable = true}}, SHIFT(518), - [3401] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_varchar, 1, 0, 0), - [3403] = {.entry = {.count = 1, .reusable = true}}, SHIFT(538), - [3405] = {.entry = {.count = 1, .reusable = true}}, SHIFT(539), - [3407] = {.entry = {.count = 1, .reusable = true}}, SHIFT(451), - [3409] = {.entry = {.count = 1, .reusable = true}}, SHIFT(452), - [3411] = {.entry = {.count = 1, .reusable = true}}, SHIFT(540), - [3413] = {.entry = {.count = 1, .reusable = true}}, SHIFT(541), - [3415] = {.entry = {.count = 1, .reusable = true}}, SHIFT(453), - [3417] = {.entry = {.count = 1, .reusable = true}}, SHIFT(544), - [3419] = {.entry = {.count = 1, .reusable = true}}, SHIFT(414), - [3421] = {.entry = {.count = 1, .reusable = true}}, SHIFT(912), - [3423] = {.entry = {.count = 1, .reusable = true}}, SHIFT(907), - [3425] = {.entry = {.count = 1, .reusable = true}}, SHIFT(185), - [3427] = {.entry = {.count = 1, .reusable = true}}, SHIFT(186), - [3429] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1372), - [3431] = {.entry = {.count = 1, .reusable = true}}, SHIFT(62), - [3433] = {.entry = {.count = 1, .reusable = true}}, SHIFT(190), - [3435] = {.entry = {.count = 1, .reusable = true}}, SHIFT(65), - [3437] = {.entry = {.count = 1, .reusable = true}}, SHIFT(391), - [3439] = {.entry = {.count = 1, .reusable = true}}, SHIFT(913), - [3441] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [3443] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1327), - [3445] = {.entry = {.count = 1, .reusable = true}}, SHIFT(199), - [3447] = {.entry = {.count = 1, .reusable = true}}, SHIFT(392), - [3449] = {.entry = {.count = 1, .reusable = true}}, SHIFT(628), - [3451] = {.entry = {.count = 1, .reusable = true}}, SHIFT(559), - [3453] = {.entry = {.count = 1, .reusable = true}}, SHIFT(165), - [3455] = {.entry = {.count = 1, .reusable = true}}, SHIFT(164), - [3457] = {.entry = {.count = 1, .reusable = true}}, SHIFT(797), - [3459] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1459), - [3461] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1551), - [3463] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1461), - [3465] = {.entry = {.count = 1, .reusable = true}}, SHIFT(424), - [3467] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1404), - [3469] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1500), - [3471] = {.entry = {.count = 1, .reusable = true}}, SHIFT(896), - [3473] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1483), - [3475] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1484), - [3477] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1497), - [3479] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1498), - [3481] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1499), - [3483] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1290), - [3485] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1291), - [3487] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1292), - [3489] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1503), - [3491] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1504), - [3493] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), - [3495] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1506), - [3497] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1507), - [3499] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1508), - [3501] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1509), - [3503] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1510), - [3505] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1511), - [3507] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1513), - [3509] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1515), - [3511] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1516), - [3513] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1517), - [3515] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1518), - [3517] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1519), - [3519] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1520), - [3521] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1521), - [3523] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1522), - [3525] = {.entry = {.count = 1, .reusable = true}}, SHIFT(481), - [3527] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1531), - [3529] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1532), - [3531] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1533), - [3533] = {.entry = {.count = 1, .reusable = true}}, SHIFT(694), - [3535] = {.entry = {.count = 1, .reusable = true}}, SHIFT(276), - [3537] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1501), - [3539] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1542), - [3541] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1543), - [3543] = {.entry = {.count = 1, .reusable = true}}, SHIFT(629), - [3545] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_limit, 3, 0, 0), - [3547] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1078), - [3549] = {.entry = {.count = 1, .reusable = true}}, SHIFT(254), - [3551] = {.entry = {.count = 1, .reusable = true}}, SHIFT(806), - [3553] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1567), - [3555] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1568), - [3557] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1574), - [3559] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1575), - [3561] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1576), - [3563] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1577), - [3565] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1578), - [3567] = {.entry = {.count = 1, .reusable = true}}, SHIFT(430), - [3569] = {.entry = {.count = 1, .reusable = true}}, SHIFT(693), - [3571] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1595), - [3573] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1596), - [3575] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1597), - [3577] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1598), - [3579] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1599), - [3581] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1364), - [3583] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_marginalia, 3, 0, 0), - [3585] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_comment, 2, 0, 0), + [2861] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definitions, 3, 0, 0), + [2863] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_create_table_statement, 6, 0, 84), + [2865] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 7, 0, 0), + [2867] = {.entry = {.count = 1, .reusable = true}}, SHIFT(780), + [2869] = {.entry = {.count = 1, .reusable = true}}, SHIFT(781), + [2871] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 2, 0, 0), + [2873] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 8, 0, 135), + [2875] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1107), + [2877] = {.entry = {.count = 1, .reusable = true}}, SHIFT(418), + [2879] = {.entry = {.count = 1, .reusable = false}}, SHIFT(674), + [2881] = {.entry = {.count = 1, .reusable = true}}, SHIFT(674), + [2883] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 1), + [2885] = {.entry = {.count = 1, .reusable = true}}, SHIFT(706), + [2887] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 2), + [2889] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 10, 0, 153), + [2891] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_view, 4, 0, 0), + [2893] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 10, 0, 154), + [2895] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 10, 0, 155), + [2897] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 8, 0, 136), + [2899] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_table_option, 3, 0, 137), + [2901] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 6, 0, 0), + [2903] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 2, 0, 24), + [2905] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 4, 0, 0), + [2907] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 3), + [2909] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 6, 0, 0), + [2911] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement_transaction, 1, 0, 4), + [2913] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1386), + [2915] = {.entry = {.count = 1, .reusable = true}}, SHIFT(16), + [2917] = {.entry = {.count = 1, .reusable = true}}, SHIFT(875), + [2919] = {.entry = {.count = 1, .reusable = true}}, SHIFT(724), + [2921] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1369), + [2923] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1372), + [2925] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 6, 0, 0), + [2927] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 6, 0, 101), + [2929] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_schema, 6, 0, 0), + [2931] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 1, 0, 5), + [2933] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 6, 0, 50), + [2935] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 4, 0, 0), + [2937] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 6, 0, 31), + [2939] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_database, 6, 0, 0), + [2941] = {.entry = {.count = 1, .reusable = true}}, SHIFT(951), + [2943] = {.entry = {.count = 1, .reusable = true}}, SHIFT(878), + [2945] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 6, 0, 0), + [2947] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_copy_stmt, 1, 0, 0), + [2949] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 4, 0, 0), + [2951] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1412), + [2953] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25), + [2955] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_database, 4, 0, 0), + [2957] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_column_list_repeat1, 2, 0, 79), + [2959] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_index, 8, 0, 74), + [2961] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_column_definitions, 4, 0, 0), + [2963] = {.entry = {.count = 1, .reusable = true}}, SHIFT(654), + [2965] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_configuration, 3, 0, 45), + [2967] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_set_configuration, 3, 0, 111), + [2969] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_statement, 4, 0, 48), + [2971] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1034), + [2973] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_role, 4, 0, 0), + [2975] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_drop_table, 4, 0, 30), + [2977] = {.entry = {.count = 1, .reusable = true}}, SHIFT(659), + [2979] = {.entry = {.count = 1, .reusable = true}}, SHIFT(261), + [2981] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_dml_write_stmt, 1, 0, 0), + [2983] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ddl_stmt, 1, 0, 0), + [2985] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1470), + [2987] = {.entry = {.count = 1, .reusable = true}}, SHIFT(71), + [2989] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_ddl_stmt, 1, 0, 6), + [2991] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__optimize_table, 7, 0, 0), + [2993] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_view, 5, 0, 0), + [2995] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1289), + [2997] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1462), + [2999] = {.entry = {.count = 1, .reusable = true}}, SHIFT(417), + [3001] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1505), + [3003] = {.entry = {.count = 1, .reusable = true}}, SHIFT(372), + [3005] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1538), + [3007] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 11, 0, 161), + [3009] = {.entry = {.count = 1, .reusable = true}}, SHIFT(373), + [3011] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1566), + [3013] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_sequence, 5, 0, 0), + [3015] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_update_statement, 5, 0, 56), + [3017] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_type, 11, 0, 0), + [3019] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__compute_stats, 11, 0, 0), + [3021] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_delete_statement, 4, 0, 38), + [3023] = {.entry = {.count = 1, .reusable = true}}, SHIFT(551), + [3025] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1587), + [3027] = {.entry = {.count = 1, .reusable = true}}, SHIFT(552), + [3029] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1588), + [3031] = {.entry = {.count = 1, .reusable = true}}, SHIFT(553), + [3033] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1589), + [3035] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_constraints_repeat1, 2, 0, 110), + [3037] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__alter_statement, 1, 0, 0), + [3039] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1545), + [3041] = {.entry = {.count = 1, .reusable = true}}, SHIFT(165), + [3043] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_begin_transaction, 2, 0, 0), + [3045] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1485), + [3047] = {.entry = {.count = 1, .reusable = true}}, SHIFT(251), + [3049] = {.entry = {.count = 1, .reusable = true}}, SHIFT(946), + [3051] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_insert_statement, 4, 0, 39), + [3053] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1550), + [3055] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 4, 0, 0), + [3057] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1431), + [3059] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_alter_index, 7, 0, 0), + [3061] = {.entry = {.count = 1, .reusable = true}}, SHIFT(656), + [3063] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__vacuum_table, 7, 0, 0), + [3065] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1590), + [3067] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1486), + [3069] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1300), + [3071] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1301), + [3073] = {.entry = {.count = 1, .reusable = true}}, SHIFT(770), + [3075] = {.entry = {.count = 1, .reusable = true}}, SHIFT(762), + [3077] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1303), + [3079] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1370), + [3081] = {.entry = {.count = 1, .reusable = true}}, SHIFT(841), + [3083] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1492), + [3085] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1494), + [3087] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1495), + [3089] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1496), + [3091] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select, 2, 0, 11), + [3093] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1500), + [3095] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1501), + [3097] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1502), + [3099] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1503), + [3101] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1506), + [3103] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1507), + [3105] = {.entry = {.count = 1, .reusable = true}}, SHIFT(582), + [3107] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1509), + [3109] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1544), + [3111] = {.entry = {.count = 1, .reusable = true}}, SHIFT(665), + [3113] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), + [3115] = {.entry = {.count = 1, .reusable = true}}, SHIFT(492), + [3117] = {.entry = {.count = 1, .reusable = true}}, SHIFT(457), + [3119] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1554), + [3121] = {.entry = {.count = 1, .reusable = true}}, SHIFT(45), + [3123] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1142), + [3125] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1044), + [3127] = {.entry = {.count = 1, .reusable = true}}, SHIFT(698), + [3129] = {.entry = {.count = 1, .reusable = true}}, SHIFT(599), + [3131] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1028), + [3133] = {.entry = {.count = 1, .reusable = true}}, SHIFT(477), + [3135] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1046), + [3137] = {.entry = {.count = 1, .reusable = true}}, SHIFT(604), + [3139] = {.entry = {.count = 1, .reusable = true}}, SHIFT(788), + [3141] = {.entry = {.count = 1, .reusable = true}}, SHIFT(940), + [3143] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1380), + [3145] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_offset, 2, 0, 0), + [3147] = {.entry = {.count = 1, .reusable = true}}, SHIFT(131), + [3149] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1429), + [3151] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1529), + [3153] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_varchar, 1, 0, 0), + [3155] = {.entry = {.count = 1, .reusable = true}}, SHIFT(987), + [3157] = {.entry = {.count = 1, .reusable = true}}, SHIFT(537), + [3159] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1450), + [3161] = {.entry = {.count = 1, .reusable = true}}, SHIFT(542), + [3163] = {.entry = {.count = 1, .reusable = true}}, SHIFT(917), + [3165] = {.entry = {.count = 1, .reusable = true}}, SHIFT(905), + [3167] = {.entry = {.count = 1, .reusable = true}}, SHIFT(763), + [3169] = {.entry = {.count = 1, .reusable = true}}, SHIFT(594), + [3171] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1540), + [3173] = {.entry = {.count = 1, .reusable = true}}, SHIFT(436), + [3175] = {.entry = {.count = 1, .reusable = true}}, SHIFT(444), + [3177] = {.entry = {.count = 1, .reusable = true}}, SHIFT(595), + [3179] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1463), + [3181] = {.entry = {.count = 1, .reusable = true}}, SHIFT(832), + [3183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1556), + [3185] = {.entry = {.count = 1, .reusable = true}}, SHIFT(645), + [3187] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1487), + [3189] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1396), + [3191] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1428), + [3193] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1123), + [3195] = {.entry = {.count = 1, .reusable = true}}, SHIFT(991), + [3197] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1040), + [3199] = {.entry = {.count = 1, .reusable = true}}, SHIFT(644), + [3201] = {.entry = {.count = 1, .reusable = true}}, SHIFT(316), + [3203] = {.entry = {.count = 1, .reusable = true}}, SHIFT(727), + [3205] = {.entry = {.count = 1, .reusable = true}}, SHIFT(746), + [3207] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1474), + [3209] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1185), + [3211] = {.entry = {.count = 1, .reusable = true}}, SHIFT(368), + [3213] = {.entry = {.count = 1, .reusable = true}}, SHIFT(740), + [3215] = {.entry = {.count = 1, .reusable = true}}, SHIFT(876), + [3217] = {.entry = {.count = 1, .reusable = true}}, SHIFT(681), + [3219] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1513), + [3221] = {.entry = {.count = 1, .reusable = true}}, SHIFT(761), + [3223] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_not_in, 2, 0, 0), + [3225] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1467), + [3227] = {.entry = {.count = 1, .reusable = true}}, SHIFT(597), + [3229] = {.entry = {.count = 1, .reusable = true}}, SHIFT(837), + [3231] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), + [3233] = {.entry = {.count = 1, .reusable = true}}, SHIFT(262), + [3235] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), + [3237] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1419), + [3239] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1421), + [3241] = {.entry = {.count = 1, .reusable = true}}, SHIFT(460), + [3243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1113), + [3245] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [3247] = {.entry = {.count = 1, .reusable = true}}, SHIFT(900), + [3249] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1626), + [3251] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1406), + [3253] = {.entry = {.count = 1, .reusable = true}}, SHIFT(881), + [3255] = {.entry = {.count = 1, .reusable = true}}, SHIFT(605), + [3257] = {.entry = {.count = 1, .reusable = true}}, SHIFT(882), + [3259] = {.entry = {.count = 1, .reusable = true}}, SHIFT(282), + [3261] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1469), + [3263] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [3265] = {.entry = {.count = 1, .reusable = true}}, SHIFT(960), + [3267] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1168), + [3269] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1281), + [3271] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__temporary, 1, 0, 0), + [3273] = {.entry = {.count = 1, .reusable = true}}, SHIFT(965), + [3275] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1382), + [3277] = {.entry = {.count = 1, .reusable = true}}, SHIFT(386), + [3279] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1347), + [3281] = {.entry = {.count = 1, .reusable = true}}, SHIFT(680), + [3283] = {.entry = {.count = 1, .reusable = true}}, SHIFT(387), + [3285] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1045), + [3287] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), + [3289] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1218), + [3291] = {.entry = {.count = 1, .reusable = true}}, SHIFT(445), + [3293] = {.entry = {.count = 1, .reusable = true}}, SHIFT(894), + [3295] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1348), + [3297] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1392), + [3299] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_limit, 3, 0, 0), + [3301] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1416), + [3303] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1435), + [3305] = {.entry = {.count = 1, .reusable = true}}, SHIFT(384), + [3307] = {.entry = {.count = 1, .reusable = true}}, SHIFT(338), + [3309] = {.entry = {.count = 1, .reusable = true}}, SHIFT(956), + [3311] = {.entry = {.count = 1, .reusable = true}}, SHIFT(819), + [3313] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1207), + [3315] = {.entry = {.count = 1, .reusable = true}}, SHIFT(388), + [3317] = {.entry = {.count = 1, .reusable = true}}, SHIFT(957), + [3319] = {.entry = {.count = 1, .reusable = true}}, SHIFT(84), + [3321] = {.entry = {.count = 1, .reusable = true}}, SHIFT(89), + [3323] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1408), + [3325] = {.entry = {.count = 1, .reusable = true}}, SHIFT(759), + [3327] = {.entry = {.count = 1, .reusable = true}}, SHIFT(389), + [3329] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), + [3331] = {.entry = {.count = 1, .reusable = true}}, SHIFT(95), + [3333] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), + [3335] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1236), + [3337] = {.entry = {.count = 1, .reusable = true}}, SHIFT(432), + [3339] = {.entry = {.count = 1, .reusable = true}}, SHIFT(748), + [3341] = {.entry = {.count = 1, .reusable = true}}, SHIFT(844), + [3343] = {.entry = {.count = 1, .reusable = true}}, SHIFT(117), + [3345] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1454), + [3347] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1457), + [3349] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1458), + [3351] = {.entry = {.count = 1, .reusable = true}}, SHIFT(369), + [3353] = {.entry = {.count = 1, .reusable = true}}, SHIFT(370), + [3355] = {.entry = {.count = 1, .reusable = true}}, SHIFT(897), + [3357] = {.entry = {.count = 1, .reusable = true}}, SHIFT(371), + [3359] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1625), + [3361] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1413), + [3363] = {.entry = {.count = 1, .reusable = true}}, SHIFT(340), + [3365] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1437), + [3367] = {.entry = {.count = 1, .reusable = true}}, SHIFT(753), + [3369] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1489), + [3371] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1484), + [3373] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1515), + [3375] = {.entry = {.count = 1, .reusable = true}}, SHIFT(375), + [3377] = {.entry = {.count = 1, .reusable = true}}, SHIFT(376), + [3379] = {.entry = {.count = 1, .reusable = true}}, SHIFT(334), + [3381] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1409), + [3383] = {.entry = {.count = 1, .reusable = true}}, SHIFT(87), + [3385] = {.entry = {.count = 1, .reusable = true}}, SHIFT(378), + [3387] = {.entry = {.count = 1, .reusable = true}}, SHIFT(359), + [3389] = {.entry = {.count = 1, .reusable = true}}, SHIFT(351), + [3391] = {.entry = {.count = 1, .reusable = true}}, SHIFT(379), + [3393] = {.entry = {.count = 1, .reusable = true}}, SHIFT(446), + [3395] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1443), + [3397] = {.entry = {.count = 1, .reusable = true}}, SHIFT(380), + [3399] = {.entry = {.count = 1, .reusable = true}}, SHIFT(381), + [3401] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1316), + [3403] = {.entry = {.count = 1, .reusable = true}}, SHIFT(382), + [3405] = {.entry = {.count = 1, .reusable = true}}, SHIFT(548), + [3407] = {.entry = {.count = 1, .reusable = true}}, SHIFT(549), + [3409] = {.entry = {.count = 1, .reusable = true}}, SHIFT(550), + [3411] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1378), + [3413] = {.entry = {.count = 1, .reusable = true}}, SHIFT(441), + [3415] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1497), + [3417] = {.entry = {.count = 1, .reusable = true}}, SHIFT(583), + [3419] = {.entry = {.count = 1, .reusable = true}}, SHIFT(556), + [3421] = {.entry = {.count = 1, .reusable = true}}, SHIFT(768), + [3423] = {.entry = {.count = 1, .reusable = true}}, SHIFT(558), + [3425] = {.entry = {.count = 1, .reusable = true}}, SHIFT(523), + [3427] = {.entry = {.count = 1, .reusable = true}}, SHIFT(524), + [3429] = {.entry = {.count = 1, .reusable = true}}, SHIFT(561), + [3431] = {.entry = {.count = 1, .reusable = true}}, SHIFT(562), + [3433] = {.entry = {.count = 1, .reusable = true}}, SHIFT(563), + [3435] = {.entry = {.count = 1, .reusable = true}}, SHIFT(564), + [3437] = {.entry = {.count = 1, .reusable = true}}, SHIFT(565), + [3439] = {.entry = {.count = 1, .reusable = true}}, SHIFT(588), + [3441] = {.entry = {.count = 1, .reusable = true}}, SHIFT(566), + [3443] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1407), + [3445] = {.entry = {.count = 1, .reusable = true}}, SHIFT(568), + [3447] = {.entry = {.count = 1, .reusable = true}}, SHIFT(569), + [3449] = {.entry = {.count = 1, .reusable = true}}, SHIFT(473), + [3451] = {.entry = {.count = 1, .reusable = true}}, SHIFT(497), + [3453] = {.entry = {.count = 1, .reusable = true}}, SHIFT(570), + [3455] = {.entry = {.count = 1, .reusable = true}}, SHIFT(571), + [3457] = {.entry = {.count = 1, .reusable = true}}, SHIFT(475), + [3459] = {.entry = {.count = 1, .reusable = true}}, SHIFT(576), + [3461] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1446), + [3463] = {.entry = {.count = 1, .reusable = true}}, SHIFT(930), + [3465] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), + [3467] = {.entry = {.count = 1, .reusable = true}}, SHIFT(189), + [3469] = {.entry = {.count = 1, .reusable = true}}, SHIFT(190), + [3471] = {.entry = {.count = 1, .reusable = true}}, SHIFT(749), + [3473] = {.entry = {.count = 1, .reusable = true}}, SHIFT(383), + [3475] = {.entry = {.count = 1, .reusable = true}}, SHIFT(61), + [3477] = {.entry = {.count = 1, .reusable = true}}, SHIFT(195), + [3479] = {.entry = {.count = 1, .reusable = true}}, SHIFT(70), + [3481] = {.entry = {.count = 1, .reusable = true}}, SHIFT(610), + [3483] = {.entry = {.count = 1, .reusable = true}}, SHIFT(931), + [3485] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1286), + [3487] = {.entry = {.count = 1, .reusable = true}}, SHIFT(926), + [3489] = {.entry = {.count = 1, .reusable = true}}, SHIFT(201), + [3491] = {.entry = {.count = 1, .reusable = true}}, SHIFT(831), + [3493] = {.entry = {.count = 1, .reusable = true}}, SHIFT(306), + [3495] = {.entry = {.count = 1, .reusable = true}}, SHIFT(952), + [3497] = {.entry = {.count = 1, .reusable = true}}, SHIFT(158), + [3499] = {.entry = {.count = 1, .reusable = true}}, SHIFT(157), + [3501] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1460), + [3503] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1471), + [3505] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1472), + [3507] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1473), + [3509] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1464), + [3511] = {.entry = {.count = 1, .reusable = true}}, SHIFT(250), + [3513] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1459), + [3515] = {.entry = {.count = 1, .reusable = true}}, SHIFT(443), + [3517] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_character, 1, 0, 0), + [3519] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1510), + [3521] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1511), + [3523] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1512), + [3525] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1310), + [3527] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1311), + [3529] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1312), + [3531] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1516), + [3533] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1517), + [3535] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1519), + [3537] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1520), + [3539] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1521), + [3541] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1522), + [3543] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1523), + [3545] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1524), + [3547] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1525), + [3549] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1526), + [3551] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1528), + [3553] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1530), + [3555] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1531), + [3557] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1532), + [3559] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1533), + [3561] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1534), + [3563] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1535), + [3565] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1536), + [3567] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1537), + [3569] = {.entry = {.count = 1, .reusable = true}}, SHIFT(793), + [3571] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1546), + [3573] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1547), + [3575] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1548), + [3577] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_keyword_varchar, 2, 0, 0), + [3579] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1334), + [3581] = {.entry = {.count = 1, .reusable = false}}, SHIFT(1557), + [3583] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1558), + [3585] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select, 3, 0, 26), + [3587] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1426), + [3589] = {.entry = {.count = 1, .reusable = true}}, SHIFT(852), + [3591] = {.entry = {.count = 1, .reusable = true}}, SHIFT(815), + [3593] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1581), + [3595] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1582), + [3597] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1062), + [3599] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1591), + [3601] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1592), + [3603] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1593), + [3605] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1594), + [3607] = {.entry = {.count = 1, .reusable = true}}, SHIFT(419), + [3609] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1483), + [3611] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1330), + [3613] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1612), + [3615] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1613), + [3617] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1614), + [3619] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1615), + [3621] = {.entry = {.count = 1, .reusable = true}}, SHIFT(1339), + [3623] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_comment, 2, 0, 0), + [3625] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_marginalia, 3, 0, 0), }; #ifdef __cplusplus