diff --git a/Cargo.lock b/Cargo.lock index b8a3d58ec5..6fdb119793 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -352,7 +352,7 @@ dependencies = [ "fastrand", "hex", "http 0.2.12", - "hyper 0.14.30", + "hyper", "ring", "time", "tokio", @@ -628,7 +628,7 @@ dependencies = [ "http-body 0.4.6", "http-body 1.0.0", "httparse", - "hyper 0.14.30", + "hyper", "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", @@ -681,17 +681,6 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "aws-smithy-types-convert" -version = "0.60.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f280f434214856abace637b1f944d50ccca216814813acd195cdd7f206ce17f" -dependencies = [ - "aws-smithy-types", - "chrono", - "time", -] - [[package]] name = "aws-smithy-xml" version = "0.60.8" @@ -729,7 +718,7 @@ dependencies = [ "headers", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper", "itoa", "matchit", "memchr", @@ -741,7 +730,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 0.1.2", + "sync_wrapper", "tokio", "tower", "tower-layer", @@ -1166,12 +1155,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "chrono" version = "0.4.38" @@ -1640,47 +1623,12 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-skiplist" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" -[[package]] -name = "crossterm" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" -dependencies = [ - "bitflags 1.3.2", - "crossterm_winapi", - "libc", - "mio", - "parking_lot", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - [[package]] name = "crunchy" version = "0.2.2" @@ -1740,20 +1688,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "dashmap" -version = "6.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "data-encoding" version = "2.6.0" @@ -1870,12 +1804,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - [[package]] name = "ecdsa" version = "0.14.8" @@ -2138,12 +2066,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "fst" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" - [[package]] name = "futures" version = "0.3.30" @@ -2233,15 +2155,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fuzzy-matcher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" -dependencies = [ - "thread_local", -] - [[package]] name = "fxhash" version = "0.2.1" @@ -2588,25 +2501,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", -] - [[package]] name = "hyper-rustls" version = "0.24.1" @@ -2614,7 +2508,7 @@ source = "git+https://github.com/rustls/hyper-rustls.git?rev=163b3f5#163b3f539a4 dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.30", + "hyper", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -2630,7 +2524,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.30", + "hyper", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -2646,7 +2540,7 @@ checksum = "399c78f9338483cb7e630c8474b07268983c6bd5acee012e4211f9f7bb21b070" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.30", + "hyper", "log", "rustls 0.22.4", "rustls-native-certs 0.7.1", @@ -2662,7 +2556,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.30", + "hyper", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -2674,7 +2568,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cc7dcb1ab67cd336f468a12491765672e61a3b6b148634dbfe2fe8acd3fe7d9" dependencies = [ - "hyper 0.14.30", + "hyper", "pin-project-lite", "tokio", "tokio-tungstenite", @@ -2782,23 +2676,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "inquire" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" -dependencies = [ - "bitflags 2.6.0", - "crossterm", - "dyn-clone", - "fuzzy-matcher", - "fxhash", - "newline-converter", - "once_cell", - "unicode-segmentation", - "unicode-width", -] - [[package]] name = "insta" version = "1.39.0" @@ -3034,7 +2911,7 @@ dependencies = [ "fallible-iterator 0.3.0", "futures", "http 0.2.12", - "hyper 0.14.30", + "hyper", "hyper-rustls 0.25.0", "libsql-hrana", "libsql-sqlite3-parser", @@ -3160,7 +3037,7 @@ dependencies = [ "hdrhistogram", "hmac", "http-body 0.4.6", - "hyper 0.14.30", + "hyper", "hyper-rustls 0.24.1", "hyper-tungstenite", "indicatif", @@ -3173,7 +3050,6 @@ dependencies = [ "libsql-rusqlite", "libsql-sqlite3-parser", "libsql-sys", - "libsql-wal", "libsql_replication", "md-5", "metrics", @@ -3181,12 +3057,12 @@ dependencies = [ "metrics-util", "mimalloc", "moka", - "nix 0.26.4", + "nix", "once_cell", "parking_lot", "pem", "pin-project-lite", - "priority-queue 1.4.0", + "priority-queue", "proptest", "prost", "prost-build", @@ -3197,8 +3073,8 @@ dependencies = [ "ring", "rustls 0.21.12", "rustls-pemfile 1.0.4", - "s3s 0.8.1", - "s3s-fs 0.8.1", + "s3s", + "s3s-fs", "semver", "serde", "serde_json", @@ -3254,63 +3130,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "libsql-wal" -version = "0.1.0-alpha.1" -dependencies = [ - "anyhow", - "arc-swap", - "async-lock 3.4.0", - "async-stream", - "aws-config", - "aws-credential-types", - "aws-sdk-s3", - "aws-smithy-runtime", - "aws-smithy-types-convert", - "bitflags 2.6.0", - "bytes", - "chrono", - "clap 4.5.9", - "crc32fast", - "criterion", - "crossbeam", - "crossbeam-skiplist", - "dashmap", - "fst", - "futures", - "hashbrown 0.14.5", - "hex", - "http-body 1.0.0", - "hyper 0.14.30", - "inquire", - "insta", - "libsql-sys", - "memmap", - "nix 0.28.0", - "once_cell", - "parking_lot", - "petgraph", - "pin-project-lite", - "priority-queue 2.0.3", - "rand", - "rand_chacha", - "regex", - "roaring", - "s3s 0.10.1-dev", - "s3s-aws", - "s3s-fs 0.10.1-dev", - "tempfile", - "thiserror", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", - "tracing-subscriber", - "uuid", - "walkdir", - "zerocopy", -] - [[package]] name = "libsql-wasm" version = "0.1.0" @@ -3343,7 +3162,6 @@ dependencies = [ "cbc", "libsql-rusqlite", "libsql-sys", - "libsql-wal", "parking_lot", "prost", "prost-build", @@ -3467,16 +3285,6 @@ dependencies = [ "rustix 0.38.34", ] -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "memmap2" version = "0.9.4" @@ -3522,7 +3330,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" dependencies = [ "base64 0.21.7", - "hyper 0.14.30", + "hyper", "indexmap 1.9.3", "ipnet", "metrics", @@ -3600,7 +3408,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "log", "wasi", "windows-sys 0.48.0", ] @@ -3635,15 +3442,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" -[[package]] -name = "newline-converter" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "nibble_vec" version = "0.1.0" @@ -3666,18 +3464,6 @@ dependencies = [ "pin-utils", ] -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "cfg_aliases", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -4086,7 +3872,7 @@ dependencies = [ "inferno", "libc", "log", - "nix 0.26.4", + "nix", "once_cell", "parking_lot", "smallvec", @@ -4121,17 +3907,6 @@ dependencies = [ "indexmap 1.9.3", ] -[[package]] -name = "priority-queue" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70c501afe3a2e25c9bd219aa56ec1e04cdb3fcdd763055be268778c13fa82c1f" -dependencies = [ - "autocfg", - "equivalent", - "indexmap 2.2.6", -] - [[package]] name = "proc-macro2" version = "1.0.86" @@ -4290,16 +4065,6 @@ dependencies = [ "serde", ] -[[package]] -name = "quick-xml" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e446ed58cef1bbfe847bc2fda0e2e4ea9f0e57b90c507d4781292590d72a4e" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quote" version = "1.0.36" @@ -4512,7 +4277,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -4526,7 +4291,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 0.1.2", + "sync_wrapper", "system-configuration", "tokio", "tokio-rustls 0.24.1", @@ -4591,16 +4356,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "roaring" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4b84ba6e838ceb47b41de5194a60244fac43d9fe03b71dbe8c5a201081d6d1" -dependencies = [ - "bytemuck", - "byteorder", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -4791,7 +4546,7 @@ dependencies = [ "hmac", "http-body 0.4.6", "httparse", - "hyper 0.14.30", + "hyper", "itoa", "memchr", "mime", @@ -4812,68 +4567,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "s3s" -version = "0.10.1-dev" -source = "git+https://github.com/Nugine/s3s#29bf39cb72507505d09d9d7637f57784dbfc0a40" -dependencies = [ - "arrayvec", - "async-trait", - "atoi", - "base64-simd", - "bytes", - "bytestring", - "chrono", - "crc32c", - "crc32fast", - "digest", - "futures", - "hex-simd", - "hmac", - "http-body 1.0.0", - "http-body-util", - "httparse", - "hyper 1.4.1", - "itoa", - "memchr", - "mime", - "nom", - "nugine-rust-utils", - "numeric_cast", - "pin-project-lite", - "quick-xml 0.35.0", - "serde", - "serde_urlencoded", - "sha1", - "sha2", - "smallvec", - "sync_wrapper 1.0.1", - "thiserror", - "time", - "tokio", - "tracing", - "transform-stream", - "urlencoding", - "zeroize", -] - -[[package]] -name = "s3s-aws" -version = "0.10.1-dev" -source = "git+https://github.com/Nugine/s3s#29bf39cb72507505d09d9d7637f57784dbfc0a40" -dependencies = [ - "async-trait", - "aws-sdk-s3", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-smithy-types-convert", - "hyper 1.4.1", - "s3s 0.10.1-dev", - "sync_wrapper 1.0.1", - "tracing", - "transform-stream", -] - [[package]] name = "s3s-fs" version = "0.8.1" @@ -4894,7 +4587,7 @@ dependencies = [ "nugine-rust-utils", "numeric_cast", "path-absolutize", - "s3s 0.8.1", + "s3s", "serde_json", "sha1", "sha2", @@ -4908,35 +4601,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "s3s-fs" -version = "0.10.1-dev" -source = "git+https://github.com/Nugine/s3s#29bf39cb72507505d09d9d7637f57784dbfc0a40" -dependencies = [ - "async-trait", - "base64-simd", - "bytes", - "chrono", - "crc32c", - "futures", - "hex-simd", - "md-5", - "mime", - "nugine-rust-utils", - "numeric_cast", - "path-absolutize", - "s3s 0.10.1-dev", - "serde_json", - "thiserror", - "time", - "tokio", - "tokio-util", - "tracing", - "tracing-error", - "transform-stream", - "uuid", -] - [[package]] name = "same-file" version = "1.0.6" @@ -5174,27 +4838,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -5394,12 +5037,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - [[package]] name = "system-configuration" version = "0.5.1" @@ -5720,7 +5357,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper", "hyper-timeout", "percent-encoding", "pin-project", @@ -5747,7 +5384,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper", "hyper-timeout", "percent-encoding", "pin-project", @@ -5786,7 +5423,7 @@ dependencies = [ "bytes", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper", "pin-project", "tokio-stream", "tonic 0.11.0", @@ -6053,12 +5690,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - [[package]] name = "unicode-width" version = "0.1.13" diff --git a/Cargo.toml b/Cargo.toml index c79d105a5c..7bc2881a42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,6 @@ members = [ "vendored/sqlite3-parser", "xtask", "libsql-hrana", - "libsql-wal", ] exclude = [ diff --git a/libsql-replication/Cargo.toml b/libsql-replication/Cargo.toml index b04c8c619e..d15b54c4b1 100644 --- a/libsql-replication/Cargo.toml +++ b/libsql-replication/Cargo.toml @@ -12,7 +12,6 @@ license = "MIT" tonic = { version = "0.11", default-features = false, features = ["codegen", "prost"] } prost = "0.12" libsql-sys = { version = "0.8", path = "../libsql-sys", default-features = false, features = ["wal", "rusqlite", "api"] } -libsql-wal = { version = "0.1.0-alpha.1", path = "../libsql-wal/", optional = true } rusqlite = { workspace = true } parking_lot = "0.12.1" bytes = { version = "1.5.0", features = ["serde"] } @@ -38,4 +37,3 @@ tonic-build = "0.11" [features] encryption = ["libsql-sys/encryption"] -libsql_wal = ["dep:libsql-wal"] diff --git a/libsql-replication/src/injector/mod.rs b/libsql-replication/src/injector/mod.rs index 9519dc1a20..8e58e99a31 100644 --- a/libsql-replication/src/injector/mod.rs +++ b/libsql-replication/src/injector/mod.rs @@ -1,8 +1,6 @@ use std::future::Future; use super::rpc::replication::Frame as RpcFrame; -#[cfg(feature = "libsql_wal")] -pub use libsql_injector::LibsqlInjector; pub use sqlite_injector::SqliteInjector; use crate::frame::FrameNo; @@ -11,8 +9,6 @@ pub use error::Error; use error::Result; mod error; -#[cfg(feature = "libsql_wal")] -mod libsql_injector; mod sqlite_injector; pub trait Injector { diff --git a/libsql-server/Cargo.toml b/libsql-server/Cargo.toml index 28f278e813..aabd1e1e79 100644 --- a/libsql-server/Cargo.toml +++ b/libsql-server/Cargo.toml @@ -37,8 +37,7 @@ hyper-tungstenite = "0.11" itertools = "0.10.5" jsonwebtoken = "9" libsql = { path = "../libsql/", optional = true } -libsql_replication = { path = "../libsql-replication", features = ["libsql_wal"] } -libsql-wal = { path = "../libsql-wal/" } +libsql_replication = { path = "../libsql-replication" } metrics = "0.21.1" metrics-util = "0.15" metrics-exporter-prometheus = "0.12.2" @@ -91,7 +90,7 @@ async-recursion = "1" mimalloc = "0.1.42" rheaper = { git = "https://github.com/MarinPostma/rheaper.git", tag = "v0.2.0", default-features = false, features = ["allocator"] } tar = "0.4.41" -aws-config = "1" +aws-config = { version = "1", features = ["behavior-version-latest"] } aws-sdk-s3 = "1" aws-smithy-runtime = "1.6.2" dialoguer = { version = "0.11.0", features = ["history"] } diff --git a/libsql-server/src/bottomless_migrate.rs b/libsql-server/src/bottomless_migrate.rs deleted file mode 100644 index 02c5797a3c..0000000000 --- a/libsql-server/src/bottomless_migrate.rs +++ /dev/null @@ -1,194 +0,0 @@ -use std::path::{Path, PathBuf}; -use std::sync::Arc; - -use libsql_sys::ffi::Sqlite3DbHeader; -use libsql_sys::wal::Sqlite3WalManager; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; -use libsql_wal::replication::injector::Injector; -use libsql_wal::segment::{Frame, FrameHeader}; -use libsql_wal::storage::NoStorage; -use tempfile::TempDir; -use tokio::io::AsyncReadExt; -use tokio_stream::StreamExt; -use zerocopy::{FromBytes, FromZeroes}; - -use libsql_sys::wal::either::Either as EitherWAL; - -use crate::namespace::broadcasters::BroadcasterRegistry; -use crate::namespace::configurator::{ - BaseNamespaceConfig, NamespaceConfigurators, PrimaryConfig, PrimaryConfigurator, -}; -use crate::namespace::meta_store::{MetaStore, MetaStoreHandle}; -use crate::namespace::NamespaceStore; - -/// The process for migrating from bottomless to libsql wal is simple: -/// 1) iteratate over all namespaces, and make sure that they are up to date with bottomless by -/// loading them -/// 2) with a dummy registry, in a temp directory, with no storage, and no checkpointer, inject all the pages from the -/// original db into a new temp db -/// 3) when all namespace have been successfully migrated, make the dbs and wals folders permanent -pub async fn bottomless_migrate( - meta_store: MetaStore, - base_config: BaseNamespaceConfig, - primary_config: PrimaryConfig, -) -> anyhow::Result<()> { - let base_dbs_dir = base_config.base_path.join("dbs"); - let base_dbs_dir_tmp = base_config.base_path.join("_dbs"); - // the previous migration failed. The _dbs is still present, but the wals is not. In this case - // we delete the current dbs if it exists and replace it with _dbs, and attempt migration again - if base_dbs_dir_tmp.try_exists()? { - tokio::fs::remove_dir_all(&base_dbs_dir).await?; - tokio::fs::rename(&base_dbs_dir_tmp, &base_dbs_dir).await?; - } - - tracing::info!("attempting bottomless migration to libsql-wal"); - - let tmp = TempDir::new()?; - - tokio::fs::create_dir_all(tmp.path().join("dbs")).await?; - - let configs_stream = meta_store.namespaces(); - tokio::pin!(configs_stream); - - let (sender, mut rcv) = tokio::sync::mpsc::channel(1); - - // we are not checkpointing anything, be we want to drain the receiver - tokio::spawn(async move { - loop { - match rcv.recv().await { - Some(libsql_wal::checkpointer::CheckpointMessage::Shutdown) | None => break, - Some(_) => (), - } - } - }); - - let tmp_registry = Arc::new(WalRegistry::new(NoStorage.into(), sender)?); - - let mut configurators = NamespaceConfigurators::default(); - - let make_wal_manager = Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())); - let primary_configurator = - PrimaryConfigurator::new(base_config.clone(), primary_config, make_wal_manager); - configurators.with_primary(primary_configurator); - - let dummy_store = NamespaceStore::new( - false, - false, - 1000, - meta_store.clone(), - NamespaceConfigurators::default(), - crate::database::DatabaseKind::Primary, - ) - .await?; - - while let Some(config) = configs_stream.next().await { - migrate_one( - &configurators, - config, - dummy_store.clone(), - tmp.path(), - tmp_registry.clone(), - &base_config.base_path, - ) - .await?; - } - - tmp_registry.shutdown().await?; - - // unix prevents atomically renaming directories with mv, so we first rename dbs to _dbs, then - // move the new dbs and wals, then remove old dbs. - // when we perform a check form migration, whe verify if _dbs exists. If it exists, and wals - // doesn't exist, then we restore it, otherwise, we delete it. - tokio::fs::rename(&base_dbs_dir, &base_dbs_dir_tmp).await?; - tokio::fs::rename(tmp.path().join("dbs"), base_dbs_dir).await?; - tokio::fs::remove_dir_all(base_config.base_path.join("_dbs")).await?; - - Ok(()) -} - -/// this may not be the most efficient method to perform a migration, but it has the advantage of -/// being atomic. when all namespaces are migrated, be rename the dbs and wals folders from the tmp -/// directory, in that order. If we don't find a wals folder in the db directory, we'll just -/// atttempt migrating again, because: -/// - either the migration didn't happen -/// - a crash happened before we could swap the directories -#[tracing::instrument(skip_all, fields(namespace = config.namespace().as_str()))] -async fn migrate_one( - configurators: &NamespaceConfigurators, - config: MetaStoreHandle, - dummy_store: NamespaceStore, - tmp: &Path, - tmp_registry: Arc>, - base_path: &Path, -) -> anyhow::Result<()> { - let broadcasters = BroadcasterRegistry::default(); - // TODO: check if we already have a backup for this db from storage - tracing::info!("started namespace migration"); - // we load the namespace ensuring it's restored to the latest version - configurators - .configure_primary()? - .setup( - config.clone(), - crate::namespace::RestoreOption::Latest, - config.namespace(), - // don't care about reset - Box::new(|_| ()), - // don't care about attach - Arc::new(|_| Ok(PathBuf::new().into())), - dummy_store.clone(), - broadcasters.handle(config.namespace().clone()), - ) - .await?; - - let db_dir = tmp.join("dbs").join(config.namespace().as_str()); - tokio::fs::create_dir_all(&db_dir).await?; - let db_path = db_dir.join("data"); - let registry = tmp_registry.clone(); - let namespace = config.namespace().clone(); - let shared = tokio::task::spawn_blocking({ - let registry = registry.clone(); - move || registry.open(&db_path, &namespace.into()) - }) - .await - .unwrap()?; - - let mut injector = Injector::new(shared.clone(), 10)?; - let orig_db_path = base_path - .join("dbs") - .join(config.namespace().as_str()) - .join("data"); - let mut orig_db_file = tokio::fs::File::open(orig_db_path).await?; - let mut db_size = usize::MAX; - let mut current = 0; - while current < db_size { - let mut frame: Box = Frame::new_box_zeroed(); - orig_db_file.read_exact(frame.data_mut()).await?; - if current == 0 { - let header: Sqlite3DbHeader = Sqlite3DbHeader::read_from_prefix(frame.data()).unwrap(); - db_size = header.db_size.get() as usize; - } - let size_after = if current == db_size - 1 { - db_size as u32 - } else { - 0 - }; - *frame.header_mut() = FrameHeader { - page_no: (current as u32 + 1).into(), - size_after: size_after.into(), - frame_no: (current as u64 + 1).into(), - }; - injector.insert_frame(frame).await?; - current += 1; - } - - drop(injector); - - tokio::task::spawn_blocking(move || shared.seal_current()) - .await - .unwrap()?; - - tracing::info!("sucessfull migration"); - - Ok(()) -} diff --git a/libsql-server/src/connection/connection_core.rs b/libsql-server/src/connection/connection_core.rs index 9480cdde62..17a6f52961 100644 --- a/libsql-server/src/connection/connection_core.rs +++ b/libsql-server/src/connection/connection_core.rs @@ -384,7 +384,6 @@ impl CoreConnection { #[cfg(test)] mod test { use itertools::Itertools; - use libsql_sys::wal::either::Either as EitherWAL; use libsql_sys::wal::wrapper::PassthroughWalWrapper; use libsql_sys::wal::{Sqlite3Wal, Sqlite3WalManager}; use rand::Rng; @@ -454,7 +453,7 @@ mod test { None, Default::default(), Arc::new(|_| unreachable!()), - Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())), + Arc::new(|| Sqlite3WalManager::default()), ) .await .unwrap(); @@ -500,7 +499,7 @@ mod test { None, Default::default(), Arc::new(|_| unreachable!()), - Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())), + Arc::new(|| Sqlite3WalManager::default()), ) .await .unwrap(); @@ -551,7 +550,7 @@ mod test { None, Default::default(), Arc::new(|_| unreachable!()), - Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())), + Arc::new(|| Sqlite3WalManager::default()), ) .await .unwrap(); @@ -634,7 +633,7 @@ mod test { None, Default::default(), Arc::new(|_| unreachable!()), - Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())), + Arc::new(|| Sqlite3WalManager::default()), ) .await .unwrap(); @@ -727,7 +726,7 @@ mod test { None, Default::default(), Arc::new(|_| unreachable!()), - Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())), + Arc::new(|| Sqlite3WalManager::default()), ) .await .unwrap(); diff --git a/libsql-server/src/connection/connection_manager.rs b/libsql-server/src/connection/connection_manager.rs index 570186108f..9fa22fbb8e 100644 --- a/libsql-server/src/connection/connection_manager.rs +++ b/libsql-server/src/connection/connection_manager.rs @@ -6,24 +6,19 @@ use std::time::{Duration, Instant}; use crossbeam::deque::Steal; use crossbeam::sync::{Parker, Unparker}; use hashbrown::HashMap; -use libsql_sys::wal::either::Either; use libsql_sys::wal::wrapper::{WrapWal, WrappedWal}; use libsql_sys::wal::{CheckpointMode, Sqlite3Wal, Sqlite3WalManager, Wal}; -use libsql_wal::io::StdIO; -use libsql_wal::wal::{LibsqlWal, LibsqlWalManager}; use metrics::atomics::AtomicU64; use parking_lot::{Mutex, MutexGuard}; use rusqlite::ErrorCode; -use crate::SqldStorage; - use super::connection_core::CoreConnection; use super::TXN_TIMEOUT; pub type ConnId = u64; -pub type InnerWalManager = Either>; +pub type InnerWalManager = Sqlite3WalManager; -pub type InnerWal = Either>; +pub type InnerWal = Sqlite3Wal; pub type ManagedConnectionWal = WrappedWal; #[derive(Copy, Clone, Debug)] diff --git a/libsql-server/src/connection/legacy.rs b/libsql-server/src/connection/legacy.rs index eb8b11e6a3..ae5addd70d 100644 --- a/libsql-server/src/connection/legacy.rs +++ b/libsql-server/src/connection/legacy.rs @@ -170,7 +170,6 @@ pub struct LegacyConnection { #[cfg(test)] impl LegacyConnection { pub async fn new_test(path: &Path) -> Self { - use libsql_sys::wal::either::Either as EitherWAL; use libsql_sys::wal::Sqlite3WalManager; Self::new( @@ -185,7 +184,7 @@ impl LegacyConnection { Default::default(), Arc::new(|_| unreachable!()), ConnectionManager::new(TXN_TIMEOUT), - Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())), + Arc::new(|| Sqlite3WalManager::default()), ) .await .unwrap() diff --git a/libsql-server/src/connection/libsql.rs b/libsql-server/src/connection/libsql.rs deleted file mode 100644 index a38e1da919..0000000000 --- a/libsql-server/src/connection/libsql.rs +++ /dev/null @@ -1,164 +0,0 @@ -use std::path::{Path, PathBuf}; -use std::sync::atomic::AtomicBool; -use std::sync::Arc; - -use libsql_sys::EncryptionConfig; -use libsql_wal::io::StdIO; -use libsql_wal::wal::{LibsqlWal, LibsqlWalManager}; -use parking_lot::Mutex; - -use crate::connection::program::check_program_auth; -use crate::metrics::DESCRIBE_COUNT; -use crate::namespace::broadcasters::BroadcasterHandle; -use crate::namespace::meta_store::MetaStoreHandle; -use crate::namespace::ResolveNamespacePathFn; -use crate::query_result_builder::{QueryBuilderConfig, QueryResultBuilder}; -use crate::replication::FrameNo; -use crate::stats::Stats; -use crate::Result; -use crate::{record_time, SqldStorage, BLOCKING_RT}; - -use super::connection_core::{CoreConnection, GetCurrentFrameNo}; -use super::program::{check_describe_auth, DescribeResponse, Program}; -use super::{MakeConnection, RequestContext}; - -pub struct MakeLibsqlConnection { - pub(crate) inner: Arc, -} - -pub struct MakeLibsqlConnectionInner { - pub(crate) db_path: Arc, - pub(crate) stats: Arc, - pub(crate) broadcaster: BroadcasterHandle, - pub(crate) config_store: MetaStoreHandle, - pub(crate) extensions: Arc<[PathBuf]>, - pub(crate) max_response_size: u64, - pub(crate) max_total_response_size: u64, - pub(crate) auto_checkpoint: u32, - pub(crate) get_current_frame_no: GetCurrentFrameNo, - pub(crate) encryption_config: Option, - pub(crate) block_writes: Arc, - pub(crate) resolve_attach_path: ResolveNamespacePathFn, - pub(crate) wal_manager: LibsqlWalManager, -} - -#[async_trait::async_trait] -impl MakeConnection for MakeLibsqlConnection { - type Connection = LibsqlConnection; - - async fn create(&self) -> crate::Result { - let inner = self.inner.clone(); - let core = BLOCKING_RT - .spawn_blocking(move || -> crate::Result<_> { - let builder_config = QueryBuilderConfig { - max_size: Some(inner.max_response_size), - max_total_size: Some(inner.max_total_response_size), - auto_checkpoint: inner.auto_checkpoint, - encryption_config: inner.encryption_config.clone(), - }; - - // todo: handle retries - CoreConnection::new( - &inner.db_path, - inner.extensions.clone(), - inner.wal_manager.clone(), - inner.stats.clone(), - inner.broadcaster.clone(), - inner.config_store.clone(), - builder_config, - inner.get_current_frame_no.clone(), - inner.block_writes.clone(), - inner.resolve_attach_path.clone(), - ) - }) - .await - .unwrap()?; - - Ok(LibsqlConnection { - inner: Arc::new(Mutex::new(core)), - }) - } -} - -#[derive(Clone)] -pub struct LibsqlConnection { - inner: Arc>>>, -} - -impl LibsqlConnection { - pub async fn execute( - &self, - pgm: Program, - ctx: RequestContext, - builder: B, - ) -> Result { - let inner = self.inner.clone(); - let config = tokio::task::spawn_blocking(move || inner.lock().config()) - .await - .unwrap(); - check_program_auth(&ctx, &pgm, &config).await?; - let conn = self.inner.clone(); - CoreConnection::run_async(conn, pgm, builder).await - } -} - -#[async_trait::async_trait] -impl super::Connection for LibsqlConnection { - async fn execute_program( - &self, - pgm: Program, - ctx: RequestContext, - builder: B, - _replication_index: Option, - ) -> Result { - record_time! { - "libsql_query_exec"; - self.execute(pgm, ctx, builder).await - } - } - - async fn describe( - &self, - sql: String, - ctx: RequestContext, - _replication_index: Option, - ) -> Result> { - DESCRIBE_COUNT.increment(1); - check_describe_auth(ctx)?; - let conn = self.inner.clone(); - let res = tokio::task::spawn_blocking(move || conn.lock().describe(&sql)) - .await - .unwrap(); - - Ok(res) - } - - async fn is_autocommit(&self) -> Result { - Ok(self.inner.lock().is_autocommit()) - } - - async fn checkpoint(&self) -> Result<()> { - let conn = self.inner.clone(); - tokio::task::spawn_blocking(move || conn.lock().checkpoint()) - .await - .unwrap()?; - Ok(()) - } - - async fn vacuum_if_needed(&self) -> Result<()> { - let conn = self.inner.clone(); - tokio::task::spawn_blocking(move || conn.lock().vacuum_if_needed()) - .await - .unwrap()?; - Ok(()) - } - - fn diagnostics(&self) -> String { - String::new() - } - - fn with_raw(&self, f: impl FnOnce(&mut rusqlite::Connection) -> R) -> R { - let mut inner = self.inner.lock(); - f(inner.raw_mut()) - } -} diff --git a/libsql-server/src/connection/mod.rs b/libsql-server/src/connection/mod.rs index dbdfb7cf7d..167a1a595c 100644 --- a/libsql-server/src/connection/mod.rs +++ b/libsql-server/src/connection/mod.rs @@ -30,7 +30,6 @@ mod connection_core; pub mod connection_manager; pub mod dump; pub mod legacy; -pub mod libsql; pub mod program; pub mod write_proxy; diff --git a/libsql-server/src/database/libsql_primary.rs b/libsql-server/src/database/libsql_primary.rs deleted file mode 100644 index cfc51d8f6d..0000000000 --- a/libsql-server/src/database/libsql_primary.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::sync::atomic::AtomicBool; -use std::sync::Arc; - -use crate::connection::libsql::{LibsqlConnection, MakeLibsqlConnection}; -use crate::connection::{MakeThrottledConnection, TrackedConnection}; - -pub type LibsqlPrimaryConnection = TrackedConnection; -pub type LibsqlPrimaryConnectionMaker = MakeThrottledConnection; - -pub struct LibsqlPrimaryDatabase { - pub connection_maker: Arc, - pub block_writes: Arc, - pub new_frame_notifier: tokio::sync::watch::Receiver>, -} - -impl LibsqlPrimaryDatabase { - pub fn connection_maker(&self) -> Arc { - self.connection_maker.clone() - } - - pub fn destroy(self) {} - - pub async fn shutdown(self) -> anyhow::Result<()> { - Ok(()) - } -} diff --git a/libsql-server/src/database/libsql_replica.rs b/libsql-server/src/database/libsql_replica.rs deleted file mode 100644 index bd2f1df155..0000000000 --- a/libsql-server/src/database/libsql_replica.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::sync::Arc; - -use libsql_replication::rpc::proxy::ExecResp; -use tonic::Streaming; - -use crate::connection::libsql::{LibsqlConnection, MakeLibsqlConnection}; -use crate::connection::write_proxy::{MakeWriteProxyConn, WriteProxyConnection}; -use crate::connection::{MakeThrottledConnection, TrackedConnection}; - -use super::Result; - -pub type LibsqlReplicaConnection = - TrackedConnection, LibsqlConnection>>; -type LibsqlReplicaConnectionMaker = - MakeThrottledConnection>; - -pub struct LibsqlReplicaDatabase { - pub connection_maker: Arc, -} - -impl LibsqlReplicaDatabase { - pub fn connection_maker(&self) -> Arc { - self.connection_maker.clone() - } - - pub fn destroy(self) {} - - pub async fn shutdown(self) -> Result<()> { - Ok(()) - } -} diff --git a/libsql-server/src/database/mod.rs b/libsql-server/src/database/mod.rs index 327e92f391..d3052bd43f 100644 --- a/libsql-server/src/database/mod.rs +++ b/libsql-server/src/database/mod.rs @@ -8,16 +8,10 @@ use tokio::sync::watch; use crate::connection::{MakeConnection, RequestContext}; use crate::replication::{FrameNo, ReplicationLogger}; -pub use self::libsql_primary::{ - LibsqlPrimaryConnection, LibsqlPrimaryConnectionMaker, LibsqlPrimaryDatabase, -}; -pub use self::libsql_replica::{LibsqlReplicaConnection, LibsqlReplicaDatabase}; pub use self::primary::{PrimaryConnection, PrimaryConnectionMaker, PrimaryDatabase}; pub use self::replica::{ReplicaConnection, ReplicaDatabase}; pub use self::schema::{SchemaConnection, SchemaDatabase}; -mod libsql_primary; -mod libsql_replica; mod primary; mod replica; mod schema; @@ -53,9 +47,6 @@ pub enum Connection { Primary(PrimaryConnection), Replica(ReplicaConnection), Schema(SchemaConnection), - LibsqlPrimary(LibsqlPrimaryConnection), - LibsqlReplica(LibsqlReplicaConnection), - LibsqlSchema(SchemaConnection), } impl fmt::Debug for Connection { @@ -64,9 +55,6 @@ impl fmt::Debug for Connection { Self::Primary(_) => write!(f, "Primary"), Self::Replica(_) => write!(f, "Replica"), Self::Schema(_) => write!(f, "Schema"), - Self::LibsqlPrimary(_) => write!(f, "LibsqlPrimaryConnection"), - Self::LibsqlReplica(_) => write!(f, "LibsqlReplicaConnection"), - Self::LibsqlSchema(_) => write!(f, "LibsqlSchema"), } } } @@ -77,7 +65,7 @@ impl Connection { /// [`Primary`]: Connection::Primary #[must_use] pub fn is_primary(&self) -> bool { - matches!(self, Self::Primary(..) | Self::LibsqlPrimary(_)) + matches!(self, Self::Primary(..)) } } @@ -103,18 +91,6 @@ impl crate::connection::Connection for Connection { conn.execute_program(pgm, ctx, response_builder, replication_index) .await } - Connection::LibsqlPrimary(conn) => { - conn.execute_program(pgm, ctx, response_builder, replication_index) - .await - } - Connection::LibsqlReplica(conn) => { - conn.execute_program(pgm, ctx, response_builder, replication_index) - .await - } - Connection::LibsqlSchema(conn) => { - conn.execute_program(pgm, ctx, response_builder, replication_index) - .await - } } } @@ -128,9 +104,6 @@ impl crate::connection::Connection for Connection { Connection::Primary(conn) => conn.describe(sql, ctx, replication_index).await, Connection::Replica(conn) => conn.describe(sql, ctx, replication_index).await, Connection::Schema(conn) => conn.describe(sql, ctx, replication_index).await, - Connection::LibsqlPrimary(conn) => conn.describe(sql, ctx, replication_index).await, - Connection::LibsqlReplica(conn) => conn.describe(sql, ctx, replication_index).await, - Connection::LibsqlSchema(conn) => conn.describe(sql, ctx, replication_index).await, } } @@ -139,9 +112,6 @@ impl crate::connection::Connection for Connection { Connection::Primary(conn) => conn.is_autocommit().await, Connection::Replica(conn) => conn.is_autocommit().await, Connection::Schema(conn) => conn.is_autocommit().await, - Connection::LibsqlPrimary(conn) => conn.is_autocommit().await, - Connection::LibsqlReplica(conn) => conn.is_autocommit().await, - Connection::LibsqlSchema(conn) => conn.is_autocommit().await, } } @@ -150,9 +120,6 @@ impl crate::connection::Connection for Connection { Connection::Primary(conn) => conn.checkpoint().await, Connection::Replica(conn) => conn.checkpoint().await, Connection::Schema(conn) => conn.checkpoint().await, - Connection::LibsqlPrimary(conn) => conn.checkpoint().await, - Connection::LibsqlReplica(conn) => conn.checkpoint().await, - Connection::LibsqlSchema(conn) => conn.checkpoint().await, } } @@ -161,9 +128,6 @@ impl crate::connection::Connection for Connection { Connection::Primary(conn) => conn.vacuum_if_needed().await, Connection::Replica(conn) => conn.vacuum_if_needed().await, Connection::Schema(conn) => conn.vacuum_if_needed().await, - Connection::LibsqlPrimary(conn) => conn.vacuum_if_needed().await, - Connection::LibsqlReplica(conn) => conn.vacuum_if_needed().await, - Connection::LibsqlSchema(conn) => conn.vacuum_if_needed().await, } } @@ -172,9 +136,6 @@ impl crate::connection::Connection for Connection { Connection::Primary(conn) => conn.diagnostics(), Connection::Replica(conn) => conn.diagnostics(), Connection::Schema(conn) => conn.diagnostics(), - Connection::LibsqlPrimary(conn) => conn.diagnostics(), - Connection::LibsqlReplica(conn) => conn.diagnostics(), - Connection::LibsqlSchema(conn) => conn.diagnostics(), } } @@ -183,9 +144,6 @@ impl crate::connection::Connection for Connection { Connection::Primary(c) => c.with_raw(f), Connection::Replica(c) => c.with_raw(f), Connection::Schema(c) => c.with_raw(f), - Connection::LibsqlPrimary(c) => c.with_raw(f), - Connection::LibsqlReplica(c) => c.with_raw(f), - Connection::LibsqlSchema(c) => c.with_raw(f), } } } @@ -194,9 +152,6 @@ pub enum Database { Primary(PrimaryDatabase), Replica(ReplicaDatabase), Schema(SchemaDatabase), - LibsqlPrimary(LibsqlPrimaryDatabase), - LibsqlReplica(LibsqlReplicaDatabase), - LibsqlSchema(SchemaDatabase), } impl fmt::Debug for Database { @@ -205,9 +160,6 @@ impl fmt::Debug for Database { Self::Primary(_) => write!(f, "Primary"), Self::Replica(_) => write!(f, "Replica"), Self::Schema(_) => write!(f, "Schema"), - Self::LibsqlPrimary(_) => write!(f, "LibsqlPrimary"), - Self::LibsqlReplica(_) => write!(f, "LibsqlReplica"), - Self::LibsqlSchema(_) => write!(f, "LibsqlSchema"), } } } @@ -218,15 +170,6 @@ impl Database { Database::Primary(db) => Arc::new(db.connection_maker().map(Connection::Primary)), Database::Replica(db) => Arc::new(db.connection_maker().map(Connection::Replica)), Database::Schema(db) => Arc::new(db.connection_maker().map(Connection::Schema)), - Database::LibsqlPrimary(db) => { - Arc::new(db.connection_maker().map(Connection::LibsqlPrimary)) - } - Database::LibsqlReplica(db) => { - Arc::new(db.connection_maker().map(Connection::LibsqlReplica)) - } - Database::LibsqlSchema(db) => { - Arc::new(db.connection_maker().map(Connection::LibsqlSchema)) - } } } @@ -235,9 +178,6 @@ impl Database { Database::Primary(db) => db.destroy(), Database::Replica(db) => db.destroy(), Database::Schema(db) => db.destroy(), - Database::LibsqlPrimary(db) => db.destroy(), - Database::LibsqlReplica(db) => db.destroy(), - Database::LibsqlSchema(db) => db.destroy(), } } @@ -246,9 +186,6 @@ impl Database { Database::Primary(db) => db.shutdown().await, Database::Replica(db) => db.shutdown().await, Database::Schema(db) => db.shutdown().await, - Database::LibsqlPrimary(db) => db.shutdown().await, - Database::LibsqlReplica(db) => db.shutdown().await, - Database::LibsqlSchema(db) => db.shutdown().await, } } @@ -257,16 +194,12 @@ impl Database { Database::Primary(p) => Some(p.wal_wrapper.wrapper().logger()), Database::Replica(_) => None, Database::Schema(s) => Some(s.wal_wrapper.as_ref().unwrap().wrapper().logger()), - Database::LibsqlPrimary(_) => None, - Database::LibsqlReplica(_) => None, - Database::LibsqlSchema(s) => Some(s.wal_wrapper.as_ref().unwrap().wrapper().logger()), } } pub fn block_writes(&self) -> Option> { match self { Self::Primary(p) => Some(p.block_writes.clone()), - Self::LibsqlPrimary(p) => Some(p.block_writes.clone()), _ => None, } } @@ -282,15 +215,12 @@ impl Database { ), Database::Replica(_) => None, Database::Schema(s) => Some(s.new_frame_notifier.clone()), - Database::LibsqlPrimary(p) => Some(p.new_frame_notifier.clone()), - Database::LibsqlReplica(_) => None, - Database::LibsqlSchema(s) => Some(s.new_frame_notifier.clone()), } } pub fn is_primary(&self) -> bool { match self { - Self::LibsqlPrimary(_) | Self::Primary(_) => true, + Self::Primary(_) => true, _ => false, } } @@ -307,9 +237,6 @@ impl Database { Database::Primary(db) => db.replicator(), Database::Replica(_) => None, Database::Schema(db) => db.replicator(), - Database::LibsqlPrimary(_) => None, - Database::LibsqlReplica(_) => None, - Database::LibsqlSchema(_) => None, } } } diff --git a/libsql-server/src/error.rs b/libsql-server/src/error.rs index 2bb829be89..bfe67f47c7 100644 --- a/libsql-server/src/error.rs +++ b/libsql-server/src/error.rs @@ -126,8 +126,6 @@ pub enum Error { AttachInMigration, #[error("join failure: {0}")] RuntimeTaskJoinError(#[from] tokio::task::JoinError), - #[error("wal error: {0}")] - LibsqlWal(#[from] libsql_wal::error::Error), #[error("database is not a primary")] NotAPrimary, } @@ -225,7 +223,6 @@ impl IntoResponse for &Error { HasLinkedDbs(_) => self.format_err(StatusCode::BAD_REQUEST), AttachInMigration => self.format_err(StatusCode::BAD_REQUEST), RuntimeTaskJoinError(_) => self.format_err(StatusCode::INTERNAL_SERVER_ERROR), - LibsqlWal(_) => self.format_err(StatusCode::INTERNAL_SERVER_ERROR), NotAPrimary => self.format_err(StatusCode::BAD_REQUEST), } } diff --git a/libsql-server/src/lib.rs b/libsql-server/src/lib.rs index 6bb4c064c4..1642ad951a 100644 --- a/libsql-server/src/lib.rs +++ b/libsql-server/src/lib.rs @@ -17,7 +17,6 @@ use crate::pager::{make_pager, PAGER_CACHE_SIZE}; use crate::rpc::proxy::rpc::proxy_server::Proxy; use crate::rpc::proxy::ProxyService; use crate::rpc::replica_proxy::ReplicaProxyService; -use crate::rpc::replication::libsql_replicator::LibsqlReplicationService; use crate::rpc::replication::replication_log::rpc::replication_log_server::ReplicationLog; use crate::rpc::replication::replication_log::ReplicationLogService; use crate::rpc::replication::replication_log_proxy::ReplicationLogProxyService; @@ -26,10 +25,6 @@ use crate::schema::Scheduler; use crate::stats::Stats; use anyhow::Context as AnyhowContext; use auth::Auth; -use aws_config::retry::RetryConfig; -use aws_config::{BehaviorVersion, Region}; -use aws_sdk_s3::config::{Credentials, SharedCredentialsProvider}; -use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use config::{ AdminApiConfig, DbConfig, HeartbeatConfig, RpcClientConfig, RpcServerConfig, UserApiConfig, }; @@ -40,16 +35,7 @@ use hyper::client::HttpConnector; use hyper::Uri; use hyper_rustls::HttpsConnector; use libsql_replication::rpc::replication::BoxReplicationService; -use libsql_sys::wal::either::Either; -use libsql_sys::wal::either::Either as EitherWAL; use libsql_sys::wal::Sqlite3WalManager; -use libsql_wal::checkpointer::LibsqlCheckpointer; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; -use libsql_wal::segment::sealed::SealedSegment; -use libsql_wal::storage::async_storage::{AsyncStorage, AsyncStorageInitConfig}; -use libsql_wal::storage::backend::s3::S3Backend; -use libsql_wal::storage::NoStorage; use namespace::meta_store::MetaStoreHandle; use namespace::NamespaceName; use net::Connector; @@ -60,18 +46,15 @@ use tokio::runtime::Runtime; use tokio::sync::{mpsc, Notify, Semaphore}; use tokio::task::JoinSet; use tokio::time::Duration; -use tokio_stream::StreamExt as _; use tonic::transport::Channel; use url::Url; use utils::services::idle_shutdown::IdleShutdownKicker; -use self::bottomless_migrate::bottomless_migrate; use self::config::MetaStoreConfig; use self::connection::connection_manager::InnerWalManager; use self::connection::MakeThrottledConnection; use self::namespace::configurator::{ - BaseNamespaceConfig, LibsqlPrimaryConfigurator, LibsqlReplicaConfigurator, - LibsqlSchemaConfigurator, NamespaceConfigurators, PrimaryConfig, PrimaryConfigurator, + BaseNamespaceConfig, NamespaceConfigurators, PrimaryConfig, PrimaryConfigurator, ReplicaConfigurator, SchemaConfigurator, }; use self::namespace::NamespaceStore; @@ -90,7 +73,6 @@ pub mod version; pub use hrana::proto as hrana_proto; -mod bottomless_migrate; mod database; mod error; mod h2c; @@ -110,7 +92,6 @@ mod stats; #[cfg(test)] mod test; mod utils; -pub mod wal_toolkit; const DB_CREATE_TIMEOUT: Duration = Duration::from_secs(1); const DEFAULT_AUTO_CHECKPOINT: u32 = 1000; @@ -145,11 +126,6 @@ type MakeReplicationSvc = Box< static GLOBAL: rheaper::Allocator = rheaper::Allocator::from_allocator(std::alloc::System); -#[derive(clap::ValueEnum, PartialEq, Clone, Copy, Debug)] -pub enum CustomWAL { - LibsqlWal, -} - pub struct Server> { pub path: Arc, pub db_config: DbConfig, @@ -167,7 +143,6 @@ pub struct Server, pub storage_server_address: String, pub connector: Option, pub migrate_bottomless: bool, @@ -197,7 +172,6 @@ impl Default for Server { meta_store_config: Default::default(), max_concurrent_connections: 128, shutdown_timeout: Duration::from_secs(30), - use_custom_wal: None, storage_server_address: Default::default(), connector: None, migrate_bottomless: false, @@ -343,9 +317,6 @@ where } } -pub type SqldStorage = - Either, SealedSegment>, NoStorage>; - #[tracing::instrument(skip(connection_maker))] async fn run_periodic_checkpoint( connection_maker: Arc>, @@ -828,217 +799,18 @@ where &self, base_config: BaseNamespaceConfig, client_config: Option<(Channel, Uri)>, - task_manager: &mut TaskManager, - migration_scheduler_handle: SchedulerHandle, - scripted_backup: Option, - meta_store: MetaStore, - ) -> anyhow::Result<(NamespaceConfigurators, MakeReplicationSvc)> { - match self.use_custom_wal { - Some(CustomWAL::LibsqlWal) => { - self.libsql_wal_configurators( - base_config, - client_config, - task_manager, - migration_scheduler_handle, - scripted_backup, - meta_store, - ) - .await - } - None => { - self.legacy_configurators( - base_config, - client_config, - migration_scheduler_handle, - scripted_backup, - ) - .await - } - } - } - - async fn libsql_wal_configurators( - &self, - base_config: BaseNamespaceConfig, - client_config: Option<(Channel, Uri)>, - task_manager: &mut TaskManager, + _task_manager: &mut TaskManager, migration_scheduler_handle: SchedulerHandle, scripted_backup: Option, - meta_store: MetaStore, + _meta_store: MetaStore, ) -> anyhow::Result<(NamespaceConfigurators, MakeReplicationSvc)> { - tracing::info!("using libsql wal"); - let (sender, receiver) = tokio::sync::mpsc::channel(64); - let storage: Arc<_> = if let Some(ref opt) = self.db_config.bottomless_replication { - if client_config.is_some() { - anyhow::bail!("bottomless cannot be enabled on replicas"); - } - - let config = aws_config::load_defaults(BehaviorVersion::latest()).await; - - let http_client = HyperClientBuilder::new().build(self.connector.clone().unwrap()); - let mut builder = config.into_builder(); - builder.set_http_client(Some(http_client)); - builder.set_endpoint_url(opt.aws_endpoint.clone()); - builder.set_retry_config(RetryConfig::standard().with_max_attempts(10).into()); - builder.set_region(Region::new( - opt.region.clone().expect("expected aws region"), - )); - let cred = Credentials::new( - opt.access_key_id.as_ref().unwrap(), - opt.secret_access_key.as_ref().unwrap(), - None, - None, - "Static", - ); - builder.set_credentials_provider(Some(SharedCredentialsProvider::new(cred))); - let config = builder.build(); - let backend = S3Backend::from_sdk_config( - config, - opt.bucket_name.clone(), - opt.db_id.clone().expect("expected db id"), - ) - .await?; - let config = AsyncStorageInitConfig { - backend: Arc::new(backend), - max_in_flight_jobs: 16, - }; - let (storage, storage_loop) = AsyncStorage::new(config).await; - - task_manager.spawn_with_shutdown_notify(|_| async move { - storage_loop.run().await; - Ok(()) - }); - - Either::A(storage) - } else { - Either::B(NoStorage) - } - .into(); - - let primary_config = PrimaryConfig { - max_log_size: self.db_config.max_log_size, - max_log_duration: self.db_config.max_log_duration.map(Duration::from_secs_f32), - bottomless_replication: self.db_config.bottomless_replication.clone(), + self.legacy_configurators( + base_config, + client_config, + migration_scheduler_handle, scripted_backup, - checkpoint_interval: self.db_config.checkpoint_interval, - }; - - // perform migration before creating the actual registry creation - let did_migrate = self - .maybe_migrate_bottomless(meta_store.clone(), &base_config, &primary_config) - .await?; - - if self.rpc_server_config.is_some() && matches!(*storage, Either::B(_)) { - anyhow::bail!("replication without bottomless not supported yet"); - } - - let registry = Arc::new(WalRegistry::new(storage, sender)?); - let checkpointer = LibsqlCheckpointer::new(registry.clone(), receiver, 8); - task_manager.spawn_with_shutdown_notify(|_| async move { - checkpointer.run().await; - Ok(()) - }); - - // If we performed a migration from bottomless to libsql-wal earlier, then we need to - // forecefully load all the wals, to trigger segment storage with the actual storage. This - // is because migration didn't actually send anything to storage, but just created the - // segments. - if did_migrate || self.should_sync_from_storage || self.force_load_wals { - // eagerly load all namespaces, then call sync_all on the registry - // TODO: do conccurently - let dbs_path = base_config.base_path.join("dbs"); - let stream = meta_store.namespaces(); - tokio::pin!(stream); - while let Some(conf) = stream.next().await { - let registry = registry.clone(); - let namespace = conf.namespace().clone(); - let path = dbs_path.join(namespace.as_str()); - tokio::fs::create_dir_all(&path).await?; - tokio::task::spawn_blocking(move || { - registry.open(&path.join("data"), &namespace.into()) - }) - .await - .unwrap()?; - } - - if self.should_sync_from_storage { - registry.sync_all(self.sync_conccurency).await?; - } - } - - let namespace_resolver = Arc::new(|path: &Path| { - NamespaceName::from_string( - path.parent() - .unwrap() - .file_name() - .unwrap() - .to_str() - .unwrap() - .to_string(), - ) - .unwrap() - .into() - }); - - task_manager.spawn_with_shutdown_notify(|shutdown| { - let registry = registry.clone(); - async move { - shutdown.notified().await; - registry.shutdown().await?; - Ok(()) - } - }); - - let make_replication_svc = Box::new({ - let registry = registry.clone(); - let disable_namespaces = self.disable_namespaces; - move |store, user_auth, _, _, service_internal| -> BoxReplicationService { - Box::new(LibsqlReplicationService::new( - registry.clone(), - store, - user_auth, - disable_namespaces, - service_internal, - )) - } - }); - let mut configurators = NamespaceConfigurators::empty(); - - match client_config { - // configure replica - Some((channel, uri)) => { - let replica_configurator = LibsqlReplicaConfigurator::new( - base_config, - registry.clone(), - uri, - channel, - namespace_resolver, - ); - configurators.with_replica(replica_configurator); - } - // configure primary - None => { - let primary_configurator = LibsqlPrimaryConfigurator::new( - base_config.clone(), - primary_config.clone(), - registry.clone(), - namespace_resolver.clone(), - ); - - let schema_configurator = LibsqlSchemaConfigurator::new( - base_config, - primary_config, - migration_scheduler_handle, - registry, - namespace_resolver, - ); - - configurators.with_primary(primary_configurator); - configurators.with_schema(schema_configurator); - } - } - - Ok((configurators, make_replication_svc)) + ) + .await } async fn legacy_configurators( @@ -1048,7 +820,7 @@ where migration_scheduler_handle: SchedulerHandle, scripted_backup: Option, ) -> anyhow::Result<(NamespaceConfigurators, MakeReplicationSvc)> { - let make_wal_manager = Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())); + let make_wal_manager = Arc::new(|| Sqlite3WalManager::default()); let configurators = self.configurators_common( base_config, client_config, @@ -1154,61 +926,6 @@ where None => Ok(None), } } - - /// perform migration from bottomless_wal to libsql_wal if necessary. This only happens if - /// all: - /// - bottomless is enabled - /// - this is a primary - /// - we are operating in libsql-wal mode - /// - migrate_bottomless flag is raised - /// - there hasn't been a previous successfull migration (wals directory is either absent, - /// or emtpy) - /// returns whether the migration was performed - async fn maybe_migrate_bottomless( - &self, - meta_store: MetaStore, - base_config: &BaseNamespaceConfig, - primary_config: &PrimaryConfig, - ) -> anyhow::Result { - let is_primary = self.rpc_client_config.is_none(); - if self.migrate_bottomless && is_primary { - let is_previous_migration_successful = self.check_previous_migration_success()?; - let is_libsql_wal = matches!(self.use_custom_wal, Some(CustomWAL::LibsqlWal)); - let is_bottomless_enabled = self.db_config.bottomless_replication.is_some(); - let should_attempt_migration = - is_bottomless_enabled && !is_previous_migration_successful && is_libsql_wal; - - if should_attempt_migration { - bottomless_migrate(meta_store, base_config.clone(), primary_config.clone()).await?; - return Ok(true); - } else { - // the wals directory is present and so is the _dbs. This means that a crash occured - // before we could remove it. clean it up now. see code in `bottomless_migrate.rs` - let tmp_dbs_path = base_config.base_path.join("_dbs"); - if tmp_dbs_path.try_exists()? { - tracing::info!("removed dangling `_dbs` folder"); - tokio::fs::remove_dir_all(&tmp_dbs_path).await?; - } - - tracing::info!("bottomless already migrated, skipping..."); - } - } - - Ok(false) - } - - fn check_previous_migration_success(&self) -> anyhow::Result { - todo!("not usings wal directory anymore"); - // let wals_path = self.path.join("wals"); - // if !wals_path.try_exists()? { - // return Ok(false); - // } - // - // let dir = std::fs::read_dir(&wals_path)?; - // - // // wals dir exist and is not empty - // Ok(dir.count() != 0) - } } /// Setup sqlite to use the same allocator as sqld. diff --git a/libsql-server/src/main.rs b/libsql-server/src/main.rs index fd234a379b..307d5482fe 100644 --- a/libsql-server/src/main.rs +++ b/libsql-server/src/main.rs @@ -9,7 +9,6 @@ use bytesize::ByteSize; use clap::Parser; use hyper::client::HttpConnector; use libsql_server::auth::{parse_http_basic_auth_arg, parse_jwt_keys, user_auth_strategies, Auth}; -use libsql_server::wal_toolkit::{S3Args, WalToolkitCommand}; use tokio::sync::Notify; use tokio::time::Duration; use tracing_subscriber::util::SubscriberInitExt; @@ -22,7 +21,6 @@ use libsql_server::config::{ }; use libsql_server::net::AddrIncoming; use libsql_server::version::Version; -use libsql_server::CustomWAL; use libsql_server::Server; use libsql_sys::{Cipher, EncryptionConfig}; @@ -264,9 +262,6 @@ struct Cli { #[clap(long, env = "SQLD_SHUTDOWN_TIMEOUT")] shutdown_timeout: Option, - #[clap(value_enum, long)] - use_custom_wal: Option, - #[clap( long, env = "LIBSQL_STORAGE_SERVER_ADDR", @@ -329,14 +324,6 @@ enum UtilsSubcommands { #[clap(long)] auth: Option, }, - WalToolkit { - #[arg(long, short, default_value = ".compactor")] - path: PathBuf, - #[clap(flatten)] - s3_args: S3Args, - #[clap(subcommand)] - command: WalToolkitCommand, - }, } impl Cli { @@ -729,7 +716,6 @@ async fn build_server( .shutdown_timeout .map(Duration::from_secs) .unwrap_or(Duration::from_secs(30)), - use_custom_wal: config.use_custom_wal, storage_server_address: config.storage_server_address.clone(), connector: Some(https), migrate_bottomless: config.migrate_bottomless, @@ -788,13 +774,6 @@ async fn main() -> Result<()> { client.run_namespace(ns).await?; } } - UtilsSubcommands::WalToolkit { - command, - path, - s3_args, - } => { - command.exec(path, s3_args).await?; - } } return Ok(()); diff --git a/libsql-server/src/namespace/configurator/helpers.rs b/libsql-server/src/namespace/configurator/helpers.rs index 6409d86913..810b84b76d 100644 --- a/libsql-server/src/namespace/configurator/helpers.rs +++ b/libsql-server/src/namespace/configurator/helpers.rs @@ -9,8 +9,6 @@ use bytes::Bytes; use enclose::enclose; use futures::Stream; use libsql_sys::EncryptionConfig; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; use rusqlite::hooks::{AuthAction, AuthContext, Authorization}; use tokio::io::AsyncBufReadExt as _; use tokio::task::JoinSet; @@ -31,7 +29,7 @@ use crate::namespace::{ }; use crate::replication::ReplicationLogger; use crate::stats::Stats; -use crate::{SqldStorage, StatsSender, BLOCKING_RT, DB_CREATE_TIMEOUT, DEFAULT_AUTO_CHECKPOINT}; +use crate::{StatsSender, BLOCKING_RT, DB_CREATE_TIMEOUT, DEFAULT_AUTO_CHECKPOINT}; use super::{BaseNamespaceConfig, PrimaryConfig}; @@ -506,31 +504,3 @@ pub(super) async fn cleanup_primary( Ok(()) } - -pub async fn cleanup_libsql( - namespace: &NamespaceName, - registry: &WalRegistry, - base_path: &Path, -) -> crate::Result<()> { - let namespace = namespace.clone().into(); - if let Some(shared) = registry.tombstone(&namespace).await { - // shutdown the registry, don't seal the current segment so that it's not - tokio::task::spawn_blocking({ - let shared = shared.clone(); - move || shared.shutdown() - }) - .await - .unwrap()?; - } - - let ns_db_path = base_path.join("dbs").join(namespace.as_str()); - if ns_db_path.try_exists()? { - tracing::debug!("removing database directory: {}", ns_db_path.display()); - let _ = tokio::fs::remove_dir_all(ns_db_path).await; - } - - // when all is cleaned, leave place for next one - registry.remove(&namespace).await; - - Ok(()) -} diff --git a/libsql-server/src/namespace/configurator/libsql_fork.rs b/libsql-server/src/namespace/configurator/libsql_fork.rs deleted file mode 100644 index bdd5b62466..0000000000 --- a/libsql-server/src/namespace/configurator/libsql_fork.rs +++ /dev/null @@ -1,127 +0,0 @@ -use std::path::Path; -use std::pin::Pin; -use std::sync::Arc; - -use chrono::{DateTime, Utc}; -use futures::Stream; -use libsql_sys::wal::either::Either; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; -use libsql_wal::replication::injector::Injector; -use libsql_wal::replication::storage::StorageReplicator; -use libsql_wal::replication::{replicator::Replicator, storage::ReplicateFromStorage as _}; -use libsql_wal::segment::Frame; -use libsql_wal::shared_wal::SharedWal; -use libsql_wal::storage::backend::Backend as _; -use tempfile::tempdir; -use tokio_stream::StreamExt as _; - -use crate::namespace::configurator::fork::ForkError; -use crate::namespace::RestoreOption; -use crate::{ - namespace::{meta_store::MetaStoreHandle, Namespace, NamespaceName, NamespaceStore}, - SqldStorage, -}; - -pub(crate) async fn libsql_wal_fork( - registry: Arc>, - base_path: &Path, - from_ns: &Namespace, - to_ns: NamespaceName, - to_config: MetaStoreHandle, - timestamp: Option>, - store: NamespaceStore, -) -> crate::Result { - let mut seen = Default::default(); - let storage = registry.storage(); - match &*storage { - Either::A(s) => { - let from_ns_name: libsql_sys::name::NamespaceName = from_ns.name().clone().into(); - let to_ns_name: libsql_sys::name::NamespaceName = to_ns.clone().into(); - - let mut stream = match timestamp { - Some(ts) => { - let key = s - .backend() - .find_segment( - &s.backend().default_config(), - &from_ns_name, - libsql_wal::storage::backend::FindSegmentReq::Timestamp(ts), - ) - .await - .unwrap(); - let restore_until = key.end_frame_no; - let replicator = StorageReplicator::new(storage.clone(), from_ns_name.clone()); - replicator.stream(&mut seen, restore_until, 1) - } - // find the most recent frame_no - None => { - let from_shared = tokio::task::spawn_blocking({ - let registry = registry.clone(); - let from_ns_name = from_ns_name.clone(); - let path = from_ns.path.join("data"); - move || registry.open(&path, &from_ns_name) - }) - .await - .unwrap()?; - - let replicator = Replicator::new(from_shared, 1, false); - Box::pin(replicator.into_frame_stream()) - } - }; - - let tmp = tempdir()?; - let to_shared = tokio::task::spawn_blocking({ - let registry = registry.clone(); - let path = tmp.path().join("data"); - let to_ns_name = to_ns_name.clone(); - move || registry.open(&path, &to_ns_name) - }) - .await - .unwrap()?; - - // make sure that nobody can use that namespace - registry.tombstone(&to_ns_name).await; - let ret = try_inject(to_shared, &mut stream).await; - registry.remove(&to_ns_name).await; - ret?; - - tokio::fs::rename(tmp.path(), base_path.join("dbs").join(to_ns.as_str())).await?; - - Ok(store - .make_namespace(&to_ns, to_config, RestoreOption::Latest) - .await?) - } - Either::B(_) => Err(crate::Error::Fork(super::fork::ForkError::ForkNoStorage)), - } -} - -async fn try_inject( - to_shared: Arc>, - stream: &mut Pin< - Box, libsql_wal::replication::Error>> + Send + '_>, - >, -) -> crate::Result<()> { - let stream = stream.peekable(); - tokio::pin!(stream); - let mut injector = Injector::new(to_shared.clone(), 16)?; - let mut count = 0; - while let Some(f) = stream.next().await { - let mut frame = f.map_err(|e| ForkError::Internal(anyhow::anyhow!(e)))?; - count += 1; - if stream.peek().await.is_none() { - frame.header_mut().set_size_after(count); - } - - injector.insert_frame(frame).await?; - } - - tokio::task::spawn_blocking({ - let shared = to_shared.clone(); - move || shared.seal_current() - }) - .await - .unwrap()?; - - Ok(()) -} diff --git a/libsql-server/src/namespace/configurator/libsql_primary.rs b/libsql-server/src/namespace/configurator/libsql_primary.rs deleted file mode 100644 index d662c6d7a9..0000000000 --- a/libsql-server/src/namespace/configurator/libsql_primary.rs +++ /dev/null @@ -1,310 +0,0 @@ -use std::path::Path; -use std::pin::Pin; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; - -use chrono::NaiveDateTime; -use futures::prelude::Future; -use libsql_sys::name::NamespaceResolver; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; -use libsql_wal::wal::LibsqlWalManager; -use tokio::task::JoinSet; - -use crate::connection::config::DatabaseConfig; -use crate::connection::libsql::{MakeLibsqlConnection, MakeLibsqlConnectionInner}; -use crate::connection::{Connection as _, MakeConnection}; -use crate::database::{Database, LibsqlPrimaryConnectionMaker, LibsqlPrimaryDatabase}; -use crate::namespace::broadcasters::BroadcasterHandle; -use crate::namespace::configurator::helpers::{make_stats, run_storage_monitor}; -use crate::namespace::meta_store::MetaStoreHandle; -use crate::namespace::{ - Namespace, NamespaceBottomlessDbIdInit, NamespaceName, NamespaceStore, ResetCb, - ResolveNamespacePathFn, RestoreOption, -}; -use crate::schema::{has_pending_migration_task, setup_migration_table}; -use crate::stats::Stats; -use crate::{SqldStorage, DB_CREATE_TIMEOUT, DEFAULT_AUTO_CHECKPOINT}; - -use super::helpers::cleanup_libsql; -use super::{BaseNamespaceConfig, ConfigureNamespace, PrimaryConfig}; - -pub struct LibsqlPrimaryConfigurator { - base: BaseNamespaceConfig, - primary_config: PrimaryConfig, - registry: Arc>, - namespace_resolver: Arc, -} - -pub struct LibsqlPrimaryCommon { - pub stats: Arc, - pub connection_maker: Arc, - pub join_set: JoinSet>, - pub block_writes: Arc, - pub notifier: tokio::sync::watch::Receiver, -} - -pub(super) async fn libsql_primary_common( - db_path: Arc, - db_config: MetaStoreHandle, - base_config: &BaseNamespaceConfig, - primary_config: &PrimaryConfig, - namespace: NamespaceName, - broadcaster: BroadcasterHandle, - resolve_attach_path: ResolveNamespacePathFn, - registry: Arc>, - namespace_resolver: Arc, -) -> crate::Result { - let mut join_set = JoinSet::new(); - - tokio::fs::create_dir_all(&db_path).await?; - - tracing::debug!("Done making new primary"); - let (_snd, rcv) = tokio::sync::watch::channel(None); - let stats = make_stats( - &db_path, - &mut join_set, - db_config.clone(), - base_config.stats_sender.clone(), - namespace.clone(), - ) - .await?; - - join_set.spawn({ - let stats = stats.clone(); - let rcv = rcv.clone(); - async move { - let mut rcv = rcv.clone(); - let _ = rcv - .wait_for(move |fno| { - if let Some(fno) = *fno { - stats.set_current_frame_no(fno); - } - false - }) - .await; - Ok(()) - } - }); - - let auto_checkpoint = if primary_config.checkpoint_interval.is_some() { - 0 - } else { - DEFAULT_AUTO_CHECKPOINT - }; - let block_writes = Arc::new(AtomicBool::new(false)); - - let get_current_frame_no = Arc::new({ - let rcv = rcv.clone(); - move || *rcv.borrow() - }); - - let connection_maker = MakeLibsqlConnection { - inner: Arc::new(MakeLibsqlConnectionInner { - db_path: db_path.into(), - stats: stats.clone(), - broadcaster, - config_store: db_config.clone(), - extensions: base_config.extensions.clone(), - max_response_size: base_config.max_response_size, - max_total_response_size: base_config.max_total_response_size, - auto_checkpoint, - get_current_frame_no, - block_writes: block_writes.clone(), - resolve_attach_path, - wal_manager: LibsqlWalManager::new(registry.clone(), namespace_resolver.clone()), - encryption_config: None, - }), - } - .throttled( - base_config.max_concurrent_connections.clone(), - base_config - .connection_creation_timeout - .or(Some(DB_CREATE_TIMEOUT)), - base_config.max_total_response_size, - base_config.max_concurrent_requests, - base_config.disable_intelligent_throttling, - ); - let connection_maker = Arc::new(connection_maker); - - // FIXME: dummy connection to load the wal - let _ = connection_maker.create().await?; - let shared = registry.get_async(&namespace.into()).await.unwrap(); - let new_frame_notifier = shared.new_frame_notifier(); - - join_set.spawn(run_storage_monitor( - Arc::downgrade(&stats), - connection_maker.clone(), - )); - - if db_config.get().shared_schema_name.is_some() { - let block_writes = block_writes.clone(); - let conn = connection_maker.create().await?; - tokio::task::spawn_blocking(move || { - conn.with_raw(|conn| -> crate::Result<()> { - setup_migration_table(conn)?; - if has_pending_migration_task(conn)? { - block_writes.store(true, Ordering::SeqCst); - } - Ok(()) - }) - }) - .await - .unwrap()?; - } - - Ok(LibsqlPrimaryCommon { - stats, - connection_maker, - join_set, - block_writes, - notifier: new_frame_notifier, - }) -} - -impl LibsqlPrimaryConfigurator { - pub fn new( - base: BaseNamespaceConfig, - primary_config: PrimaryConfig, - registry: Arc>, - namespace_resolver: Arc, - ) -> Self { - Self { - base, - primary_config, - registry, - namespace_resolver, - } - } - - #[tracing::instrument(skip_all, fields(namespace))] - async fn try_new_primary( - &self, - namespace: NamespaceName, - db_config: MetaStoreHandle, - _restore_option: RestoreOption, - resolve_attach_path: ResolveNamespacePathFn, - db_path: Arc, - broadcaster: BroadcasterHandle, - ) -> crate::Result { - let LibsqlPrimaryCommon { - stats, - connection_maker, - mut join_set, - block_writes, - mut notifier, - } = libsql_primary_common( - db_path.clone(), - db_config.clone(), - &self.base, - &self.primary_config, - namespace.clone(), - broadcaster, - resolve_attach_path, - self.registry.clone(), - self.namespace_resolver.clone(), - ) - .await?; - - let (notifier_sender, new_frame_notifier) = tokio::sync::watch::channel(None); - join_set.spawn(async move { - while let Ok(()) = notifier.changed().await { - let new = *notifier.borrow_and_update(); - notifier_sender.send_replace(Some(new)); - } - - Ok(()) - }); - - Ok(Namespace { - tasks: join_set, - db: Database::LibsqlPrimary(LibsqlPrimaryDatabase { - connection_maker, - block_writes, - new_frame_notifier, - }), - name: namespace, - stats, - db_config_store: db_config, - path: db_path.into(), - }) - } -} - -impl ConfigureNamespace for LibsqlPrimaryConfigurator { - fn setup<'a>( - &'a self, - meta_store_handle: MetaStoreHandle, - restore_option: RestoreOption, - name: &'a NamespaceName, - _reset: ResetCb, - resolve_attach_path: ResolveNamespacePathFn, - _store: NamespaceStore, - broadcaster: BroadcasterHandle, - ) -> Pin> + Send + 'a>> { - Box::pin(async move { - let db_path: Arc = self.base.base_path.join("dbs").join(name.as_str()).into(); - let fresh_namespace = !db_path.try_exists()?; - // FIXME: make that truly atomic. explore the idea of using temp directories, and it's implications - match self - .try_new_primary( - name.clone(), - meta_store_handle, - restore_option, - resolve_attach_path, - db_path.clone(), - broadcaster, - ) - .await - { - Ok(this) => Ok(this), - Err(e) if fresh_namespace => { - tracing::error!( - "an error occured while deleting creating namespace, cleaning..." - ); - if let Err(e) = tokio::fs::remove_dir_all(&db_path).await { - tracing::error!("failed to remove dirty namespace directory: {e}") - } - Err(e) - } - Err(e) => Err(e), - } - }) - } - - fn cleanup<'a>( - &'a self, - namespace: &'a NamespaceName, - _db_config: &'a DatabaseConfig, - _prune_all: bool, - _bottomless_db_id_init: NamespaceBottomlessDbIdInit, - ) -> Pin> + Send + 'a>> { - Box::pin(cleanup_libsql( - namespace, - &self.registry, - &self.base.base_path, - )) - } - - fn fork<'a>( - &'a self, - from_ns: &'a Namespace, - _from_config: MetaStoreHandle, - to_ns: NamespaceName, - to_config: MetaStoreHandle, - timestamp: Option, - store: NamespaceStore, - ) -> Pin> + Send + 'a>> { - let registry = self.registry.clone(); - let base_path = &self.base.base_path; - Box::pin(super::libsql_fork::libsql_wal_fork( - registry, - base_path, - from_ns, - to_ns, - to_config, - timestamp.map(|ts| ts.and_utc()), - store, - )) - } -} diff --git a/libsql-server/src/namespace/configurator/libsql_replica.rs b/libsql-server/src/namespace/configurator/libsql_replica.rs deleted file mode 100644 index a17242f85e..0000000000 --- a/libsql-server/src/namespace/configurator/libsql_replica.rs +++ /dev/null @@ -1,315 +0,0 @@ -use std::future::Future; -use std::pin::Pin; -use std::sync::Arc; -use std::time::Duration; - -use hyper::Uri; -use libsql_replication::injector::LibsqlInjector; -use libsql_replication::replicator::Replicator; -use libsql_replication::rpc::replication::replication_log_client::ReplicationLogClient; -use libsql_sys::name::NamespaceResolver; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; -use libsql_wal::replication::injector::Injector; -use libsql_wal::wal::LibsqlWalManager; -use tokio::task::JoinSet; -use tonic::transport::Channel; - -use crate::connection::config::DatabaseConfig; -use crate::connection::libsql::{MakeLibsqlConnection, MakeLibsqlConnectionInner}; -use crate::connection::write_proxy::MakeWriteProxyConn; -use crate::connection::MakeConnection; -use crate::database::{Database, LibsqlReplicaDatabase}; -use crate::namespace::broadcasters::BroadcasterHandle; -use crate::namespace::configurator::helpers::{make_stats, run_storage_monitor}; -use crate::namespace::meta_store::MetaStoreHandle; -use crate::namespace::{ - Namespace, NamespaceBottomlessDbIdInit, NamespaceName, NamespaceStore, ResetCb, ResetOp, - ResolveNamespacePathFn, RestoreOption, -}; -use crate::replication::replicator_client::WalImpl; -use crate::{SqldStorage, DB_CREATE_TIMEOUT}; - -use super::helpers::cleanup_libsql; -use super::{BaseNamespaceConfig, ConfigureNamespace}; - -pub struct LibsqlReplicaConfigurator { - base: BaseNamespaceConfig, - registry: Arc>, - uri: Uri, - channel: Channel, - namespace_resolver: Arc, -} - -impl LibsqlReplicaConfigurator { - pub fn new( - base: BaseNamespaceConfig, - registry: Arc>, - uri: Uri, - channel: Channel, - namespace_resolver: Arc, - ) -> Self { - Self { - base, - registry, - uri, - channel, - namespace_resolver, - } - } -} - -impl ConfigureNamespace for LibsqlReplicaConfigurator { - fn setup<'a>( - &'a self, - db_config: MetaStoreHandle, - restore_option: RestoreOption, - name: &'a NamespaceName, - reset: ResetCb, - resolve_attach_path: ResolveNamespacePathFn, - store: NamespaceStore, - broadcaster: BroadcasterHandle, - ) -> Pin> + Send + 'a>> { - Box::pin(async move { - tracing::debug!("creating replica namespace"); - let mut join_set = JoinSet::new(); - let db_path = self.base.base_path.join("dbs").join(name.as_str()); - tokio::fs::create_dir_all(&db_path).await?; - let channel = self.channel.clone(); - let uri = self.uri.clone(); - let rpc_client = ReplicationLogClient::with_origin(channel.clone(), uri.clone()); - let shared = { - let registry = self.registry.clone(); - let ns = name.clone().into(); - let db_path = db_path.join("data"); - tokio::task::spawn_blocking(move || registry.open(&db_path, &ns)) - .await - .unwrap()? - }; - - let client = crate::replication::replicator_client::Client::new( - name.clone(), - rpc_client, - db_config.clone(), - store.clone(), - WalImpl::new_libsql(shared.clone()), - ) - .await?; - let stats = make_stats( - &db_path, - &mut join_set, - db_config.clone(), - self.base.stats_sender.clone(), - name.clone(), - ) - .await?; - - join_set.spawn({ - let stats = stats.clone(); - let mut rcv = shared.new_frame_notifier(); - async move { - let _ = rcv - .wait_for(move |fno| { - stats.set_current_frame_no(*fno); - false - }) - .await; - Ok(()) - } - }); - - let get_current_frame_no = Arc::new({ - let rcv = shared.new_frame_notifier(); - move || Some(*rcv.borrow()) - }); - - let read_connection_maker = MakeLibsqlConnection { - inner: Arc::new(MakeLibsqlConnectionInner { - db_path: db_path.clone().into(), - stats: stats.clone(), - broadcaster: broadcaster.clone(), - config_store: db_config.clone(), - extensions: self.base.extensions.clone(), - max_response_size: self.base.max_response_size, - max_total_response_size: self.base.max_total_response_size, - auto_checkpoint: 0, - get_current_frame_no: get_current_frame_no.clone(), - encryption_config: self.base.encryption_config.clone(), - block_writes: Arc::new(true.into()), - resolve_attach_path: resolve_attach_path.clone(), - wal_manager: LibsqlWalManager::new( - self.registry.clone(), - self.namespace_resolver.clone(), - ), - }), - }; - - let rcv = shared.new_frame_notifier(); - let wait_for_frame_no = Arc::new( - move |frame_no| -> Pin + Send + 'static>> { - let mut rcv = rcv.clone(); - Box::pin(async move { - let _ = rcv.wait_for(|x| *x == frame_no).await; - }) - }, - ); - - let connection_maker = Arc::new( - MakeWriteProxyConn::new( - channel.clone(), - uri.clone(), - stats.clone(), - wait_for_frame_no, - self.base.max_response_size, - self.base.max_total_response_size, - // FIXME: we need to fetch the primary index before - None, - self.base.encryption_config.clone(), - read_connection_maker, - get_current_frame_no, - ) - .throttled( - self.base.max_concurrent_connections.clone(), - self.base - .connection_creation_timeout - .or(Some(DB_CREATE_TIMEOUT)), - self.base.max_total_response_size, - self.base.max_concurrent_requests, - self.base.disable_intelligent_throttling, - ), - ); - - join_set.spawn(run_storage_monitor( - Arc::downgrade(&stats), - connection_maker.clone(), - )); - - // FIXME: hack, this is necessary for the registry to open the SharedWal - let _ = connection_maker.create().await?; - let injector = Injector::new(shared, 10).unwrap(); - let injector = LibsqlInjector::new(injector); - let mut replicator = Replicator::new(client, injector); - - tracing::debug!("try perform handshake"); - // force a handshake now, to retrieve the primary's current replication index - match replicator.try_perform_handshake().await { - Err(libsql_replication::replicator::Error::Meta( - libsql_replication::meta::Error::LogIncompatible, - )) => { - tracing::error!( - "trying to replicate incompatible logs, reseting replica and nuking db dir" - ); - std::fs::remove_dir_all(&db_path).unwrap(); - return self - .setup( - db_config, - restore_option, - name, - reset, - resolve_attach_path, - store, - broadcaster, - ) - .await; - } - Err(e) => Err(e)?, - Ok(_) => (), - } - - tracing::debug!("done performing handshake"); - - let namespace = name.clone(); - let mut retries = 0; - join_set.spawn(async move { - use libsql_replication::replicator::Error; - loop { - match replicator.run().await { - err if retries > 10 => Err(err)?, - err @ Error::Fatal(_) => Err(err)?, - err @ Error::NamespaceDoesntExist => { - tracing::error!("namespace {namespace} doesn't exist, destroying..."); - (reset)(ResetOp::Destroy(namespace.clone())); - Err(err)?; - } - e @ Error::Injector(_) => { - tracing::error!("potential corruption detected while replicating, reseting replica: {e}"); - (reset)(ResetOp::Reset(namespace.clone())); - Err(e)?; - }, - Error::Meta(err) => { - use libsql_replication::meta::Error; - match err { - Error::LogIncompatible => { - tracing::error!("trying to replicate incompatible logs, reseting replica"); - (reset)(ResetOp::Reset(namespace.clone())); - Err(err)?; - } - Error::InvalidMetaFile - | Error::Io(_) - | Error::InvalidLogId - | Error::FailedToCommit(_) - | Error::InvalidReplicationPath - | Error::RequiresCleanDatabase => { - // We retry from last frame index? - tracing::warn!("non-fatal replication error, retrying from last commit index: {err}"); - }, - } - } - e @ (Error::Internal(_) - | Error::Client(_) - | Error::PrimaryHandshakeTimeout - | Error::NeedSnapshot) => { - tracing::warn!("non-fatal replication error, retrying from last commit index: {e}"); - }, - Error::NoHandshake => { - // not strictly necessary, but in case the handshake error goes uncaught, - // we reset the client state. - replicator.client_mut().reset_token(); - } - Error::SnapshotPending => unreachable!(), - } - - tokio::time::sleep(Duration::from_millis(500) * 2u32.pow(retries)).await; - retries += 1; - } - }); - - Ok(Namespace { - tasks: join_set, - db: Database::LibsqlReplica(LibsqlReplicaDatabase { connection_maker }), - name: name.clone(), - stats, - db_config_store: db_config, - path: db_path.into(), - }) - }) - } - - fn cleanup<'a>( - &'a self, - namespace: &'a NamespaceName, - _db_config: &DatabaseConfig, - _prune_all: bool, - _bottomless_db_id_init: NamespaceBottomlessDbIdInit, - ) -> Pin> + Send + 'a>> { - Box::pin(cleanup_libsql( - namespace, - &self.registry, - &self.base.base_path, - )) - } - - fn fork<'a>( - &'a self, - _from_ns: &'a Namespace, - _from_config: MetaStoreHandle, - _to_ns: NamespaceName, - _to_config: MetaStoreHandle, - _timestamp: Option, - _store: NamespaceStore, - ) -> Pin> + Send + 'a>> { - Box::pin(std::future::ready(Err(crate::Error::Fork( - super::fork::ForkError::ForkReplica, - )))) - } -} diff --git a/libsql-server/src/namespace/configurator/libsql_schema.rs b/libsql-server/src/namespace/configurator/libsql_schema.rs deleted file mode 100644 index 83e83c27e4..0000000000 --- a/libsql-server/src/namespace/configurator/libsql_schema.rs +++ /dev/null @@ -1,182 +0,0 @@ -use std::path::Path; -use std::sync::Arc; - -use chrono::NaiveDateTime; -use futures::prelude::Future; -use libsql_sys::name::NamespaceResolver; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; - -use crate::connection::config::DatabaseConfig; -use crate::database::{Database, SchemaDatabase}; -use crate::namespace::broadcasters::BroadcasterHandle; -use crate::namespace::meta_store::MetaStoreHandle; -use crate::namespace::{ - Namespace, NamespaceName, NamespaceStore, ResetCb, ResolveNamespacePathFn, RestoreOption, -}; -use crate::schema::SchedulerHandle; -use crate::SqldStorage; - -use super::helpers::cleanup_libsql; -use super::libsql_primary::{libsql_primary_common, LibsqlPrimaryCommon}; -use super::{BaseNamespaceConfig, ConfigureNamespace, PrimaryConfig}; - -pub struct LibsqlSchemaConfigurator { - base: BaseNamespaceConfig, - primary_config: PrimaryConfig, - migration_scheduler: SchedulerHandle, - registry: Arc>, - namespace_resolver: Arc, -} - -impl LibsqlSchemaConfigurator { - pub fn new( - base: BaseNamespaceConfig, - primary_config: PrimaryConfig, - migration_scheduler: SchedulerHandle, - registry: Arc>, - namespace_resolver: Arc, - ) -> Self { - Self { - base, - primary_config, - migration_scheduler, - registry, - namespace_resolver, - } - } - - #[tracing::instrument(skip_all, fields(namespace))] - async fn try_new_schema( - &self, - namespace: NamespaceName, - db_config: MetaStoreHandle, - _restore_option: RestoreOption, - resolve_attach_path: ResolveNamespacePathFn, - db_path: Arc, - broadcaster: BroadcasterHandle, - ) -> crate::Result { - let LibsqlPrimaryCommon { - stats, - connection_maker, - mut join_set, - mut notifier, - .. - } = libsql_primary_common( - db_path.clone(), - db_config.clone(), - &self.base, - &self.primary_config, - namespace.clone(), - broadcaster, - resolve_attach_path, - self.registry.clone(), - self.namespace_resolver.clone(), - ) - .await?; - - let (notifier_sender, new_frame_notifier) = tokio::sync::watch::channel(None); - join_set.spawn(async move { - while let Ok(()) = notifier.changed().await { - let new = *notifier.borrow_and_update(); - notifier_sender.send_replace(Some(new)); - } - - Ok(()) - }); - - Ok(Namespace { - tasks: join_set, - db: Database::LibsqlSchema(SchemaDatabase::new( - self.migration_scheduler.clone(), - namespace.clone(), - connection_maker, - None, - db_config.clone(), - new_frame_notifier, - )), - name: namespace, - stats, - db_config_store: db_config, - path: db_path.into(), - }) - } -} - -impl ConfigureNamespace for LibsqlSchemaConfigurator { - fn setup<'a>( - &'a self, - db_config: MetaStoreHandle, - restore_option: RestoreOption, - name: &'a NamespaceName, - _reset: ResetCb, - resolve_attach_path: ResolveNamespacePathFn, - _store: NamespaceStore, - broadcaster: BroadcasterHandle, - ) -> std::pin::Pin> + Send + 'a>> { - Box::pin(async move { - let db_path: Arc = self.base.base_path.join("dbs").join(name.as_str()).into(); - let fresh_namespace = !db_path.try_exists()?; - // FIXME: make that truly atomic. explore the idea of using temp directories, and it's implications - match self - .try_new_schema( - name.clone(), - db_config, - restore_option, - resolve_attach_path, - db_path.clone(), - broadcaster, - ) - .await - { - Ok(this) => Ok(this), - Err(e) if fresh_namespace => { - tracing::error!( - "an error occured while deleting creating namespace, cleaning..." - ); - if let Err(e) = tokio::fs::remove_dir_all(&db_path).await { - tracing::error!("failed to remove dirty namespace directory: {e}") - } - Err(e) - } - Err(e) => Err(e), - } - }) - } - - fn cleanup<'a>( - &'a self, - namespace: &'a NamespaceName, - _db_config: &'a DatabaseConfig, - _prune_all: bool, - _bottomless_db_id_init: crate::namespace::NamespaceBottomlessDbIdInit, - ) -> std::pin::Pin> + Send + 'a>> { - Box::pin(cleanup_libsql( - namespace, - &self.registry, - &self.base.base_path, - )) - } - - fn fork<'a>( - &'a self, - from_ns: &'a Namespace, - _from_config: MetaStoreHandle, - to_ns: NamespaceName, - to_config: MetaStoreHandle, - timestamp: Option, - store: NamespaceStore, - ) -> std::pin::Pin> + Send + 'a>> { - let registry = self.registry.clone(); - let base_path = &self.base.base_path; - Box::pin(super::libsql_fork::libsql_wal_fork( - registry, - base_path, - from_ns, - to_ns, - to_config, - timestamp.map(|ts| ts.and_utc()), - store, - )) - } -} diff --git a/libsql-server/src/namespace/configurator/mod.rs b/libsql-server/src/namespace/configurator/mod.rs index eed8bc18d7..517b21ca5a 100644 --- a/libsql-server/src/namespace/configurator/mod.rs +++ b/libsql-server/src/namespace/configurator/mod.rs @@ -21,17 +21,10 @@ use super::{ pub mod fork; mod helpers; -mod libsql_fork; -mod libsql_primary; -mod libsql_replica; -mod libsql_schema; mod primary; mod replica; mod schema; -pub use libsql_primary::LibsqlPrimaryConfigurator; -pub use libsql_replica::LibsqlReplicaConfigurator; -pub use libsql_schema::LibsqlSchemaConfigurator; pub use primary::PrimaryConfigurator; pub use replica::ReplicaConfigurator; pub use schema::SchemaConfigurator; diff --git a/libsql-server/src/namespace/meta_store.rs b/libsql-server/src/namespace/meta_store.rs index 721c83adc0..70b419ebe9 100644 --- a/libsql-server/src/namespace/meta_store.rs +++ b/libsql-server/src/namespace/meta_store.rs @@ -6,7 +6,6 @@ use std::{collections::HashMap, fs::read_dir}; use bottomless::bottomless_wal::BottomlessWalWrapper; use bottomless::replicator::CompressionKind; use bottomless::SavepointTracker; -use futures::Stream; use futures_core::Future; use libsql_replication::rpc::metadata; use libsql_sys::wal::{ @@ -617,24 +616,6 @@ impl MetaStore { } None } - - /// returns an iterator over all manespaces config handles - pub(crate) fn namespaces(&self) -> impl Stream + '_ { - async_stream::stream! { - let lock = self.inner.configs.lock().await; - for (ns, sender) in lock.iter() { - let change_tx = self.changes_tx.clone(); - - - let handle = MetaStoreHandle { - namespace: ns.clone(), - inner: HandleState::External(change_tx, sender.subscribe()), - }; - - yield handle; - } - } - } } impl MetaStoreHandle { diff --git a/libsql-server/src/namespace/mod.rs b/libsql-server/src/namespace/mod.rs index 89935881bf..ec45b50445 100644 --- a/libsql-server/src/namespace/mod.rs +++ b/libsql-server/src/namespace/mod.rs @@ -32,7 +32,6 @@ pub type ResolveNamespacePathFn = pub enum ResetOp { Reset(NamespaceName), - Destroy(NamespaceName), } #[derive(Clone, Debug)] diff --git a/libsql-server/src/namespace/store.rs b/libsql-server/src/namespace/store.rs index f9f614fc77..86e9438ccd 100644 --- a/libsql-server/src/namespace/store.rs +++ b/libsql-server/src/namespace/store.rs @@ -204,11 +204,6 @@ impl NamespaceStore { tracing::error!("error resetting namespace `{ns}`: {e}"); } } - ResetOp::Destroy(ns) => { - if let Err(e) = this.destroy(ns.clone(), false).await { - tracing::error!("error destroying namesace `{ns}`: {e}",); - } - } } }); }) diff --git a/libsql-server/src/replication/replicator_client.rs b/libsql-server/src/replication/replicator_client.rs index 9cf9623079..fb8154824d 100644 --- a/libsql-server/src/replication/replicator_client.rs +++ b/libsql-server/src/replication/replicator_client.rs @@ -1,6 +1,5 @@ use std::path::Path; use std::pin::Pin; -use std::sync::Arc; use bytes::Bytes; use chrono::{DateTime, Utc}; @@ -13,8 +12,6 @@ use libsql_replication::rpc::replication::{ verify_session_token, Frame as RpcFrame, HelloRequest, HelloResponse, LogOffset, NAMESPACE_METADATA_KEY, SESSION_TOKEN_KEY, }; -use libsql_wal::io::StdIO; -use libsql_wal::shared_wal::SharedWal; use tokio::sync::watch; use tokio_stream::Stream; @@ -29,12 +26,8 @@ use crate::metrics::{ use crate::namespace::meta_store::MetaStoreHandle; use crate::namespace::{NamespaceName, NamespaceStore}; use crate::replication::FrameNo; -use crate::SqldStorage; pub enum WalImpl { - LibsqlWal { - shared: Arc>, - }, SqliteWal { meta: WalIndexMeta, current_frame_no_notifier: watch::Sender>, @@ -53,24 +46,8 @@ impl WalImpl { }) } - pub fn new_libsql(shared: Arc>) -> Self { - Self::LibsqlWal { shared } - } - - fn next_frame_no(&self, first_since_handshake: bool) -> FrameNo { + fn next_frame_no(&self, _first_since_handshake: bool) -> FrameNo { match self { - WalImpl::LibsqlWal { shared } => { - if first_since_handshake { - // with libsql-wal we only checkpoint frames that are durable. We will only - // perform a handshake if we just started, or if the primary forced us to do it - // again. In either cases, we want to start replicating again from the last - // known durable replication index - shared.durable_frame_no() + 1 - } else { - // otherwise we just query the next frame - *shared.new_frame_notifier().borrow() + 1 - } - } WalImpl::SqliteWal { current_frame_no_notifier, .. @@ -83,7 +60,6 @@ impl WalImpl { fn handle_hello(&mut self, hello: HelloResponse) -> Result<(), Error> { match self { - WalImpl::LibsqlWal { .. } => Ok(()), WalImpl::SqliteWal { meta, current_frame_no_notifier, @@ -97,7 +73,6 @@ impl WalImpl { async fn set_commit_frame_no(&mut self, frame_no: FrameNo) -> Result<(), Error> { match self { - WalImpl::LibsqlWal { .. } => Ok(()), WalImpl::SqliteWal { meta, current_frame_no_notifier, @@ -111,14 +86,12 @@ impl WalImpl { fn commit_frame_no(&self) -> Option { match self { - WalImpl::LibsqlWal { shared, .. } => Some(*shared.new_frame_notifier().borrow()), WalImpl::SqliteWal { meta, .. } => meta.current_frame_no(), } } fn flavor(&self) -> WalFlavor { match self { - WalImpl::LibsqlWal { .. } => WalFlavor::Libsql, WalImpl::SqliteWal { .. } => WalFlavor::Sqlite, } } diff --git a/libsql-server/src/rpc/replication/libsql_replicator.rs b/libsql-server/src/rpc/replication/libsql_replicator.rs deleted file mode 100644 index a29864fcc3..0000000000 --- a/libsql-server/src/rpc/replication/libsql_replicator.rs +++ /dev/null @@ -1,245 +0,0 @@ -use std::mem::size_of; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{ready, Context, Poll}; - -use bytes::Bytes; -use futures::stream::BoxStream; -use libsql_replication::rpc::replication::log_offset::WalFlavor; -use libsql_replication::rpc::replication::replication_log_server::ReplicationLog; -use libsql_replication::rpc::replication::{ - Frame as RpcFrame, Frames, HelloRequest, HelloResponse, LogOffset, NAMESPACE_DOESNT_EXIST, -}; -use libsql_wal::io::StdIO; -use libsql_wal::registry::WalRegistry; -use libsql_wal::segment::Frame; -use libsql_wal::shared_wal::SharedWal; -use md5::{Digest as _, Md5}; -use tokio_stream::Stream; -use tonic::Status; -use uuid::Uuid; - -use crate::auth::Auth; -use crate::namespace::{NamespaceName, NamespaceStore}; -use crate::SqldStorage; - -pub struct LibsqlReplicationService { - registry: Arc>, - store: NamespaceStore, - user_auth_strategy: Option, - disable_namespaces: bool, - session_token: Bytes, - service_internal: bool, -} - -impl LibsqlReplicationService { - pub fn new( - registry: Arc>, - store: NamespaceStore, - user_auth_strategy: Option, - disable_namespaces: bool, - service_internal: bool, - ) -> Self { - let session_token = Uuid::new_v4().to_string().into(); - Self { - registry, - disable_namespaces, - store, - user_auth_strategy, - session_token, - service_internal, - } - } - - async fn authenticate( - &self, - req: &tonic::Request, - namespace: NamespaceName, - ) -> Result<(), Status> { - if self.service_internal && req.metadata().get("libsql-proxied").is_some() - || !self.service_internal - { - super::auth::authenticate(&self.store, req, namespace, &self.user_auth_strategy, true) - .await - } else { - Ok(()) - } - } - - fn encode_session_token(&self, version: usize) -> Uuid { - let mut sha = Md5::new(); - sha.update(&self.session_token[..]); - sha.update(version.to_le_bytes()); - - let num = sha.finalize(); - let num = u128::from_le_bytes(num.into()); - Uuid::from_u128(num) - } -} - -pin_project_lite::pin_project! { - struct FrameStreamAdapter { - #[pin] - inner: S, - flavor: WalFlavor, - shared: Arc>, - } -} - -impl FrameStreamAdapter { - fn new(inner: S, flavor: WalFlavor, shared: Arc>) -> Self { - Self { - inner, - flavor, - shared, - } - } -} - -impl Stream for FrameStreamAdapter -where - S: Stream, libsql_wal::replication::Error>>, -{ - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.project(); - match ready!(this.inner.poll_next(cx)) { - Some(Ok(f)) => { - match this.flavor { - WalFlavor::Libsql => { - let durable_frame_no = if f.header().is_commit() { - Some(this.shared.durable_frame_no()) - } else { - None - }; - // safety: frame implemements zerocopy traits, so it can safely be interpreted as a - // byte slize of the same size - let bytes: Box<[u8; size_of::()]> = - unsafe { std::mem::transmute(f) }; - - let data = Bytes::from(bytes as Box<[u8]>); - Poll::Ready(Some(Ok(RpcFrame { - data, - timestamp: None, - durable_frame_no, - }))) - } - WalFlavor::Sqlite => { - let header = libsql_replication::frame::FrameHeader { - frame_no: f.header().frame_no().into(), - checksum: 0.into(), - page_no: f.header().page_no().into(), - size_after: f.header().size_after().into(), - }; - - let frame = libsql_replication::frame::Frame::from_parts(&header, f.data()); - Poll::Ready(Some(Ok(RpcFrame { - data: frame.bytes(), - timestamp: None, - durable_frame_no: None, - }))) - } - } - } - Some(Err(e)) => Poll::Ready(Some(Err(Status::internal(format!("{e}"))))), - None => Poll::Ready(None), - } - } -} - -#[tonic::async_trait] -impl ReplicationLog for LibsqlReplicationService { - type LogEntriesStream = BoxStream<'static, Result>; - type SnapshotStream = BoxStream<'static, Result>; - - #[tracing::instrument(skip_all, fields(namespace))] - async fn log_entries( - &self, - req: tonic::Request, - ) -> Result, Status> { - let namespace = super::super::extract_namespace(self.disable_namespaces, &req)?; - self.authenticate(&req, namespace.clone()).await?; - let shared = self.registry.get_async(&namespace.into()).await.unwrap(); - let req = req.into_inner(); - // TODO: replicator should only accecpt NonZero - let replicator = libsql_wal::replication::replicator::Replicator::new( - shared.clone(), - req.next_offset.max(1), - true, - ); - - let flavor = req.wal_flavor(); - let stream = FrameStreamAdapter::new(replicator.into_frame_stream(), flavor, shared); - Ok(tonic::Response::new(Box::pin(stream))) - } - - async fn batch_log_entries( - &self, - _req: tonic::Request, - ) -> Result, Status> { - todo!() - // let namespace = super::super::extract_namespace(self.disable_namespaces, &req)?; - // self.authenticate(&req, namespace.clone()).await?; - // let shared = self.registry.get_async(&namespace.into()).await.unwrap(); - // let replicator = libsql_wal::replication::replicator::Replicator::new(shared, req.into_inner().next_offset); - // - // let frames = FrameStreamAdapter::new(replicator.into_frame_stream()) - // .take_while(|) - // .collect::, Status>>().await?; - // Ok(tonic::Response::new(Frames { frames })) - } - - async fn hello( - &self, - req: tonic::Request, - ) -> Result, Status> { - let namespace = super::super::extract_namespace(self.disable_namespaces, &req)?; - self.authenticate(&req, namespace.clone()).await?; - - let shared = self - .registry - .get_async(&namespace.clone().into()) - .await - .unwrap(); - let log_id = shared.log_id(); - let current_replication_index = shared.last_committed_frame_no(); - let (config, version) = self - .store - .with(namespace, |ns| -> Result<_, Status> { - let config = ns.config(); - let version = ns.config_version(); - Ok((config, version)) - }) - .await - .map_err(|e| { - if let crate::error::Error::NamespaceDoesntExist(_) = e.as_ref() { - Status::failed_precondition(NAMESPACE_DOESNT_EXIST) - } else { - Status::internal(e.to_string()) - } - })??; - - let session_hash = self.encode_session_token(version); - - let response = HelloResponse { - log_id: log_id.to_string(), - session_token: session_hash.to_string().into(), - generation_id: Uuid::from_u128(0).to_string(), - generation_start_index: 0, - current_replication_index: Some(current_replication_index), - config: Some(config.as_ref().into()), - }; - - Ok(tonic::Response::new(response)) - } - - async fn snapshot( - &self, - _req: tonic::Request, - ) -> Result, Status> { - Err(Status::unimplemented( - "no snapshot required with libsql wal", - )) - } -} diff --git a/libsql-server/src/rpc/replication/mod.rs b/libsql-server/src/rpc/replication/mod.rs index 2726d808f4..e405e7fb52 100644 --- a/libsql-server/src/rpc/replication/mod.rs +++ b/libsql-server/src/rpc/replication/mod.rs @@ -1,4 +1,3 @@ mod auth; -pub mod libsql_replicator; pub mod replication_log; pub mod replication_log_proxy; diff --git a/libsql-server/src/schema/scheduler.rs b/libsql-server/src/schema/scheduler.rs index efb6170b23..d9431b2d86 100644 --- a/libsql-server/src/schema/scheduler.rs +++ b/libsql-server/src/schema/scheduler.rs @@ -818,7 +818,6 @@ async fn step_job_run_success( #[cfg(test)] mod test { use insta::assert_debug_snapshot; - use libsql_sys::wal::either::Either as EitherWAL; use libsql_sys::wal::Sqlite3WalManager; use std::path::Path; use tempfile::tempdir; @@ -951,7 +950,7 @@ mod test { checkpoint_interval: None, }; - let make_wal_manager = Arc::new(|| EitherWAL::A(Sqlite3WalManager::default())); + let make_wal_manager = Arc::new(|| Sqlite3WalManager::default()); configurators.with_schema(SchemaConfigurator::new( base_config.clone(), diff --git a/libsql-server/src/wal_toolkit.rs b/libsql-server/src/wal_toolkit.rs deleted file mode 100644 index 18cc204e78..0000000000 --- a/libsql-server/src/wal_toolkit.rs +++ /dev/null @@ -1,386 +0,0 @@ -use std::path::{Path, PathBuf}; - -use anyhow::Context as _; -use aws_config::{retry::RetryConfig, BehaviorVersion, Region}; -use aws_sdk_s3::config::{Credentials, SharedCredentialsProvider}; -use chrono::DateTime; -use hashbrown::HashSet; -use indicatif::ProgressStyle; -use libsql_sys::name::NamespaceName; -use libsql_wal::io::StdIO; -use libsql_wal::storage::backend::s3::S3Backend; -use libsql_wal::storage::backend::Backend; -use libsql_wal::storage::compaction::strategy::identity::IdentityStrategy; -use libsql_wal::storage::compaction::strategy::log_strategy::LogReductionStrategy; -use libsql_wal::storage::compaction::strategy::tiered::LevelsStrategy; -use libsql_wal::storage::compaction::strategy::CompactionStrategy; -use libsql_wal::storage::compaction::Compactor; -use rusqlite::OpenFlags; - -#[derive(Debug, clap::Subcommand)] -pub enum WalToolkitCommand { - Monitor(MonitorCommand), - Analyze(AnalyzeCommand), - Compact(CompactCommand), - Sync(SyncCommand), - Restore(RestoreCommand), -} - -impl WalToolkitCommand { - pub async fn exec(&self, compact_path: &Path, s3_args: &S3Args) -> anyhow::Result<()> { - let backend = setup_storage(s3_args).await?; - tokio::fs::create_dir_all(compact_path).await?; - let mut compactor = Compactor::new(backend.into(), compact_path)?; - match self { - Self::Monitor(cmd) => cmd.exec(&mut compactor).await?, - Self::Analyze(cmd) => cmd.exec(&compactor).await?, - Self::Compact(cmd) => cmd.exec(&mut compactor).await?, - Self::Sync(cmd) => cmd.exec(&mut compactor).await?, - Self::Restore(cmd) => cmd.exec(&compactor).await?, - } - - Ok(()) - } -} - -#[derive(Debug, clap::Args)] -/// Restore namespace -pub struct RestoreCommand { - #[clap(long)] - pub verify: bool, - pub namespace: String, - pub out: PathBuf, -} - -fn make_progress_fn() -> impl FnMut(u32, u32) { - let bar = indicatif::ProgressBar::new(0); - bar.set_style( - ProgressStyle::with_template("[{elapsed_precise}] {bar:30} {percent_precise}% eta: {eta}") - .unwrap() - .progress_chars("##-"), - ); - - move |current, total| { - bar.set_length(total as u64); - bar.set_position(current as u64); - } -} - -impl RestoreCommand { - async fn exec(&self, compactor: &Compactor>) -> Result<(), anyhow::Error> { - let namespace = NamespaceName::from_string(self.namespace.to_string()); - let analysis = compactor.analyze(&namespace)?; - let set = analysis.shortest_restore_path(); - compactor - .restore(set, &self.out, make_progress_fn()) - .await?; - if self.verify { - let conn = libsql_sys::rusqlite::Connection::open(&self.out)?; - conn.pragma_query(None, "integrity_check", |r| { - println!("{r:?}"); - Ok(()) - })?; - } - Ok(()) - } -} - -#[derive(Debug, clap::Args)] -/// Sync namespace metadata from remote storage -pub struct SyncCommand { - /// When performing a full sync, all the segment space is scanned again. By default, only - /// segments with frame_no greated that the last frame_no are retrieved. - #[clap(long)] - full: bool, - /// unless this is specified, all monitored namespaces are synced - namespace: Option, -} - -impl SyncCommand { - async fn exec(&self, compactor: &mut Compactor>) -> Result<(), anyhow::Error> { - match self.namespace { - Some(ref ns) => { - let namespace = NamespaceName::from_string(ns.to_string()); - compactor.sync_one(&namespace, self.full).await?; - println!("`{namespace}` fully up to date."); - } - None => { - compactor.sync_all(self.full).await?; - println!("all monitored namespace fully up to date."); - } - } - - Ok(()) - } -} - -#[derive(Clone, Debug, clap::ValueEnum, Copy)] -pub enum CompactStrategy { - Logarithmic, - CompactAll, - Tiered, -} - -#[derive(Debug, clap::Args)] -/// Compact segments into bigger segments -pub struct CompactCommand { - /// compaction strategy - #[clap(long, short)] - pub strategy: CompactStrategy, - /// prints the compaction plan, but doesn't perform it. - #[clap(long)] - pub dry_run: bool, - /// only compact if it takes more than `threshold` segments to restore - #[clap(long, short, default_value = "1")] - pub threshold: usize, - /// whether to display a progress bar - #[clap(long, short)] - pub progress: bool, - /// namespace to compact, otherwise, all namespaces are compacted - pub namespace: Option, - #[clap(requires = "namespace")] - /// compact to given path instead of sending to backend - pub out: Option, -} - -impl CompactCommand { - async fn exec(&self, compactor: &mut Compactor>) -> Result<(), anyhow::Error> { - match self.namespace { - Some(ref namespace) => { - let namespace = NamespaceName::from_string(namespace.to_string()); - self.compact_namespace(compactor, &namespace).await?; - } - None => { - let mut out = Vec::new(); - compactor.list_monitored_namespaces(|ns| { - out.push(ns); - })?; - - for ns in &out { - self.compact_namespace(compactor, ns).await?; - } - } - } - Ok(()) - } - - async fn compact_namespace( - &self, - compactor: &mut Compactor, - namespace: &NamespaceName, - ) -> anyhow::Result<()> { - let analysis = compactor.analyze(&namespace)?; - let strat: Box = match self.strategy { - CompactStrategy::Logarithmic => Box::new(LogReductionStrategy), - CompactStrategy::CompactAll => Box::new(IdentityStrategy), - CompactStrategy::Tiered => Box::new(LevelsStrategy::new(self.threshold)), - }; - - let set = analysis.shortest_restore_path(); - if set.len() <= self.threshold { - println!( - "skipping {namespace}: shortest restore path is {}, and threshold is {}", - set.len(), - self.threshold, - ); - return Ok(()); - } - let partition = strat.partition(&set); - - println!("compacting {namespace}:"); - println!("-> initial shortest restore path len: {}", set.len()); - println!("-> compacting into {} segments", partition.len()); - for set in partition.iter() { - println!("\t- {:?}", set.range().unwrap()); - } - - if self.dry_run { - println!("dry run: stopping"); - } else { - println!("performing compaction"); - let part_len = partition.len(); - for (idx, set) in partition.into_iter().enumerate() { - let Some((start, end)) = set.range() else { - continue; - }; - println!("compacting {start}-{end} ({}/{})", idx + 1, part_len); - if self.progress { - compactor - .compact(set, self.out.as_deref(), make_progress_fn()) - .await?; - } else { - compactor - .compact(set, self.out.as_deref(), |_, _| ()) - .await?; - } - - // sync back the new segments - compactor.sync_one(&namespace, false).await?; - } - } - - Ok(()) - } -} - -#[derive(Debug, clap::Args)] -/// Analyze segments for a namespaces -pub struct AnalyzeCommand { - /// list all segments - #[clap(long)] - pub list_all: bool, - pub namespace: String, -} - -impl AnalyzeCommand { - async fn exec(&self, compactor: &Compactor>) -> Result<(), anyhow::Error> { - let namespace = NamespaceName::from_string(self.namespace.to_string()); - let analysis = compactor.analyze(&namespace)?; - println!("stats for {namespace}:"); - println!("- segment count: {}", analysis.segment_count()); - println!("- last frame_no: {}", analysis.last_frame_no()); - let set = analysis.shortest_restore_path(); - println!("- shortest restore path len: {}", set.len()); - if let Some((first, last)) = compactor.get_segment_range(&namespace)? { - println!( - "- oldest segment: {}-{} ({})", - first.key.start_frame_no, - first.key.end_frame_no, - DateTime::from_timestamp_millis(first.key.timestamp as _).unwrap() - ); - println!( - "- most recent segment: {}-{} ({})", - last.key.start_frame_no, - last.key.end_frame_no, - DateTime::from_timestamp_millis(last.key.timestamp as _).unwrap() - ); - } - - if self.list_all { - println!("segments:"); - compactor.list_all_segments(&namespace, |info| { - println!( - "- {}-{} ({})", - info.key.start_frame_no, - info.key.end_frame_no, - DateTime::from_timestamp_millis(info.key.timestamp as _).unwrap() - ); - })?; - } - - Ok(()) - } -} - -#[derive(Debug, clap::Args)] -/// Register namespaces to monitor -pub struct MonitorCommand { - /// list monitored namespaces - #[clap(long, short)] - pub list: bool, - /// Monitor the passed namespace - #[clap(long, short)] - pub add: Option, - /// Unmonitor the passed namespace - #[clap(long, short)] - pub delete: Option, - /// Sync namespaces from a sqld meta-store - #[clap(long)] - pub from_db: Option, -} - -impl MonitorCommand { - async fn exec(&self, compactor: &mut Compactor>) -> Result<(), anyhow::Error> { - if self.list { - compactor.list_monitored_namespaces(|ns| { - println!("{ns}"); - })?; - } else if let Some(ref namespace) = self.add { - let namespace = NamespaceName::from_string(namespace.to_string()); - compactor.monitor(&namespace).await?; - println!("monitoring {namespace}"); - } - - if let Some(ref namespace) = self.delete { - let namespace = NamespaceName::from_string(namespace.to_string()); - compactor.unmonitor(&namespace)?; - println!("{namespace} is unmonitored"); - } else if let Some(ref path) = self.from_db { - let metastore_path = path.join("metastore").join("data"); - let conn = rusqlite::Connection::open_with_flags( - metastore_path, - OpenFlags::SQLITE_OPEN_READ_ONLY, - )?; - let mut stmt = conn.prepare("SELECT namespace FROM namespace_configs")?; - let metastore_namespaces = stmt - .query(())? - .mapped(|r| Ok(NamespaceName::from_string(r.get(0)?))) - .collect::, _>>()?; - - let mut monitored_namespace = HashSet::new(); - compactor.list_monitored_namespaces(|n| { - monitored_namespace.insert(n); - })?; - - let to_remove = monitored_namespace.difference(&metastore_namespaces); - for ns in to_remove { - println!("- {ns}"); - compactor.unmonitor(ns)?; - } - - let to_add = metastore_namespaces.difference(&monitored_namespace); - for ns in to_add { - println!("+ {ns}"); - compactor.monitor(&ns).await?; - } - } - - Ok(()) - } -} - -async fn setup_storage(opt: &S3Args) -> anyhow::Result> { - let config = aws_config::load_defaults(BehaviorVersion::latest()).await; - - let mut builder = config.into_builder(); - builder.set_endpoint_url(opt.s3_url.clone()); - builder.set_retry_config(RetryConfig::standard().with_max_attempts(10).into()); - builder.set_region(Region::new( - opt.s3_region_id.clone().expect("expected aws region"), - )); - let cred = Credentials::new( - opt.s3_access_key_id.as_ref().unwrap(), - opt.s3_access_key.as_ref().unwrap(), - None, - None, - "Static", - ); - builder.set_credentials_provider(Some(SharedCredentialsProvider::new(cred))); - let config = builder.build(); - let backend = S3Backend::from_sdk_config( - config, - opt.s3_bucket.clone().context("missing bucket id")?, - opt.cluster_id.clone().context("missing cluster id")?, - ) - .await?; - - Ok(backend) -} - -#[derive(Debug, clap::Args)] -pub struct S3Args { - #[arg(long, requires = "S3Args")] - enable_s3: bool, - #[arg(long, env = "LIBSQL_BOTTOMLESS_DATABASE_ID")] - cluster_id: Option, - #[arg(long, env = "LIBSQL_BOTTOMLESS_ENDPOINT")] - s3_url: Option, - #[arg(long, env = "LIBSQL_BOTTOMLESS_AWS_SECRET_ACCESS_KEY")] - s3_access_key: Option, - #[arg(long, env = "LIBSQL_BOTTOMLESS_AWS_ACCESS_KEY_ID")] - s3_access_key_id: Option, - #[arg(long, env = "LIBSQL_BOTTOMLESS_BUCKET")] - s3_bucket: Option, - #[arg(long, env = "LIBSQL_BOTTOMLESS_AWS_DEFAULT_REGION")] - s3_region_id: Option, -} diff --git a/libsql-wal/Cargo.toml b/libsql-wal/Cargo.toml deleted file mode 100644 index c5e39cb853..0000000000 --- a/libsql-wal/Cargo.toml +++ /dev/null @@ -1,82 +0,0 @@ -[package] -name = "libsql-wal" -version = "0.1.0-alpha.1" -edition = "2021" -description = "wal implementation for libsql" -license = "MIT" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -arc-swap = "1.7.1" -async-stream = "0.3.5" -async-lock = "3.4.0" -bitflags = "2.5.0" -bytes = "1.6.0" -chrono = "0.4.38" -crc32fast = "1.4.2" -crossbeam = "0.8.4" -crossbeam-skiplist = "0.1.3" -fst = "0.4.7" -hashbrown = "0.14.3" -libsql-sys = { version = "0.8", path = "../libsql-sys", features = ["rusqlite"] } -nix = { version = "0.28.0", features = ["uio", "fs"] } -parking_lot = { version = "0.12.3", features = ["arc_lock"] } -priority-queue = "2.0.2" -roaring = "0.10.5" -tempfile = "3.10.1" -thiserror = "1.0.58" -tokio = { version = "1", features = ["full"] } -tokio-stream = "0.1.15" -tracing = "0.1.40" -uuid = { version = "1.8.0", features = ["v4"] } -walkdir = "2.5.0" -zerocopy = { workspace = true } - -aws-config = { version = "1", optional = true, features = ["behavior-version-latest"] } -aws-sdk-s3 = { version = "1", optional = true } -http-body = "1.0.0" -tokio-util = "0.7.11" -hyper = { workspace = true, optional = true, features = ["client", "http2"] } -aws-smithy-runtime = { version = "1.6.2", optional = true, features = ["connector-hyper-0-14-x", "client"]} -clap = { version = "4.5.9", optional = true, features = ["derive"] } -inquire = { version = "0.7.5", optional = true } -tracing-subscriber = { version = "0.3.18", optional = true } -aws-credential-types = { version = "1.2.0", optional = true } -dashmap = "6.0.1" -rand = "0.8.5" -aws-smithy-types-convert = { version = "0.60.8", features = ["convert-chrono"] } -petgraph = "0.6.5" -anyhow = { version = "1.0.86", optional = true } -futures = "0.3.30" -memmap = "0.7.0" -pin-project-lite = "0.2.14" - -[dev-dependencies] -criterion = "0.5.1" -hex = "0.4.3" -insta = "1.39.0" -once_cell = "1.19.0" -rand = "0.8.5" -rand_chacha = "0.3.1" -regex = "1.10.4" -s3s = { git = "https://github.com/Nugine/s3s" } -s3s-fs = { git = "https://github.com/Nugine/s3s" } -s3s-aws = { git = "https://github.com/Nugine/s3s" } -tracing-subscriber = "0.3" -aws-credential-types = { version = "1", features = ["test-util"] } -tokio = { version = "1", features = ["test-util"] } - -[[bench]] -name = "benchmarks" -harness = false - -[features] -default = ["s3"] -s3 = [ - "dep:hyper", - "dep:aws-smithy-runtime", - "dep:aws-sdk-s3", - "dep:aws-config", - "dep:aws-credential-types", -] diff --git a/libsql-wal/benches/benchmarks.rs b/libsql-wal/benches/benchmarks.rs deleted file mode 100644 index 67f54edfb0..0000000000 --- a/libsql-wal/benches/benchmarks.rs +++ /dev/null @@ -1,128 +0,0 @@ -use std::path::Path; -use std::sync::Arc; - -use criterion::{criterion_group, criterion_main, Bencher, Criterion}; -use libsql_sys::name::NamespaceName; -use libsql_sys::rusqlite::{self, OpenFlags}; -use libsql_sys::wal::{Sqlite3Wal, Sqlite3WalManager, Wal}; -use libsql_sys::Connection; -use libsql_wal::io::StdIO; -use libsql_wal::storage::NoStorage; -use libsql_wal::wal::LibsqlWal; -use libsql_wal::{registry::WalRegistry, wal::LibsqlWalManager}; -use tempfile::tempdir; - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); - -pub fn criterion_benchmark(c: &mut Criterion) { - with_libsql_conn(|conn| { - c.bench_function("libsql random inserts", |b| { - bench_random_inserts(conn, b); - }); - }); - - with_sqlite_conn(|conn| { - c.bench_function("sqlite3 random inserts", |b| { - bench_random_inserts(conn, b); - }); - }); - - with_sqlite_conn(|conn| { - prepare_for_random_reads(conn); - c.bench_function("sqlite3 random reads", |b| { - bench_random_reads(conn, b); - }); - }); - - with_libsql_conn(|conn| { - prepare_for_random_reads(conn); - c.bench_function("libsql random reads", |b| { - bench_random_reads(conn, b); - }); - }); -} - -fn prepare_for_random_reads(conn: &mut Connection) { - let _ = conn.execute( - "CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB(16), c BLOB(16), d BLOB(400));", - (), - ); - let _ = conn.execute("CREATE INDEX i1 ON t1(b);", ()); - let _ = conn.execute("CREATE INDEX i2 ON t1(c);", ()); - for _ in 0..20_000 { - random_inserts(conn); - } -} - -fn with_libsql_conn(f: impl FnOnce(&mut Connection>)) { - let tmp = tempdir().unwrap(); - let resolver = |_: &Path| NamespaceName::from_string("test".into()); - - let (sender, _) = tokio::sync::mpsc::channel(12); - let registry = Arc::new(WalRegistry::new(NoStorage.into(), sender).unwrap()); - let wal_manager = LibsqlWalManager::new(registry.clone(), Arc::new(resolver)); - - let mut conn = libsql_sys::Connection::open( - tmp.path().join("data"), - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - wal_manager.clone(), - 100000, - None, - ) - .unwrap(); - - f(&mut conn) -} - -fn with_sqlite_conn(f: impl FnOnce(&mut Connection)) { - let tmp = tempdir().unwrap(); - let mut conn = libsql_sys::Connection::open( - tmp.path().join("data"), - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - Sqlite3WalManager::default(), - 100000, - None, - ) - .unwrap(); - - f(&mut conn) -} - -fn bench_random_reads(conn: &mut Connection, bencher: &mut Bencher<'_>) { - bencher.iter(|| random_read(conn)); -} - -fn bench_random_inserts(conn: &mut Connection, bencher: &mut Bencher<'_>) { - let _ = conn.execute( - "CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB(16), c BLOB(16), d BLOB(400));", - (), - ); - let _ = conn.execute("CREATE INDEX i1 ON t1(b);", ()); - let _ = conn.execute("CREATE INDEX i2 ON t1(c);", ()); - bencher.iter(|| random_inserts(conn)); -} - -fn random_inserts(conn: &mut Connection) { - let tx = conn - .transaction_with_behavior(rusqlite::TransactionBehavior::Immediate) - .unwrap(); - // println!("write_acquired: {:?}", before.elapsed().as_micros()); - tx.execute("REPLACE INTO t1 VALUES(abs(random() % 5000000), randomblob(16), randomblob(16), randomblob(400));", ()).unwrap(); - tx.execute("REPLACE INTO t1 VALUES(abs(random() % 5000000), randomblob(16), randomblob(16), randomblob(400));", ()).unwrap(); - tx.execute("REPLACE INTO t1 VALUES(abs(random() % 5000000), randomblob(16), randomblob(16), randomblob(400));", ()).unwrap(); - tx.commit().unwrap(); -} - -fn random_read(conn: &mut Connection) { - let tx = conn.transaction().unwrap(); - // println!("write_acquired: {:?}", before.elapsed().as_micros()); - let mut stmt = tx - .prepare("SELECT * FROM t1 WHERE a>abs((random()%5000000)) LIMIT 10;") - .unwrap(); - stmt.query(()).unwrap().mapped(|_r| Ok(())).count(); - stmt.query(()).unwrap().mapped(|_r| Ok(())).count(); - stmt.query(()).unwrap().mapped(|_r| Ok(())).count(); - drop(stmt); - tx.commit().unwrap(); -} diff --git a/libsql-wal/src/checkpointer.rs b/libsql-wal/src/checkpointer.rs deleted file mode 100644 index f6ec6d3cf7..0000000000 --- a/libsql-wal/src/checkpointer.rs +++ /dev/null @@ -1,460 +0,0 @@ -use std::future::Future; -use std::sync::Arc; - -use hashbrown::HashSet; -use libsql_sys::name::NamespaceName; -use tokio::sync::mpsc; -use tokio::task::JoinSet; - -use crate::io::Io; -use crate::registry::WalRegistry; -use crate::segment::sealed::SealedSegment; -use crate::storage::Storage; - -pub(crate) type NotifyCheckpointer = mpsc::Sender; - -pub enum CheckpointMessage { - /// notify that a namespace may be checkpointable - Namespace(NamespaceName), - /// shutdown initiated - Shutdown, -} - -impl From for CheckpointMessage { - fn from(value: NamespaceName) -> Self { - Self::Namespace(value) - } -} - -pub type LibsqlCheckpointer = Checkpointer>; - -impl LibsqlCheckpointer -where - IO: Io, - S: Storage>, -{ - pub fn new( - registry: Arc>, - notifier: mpsc::Receiver, - max_checkpointing_conccurency: usize, - ) -> Self { - Self::new_with_performer(registry, notifier, max_checkpointing_conccurency) - } -} - -trait PerformCheckpoint { - fn checkpoint( - &self, - namespace: &NamespaceName, - ) -> impl Future> + Send; -} - -impl PerformCheckpoint for WalRegistry -where - IO: Io, - S: Sync + Send + 'static, - S: Storage>, -{ - #[tracing::instrument(skip(self))] - fn checkpoint( - &self, - namespace: &NamespaceName, - ) -> impl Future> + Send { - let namespace = namespace.clone(); - async move { - if let Some(registry) = self.get_async(&namespace).await { - registry.checkpoint().await?; - } - Ok(()) - } - } -} - -const CHECKPOINTER_ERROR_THRES: usize = 16; - -/// The checkpointer checkpoint wal segments in the main db file, and deletes checkpointed -/// segments. -/// For simplicity of implementation, we only delete segments when they are checkpointed, and only checkpoint when -/// they are reported as durable. -#[derive(Debug)] -pub struct Checkpointer

{ - perform_checkpoint: Arc

, - /// Namespaces scheduled for checkpointing, but not currently checkpointing - scheduled: HashSet, - /// currently checkpointing databases - checkpointing: HashSet, - /// the checkpointer is notifier whenever there is a change to a namespage that could trigger a - /// checkpoint - recv: mpsc::Receiver, - max_checkpointing_conccurency: usize, - shutting_down: bool, - join_set: JoinSet<(NamespaceName, crate::error::Result<()>)>, - processing: Vec, - errors: usize, - /// previous iteration of the loop resulted in no work being enqueued - no_work: bool, -} - -#[allow(private_bounds)] -impl

Checkpointer

-where - P: PerformCheckpoint + Send + Sync + 'static, -{ - fn new_with_performer( - perform_checkpoint: Arc

, - notifier: mpsc::Receiver, - max_checkpointing_conccurency: usize, - ) -> Self { - Self { - perform_checkpoint, - scheduled: Default::default(), - checkpointing: Default::default(), - recv: notifier, - max_checkpointing_conccurency, - shutting_down: false, - join_set: JoinSet::new(), - processing: Vec::new(), - errors: 0, - no_work: false, - } - } - - #[tracing::instrument(skip(self))] - pub async fn run(mut self) { - loop { - if self.should_exit() { - tracing::info!("checkpointer exited cleanly."); - return; - } - - if self.errors > CHECKPOINTER_ERROR_THRES { - todo!("handle too many consecutive errors"); - } - - self.step().await; - } - } - - fn should_exit(&self) -> bool { - self.shutting_down - && self.recv.is_empty() - && self.scheduled.is_empty() - && self.checkpointing.is_empty() - && self.join_set.is_empty() - } - - async fn step(&mut self) { - tokio::select! { - biased; - result = self.join_set.join_next(), if !self.join_set.is_empty() => { - match result { - Some(Ok((namespace, result))) => { - self.checkpointing.remove(&namespace); - if let Err(e) = result { - self.errors += 1; - tracing::error!("error checkpointing ns {namespace}: {e}, rescheduling"); - // reschedule - self.scheduled.insert(namespace); - } else { - self.errors = 0; - } - } - Some(Err(e)) => panic!("checkpoint task panicked: {e}"), - None => unreachable!("got None, but join set is not empty") - } - } - notified = self.recv.recv(), if !self.shutting_down => { - match notified { - Some(CheckpointMessage::Namespace(namespace)) => { - tracing::info!(namespace = namespace.as_str(), "notified for checkpoint"); - self.scheduled.insert(namespace); - } - None | Some(CheckpointMessage::Shutdown) => { - tracing::info!("checkpointed is shutting down. {} namespaces to checkpoint", self.checkpointing.len()); - self.shutting_down = true; - } - } - } - // don't wait if there is stuff to enqueue - _ = std::future::ready(()), if !self.scheduled.is_empty() - && self.join_set.len() < self.max_checkpointing_conccurency && !self.no_work => (), - } - - let n_available = self.max_checkpointing_conccurency - self.join_set.len(); - if n_available > 0 { - self.no_work = true; - for namespace in self - .scheduled - .difference(&self.checkpointing) - .take(n_available) - .cloned() - { - self.no_work = false; - self.processing.push(namespace.clone()); - let perform_checkpoint = self.perform_checkpoint.clone(); - self.join_set.spawn(async move { - let ret = perform_checkpoint.checkpoint(&namespace).await; - (namespace, ret) - }); - } - - for namespace in self.processing.drain(..) { - self.scheduled.remove(&namespace); - self.checkpointing.insert(namespace); - } - } - } -} - -#[cfg(test)] -mod test { - use std::sync::atomic::{AtomicBool, Ordering::Relaxed}; - - use tokio::time::Duration; - - use super::*; - - #[tokio::test] - async fn process_checkpoint() { - static CALLED: AtomicBool = AtomicBool::new(false); - - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - CALLED.store(true, Relaxed); - Ok(()) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 5); - let ns = NamespaceName::from("test"); - - sender.send(ns.clone().into()).await.unwrap(); - - checkpointer.step().await; - - assert!(checkpointer.checkpointing.contains(&ns)); - - checkpointer.step().await; - - assert!(checkpointer.checkpointing.is_empty()); - assert!(checkpointer.scheduled.is_empty()); - assert!(CALLED.load(std::sync::atomic::Ordering::Relaxed)); - } - - #[tokio::test] - async fn checkpoint_error() { - static CALLED: AtomicBool = AtomicBool::new(false); - - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - CALLED.store(true, Relaxed); - // random error - Err(crate::error::Error::BusySnapshot) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 5); - let ns = NamespaceName::from("test"); - - sender.send(ns.clone().into()).await.unwrap(); - - checkpointer.step().await; - assert_eq!(checkpointer.errors, 0); - - assert!(checkpointer.checkpointing.contains(&ns)); - - checkpointer.step().await; - - // job is re-enqueued - assert!(CALLED.load(std::sync::atomic::Ordering::Relaxed)); - assert!(checkpointer.checkpointing.contains(&ns)); - assert!(checkpointer.scheduled.is_empty()); - assert_eq!(checkpointer.errors, 1); - } - - #[tokio::test] - async fn checkpointer_shutdown() { - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - Ok(()) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 5); - - drop(sender); - - assert!(!checkpointer.should_exit()); - - checkpointer.step().await; - - assert!(checkpointer.should_exit()); - - // should return immediately. - checkpointer.run().await; - } - - #[tokio::test] - async fn cant_exit_until_all_processed() { - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - Ok(()) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 5); - - drop(sender); - - checkpointer.step().await; - - let ns: NamespaceName = "test".into(); - checkpointer.scheduled.insert(ns.clone()); - assert!(!checkpointer.should_exit()); - checkpointer.scheduled.remove(&ns); - - checkpointer.checkpointing.insert(ns.clone()); - assert!(!checkpointer.should_exit()); - checkpointer.checkpointing.remove(&ns); - - assert!(checkpointer.should_exit()); - // should return immediately. - checkpointer.run().await; - } - - #[tokio::test] - async fn dont_schedule_already_scheduled() { - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - tokio::time::sleep(Duration::from_secs(1000)).await; - Ok(()) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 5); - - let ns: NamespaceName = "test".into(); - - sender.send(ns.clone().into()).await.unwrap(); - sender.send(ns.clone().into()).await.unwrap(); - - checkpointer.step().await; - - assert!(checkpointer.scheduled.is_empty()); - assert!(checkpointer.checkpointing.contains(&ns)); - - checkpointer.step().await; - - assert!(checkpointer.scheduled.contains(&ns)); - assert!(checkpointer.checkpointing.contains(&ns)); - assert_eq!(checkpointer.join_set.len(), 1); - } - - #[tokio::test] - async fn schedule_conccurently_for_different_namespaces() { - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - tokio::time::sleep(Duration::from_secs(1000)).await; - Ok(()) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 5); - - let ns1: NamespaceName = "test1".into(); - let ns2: NamespaceName = "test2".into(); - - sender.send(ns1.clone().into()).await.unwrap(); - sender.send(ns2.clone().into()).await.unwrap(); - - checkpointer.step().await; - - assert!(checkpointer.scheduled.is_empty()); - assert!(checkpointer.checkpointing.contains(&ns1)); - assert_eq!(checkpointer.checkpointing.len(), 1); - - checkpointer.step().await; - - assert!(checkpointer.scheduled.is_empty()); - assert!(checkpointer.checkpointing.contains(&ns2)); - assert_eq!(checkpointer.checkpointing.len(), 2); - assert_eq!(checkpointer.join_set.len(), 2); - } - - #[tokio::test] - async fn checkpointer_limited_conccurency() { - #[derive(Debug)] - struct TestPerformCheckoint; - - impl PerformCheckpoint for TestPerformCheckoint { - async fn checkpoint(&self, _namespace: &NamespaceName) -> crate::error::Result<()> { - tokio::time::sleep(Duration::from_secs(1000)).await; - Ok(()) - } - } - - let (sender, receiver) = mpsc::channel(8); - let mut checkpointer = - Checkpointer::new_with_performer(TestPerformCheckoint.into(), receiver, 2); - - let ns1: NamespaceName = "test1".into(); - let ns2: NamespaceName = "test2".into(); - let ns3: NamespaceName = "test3".into(); - - sender.send(ns1.clone().into()).await.unwrap(); - sender.send(ns2.clone().into()).await.unwrap(); - sender.send(ns3.clone().into()).await.unwrap(); - - checkpointer.step().await; - checkpointer.step().await; - checkpointer.step().await; - - assert_eq!(checkpointer.scheduled.len(), 1); - assert!(checkpointer.scheduled.contains(&ns3)); - - assert!(checkpointer.checkpointing.contains(&ns1)); - assert!(checkpointer.checkpointing.contains(&ns2)); - assert_eq!(checkpointer.checkpointing.len(), 2); - assert_eq!(checkpointer.join_set.len(), 2); - - tokio::time::pause(); - tokio::time::advance(Duration::from_secs(2000)).await; - - checkpointer.step().await; - checkpointer.step().await; - - assert!(checkpointer.scheduled.is_empty()); - assert!(checkpointer.checkpointing.contains(&ns3)); - assert_eq!(checkpointer.checkpointing.len(), 1); - } -} diff --git a/libsql-wal/src/error.rs b/libsql-wal/src/error.rs deleted file mode 100644 index 8d367cbbb7..0000000000 --- a/libsql-wal/src/error.rs +++ /dev/null @@ -1,47 +0,0 @@ -pub type Result = std::result::Result; - -#[derive(Debug, thiserror::Error)] -pub enum Error { - #[error("io error: {0}")] - Io(#[from] std::io::Error), - #[error("error building wal index: {0}")] - IndexError(#[from] fst::Error), - /// The segment has changed since the connection last read, and it's now trying to upgrade - #[error("busy snapshot")] - BusySnapshot, - #[error("invalid segment header checksum")] - InvalidHeaderChecksum, - #[error("invalid segment header magic")] - InvalidHeaderMagic, - #[error("invalid segment header version")] - InvalidHeaderVersion, - #[error("Invalid page size, only 4095 is supported")] - InvalidPageSize, - #[error("Registry is shutting down")] - ShuttingDown, - - #[error("invalid db footer magic")] - InvalidFooterMagic, - #[error("invalid db footer version")] - InvalidFooterVersion, - - #[error("storage error: {0}")] - Storage(#[from] Box), - #[error("wal is being deleted")] - DeletingWal, -} - -impl Into for Error { - fn into(self) -> libsql_sys::ffi::Error { - let code = match self { - Error::BusySnapshot => libsql_sys::ffi::SQLITE_BUSY_SNAPSHOT, - Error::InvalidHeaderChecksum => libsql_sys::ffi::SQLITE_CORRUPT, - e => { - tracing::error!("wal error: {e}"); - libsql_sys::ffi::SQLITE_IOERR_WRITE - } - }; - - libsql_sys::ffi::Error::new(code) - } -} diff --git a/libsql-wal/src/io/buf.rs b/libsql-wal/src/io/buf.rs deleted file mode 100644 index 7b824287e4..0000000000 --- a/libsql-wal/src/io/buf.rs +++ /dev/null @@ -1,340 +0,0 @@ -// from tokio uring - -use std::{ - borrow::Borrow, - marker::PhantomData, - mem::{size_of, MaybeUninit}, -}; - -use bytes::{Bytes, BytesMut}; -use zerocopy::{AsBytes, FromBytes}; - -pub unsafe trait IoBuf: Unpin + 'static { - /// Returns a raw pointer to the vector’s buffer. - /// - /// This method is to be used by the `tokio-uring` runtime and it is not - /// expected for users to call it directly. - /// - /// The implementation must ensure that, while the `tokio-uring` runtime - /// owns the value, the pointer returned by `stable_ptr` **does not** - /// change. - fn stable_ptr(&self) -> *const u8; - - /// Number of initialized bytes. - /// - /// This method is to be used by the `tokio-uring` runtime and it is not - /// expected for users to call it directly. - /// - /// For `Vec`, this is identical to `len()`. - fn bytes_init(&self) -> usize; - - /// Total size of the buffer, including uninitialized memory, if any. - /// - /// This method is to be used by the `tokio-uring` runtime and it is not - /// expected for users to call it directly. - /// - /// For `Vec`, this is identical to `capacity()`. - fn bytes_total(&self) -> usize; -} - -/// A mutable`io-uring` compatible buffer. -/// -/// The `IoBufMut` trait is implemented by buffer types that can be passed to -/// io-uring operations. Users will not need to use this trait directly. -/// -/// # Safety -/// -/// Buffers passed to `io-uring` operations must reference a stable memory -/// region. While the runtime holds ownership to a buffer, the pointer returned -/// by `stable_mut_ptr` must remain valid even if the `IoBufMut` value is moved. -pub unsafe trait IoBufMut: IoBuf { - /// Returns a raw mutable pointer to the vector’s buffer. - /// - /// This method is to be used by the `tokio-uring` runtime and it is not - /// expected for users to call it directly. - /// - /// The implementation must ensure that, while the `tokio-uring` runtime - /// owns the value, the pointer returned by `stable_mut_ptr` **does not** - /// change. - fn stable_mut_ptr(&mut self) -> *mut u8; - - /// Updates the number of initialized bytes. - /// - /// The specified `pos` becomes the new value returned by - /// `IoBuf::bytes_init`. - /// - /// # Safety - /// - /// The caller must ensure that all bytes starting at `stable_mut_ptr()` up - /// to `pos` are initialized and owned by the buffer. - unsafe fn set_init(&mut self, pos: usize); -} - -unsafe impl IoBufMut for Box { - fn stable_mut_ptr(&mut self) -> *mut u8 { - self.as_mut().stable_mut_ptr() - } - - unsafe fn set_init(&mut self, pos: usize) { - self.as_mut().set_init(pos) - } -} - -unsafe impl IoBuf for BytesMut { - fn stable_ptr(&self) -> *const u8 { - self.as_ptr() - } - - fn bytes_init(&self) -> usize { - self.len() - } - - fn bytes_total(&self) -> usize { - self.capacity() - } -} - -unsafe impl IoBuf for Bytes { - fn stable_ptr(&self) -> *const u8 { - self.as_ptr() - } - - fn bytes_init(&self) -> usize { - self.len() - } - - fn bytes_total(&self) -> usize { - self.len() - } -} - -unsafe impl IoBufMut for BytesMut { - fn stable_mut_ptr(&mut self) -> *mut u8 { - self.as_mut_ptr() - } - - unsafe fn set_init(&mut self, pos: usize) { - unsafe { self.set_len(pos) } - } -} - -unsafe impl IoBuf for Box { - fn stable_ptr(&self) -> *const u8 { - self.as_ref().stable_ptr() - } - - fn bytes_init(&self) -> usize { - self.as_ref().bytes_init() - } - - fn bytes_total(&self) -> usize { - self.as_ref().bytes_total() - } -} - -pub struct ZeroCopyBuf { - init: usize, - inner: MaybeUninit, -} - -pub struct ZeroCopyBoxIoBuf { - inner: Box, - init: usize, -} - -impl ZeroCopyBoxIoBuf { - pub fn new(inner: Box) -> Self { - Self { - init: size_of::(), - inner, - } - } - - pub fn new_uninit(inner: Box) -> Self { - Self { init: 0, inner } - } - - /// same as new_uninit, but partially fills the buffer starting at offset - /// - /// # Safety: The caller must ensure that the remaining bytes are initialized - pub unsafe fn new_uninit_partial(inner: Box, offset: usize) -> Self { - assert!(offset < size_of::()); - Self { - inner, - init: offset, - } - } - - fn is_init(&self) -> bool { - self.init == size_of::() - } - - pub fn into_inner(self) -> Box { - assert!(self.is_init()); - self.inner - } -} - -unsafe impl IoBuf for ZeroCopyBoxIoBuf { - fn stable_ptr(&self) -> *const u8 { - T::as_bytes(&self.inner).as_ptr() - } - - fn bytes_init(&self) -> usize { - self.init - } - - fn bytes_total(&self) -> usize { - size_of::() - } -} - -unsafe impl IoBufMut for ZeroCopyBoxIoBuf { - fn stable_mut_ptr(&mut self) -> *mut u8 { - T::as_bytes_mut(&mut self.inner).as_mut_ptr() - } - - unsafe fn set_init(&mut self, pos: usize) { - self.init = pos; - } -} - -impl ZeroCopyBuf { - pub fn new_init(inner: T) -> Self { - Self { - inner: MaybeUninit::new(inner), - init: size_of::(), - } - } - - pub fn new_uninit() -> Self { - Self { - init: 0, - inner: MaybeUninit::uninit(), - } - } - - pub fn map_slice(self, f: F) -> MapSlice - where - for<'a> F: Fn(&'a Self) -> &'a [u8] + Unpin + 'static, - { - MapSlice::new(self, f) - } - - #[inline] - pub fn is_init(&self) -> bool { - self.init == size_of::() - } - - /// returns a ref to the inner type - /// # Panic - /// panics if the inner type is uninitialized - pub fn get_ref(&self) -> &T { - assert!(self.is_init()); - unsafe { self.inner.assume_init_ref() } - } - - pub fn get_mut(&mut self) -> &mut T { - assert!(self.is_init()); - unsafe { self.inner.assume_init_mut() } - } - - pub fn into_inner(self) -> T { - assert!(self.is_init()); - unsafe { self.inner.assume_init() } - } - - pub fn deinit(&mut self) { - self.init = 0; - } -} - -pub struct MapSlice { - inner: T, - f: F, - _p: PhantomData, -} - -impl MapSlice { - pub(crate) fn into_inner(self) -> T { - self.inner - } - - pub(crate) fn new(inner: T, f: F) -> Self { - Self { - inner, - f, - _p: PhantomData, - } - } -} - -unsafe impl IoBuf for MapSlice -where - for<'a> F: Fn(&'a ZeroCopyBuf) -> &'a [u8] + Unpin + 'static, - T: Borrow> + Unpin + 'static, - U: AsBytes + Unpin + 'static, -{ - fn stable_ptr(&self) -> *const u8 { - (self.f)(&self.inner.borrow()).as_ptr() - } - - fn bytes_init(&self) -> usize { - (self.f)(&self.inner.borrow()).len() - } - - fn bytes_total(&self) -> usize { - (self.f)(&self.inner.borrow()).len() - } -} - -unsafe impl IoBuf for ZeroCopyBuf { - fn stable_ptr(&self) -> *const u8 { - self.inner.as_ptr() as *const _ - } - - fn bytes_init(&self) -> usize { - self.init - } - - fn bytes_total(&self) -> usize { - size_of::() - } -} - -unsafe impl IoBufMut for ZeroCopyBuf { - fn stable_mut_ptr(&mut self) -> *mut u8 { - self.inner.as_mut_ptr() as *mut _ - } - - unsafe fn set_init(&mut self, pos: usize) { - assert!(pos <= size_of::()); - self.init = pos - } -} - -unsafe impl IoBufMut for Vec { - fn stable_mut_ptr(&mut self) -> *mut u8 { - self.as_mut_ptr() - } - - unsafe fn set_init(&mut self, init_len: usize) { - if self.len() < init_len { - self.set_len(init_len); - } - } -} - -unsafe impl IoBuf for Vec { - fn stable_ptr(&self) -> *const u8 { - self.as_ptr() - } - - fn bytes_init(&self) -> usize { - self.len() - } - - fn bytes_total(&self) -> usize { - self.capacity() - } -} diff --git a/libsql-wal/src/io/compat.rs b/libsql-wal/src/io/compat.rs deleted file mode 100644 index 78ad7752d6..0000000000 --- a/libsql-wal/src/io/compat.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::io; - -use bytes::BytesMut; -use tokio::io::AsyncRead; -use tokio::io::AsyncReadExt; - -use super::FileExt; - -/// Copy from src that implements AsyncRead to the detination file, returning how many bytes have -/// been copied -pub async fn copy_to_file(mut src: R, dst: &F) -> io::Result -where - F: FileExt, - R: AsyncRead + Unpin, -{ - let mut dst_offset = 0u64; - let mut buffer = BytesMut::with_capacity(4096); - loop { - let n = src.read_buf(&mut buffer).await?; - if n == 0 { - return Ok(dst_offset as usize); - } - let (b, ret) = dst.write_all_at_async(buffer, dst_offset).await; - ret?; - dst_offset += n as u64; - buffer = b; - buffer.clear(); - } -} diff --git a/libsql-wal/src/io/file.rs b/libsql-wal/src/io/file.rs deleted file mode 100644 index f7f4b94615..0000000000 --- a/libsql-wal/src/io/file.rs +++ /dev/null @@ -1,375 +0,0 @@ -use std::fs::File; -use std::future::Future; -use std::io::{self, ErrorKind, IoSlice, Result, Write}; - -use libsql_sys::wal::either::Either; - -use super::buf::{IoBuf, IoBufMut}; - -pub trait FileExt: Send + Sync + 'static { - fn len(&self) -> io::Result; - fn write_all_at(&self, buf: &[u8], offset: u64) -> Result<()> { - let mut written = 0; - - while written != buf.len() { - written += self.write_at(&buf[written..], offset + written as u64)?; - } - - Ok(()) - } - fn write_at_vectored(&self, bufs: &[IoSlice], offset: u64) -> Result; - fn write_at(&self, buf: &[u8], offset: u64) -> Result; - - fn read_at(&self, buf: &mut [u8], offset: u64) -> Result; - fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<()> { - let mut read = 0; - - while read != buf.len() { - let n = self.read_at(&mut buf[read..], offset + read as u64)?; - if n == 0 { - return Err(io::Error::new( - ErrorKind::UnexpectedEof, - "unexpected end-of-file", - )); - } - read += n; - } - - Ok(()) - } - - fn sync_all(&self) -> Result<()>; - - fn set_len(&self, len: u64) -> Result<()>; - - fn cursor(&self, offset: u64) -> Cursor - where - Self: Sized, - { - Cursor { - file: self, - offset, - count: 0, - } - } - - #[must_use] - fn read_exact_at_async( - &self, - buf: B, - offset: u64, - ) -> impl Future)> + Send; - - #[must_use] - fn read_at_async( - &self, - buf: B, - offset: u64, - ) -> impl Future)> + Send; - - #[must_use] - fn write_all_at_async( - &self, - buf: B, - offset: u64, - ) -> impl Future)> + Send; -} - -impl FileExt for Either -where - V: FileExt, - U: FileExt, -{ - fn len(&self) -> io::Result { - match self { - Either::A(x) => x.len(), - Either::B(x) => x.len(), - } - } - - fn write_at_vectored(&self, bufs: &[IoSlice], offset: u64) -> Result { - match self { - Either::A(x) => x.write_at_vectored(bufs, offset), - Either::B(x) => x.write_at_vectored(bufs, offset), - } - } - - fn write_at(&self, buf: &[u8], offset: u64) -> Result { - match self { - Either::A(x) => x.write_at(buf, offset), - Either::B(x) => x.write_at(buf, offset), - } - } - - fn read_at(&self, buf: &mut [u8], offset: u64) -> Result { - match self { - Either::A(x) => x.read_at(buf, offset), - Either::B(x) => x.read_at(buf, offset), - } - } - - fn sync_all(&self) -> Result<()> { - match self { - Either::A(x) => x.sync_all(), - Either::B(x) => x.sync_all(), - } - } - - fn set_len(&self, len: u64) -> Result<()> { - match self { - Either::A(x) => x.set_len(len), - Either::B(x) => x.set_len(len), - } - } - - fn read_exact_at_async( - &self, - buf: B, - offset: u64, - ) -> impl Future)> + Send { - async move { - match self { - Either::A(x) => x.read_exact_at_async(buf, offset).await, - Either::B(x) => x.read_exact_at_async(buf, offset).await, - } - } - } - - fn read_at_async( - &self, - buf: B, - offset: u64, - ) -> impl Future)> + Send { - async move { - match self { - Either::A(x) => x.read_at_async(buf, offset).await, - Either::B(x) => x.read_at_async(buf, offset).await, - } - } - } - - fn write_all_at_async( - &self, - buf: B, - offset: u64, - ) -> impl Future)> + Send { - async move { - match self { - Either::A(x) => x.write_all_at_async(buf, offset).await, - Either::B(x) => x.write_all_at_async(buf, offset).await, - } - } - } -} - -impl FileExt for File { - fn write_at_vectored(&self, bufs: &[IoSlice], offset: u64) -> Result { - Ok(nix::sys::uio::pwritev(self, bufs, offset as _)?) - } - - fn write_at(&self, buf: &[u8], offset: u64) -> Result { - Ok(nix::sys::uio::pwrite(self, buf, offset as _)?) - } - - fn read_at(&self, buf: &mut [u8], offset: u64) -> Result { - let n = nix::sys::uio::pread(self, buf, offset as _)?; - Ok(n) - } - - fn sync_all(&self) -> Result<()> { - std::fs::File::sync_all(self) - } - - fn set_len(&self, len: u64) -> Result<()> { - std::fs::File::set_len(self, len) - } - - async fn read_exact_at_async( - &self, - mut buf: B, - offset: u64, - ) -> (B, Result<()>) { - let file = self.try_clone().unwrap(); - let (buffer, ret) = tokio::task::spawn_blocking(move || { - // let mut read = 0; - - let len = buf.bytes_total(); - let init = buf.bytes_init(); - let chunk = unsafe { - let ptr = buf.stable_mut_ptr().offset(init as _); - std::slice::from_raw_parts_mut(ptr, len - init) - }; - - let ret = file.read_exact_at(chunk, offset); - if ret.is_ok() { - unsafe { - buf.set_init(init + chunk.len()); - } - } - (buf, ret) - }) - .await - .unwrap(); - - (buffer, ret) - } - - async fn read_at_async( - &self, - mut buf: B, - offset: u64, - ) -> (B, Result) { - let file = self.try_clone().unwrap(); - let (buffer, ret) = tokio::task::spawn_blocking(move || { - // let mut read = 0; - - let len = buf.bytes_total(); - let init = buf.bytes_init(); - let chunk = unsafe { - let ptr = buf.stable_mut_ptr().offset(init as _); - std::slice::from_raw_parts_mut(ptr, len - init) - }; - - let ret = file.read_at(chunk, offset); - if let Ok(n) = ret { - unsafe { - buf.set_init(init + n); - } - } - (buf, ret) - }) - .await - .unwrap(); - - (buffer, ret) - } - - async fn write_all_at_async( - &self, - buf: B, - offset: u64, - ) -> (B, Result<()>) { - let file = self.try_clone().unwrap(); - let (buffer, ret) = tokio::task::spawn_blocking(move || { - let buffer = unsafe { std::slice::from_raw_parts(buf.stable_ptr(), buf.bytes_init()) }; - let ret = file.write_all_at(buffer, offset); - (buf, ret) - }) - .await - .unwrap(); - - (buffer, ret) - } - - fn len(&self) -> io::Result { - Ok(self.metadata()?.len()) - } -} - -#[derive(Debug)] -pub struct Cursor<'a, T> { - file: &'a T, - offset: u64, - count: u64, -} - -impl Cursor<'_, T> { - pub fn count(&self) -> u64 { - self.count - } -} - -impl Write for Cursor<'_, T> { - fn write(&mut self, buf: &[u8]) -> std::io::Result { - let count = self.file.write_at(buf, self.offset + self.count)?; - self.count += count as u64; - Ok(count) - } - - fn flush(&mut self) -> std::io::Result<()> { - Ok(()) - } -} - -pub struct BufCopy { - w: W, - buf: Vec, -} - -impl BufCopy { - pub fn new(w: W) -> Self { - Self { w, buf: Vec::new() } - } - - pub fn into_parts(self) -> (W, Vec) { - let Self { w, buf } = self; - (w, buf) - } - - pub fn get_ref(&self) -> &W { - &self.w - } -} - -impl Write for BufCopy { - fn write(&mut self, buf: &[u8]) -> Result { - let count = self.w.write(buf)?; - self.buf.extend_from_slice(&buf[..count]); - Ok(count) - } - - fn flush(&mut self) -> Result<()> { - self.w.flush() - } -} - -#[cfg(test)] -mod test { - use std::io::Read; - - use tempfile::tempfile; - - use super::*; - - #[tokio::test] - async fn test_write_async() { - let mut file = tempfile().unwrap(); - - let buf = vec![1u8; 12345]; - let (buf, ret) = file.write_all_at_async(buf, 0).await; - ret.unwrap(); - assert_eq!(buf.len(), 12345); - assert!(buf.iter().all(|x| *x == 1)); - - let buf = vec![2u8; 50]; - let (buf, ret) = file.write_all_at_async(buf, 12345).await; - ret.unwrap(); - assert_eq!(buf.len(), 50); - assert!(buf.iter().all(|x| *x == 2)); - - let mut out = Vec::new(); - file.read_to_end(&mut out).unwrap(); - assert!(out[0..12345].iter().all(|x| *x == 1)); - assert!(out[12345..].iter().all(|x| *x == 2)); - } - - #[tokio::test] - async fn test_read() { - let mut file = tempfile().unwrap(); - - file.write_all(&[1; 12345]).unwrap(); - file.write_all(&[2; 50]).unwrap(); - - let buf = Vec::with_capacity(12345); - let (buf, ret) = file.read_exact_at_async(buf, 0).await; - ret.unwrap(); - assert_eq!(buf.len(), 12345); - assert!(buf.iter().all(|x| *x == 1)); - - let buf = Vec::with_capacity(50); - let (buf, ret) = file.read_exact_at_async(buf, 12345).await; - ret.unwrap(); - assert_eq!(buf.len(), 50); - assert!(buf.iter().all(|x| *x == 2)); - } -} diff --git a/libsql-wal/src/io/mod.rs b/libsql-wal/src/io/mod.rs deleted file mode 100644 index 9ccff7cecf..0000000000 --- a/libsql-wal/src/io/mod.rs +++ /dev/null @@ -1,177 +0,0 @@ -use std::path::Path; -use std::sync::Arc; -use std::{future::Future, io}; - -use chrono::{DateTime, Utc}; -use rand::{rngs::ThreadRng, thread_rng, Rng}; -use uuid::Uuid; - -pub use self::file::FileExt; - -pub mod buf; -pub mod compat; -pub mod file; - -pub trait Io: Send + Sync + 'static { - type File: FileExt; - type TempFile: FileExt; - type Rng: Rng; - - fn create_dir_all(&self, path: &Path) -> io::Result<()>; - /// TODO: when adding an async variant make sure all places where async is needed are replaced - fn open( - &self, - create_new: bool, - read: bool, - write: bool, - path: &Path, - ) -> io::Result; - - // todo: create an async counterpart - fn tempfile(&self) -> io::Result; - fn now(&self) -> DateTime; - fn hard_link(&self, src: &Path, dst: &Path) -> io::Result<()>; - fn with_rng(&self, f: F) -> R - where - F: FnOnce(&mut Self::Rng) -> R; - fn uuid(&self) -> uuid::Uuid { - self.with_rng(|rng| { - let n: u128 = rng.gen(); - Uuid::from_u128(n) - }) - } - - fn remove_file_async(&self, path: &Path) -> impl Future> + Send; -} - -#[derive(Default, Debug, Clone, Copy)] -pub struct StdIO(pub(crate) ()); - -impl Io for StdIO { - type File = std::fs::File; - type TempFile = std::fs::File; - type Rng = ThreadRng; - - fn create_dir_all(&self, path: &Path) -> io::Result<()> { - std::fs::create_dir_all(path) - } - - fn open( - &self, - create_new: bool, - read: bool, - write: bool, - path: &Path, - ) -> io::Result { - std::fs::OpenOptions::new() - .create_new(create_new) - .create(write) - .read(read) - .write(write) - .open(path) - } - - fn tempfile(&self) -> io::Result { - tempfile::tempfile() - } - - fn now(&self) -> DateTime { - Utc::now() - } - - fn uuid(&self) -> Uuid { - Uuid::new_v4() - } - - fn hard_link(&self, src: &Path, dst: &Path) -> io::Result<()> { - std::fs::hard_link(src, dst) - } - - fn with_rng(&self, f: F) -> R - where - F: FnOnce(&mut Self::Rng) -> R, - { - f(&mut thread_rng()) - } - - async fn remove_file_async(&self, path: &Path) -> io::Result<()> { - tokio::fs::remove_file(path).await - } -} - -impl Io for Arc { - type File = T::File; - type TempFile = T::TempFile; - type Rng = T::Rng; - - fn create_dir_all(&self, path: &Path) -> io::Result<()> { - self.as_ref().create_dir_all(path) - } - - fn open( - &self, - create_new: bool, - read: bool, - write: bool, - path: &Path, - ) -> io::Result { - self.as_ref().open(create_new, read, write, path) - } - - fn tempfile(&self) -> io::Result { - self.as_ref().tempfile() - } - - fn now(&self) -> DateTime { - self.as_ref().now() - } - - fn uuid(&self) -> Uuid { - self.as_ref().uuid() - } - - fn hard_link(&self, src: &Path, dst: &Path) -> io::Result<()> { - self.as_ref().hard_link(src, dst) - } - - fn with_rng(&self, f: F) -> R - where - F: FnOnce(&mut Self::Rng) -> R, - { - self.as_ref().with_rng(f) - } - - async fn remove_file_async(&self, path: &Path) -> io::Result<()> { - self.as_ref().remove_file_async(path).await - } -} - -pub struct Inspect { - inner: W, - f: F, -} - -impl Inspect { - pub fn new(inner: W, f: F) -> Self { - Self { inner, f } - } - - pub(crate) fn into_inner(self) -> W { - self.inner - } -} - -impl io::Write for Inspect -where - W: io::Write, - for<'a> F: FnMut(&'a [u8]), -{ - fn write(&mut self, buf: &[u8]) -> io::Result { - (self.f)(buf); - self.inner.write(buf) - } - - fn flush(&mut self) -> io::Result<()> { - self.inner.flush() - } -} diff --git a/libsql-wal/src/lib.rs b/libsql-wal/src/lib.rs deleted file mode 100644 index 506f26fc90..0000000000 --- a/libsql-wal/src/lib.rs +++ /dev/null @@ -1,188 +0,0 @@ -#![allow(async_fn_in_trait, dead_code)] - -pub mod checkpointer; -pub mod error; -pub mod io; -pub mod registry; -pub mod replication; -pub mod segment; -mod segment_swap_strategy; -pub mod shared_wal; -pub mod storage; -pub mod transaction; -pub mod wal; - -const LIBSQL_MAGIC: u64 = u64::from_be_bytes(*b"LIBSQL\0\0"); -const LIBSQL_PAGE_SIZE: u16 = 4096; -const LIBSQL_WAL_VERSION: u16 = 1; - -use uuid::Uuid; -use zerocopy::byteorder::big_endian::{U128 as bu128, U16 as bu16, U64 as bu64}; -/// LibsqlFooter is located at the end of the libsql file. I contains libsql specific metadata, -/// while remaining fully compatible with sqlite (which just ignores that footer) -/// -/// The fields are in big endian to remain coherent with sqlite -#[derive(Copy, Clone, Debug, zerocopy::FromBytes, zerocopy::FromZeroes, zerocopy::AsBytes)] -#[repr(C)] -pub struct LibsqlFooter { - pub magic: bu64, - pub version: bu16, - /// Replication index checkpointed into this file. - /// only valid if there are no outstanding segments to checkpoint, since a checkpoint could be - /// partial. - pub replication_index: bu64, - /// Id of the log for this this database - pub log_id: bu128, -} - -impl LibsqlFooter { - pub fn log_id(&self) -> Uuid { - Uuid::from_u128(self.log_id.get()) - } - - fn validate(&self) -> error::Result<()> { - if self.magic.get() != LIBSQL_MAGIC { - return Err(error::Error::InvalidFooterMagic); - } - - if self.version.get() != LIBSQL_WAL_VERSION { - return Err(error::Error::InvalidFooterVersion); - } - - Ok(()) - } -} - -#[cfg(any(debug_assertions, test))] -pub mod test { - use std::fs::OpenOptions; - use std::path::Path; - use std::path::PathBuf; - use std::sync::Arc; - use std::time::Duration; - - use libsql_sys::name::NamespaceName; - use libsql_sys::rusqlite::OpenFlags; - use tempfile::{tempdir, TempDir}; - use tokio::sync::mpsc; - - use crate::checkpointer::LibsqlCheckpointer; - use crate::io::Io; - use crate::io::StdIO; - use crate::registry::WalRegistry; - use crate::shared_wal::SharedWal; - use crate::storage::TestStorage; - use crate::wal::{LibsqlWal, LibsqlWalManager}; - - pub struct TestEnv { - pub tmp: Arc, - pub registry: Arc>>, - pub wal: LibsqlWalManager>, - } - - impl TestEnv { - pub fn new() -> Self { - Self::new_store(false) - } - - pub fn new_store(store: bool) -> Self { - TestEnv::new_io(StdIO(()), store) - } - } - - impl TestEnv { - pub fn new_io(io: IO, store: bool) -> Self { - let tmp = tempdir().unwrap(); - Self::new_io_and_tmp(io, tmp.into(), store) - } - - pub fn new_io_and_tmp(io: IO, tmp: Arc, store: bool) -> Self { - let resolver = |path: &Path| { - let name = path - .parent() - .unwrap() - .file_name() - .unwrap() - .to_str() - .unwrap(); - NamespaceName::from_string(name.to_string()) - }; - - let (sender, receiver) = mpsc::channel(128); - let registry = Arc::new( - WalRegistry::new_with_io(io.clone(), TestStorage::new_io(store, io).into(), sender) - .unwrap(), - ); - - if store { - let checkpointer = LibsqlCheckpointer::new(registry.clone(), receiver, 5); - tokio::spawn(checkpointer.run()); - } - - let wal = LibsqlWalManager::new(registry.clone(), Arc::new(resolver)); - - Self { tmp, registry, wal } - } - - pub fn shared(&self, namespace: &str) -> Arc>> { - let path = self.tmp.path().join(namespace).join("data"); - let registry = self.registry.clone(); - let namespace = NamespaceName::from_string(namespace.into()); - registry.clone().open(path.as_ref(), &namespace).unwrap() - } - - pub fn db_path(&self, namespace: &str) -> PathBuf { - self.tmp.path().join(namespace) - } - - pub fn open_conn( - &self, - namespace: &'static str, - ) -> libsql_sys::Connection>> { - let path = self.db_path(namespace); - let wal = self.wal.clone(); - std::fs::create_dir_all(&path).unwrap(); - libsql_sys::Connection::open( - path.join("data"), - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - wal, - 100000, - None, - ) - .unwrap() - } - - pub fn db_file(&self, namespace: &str) -> std::fs::File { - let path = self.db_path(namespace); - OpenOptions::new() - .read(true) - .write(true) - .open(path) - .unwrap() - } - } - - pub fn seal_current_segment(shared: &SharedWal>) { - let mut tx = shared.begin_read(99999).into(); - shared.upgrade(&mut tx).unwrap(); - { - let mut guard = tx.as_write_mut().unwrap().lock(); - guard.commit(); - shared.swap_current(&mut guard).unwrap(); - } - tx.end(); - } - - pub async fn wait_current_durable(shared: &SharedWal) { - let current = shared.current.load().next_frame_no().get() - 1; - loop { - { - if *shared.durable_frame_no.lock() >= current { - break; - } - } - - tokio::time::sleep(Duration::from_millis(5)).await; - } - } -} diff --git a/libsql-wal/src/registry.rs b/libsql-wal/src/registry.rs deleted file mode 100644 index d0597652ea..0000000000 --- a/libsql-wal/src/registry.rs +++ /dev/null @@ -1,368 +0,0 @@ -use std::io; -use std::path::Path; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; -use std::time::Instant; - -use dashmap::DashMap; -use parking_lot::{Condvar, Mutex}; -use roaring::RoaringBitmap; -use tokio::sync::{mpsc, Notify, Semaphore}; -use tokio::task::JoinSet; -use tokio_stream::StreamExt; -use uuid::Uuid; -use zerocopy::{AsBytes, FromZeroes}; - -use crate::checkpointer::CheckpointMessage; -use crate::error::Result; -use crate::io::file::FileExt; -use crate::io::{Io, StdIO}; -use crate::replication::injector::Injector; -use crate::replication::storage::{ReplicateFromStorage as _, StorageReplicator}; -use crate::segment::sealed::SealedSegment; -use crate::shared_wal::SharedWal; -use crate::storage::Storage; -use crate::{LibsqlFooter, LIBSQL_PAGE_SIZE}; -use libsql_sys::name::NamespaceName; - -enum Slot { - Wal(Arc>), - /// Only a single thread is allowed to instantiate the wal. The first thread to acquire an - /// entry in the registry map puts a building slot. Other connections will wait for the mutex - /// to turn to true, after the slot has been updated to contain the wal - Building(Arc<(Condvar, Mutex)>, Arc), - /// The namespace was removed - Tombstone, -} - -/// Wal Registry maintains a set of shared Wal, and their respective set of files. -pub struct WalRegistry { - io: Arc, - shutdown: AtomicBool, - opened: DashMap>, - storage: Arc, - checkpoint_notifier: mpsc::Sender, -} - -impl WalRegistry { - pub fn new( - storage: Arc, - checkpoint_notifier: mpsc::Sender, - ) -> Result { - Self::new_with_io(StdIO(()), storage, checkpoint_notifier) - } -} - -impl WalRegistry { - pub fn new_with_io( - io: IO, - storage: Arc, - checkpoint_notifier: mpsc::Sender, - ) -> Result { - let registry = Self { - io: io.into(), - opened: Default::default(), - shutdown: Default::default(), - storage, - checkpoint_notifier, - }; - - Ok(registry) - } - - pub async fn get_async(&self, namespace: &NamespaceName) -> Option>> { - loop { - let notify = { - match self.opened.get(namespace).as_deref() { - Some(Slot::Wal(wal)) => return Some(wal.clone()), - Some(Slot::Building(_, notify)) => notify.clone(), - Some(Slot::Tombstone) => return None, - None => return None, - } - }; - - notify.notified().await - } - } -} - -impl WalRegistry -where - IO: Io, - S: Storage>, -{ - #[tracing::instrument(skip(self))] - pub fn open( - self: Arc, - db_path: &Path, - namespace: &NamespaceName, - ) -> Result>> { - if self.shutdown.load(Ordering::SeqCst) { - return Err(crate::error::Error::ShuttingDown); - } - - loop { - if let Some(entry) = self.opened.get(namespace) { - match &*entry { - Slot::Wal(wal) => return Ok(wal.clone()), - Slot::Building(cond, _) => { - let cond = cond.clone(); - cond.0 - .wait_while(&mut cond.1.lock(), |ready: &mut bool| !*ready); - // the slot was updated: try again - continue; - } - Slot::Tombstone => return Err(crate::error::Error::DeletingWal), - } - } - - let action = match self.opened.entry(namespace.clone()) { - dashmap::Entry::Occupied(e) => match e.get() { - Slot::Wal(shared) => return Ok(shared.clone()), - Slot::Building(wait, _) => Err(wait.clone()), - Slot::Tombstone => return Err(crate::error::Error::DeletingWal), - }, - dashmap::Entry::Vacant(e) => { - let notifier = Arc::new((Condvar::new(), Mutex::new(false))); - let async_notifier = Arc::new(Notify::new()); - e.insert(Slot::Building(notifier.clone(), async_notifier.clone())); - Ok((notifier, async_notifier)) - } - }; - - match action { - Ok((notifier, async_notifier)) => { - // if try_open succedded, then the slot was updated and contains the shared wal, if it - // failed we need to remove the slot. Either way, notify all waiters - let ret = match SharedWal::try_open( - self.io.clone(), - self.storage.clone(), - &self.checkpoint_notifier, - namespace, - db_path, - ) { - Ok(shared) => { - let shared = Arc::new(shared); - self.opened - .insert(namespace.clone(), Slot::Wal(shared.clone())); - Ok(shared) - } - Err(e) => { - tracing::error!("error opening wal: {e}"); - self.opened.remove(namespace); - Err(e) - } - }; - - *notifier.1.lock() = true; - notifier.0.notify_all(); - async_notifier.notify_waiters(); - - return ret; - } - Err(cond) => { - cond.0 - .wait_while(&mut cond.1.lock(), |ready: &mut bool| !*ready); - // the slot was updated: try again - continue; - } - } - } - } - - pub async fn tombstone(&self, namespace: &NamespaceName) -> Option>> { - // if a wal is currently being openned, let it - { - let v = self.opened.get(namespace)?; - if let Slot::Building(_, ref notify) = *v { - notify.clone().notified().await; - } - } - - match self.opened.insert(namespace.clone(), Slot::Tombstone) { - Some(Slot::Tombstone) => None, - Some(Slot::Building(_, _)) => { - // FIXME: that could happen is someone removed it and immediately reopenned the - // wal. fix by retrying in a loop - unreachable!("already waited for ns to open") - } - Some(Slot::Wal(wal)) => Some(wal), - None => None, - } - } - - pub async fn remove(&self, namespace: &NamespaceName) { - // if a wal is currently being openned, let it - { - let v = self.opened.get(namespace); - if let Some(Slot::Building(_, ref notify)) = v.as_deref() { - notify.clone().notified().await; - } - } - - self.opened.remove(namespace); - } - - /// Attempts to sync all loaded dbs with durable storage - pub async fn sync_all(&self, conccurency: usize) -> Result<()> - where - S: Storage, - { - let mut join_set = JoinSet::new(); - tracing::info!("syncing {} namespaces", self.opened.len()); - // FIXME: arbitrary value, maybe use something like numcpu * 2? - let before_sync = Instant::now(); - let sem = Arc::new(Semaphore::new(conccurency)); - for entry in self.opened.iter() { - let Slot::Wal(shared) = entry.value() else { - panic!("all wals should already be opened") - }; - let storage = self.storage.clone(); - let shared = shared.clone(); - let sem = sem.clone(); - let permit = sem.acquire_owned().await.unwrap(); - - join_set.spawn(async move { - let _permit = permit; - sync_one(shared, storage).await - }); - - if let Some(ret) = join_set.try_join_next() { - ret.unwrap()?; - } - } - - while let Some(ret) = join_set.join_next().await { - ret.unwrap()?; - } - - tracing::info!("synced in {:?}", before_sync.elapsed()); - - Ok(()) - } - - // On shutdown, we checkpoint all the WALs. This require sealing the current segment, and when - // checkpointing all the segments - pub async fn shutdown(self: Arc) -> Result<()> { - tracing::info!("shutting down registry"); - self.shutdown.store(true, Ordering::SeqCst); - - let mut join_set = JoinSet::>::new(); - let semaphore = Arc::new(Semaphore::new(8)); - for item in self.opened.iter() { - let (name, slot) = item.pair(); - loop { - match slot { - Slot::Wal(shared) => { - // acquire a permit or drain the join set - let permit = loop { - tokio::select! { - permit = semaphore.clone().acquire_owned() => break permit, - _ = join_set.join_next() => (), - } - }; - let shared = shared.clone(); - let name = name.clone(); - - join_set.spawn_blocking(move || { - let _permit = permit; - if let Err(e) = shared.shutdown() { - tracing::error!("error shutting down `{name}`: {e}"); - } - - Ok(()) - }); - break; - } - Slot::Building(_, notify) => { - // wait for shared to finish building - notify.notified().await; - } - Slot::Tombstone => continue, - } - } - } - - while join_set.join_next().await.is_some() {} - - // we process any pending storage job, then checkpoint everything - self.storage.shutdown().await; - - // wait for checkpointer to exit - let _ = self - .checkpoint_notifier - .send(CheckpointMessage::Shutdown) - .await; - self.checkpoint_notifier.closed().await; - - tracing::info!("registry shutdown gracefully"); - - Ok(()) - } - - pub fn storage(&self) -> Arc { - self.storage.clone() - } -} - -#[tracing::instrument(skip_all, fields(namespace = shared.namespace.as_str()))] -async fn sync_one(shared: Arc>, storage: Arc) -> Result<()> -where - IO: Io, - S: Storage>, -{ - let remote_durable_frame_no = storage - .durable_frame_no(shared.namespace(), None) - .await - .map_err(Box::new)?; - let local_current_frame_no = shared.current.load().next_frame_no().get() - 1; - - if remote_durable_frame_no > local_current_frame_no { - tracing::info!( - remote_durable_frame_no, - local_current_frame_no, - "remote storage has newer segments" - ); - let mut seen = RoaringBitmap::new(); - let replicator = StorageReplicator::new(storage, shared.namespace().clone()); - let stream = replicator - .stream(&mut seen, remote_durable_frame_no, 1) - .peekable(); - let mut injector = Injector::new(shared.clone(), 10)?; - // we set the durable frame_no before we start injecting, because the wal may want to - // checkpoint on commit. - injector.set_durable(remote_durable_frame_no); - // use pin to the heap so that we can drop the stream in the loop, and count `seen`. - let mut stream = Box::pin(stream); - loop { - match stream.next().await { - Some(Ok(mut frame)) => { - if stream.peek().await.is_none() { - drop(stream); - frame.header_mut().set_size_after(seen.len() as _); - injector.insert_frame(frame).await?; - break; - } else { - injector.insert_frame(frame).await?; - } - } - Some(Err(e)) => todo!("handle error: {e}, {}", shared.namespace()), - None => break, - } - } - } - - tracing::info!("local database is up to date"); - - Ok(()) -} - -fn read_log_id_from_footer(db_file: &F, db_size: u64) -> io::Result { - let mut footer: LibsqlFooter = LibsqlFooter::new_zeroed(); - let footer_offset = LIBSQL_PAGE_SIZE as u64 * db_size; - // FIXME: failing to read the footer here is a sign of corrupted database: either we - // have a tail to the segment list, or we have fully checkpointed the database. Can we - // recover from that? - db_file.read_exact_at(footer.as_bytes_mut(), footer_offset)?; - Ok(footer.log_id()) -} diff --git a/libsql-wal/src/replication/injector.rs b/libsql-wal/src/replication/injector.rs deleted file mode 100644 index 7a7c73b20a..0000000000 --- a/libsql-wal/src/replication/injector.rs +++ /dev/null @@ -1,193 +0,0 @@ -//! The injector is the module in charge of injecting frames into a replica database. - -use std::sync::Arc; - -use crate::error::Result; -use crate::io::Io; -use crate::segment::sealed::SealedSegment; -use crate::segment::Frame; -use crate::shared_wal::SharedWal; -use crate::storage::Storage; -use crate::transaction::{Transaction, TxGuardOwned}; - -/// The injector takes frames and injects them in the wal. -pub struct Injector { - // The wal to which we are injecting - wal: Arc>, - buffer: Vec>, - /// capacity of the frame buffer - capacity: usize, - tx: Option>, - max_tx_frame_no: u64, - previous_durable_frame_no: u64, -} - -impl Injector -where - IO: Io, - S: Storage>, -{ - pub fn new(wal: Arc>, buffer_capacity: usize) -> Result { - Ok(Self { - wal, - buffer: Vec::with_capacity(buffer_capacity), - capacity: buffer_capacity, - tx: None, - max_tx_frame_no: 0, - previous_durable_frame_no: 0, - }) - } - - pub fn set_durable(&mut self, durable_frame_no: u64) { - let mut old = self.wal.durable_frame_no.lock(); - if *old <= durable_frame_no { - self.previous_durable_frame_no = *old; - *old = durable_frame_no; - } else { - todo!("primary reported older frame_no than current"); - } - } - - pub fn current_durable(&self) -> u64 { - *self.wal.durable_frame_no.lock() - } - - pub fn maybe_begin_txn(&mut self) -> Result<()> { - if self.tx.is_none() { - let mut tx = Transaction::Read(self.wal.begin_read(u64::MAX)); - self.wal.upgrade(&mut tx)?; - let tx = tx - .into_write() - .unwrap_or_else(|_| unreachable!()) - .into_lock_owned(); - assert!(self.tx.replace(tx).is_none()); - } - - Ok(()) - } - - pub async fn insert_frame(&mut self, frame: Box) -> Result> { - self.maybe_begin_txn()?; - let size_after = frame.size_after(); - self.max_tx_frame_no = self.max_tx_frame_no.max(frame.header().frame_no()); - self.buffer.push(frame); - - if size_after.is_some() || self.capacity == self.buffer.len() { - self.flush(size_after).await?; - } - - Ok(size_after.map(|_| self.max_tx_frame_no)) - } - - pub async fn flush(&mut self, size_after: Option) -> Result<()> { - if !self.buffer.is_empty() && self.tx.is_some() { - let last_committed_frame_no = self.max_tx_frame_no; - { - let tx = self.tx.as_mut().expect("we just checked that tx was there"); - let buffer = std::mem::take(&mut self.buffer); - let current = self.wal.current.load(); - let commit_data = size_after.map(|size| (size, self.max_tx_frame_no)); - if commit_data.is_some() { - self.max_tx_frame_no = 0; - } - let buffer = current.inject_frames(buffer, commit_data, tx).await?; - self.buffer = buffer; - self.buffer.clear(); - } - - if size_after.is_some() { - let mut tx = self.tx.take().unwrap(); - self.wal - .new_frame_notifier - .send_replace(last_committed_frame_no); - // the strategy to swap the current log is to do it on change of durable boundary, - // when we have caught up with the current durable frame_no - if self.current_durable() != self.previous_durable_frame_no - && self.current_durable() >= self.max_tx_frame_no - { - let wal = self.wal.clone(); - // FIXME: tokio dependency here is annoying, we need an async version of swap_current. - tokio::task::spawn_blocking(move || { - tx.commit(); - wal.swap_current(&tx) - }) - .await - .unwrap()? - } - } - } - - Ok(()) - } - - pub fn rollback(&mut self) { - self.buffer.clear(); - if let Some(tx) = self.tx.as_mut() { - tx.reset(0); - } - } -} - -#[cfg(test)] -mod test { - use tokio_stream::StreamExt; - - use crate::replication::replicator::Replicator; - use crate::test::TestEnv; - - use super::*; - - #[tokio::test] - async fn inject_basic() { - let primary_env = TestEnv::new(); - let primary_conn = primary_env.open_conn("test"); - let primary_shared = primary_env.shared("test"); - - let replicator = Replicator::new(primary_shared.clone(), 1, true); - let stream = replicator.into_frame_stream(); - - tokio::pin!(stream); - - // setup replica - let replica_env = TestEnv::new(); - let replica_conn = replica_env.open_conn("test"); - let replica_shared = replica_env.shared("test"); - - let mut injector = Injector::new(replica_shared.clone(), 10).unwrap(); - - primary_conn.execute("create table test (x)", ()).unwrap(); - - primary_shared.last_committed_frame_no(); - for _ in 0..2 { - let frame = stream.next().await.unwrap().unwrap(); - injector.insert_frame(frame).await.unwrap(); - } - - replica_conn - .query_row("select count(*) from test", (), |r| { - assert_eq!(r.get_unwrap::<_, usize>(0), 0); - Ok(()) - }) - .unwrap(); - - primary_conn - .execute("insert into test values (123)", ()) - .unwrap(); - primary_conn - .execute("insert into test values (123)", ()) - .unwrap(); - primary_conn - .execute("insert into test values (123)", ()) - .unwrap(); - - let frame = stream.next().await.unwrap().unwrap(); - injector.insert_frame(frame).await.unwrap(); - - replica_conn - .query_row("select count(*) from test", (), |r| { - assert_eq!(r.get_unwrap::<_, usize>(0), 3); - Ok(()) - }) - .unwrap(); - } -} diff --git a/libsql-wal/src/replication/mod.rs b/libsql-wal/src/replication/mod.rs deleted file mode 100644 index f2a1ab3ebb..0000000000 --- a/libsql-wal/src/replication/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::io; - -pub mod injector; -pub mod replicator; -pub mod storage; - -pub(crate) type Result = std::result::Result; - -type BoxError = Box; - -#[derive(Debug, thiserror::Error)] -pub enum Error { - #[error("io error {0}")] - IO(#[from] io::Error), - #[error("error fetching from storage: {0}")] - Storage(#[from] super::storage::Error), - #[error("error fetching from current segment: {0}")] - CurrentSegment(BoxError), - #[error("error fetching from sealed segment list: {0}")] - SealedSegment(BoxError), -} diff --git a/libsql-wal/src/replication/replicator.rs b/libsql-wal/src/replication/replicator.rs deleted file mode 100644 index 8124dcb65c..0000000000 --- a/libsql-wal/src/replication/replicator.rs +++ /dev/null @@ -1,345 +0,0 @@ -use std::pin::Pin; -use std::sync::Arc; - -use roaring::RoaringBitmap; -use tokio::sync::watch; -use tokio_stream::{Stream, StreamExt as _}; - -use crate::io::Io; -use crate::replication::Error; -use crate::segment::Frame; -use crate::shared_wal::SharedWal; -use crate::storage::Storage; - -use super::Result; - -pub struct Replicator { - shared: Arc>, - new_frame_notifier: watch::Receiver, - next_frame_no: u64, - wait_for_more: bool, -} - -impl Replicator { - pub fn new(shared: Arc>, next_frame_no: u64, wait_for_more: bool) -> Self { - let new_frame_notifier = shared.new_frame_notifier.subscribe(); - Self { - shared, - new_frame_notifier, - next_frame_no, - wait_for_more, - } - } - - /// Stream frames from this replicator. The replicator will wait for new frames to become - /// available, and never return. - /// - /// The replicator keeps track of how much progress has been made by the replica, and will - /// attempt to find the next frames to send with following strategy: - /// - First, replicate as much as possible from the current log - /// - The, if we still haven't caught up with `self.start_frame_no`, we select the next frames - /// to replicate from tail of current. - /// - Finally, if we still haven't reached `self.start_frame_no`, read from durable storage - /// (todo: maybe the replica should read from durable storage directly?) - /// - /// In a single replication step, the replicator guarantees that a minimal set of frames is - /// sent to the replica. - #[tracing::instrument(skip(self))] - pub fn into_frame_stream(mut self) -> impl Stream>> + Send { - async_stream::try_stream! { - loop { - // First we decide up to what frame_no we want to replicate in this step. If we are - // already up to date, wait for something to happen - tracing::debug!(next_frame_no = self.next_frame_no); - let most_recent_frame_no = *self - .new_frame_notifier - .wait_for(|fno| *fno >= self.next_frame_no) - .await - .expect("channel cannot be closed because we hold a ref to the sending end"); - - tracing::debug!(most_recent_frame_no, "new frame_no available"); - - let mut commit_frame_no = 0; - let tx = self.shared.begin_read(u64::MAX); - // we have stuff to replicate - if most_recent_frame_no >= self.next_frame_no { - // first replicate the most recent version of each page from the current - // segment. We also return how far back we have replicated from the current log - let mut seen = RoaringBitmap::new(); - let (stream, replicated_until) = tx.current.frame_stream_from(self.next_frame_no, &mut seen, &tx); - let should_replicate_from_tail = replicated_until != self.next_frame_no; - - { - tokio::pin!(stream); - - let mut stream = stream.peekable(); - - tracing::debug!(replicated_until, "replicating from current log"); - loop { - let Some(frame) = stream.next().await else { break }; - let mut frame = frame.map_err(|e| Error::CurrentSegment(e.into()))?; - commit_frame_no = frame.header().frame_no().max(commit_frame_no); - if stream.peek().await.is_none() && !should_replicate_from_tail { - frame.header_mut().set_size_after(tx.db_size); - self.next_frame_no = commit_frame_no + 1; - } - - yield frame - } - } - - // Replicating from the current segment wasn't enough to bring us up to date, - // wee need to take frames from the sealed segments. - if should_replicate_from_tail { - let replicated_until = { - let (stream, replicated_until) = tx.current - .tail() - .stream_pages_from(replicated_until, self.next_frame_no, &mut seen, &tx).await; - tokio::pin!(stream); - - tracing::debug!(replicated_until, "replicating from tail"); - let mut stream = stream.peekable(); - - let should_replicate_from_storage = replicated_until != self.next_frame_no; - - loop { - let Some(frame) = stream.next().await else { break }; - let mut frame = frame.map_err(|e| Error::SealedSegment(e.into()))?; - commit_frame_no = frame.header().frame_no().max(commit_frame_no); - if stream.peek().await.is_none() && !should_replicate_from_storage { - frame.header_mut().set_size_after(tx.db_size); - self.next_frame_no = commit_frame_no + 1; - } - - yield frame - } - - should_replicate_from_storage.then_some(replicated_until) - }; - - // Replicating from sealed segments was not enough, so we replicate from - // durable storage - if let Some(replicated_until) = replicated_until { - let stream: Pin + Send>> = if self.next_frame_no == 1 { - // we're replicating from scratch, read straight from the main db - // file - tracing::debug!("replicating main db file"); - Box::pin(self.shared.replicate_from_db_file(&mut seen, &tx, replicated_until)) - } else { - tracing::debug!("replicating from durable storage"); - Box::pin(self - .shared - .stored_segments - .stream(&mut seen, replicated_until, self.next_frame_no) - .peekable()) - }; - - let stream = stream.peekable(); - - tokio::pin!(stream); - - loop { - let Some(frame) = stream.next().await else { break }; - let mut frame = frame?; - commit_frame_no = frame.header().frame_no().max(commit_frame_no); - if stream.peek().await.is_none() { - frame.header_mut().set_size_after(tx.db_size); - self.next_frame_no = commit_frame_no + 1; - } - - yield frame - } - } - } - } - - if !self.wait_for_more { - break - } - } - } - } -} - -#[cfg(test)] -mod test { - use std::time::Duration; - - use tempfile::NamedTempFile; - use tokio_stream::StreamExt; - - use crate::io::FileExt; - use crate::test::{seal_current_segment, TestEnv}; - - use super::*; - - #[tokio::test] - async fn stream_from_current_log() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - - for _ in 0..50 { - conn.execute("insert into test values (randomblob(128))", ()) - .unwrap(); - } - - let replicator = Replicator::new(shared.clone(), 1, true); - - let tmp = NamedTempFile::new().unwrap(); - let stream = replicator.into_frame_stream(); - tokio::pin!(stream); - let mut last_frame_no = 0; - let mut size_after; - loop { - let frame = stream.next().await.unwrap().unwrap(); - // the last frame should commit - size_after = frame.header().size_after(); - last_frame_no = last_frame_no.max(frame.header().frame_no()); - let offset = (frame.header().page_no() - 1) * 4096; - tmp.as_file() - .write_all_at(frame.data(), offset as _) - .unwrap(); - if size_after != 0 { - break; - } - } - - assert_eq!(size_after, 4); - assert_eq!(last_frame_no, 55); - - { - let conn = libsql_sys::rusqlite::Connection::open(tmp.path()).unwrap(); - conn.query_row("select count(0) from test", (), |row| { - let count = row.get_unwrap::<_, usize>(0); - assert_eq!(count, 50); - Ok(()) - }) - .unwrap(); - } - - seal_current_segment(&shared); - - for _ in 0..50 { - conn.execute("insert into test values (randomblob(128))", ()) - .unwrap(); - } - - let mut size_after; - loop { - let frame = stream.next().await.unwrap().unwrap(); - assert!(frame.header().frame_no() > last_frame_no); - size_after = frame.header().size_after(); - // the last frame should commit - let offset = (frame.header().page_no() - 1) * 4096; - tmp.as_file() - .write_all_at(frame.data(), offset as _) - .unwrap(); - if size_after != 0 { - break; - } - } - - assert_eq!(size_after, 6); - - { - let conn = libsql_sys::rusqlite::Connection::open(tmp.path()).unwrap(); - conn.query_row("select count(0) from test", (), |row| { - let count = row.get_unwrap::<_, usize>(0); - assert_eq!(count, 100); - Ok(()) - }) - .unwrap(); - } - - // replicate everything from scratch again - { - let tmp = NamedTempFile::new().unwrap(); - let replicator = Replicator::new(shared.clone(), 1, true); - let stream = replicator.into_frame_stream(); - - tokio::pin!(stream); - - loop { - let frame = stream.next().await.unwrap().unwrap(); - // the last frame should commit - let offset = (frame.header().page_no() - 1) * 4096; - tmp.as_file() - .write_all_at(frame.data(), offset as _) - .unwrap(); - if frame.header().size_after() != 0 { - break; - } - } - - let conn = libsql_sys::rusqlite::Connection::open(tmp.path()).unwrap(); - conn.query_row("select count(0) from test", (), |row| { - let count = row.get_unwrap::<_, usize>(0); - assert_eq!(count, 100); - Ok(()) - }) - .unwrap(); - } - } - - #[tokio::test] - async fn stream_from_storage() { - let env = TestEnv::new_store(true); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - - conn.execute("insert into test values (randomblob(128))", ()) - .unwrap(); - - tokio::task::spawn_blocking({ - let shared = shared.clone(); - move || seal_current_segment(&shared) - }) - .await - .unwrap(); - - conn.execute("create table test2 (x)", ()).unwrap(); - conn.execute("insert into test2 values (randomblob(128))", ()) - .unwrap(); - - tokio::task::spawn_blocking({ - let shared = shared.clone(); - move || seal_current_segment(&shared) - }) - .await - .unwrap(); - - while !shared.current.load().tail().is_empty() { - tokio::time::sleep(Duration::from_millis(50)).await; - } - - let db_content = std::fs::read(&env.db_path("test").join("data")).unwrap(); - - let replicator = Replicator::new(shared, 1, true); - let stream = replicator.into_frame_stream().take(3); - - tokio::pin!(stream); - - let tmp = NamedTempFile::new().unwrap(); - let mut replica_content = vec![0u8; db_content.len()]; - while let Some(f) = stream.next().await { - let frame = f.unwrap(); - let offset = (frame.header().page_no() as usize - 1) * 4096; - tmp.as_file() - .write_all_at(frame.data(), offset as u64) - .unwrap(); - replica_content[offset..offset + 4096].copy_from_slice(frame.data()); - } - - assert_eq!(db_payload(&replica_content), db_payload(&db_content)); - } - - fn db_payload(db: &[u8]) -> &[u8] { - let size = (db.len() / 4096) * 4096; - &db[..size] - } -} diff --git a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-2.snap b/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-2.snap deleted file mode 100644 index f6bad7ae8f..0000000000 --- a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-2.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: libsql-wal/src/replication/replicator.rs -expression: frame.header() ---- -FrameHeader { - page_no: U32( - 2, - ), - size_after: U32( - 2, - ), - frame_no: U64( - 2, - ), -} diff --git a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-3.snap b/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-3.snap deleted file mode 100644 index a535349af9..0000000000 --- a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-3.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: libsql-wal/src/replication/replicator.rs -expression: frame.header() ---- -FrameHeader { - page_no: U32( - 1, - ), - size_after: U32( - 0, - ), - frame_no: U64( - 1, - ), -} diff --git a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-4.snap b/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-4.snap deleted file mode 100644 index 6d92df42e9..0000000000 --- a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log-4.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: libsql-wal/src/replication/replicator.rs -expression: frame.header() ---- -FrameHeader { - page_no: U32( - 2, - ), - size_after: U32( - 2, - ), - frame_no: U64( - 3, - ), -} diff --git a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log.snap b/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log.snap deleted file mode 100644 index f6bad7ae8f..0000000000 --- a/libsql-wal/src/replication/snapshots/libsql_wal__replication__replicator__test__stream_from_current_log.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: libsql-wal/src/replication/replicator.rs -expression: frame.header() ---- -FrameHeader { - page_no: U32( - 2, - ), - size_after: U32( - 2, - ), - frame_no: U64( - 2, - ), -} diff --git a/libsql-wal/src/replication/storage.rs b/libsql-wal/src/replication/storage.rs deleted file mode 100644 index aa71531e36..0000000000 --- a/libsql-wal/src/replication/storage.rs +++ /dev/null @@ -1,96 +0,0 @@ -use std::pin::Pin; -use std::sync::Arc; - -use fst::{IntoStreamer, Streamer}; -use libsql_sys::name::NamespaceName; -use roaring::RoaringBitmap; -use tokio_stream::Stream; -use zerocopy::FromZeroes; - -use crate::io::buf::ZeroCopyBoxIoBuf; -use crate::segment::compacted::CompactedFrame; -use crate::segment::Frame; -use crate::storage::backend::FindSegmentReq; -use crate::storage::Storage; - -use super::Result; - -pub trait ReplicateFromStorage: Sync + Send + 'static { - fn stream<'a, 'b>( - &'b self, - seen: &'a mut RoaringBitmap, - current: u64, - until: u64, - ) -> Pin>> + 'a + Send>>; -} - -pub struct StorageReplicator { - storage: Arc, - namespace: NamespaceName, -} - -impl StorageReplicator { - pub fn new(storage: Arc, namespace: NamespaceName) -> Self { - Self { storage, namespace } - } -} - -impl ReplicateFromStorage for StorageReplicator -where - S: Storage, -{ - fn stream<'a, 'b>( - &'b self, - seen: &'a mut roaring::RoaringBitmap, - mut current: u64, - until: u64, - ) -> Pin>> + Send + 'a>> { - let storage = self.storage.clone(); - let namespace = self.namespace.clone(); - Box::pin(async_stream::try_stream! { - loop { - let key = storage.find_segment(&namespace, FindSegmentReq::EndFrameNoLessThan(current), None).await?; - let index = storage.fetch_segment_index(&namespace, &key, None).await?; - let mut pages = index.into_stream(); - let mut maybe_seg = None; - while let Some((page, offset)) = pages.next() { - let page = u32::from_be_bytes(page.try_into().unwrap()); - // this segment contains data we are interested in, lazy dowload the segment - if !seen.contains(page) { - seen.insert(page); - let segment = match maybe_seg { - Some(ref seg) => seg, - None => { - tracing::debug!(key = %key, "fetching segment"); - maybe_seg = Some(storage.fetch_segment_data(&namespace, &key, None).await?); - maybe_seg.as_ref().unwrap() - }, - }; - - // TODO: The copy here is inneficient. This is OK for now, until we rewrite - // this code to read from the main db file instead of storage. - let (compacted_frame, ret) = segment.read_frame(ZeroCopyBoxIoBuf::new_uninit(CompactedFrame::new_box_zeroed()), offset as u32).await; - ret?; - let compacted_frame = compacted_frame.into_inner(); - let mut frame = Frame::new_box_zeroed(); - frame.data_mut().copy_from_slice(&compacted_frame.data); - - let header = frame.header_mut(); - header.frame_no = compacted_frame.header().frame_no; - header.size_after = 0.into(); - header.page_no = compacted_frame.header().page_no; - - if frame.header().frame_no() >= until { - yield frame; - } - }; - } - - if key.start_frame_no <= until { - break - } - current = key.start_frame_no - 1; - } - }) - } -} diff --git a/libsql-wal/src/segment/compacted.rs b/libsql-wal/src/segment/compacted.rs deleted file mode 100644 index 5c123cf26e..0000000000 --- a/libsql-wal/src/segment/compacted.rs +++ /dev/null @@ -1,212 +0,0 @@ -use std::io; -use std::mem::{offset_of, size_of}; - -use chrono::{DateTime, Utc}; -use uuid::Uuid; -use zerocopy::little_endian::{U128 as lu128, U16 as lu16, U32 as lu32, U64 as lu64}; -use zerocopy::{AsBytes, FromBytes, FromZeroes}; - -use crate::io::buf::{IoBufMut, ZeroCopyBuf}; -use crate::io::FileExt; -use crate::{LIBSQL_MAGIC, LIBSQL_PAGE_SIZE, LIBSQL_WAL_VERSION}; - -use super::Result; - -#[derive(Debug, AsBytes, FromZeroes, FromBytes)] -#[repr(C)] -pub struct CompactedSegmentHeader { - pub(crate) magic: lu64, - pub(crate) version: lu16, - pub(crate) log_id: lu128, - pub(crate) start_frame_no: lu64, - pub(crate) end_frame_no: lu64, - pub(crate) size_after: lu32, - /// for now, always 4096 - pub(crate) page_size: lu16, - pub(crate) timestamp: lu64, -} - -bitflags::bitflags! { - pub struct CompactedFrameFlags: u32 { - /// This flag is set for the last frame in the segment - const LAST = 1 << 0; - } -} - -#[derive(Debug, AsBytes, FromZeroes, FromBytes)] -#[repr(C)] -pub struct CompactedFrameHeader { - pub flags: lu32, - pub page_no: lu32, - pub frame_no: lu64, - /// running checksum from this frame - /// this is the crc32 of the checksum of the previous frame and all the frame data, including - /// all the fields before checksum in the header. THIS FIELD MUST ALWAYS BE THE last FIELD IN - /// THE STRUCT - pub checksum: lu32, -} - -impl CompactedFrameHeader { - pub fn flags(&self) -> CompactedFrameFlags { - CompactedFrameFlags::from_bits(self.flags.get()).unwrap() - } - - pub(crate) fn is_last(&self) -> bool { - self.flags().contains(CompactedFrameFlags::LAST) - } - - pub(crate) fn set_last(&mut self) { - let mut flags = self.flags(); - flags.insert(CompactedFrameFlags::LAST); - self.flags = flags.bits().into(); - } - - pub(crate) fn reset_flags(&mut self) { - self.flags = 0.into(); - } - - pub(crate) fn compute_checksum(&self, previous: u32, data: &[u8]) -> u32 { - assert_eq!(data.len(), LIBSQL_PAGE_SIZE as usize); - let mut h = crc32fast::Hasher::new_with_initial(previous); - h.update(&self.as_bytes()[..offset_of!(Self, checksum)]); - h.update(data); - h.finalize() - } - - /// updates the checksum with the previous frame checksum and the frame data - pub(crate) fn update_checksum(&mut self, previous: u32, data: &[u8]) -> u32 { - let checksum = self.compute_checksum(previous, data); - self.checksum = checksum.into(); - checksum - } - - pub fn checksum(&self) -> u32 { - self.checksum.get() - } - - pub fn page_no(&self) -> u32 { - self.page_no.get() - } -} - -#[derive(Debug, AsBytes, FromZeroes, FromBytes)] -#[repr(C)] -pub struct CompactedFrame { - pub header: CompactedFrameHeader, - pub data: [u8; LIBSQL_PAGE_SIZE as usize], -} - -impl CompactedFrame { - pub fn header(&self) -> &CompactedFrameHeader { - &self.header - } - - pub(crate) fn header_mut(&mut self) -> &mut CompactedFrameHeader { - &mut self.header - } -} - -impl CompactedSegmentHeader { - pub fn new( - start_frame_no: u64, - end_frame_no: u64, - size_after: u32, - timestamp: DateTime, - log_id: Uuid, - ) -> Self { - Self { - magic: LIBSQL_MAGIC.into(), - version: LIBSQL_WAL_VERSION.into(), - start_frame_no: start_frame_no.into(), - end_frame_no: end_frame_no.into(), - size_after: size_after.into(), - page_size: LIBSQL_PAGE_SIZE.into(), - timestamp: (timestamp.timestamp_millis() as u64).into(), - log_id: log_id.as_u128().into(), - } - } - - fn check(&self) -> Result<()> { - if self.magic.get() != LIBSQL_MAGIC { - return Err(super::Error::InvalidHeaderMagic); - } - - if self.page_size.get() != LIBSQL_PAGE_SIZE { - return Err(super::Error::InvalidPageSize); - } - - if self.version.get() != LIBSQL_WAL_VERSION { - return Err(super::Error::InvalidPageSize); - } - - Ok(()) - } - - pub fn size_after(&self) -> u32 { - self.size_after.get() - } -} - -pub struct CompactedSegment { - header: CompactedSegmentHeader, - file: F, -} - -impl CompactedSegment { - pub fn remap_file_type(self, f: FN) -> CompactedSegment - where - FN: FnOnce(F) -> T, - { - CompactedSegment { - header: self.header, - file: f(self.file), - } - } - - pub fn header(&self) -> &CompactedSegmentHeader { - &self.header - } -} - -impl CompactedSegment { - pub(crate) async fn open(file: F) -> Result { - let buf = ZeroCopyBuf::new_uninit(); - let (buf, ret) = file.read_exact_at_async(buf, 0).await; - ret?; - let header: CompactedSegmentHeader = buf.into_inner(); - header.check()?; - Ok(Self { file, header }) - } - - pub(crate) fn from_parts(file: F, header: CompactedSegmentHeader) -> Self { - Self { header, file } - } - - /// read a CompactedFrame from the segment - pub(crate) async fn read_frame( - &self, - buf: B, - offset: u32, - ) -> (B, io::Result<()>) { - assert_eq!(buf.bytes_init(), 0); - assert_eq!(buf.bytes_total(), size_of::()); - let offset = - size_of::() + size_of::() * offset as usize; - let (buf, ret) = self.file.read_exact_at_async(buf, offset as u64).await; - (buf, ret) - } - - pub(crate) async fn read_page( - &self, - buf: B, - offset: u32, - ) -> (B, io::Result<()>) { - assert_eq!(buf.bytes_init(), 0); - assert_eq!(buf.bytes_total(), LIBSQL_PAGE_SIZE as usize); - let offset = size_of::() - + size_of::() * offset as usize - + size_of::(); - let (buf, ret) = self.file.read_exact_at_async(buf, offset as u64).await; - (buf, ret) - } -} diff --git a/libsql-wal/src/segment/current.rs b/libsql-wal/src/segment/current.rs deleted file mode 100644 index 11a1234eb7..0000000000 --- a/libsql-wal/src/segment/current.rs +++ /dev/null @@ -1,1024 +0,0 @@ -use std::hash::Hasher; -use std::io::{BufWriter, IoSlice, Write}; -use std::num::NonZeroU64; -use std::ops::DerefMut; -use std::path::PathBuf; -use std::sync::atomic::AtomicU32; -use std::sync::{ - atomic::{AtomicBool, AtomicU64, Ordering}, - Arc, -}; - -use chrono::{DateTime, Utc}; -use crossbeam_skiplist::SkipMap; -use fst::MapBuilder; -use parking_lot::{Mutex, RwLock}; -use roaring::RoaringBitmap; -use tokio_stream::Stream; -use uuid::Uuid; -use zerocopy::little_endian::U32; -use zerocopy::{AsBytes, FromZeroes}; - -use crate::io::buf::{IoBufMut, ZeroCopyBoxIoBuf, ZeroCopyBuf}; -use crate::io::file::FileExt; -use crate::io::Inspect; -use crate::segment::{checked_frame_offset, SegmentFlags}; -use crate::segment::{frame_offset, page_offset, sealed::SealedSegment}; -use crate::transaction::{ReadTransaction, Transaction, TxGuardOwned, TxGuardShared}; -use crate::{LIBSQL_MAGIC, LIBSQL_PAGE_SIZE, LIBSQL_WAL_VERSION}; - -use super::list::SegmentList; -use super::{CheckedFrame, Frame, FrameHeader, SegmentHeader}; - -use crate::error::Result; - -pub struct CurrentSegment { - path: PathBuf, - index: SegmentIndex, - header: Mutex, - file: Arc, - /// Read lock count on this segment. Each begin_read increments the count of readers on the current - /// lock - read_locks: Arc, - sealed: AtomicBool, - /// current running checksum - current_checksum: AtomicU32, - tail: Arc>>, -} - -impl CurrentSegment { - /// Create a new segment from the given path and metadata. The file pointed to by path must not - /// exist. - pub fn create( - segment_file: F, - path: PathBuf, - start_frame_no: NonZeroU64, - db_size: u32, - tail: Arc>>, - salt: u32, - log_id: Uuid, - ) -> Result - where - F: FileExt, - { - let mut header = SegmentHeader { - start_frame_no: start_frame_no.get().into(), - last_commited_frame_no: 0.into(), - size_after: db_size.into(), - index_offset: 0.into(), - index_size: 0.into(), - header_cheksum: 0.into(), - flags: 0.into(), - magic: LIBSQL_MAGIC.into(), - version: LIBSQL_WAL_VERSION.into(), - salt: salt.into(), - page_size: LIBSQL_PAGE_SIZE.into(), - log_id: log_id.as_u128().into(), - frame_count: 0.into(), - sealed_at_timestamp: 0.into(), - }; - - header.recompute_checksum(); - - segment_file.write_all_at(header.as_bytes(), 0)?; - - Ok(Self { - path: path.to_path_buf(), - index: SegmentIndex::new(start_frame_no.get()), - header: Mutex::new(header), - file: segment_file.into(), - read_locks: Arc::new(AtomicU64::new(0)), - sealed: AtomicBool::default(), - tail, - current_checksum: salt.into(), - }) - } - - pub fn log_id(&self) -> Uuid { - Uuid::from_u128(self.header.lock().log_id.get()) - } - - pub fn is_empty(&self) -> bool { - self.header.lock().is_empty() - } - - pub fn with_header(&self, f: impl FnOnce(&SegmentHeader) -> R) -> R { - let header = self.header.lock(); - f(&header) - } - - pub fn last_committed(&self) -> u64 { - self.header.lock().last_committed() - } - - pub fn next_frame_no(&self) -> NonZeroU64 { - self.header.lock().next_frame_no() - } - - pub fn count_committed(&self) -> usize { - self.header.lock().frame_count() - } - - pub fn db_size(&self) -> u32 { - self.header.lock().size_after.get() - } - - pub fn current_checksum(&self) -> u32 { - self.current_checksum.load(Ordering::Relaxed) - } - - /// insert a bunch of frames in the Wal. The frames needn't be ordered, therefore, on commit - /// the last frame no needs to be passed alongside the new size_after. - #[tracing::instrument(skip_all)] - pub async fn inject_frames( - &self, - frames: Vec>, - // (size_after, last_frame_no) - commit_data: Option<(u32, u64)>, - tx: &mut TxGuardOwned, - ) -> Result>> - where - F: FileExt, - { - assert!(!self.sealed.load(Ordering::SeqCst)); - assert_eq!( - tx.savepoints.len(), - 1, - "injecting wal should not use savepoints" - ); - { - let tx = tx.deref_mut(); - // let mut commit_frame_written = false; - let current_savepoint = tx.savepoints.last_mut().expect("no savepoints initialized"); - let mut frames = frame_list_to_option(frames); - // For each frame, we compute and write the frame checksum, followed by the frame - // itself as an array of CheckedFrame - for i in 0..frames.len() { - let offset = tx.next_offset; - let current_checksum = current_savepoint.current_checksum; - let mut digest = crc32fast::Hasher::new_with_initial(current_checksum); - digest.write(frames[i].as_ref().unwrap().as_bytes()); - let new_checksum = digest.finalize(); - let (_buf, ret) = self - .file - .write_all_at_async( - ZeroCopyBuf::new_init(zerocopy::byteorder::little_endian::U32::new( - new_checksum, - )), - checked_frame_offset(offset), - ) - .await; - ret?; - - let buf = ZeroCopyBoxIoBuf::new(frames[i].take().unwrap()); - let (buf, ret) = self - .file - .write_all_at_async(buf, frame_offset(offset)) - .await; - ret?; - - let frame = buf.into_inner(); - - current_savepoint - .index - .insert(frame.header().page_no(), offset); - current_savepoint.current_checksum = new_checksum; - tx.next_offset += 1; - frames[i] = Some(frame); - } - - if let Some((size_after, last_frame_no)) = commit_data { - if tx.not_empty() { - let mut header = { *self.header.lock() }; - header.last_commited_frame_no = last_frame_no.into(); - header.size_after = size_after.into(); - // set frames unordered because there are no guarantees that we received frames - // in order. - header.set_flags(header.flags().union(SegmentFlags::FRAME_UNORDERED)); - { - let savepoint = tx.savepoints.first().unwrap(); - header.frame_count = (header.frame_count.get() - + (tx.next_offset - savepoint.next_offset) as u64) - .into(); - } - header.recompute_checksum(); - - let (header, ret) = self - .file - .write_all_at_async(ZeroCopyBuf::new_init(header), 0) - .await; - - ret?; - - // self.file.sync_data().unwrap(); - tx.merge_savepoints(&self.index); - // set the header last, so that a transaction does not witness a write before - // it's actually committed. - self.current_checksum - .store(tx.current_checksum(), Ordering::Relaxed); - *self.header.lock() = header.into_inner(); - - tx.is_commited = true; - } - } - - let frames = options_to_frame_list(frames); - - Ok(frames) - } - } - - #[tracing::instrument(skip(self, pages, tx))] - pub fn insert_pages<'a>( - &self, - pages: impl Iterator, - size_after: Option, - tx: &mut TxGuardShared, - ) -> Result> - where - F: FileExt, - { - assert!(!self.sealed.load(Ordering::SeqCst)); - { - let tx = tx.deref_mut(); - let mut pages = pages.peekable(); - // let mut commit_frame_written = false; - let current_savepoint = tx.savepoints.last_mut().expect("no savepoints initialized"); - while let Some((page_no, page)) = pages.next() { - // optim: if the page is already present, overwrite its content - if let Some(offset) = current_savepoint.index.get(&page_no) { - tracing::trace!(page_no, "recycling frame"); - self.file.write_all_at(page, page_offset(*offset))?; - // we overwrote a frame, record that for later rewrite - tx.recompute_checksum = Some( - tx.recompute_checksum - .map(|old| old.min(*offset)) - .unwrap_or(*offset), - ); - continue; - } - - tracing::trace!(page_no, "inserting new frame"); - let size_after = if let Some(size) = size_after { - pages.peek().is_none().then_some(size).unwrap_or(0) - } else { - 0 - }; - - let frame_no = tx.next_frame_no; - let header = FrameHeader { - page_no: page_no.into(), - size_after: size_after.into(), - frame_no: frame_no.into(), - }; - - // only compute checksum if we don't need to recompute it later - let checksum = if tx.recompute_checksum.is_none() { - let mut digest = - crc32fast::Hasher::new_with_initial(current_savepoint.current_checksum); - digest.write(header.as_bytes()); - digest.write(page); - digest.finalize() - } else { - 0 - }; - - let checksum_bytes = checksum.to_le_bytes(); - // We write a instance of a ChecksummedFrame - let slices = &[ - IoSlice::new(&checksum_bytes), - IoSlice::new(header.as_bytes()), - IoSlice::new(&page), - ]; - let offset = tx.next_offset; - debug_assert_eq!( - self.header.lock().start_frame_no.get() + offset as u64, - frame_no - ); - self.file - .write_at_vectored(slices, checked_frame_offset(offset))?; - assert!( - current_savepoint.index.insert(page_no, offset).is_none(), - "existing frames should be recycled" - ); - current_savepoint.current_checksum = checksum; - tx.next_frame_no += 1; - tx.next_offset += 1; - } - } - - // commit - if let Some(size_after) = size_after { - if tx.not_empty() { - let new_checksum = if let Some(offset) = tx.recompute_checksum { - self.recompute_checksum(offset, tx.next_offset - 1)? - } else { - tx.current_checksum() - }; - - #[cfg(debug_assertions)] - { - // ensure that file checksum for that transaction is valid - let from = { - let header = self.header.lock(); - if header.last_commited_frame_no() == 0 { - 0 - } else { - (header.last_commited_frame_no() - header.start_frame_no.get()) as u32 - } - }; - - self.assert_valid_checksum(from, tx.next_offset - 1)?; - } - - let last_frame_no = tx.next_frame_no - 1; - let mut header = { *self.header.lock() }; - header.last_commited_frame_no = last_frame_no.into(); - header.size_after = size_after.into(); - // count how many frames were appeneded: basically last appeneded offset - initial - // offset - let tx = tx.deref_mut(); - let savepoint = tx.savepoints.first().unwrap(); - header.frame_count = (header.frame_count.get() - + (tx.next_offset - savepoint.next_offset) as u64) - .into(); - header.recompute_checksum(); - - self.file.write_all_at(header.as_bytes(), 0)?; - // todo: sync if sync mode is EXTRA - // self.file.sync_data().unwrap(); - tx.merge_savepoints(&self.index); - // set the header last, so that a transaction does not witness a write before - // it's actually committed. - *self.header.lock() = header; - self.current_checksum.store(new_checksum, Ordering::Relaxed); - - tx.is_commited = true; - - return Ok(Some(last_frame_no)); - } - } - Ok(None) - } - - /// return the offset of the frame for page_no, with frame_no no larger that max_frame_no, if - /// it exists - pub fn find_frame(&self, page_no: u32, tx: &Transaction) -> Option { - // if it's a write transaction, check its transient index first - if let Transaction::Write(ref tx) = tx { - if let Some(offset) = tx.find_frame_offset(page_no) { - return Some(offset); - } - } - - // not a write tx, or page is not in write tx, look into the segment - self.index.locate(page_no, tx.max_offset) - } - - /// reads the page conainted in frame at offset into buf - #[tracing::instrument(skip(self, buf))] - pub fn read_page_offset(&self, offset: u32, buf: &mut [u8]) -> Result<()> - where - F: FileExt, - { - tracing::trace!("read page"); - debug_assert_eq!(buf.len(), 4096); - self.file.read_exact_at(buf, page_offset(offset))?; - - Ok(()) - } - - async fn read_frame_offset_async(&self, offset: u32, buf: B) -> (B, std::io::Result<()>) - where - F: FileExt, - B: IoBufMut + Send + 'static, - { - let byte_offset = frame_offset(offset); - self.file.read_exact_at_async(buf, byte_offset).await - } - - #[allow(dead_code)] - pub fn frame_header_at(&self, offset: u32) -> Result - where - F: FileExt, - { - let mut header = FrameHeader::new_zeroed(); - self.file - .read_exact_at(header.as_bytes_mut(), frame_offset(offset))?; - Ok(header) - } - - /// It is expected that sealing is performed under a write lock - #[tracing::instrument(skip_all)] - pub fn seal(&self, now: DateTime) -> Result>> - where - F: FileExt, - { - let mut header = self.header.lock(); - let index_offset = header.frame_count() as u32; - let index_byte_offset = checked_frame_offset(index_offset); - let mut cursor = self.file.cursor(index_byte_offset); - let writer = BufWriter::new(&mut cursor); - - let current = self.current_checksum(); - let mut digest = crc32fast::Hasher::new_with_initial(current); - let mut writer = Inspect::new(writer, |data: &[u8]| { - digest.write(data); - }); - self.index.merge_all(&mut writer)?; - let mut writer = writer.into_inner(); - let index_checksum = digest.finalize(); - let index_size = writer.get_ref().count(); - writer.write_all(&index_checksum.to_le_bytes())?; - - writer.into_inner().map_err(|e| e.into_parts().0)?; - // we perform a first sync to ensure that all the segment has been flushed to disk. We then - // write the header and flush again. We want to guarantee that if we find a segement marked - // as "SEALED", then there was no partial flush. - // - // If a segment is found that doesn't have the SEALED flag, then we enter crash recovery, - // and we need to check the segment. - self.file.sync_all()?; - - header.index_offset = index_byte_offset.into(); - header.index_size = index_size.into(); - let flags = header.flags(); - header.set_flags(flags | SegmentFlags::SEALED); - header.sealed_at_timestamp = (now.timestamp_millis() as u64).into(); - header.recompute_checksum(); - self.file.write_all_at(header.as_bytes(), 0)?; - - // flush the header. - self.file.sync_all()?; - - let sealed = SealedSegment::open( - self.file.clone(), - self.path.clone(), - self.read_locks.clone(), - now, - )?; - - // we only flip the sealed mark when no more error can occur, or we risk to deadlock a read - // transaction waiting for a more recent version of the segment that is never going to arrive - assert!( - self.sealed - .compare_exchange(false, true, Ordering::SeqCst, Ordering::Relaxed) - .is_ok(), - "attempt to seal an already sealed segment" - ); - - tracing::debug!("segment sealed"); - - Ok(sealed) - } - - pub fn last_committed_frame_no(&self) -> u64 { - let header = self.header.lock(); - if header.last_commited_frame_no.get() == 0 { - header.start_frame_no.get() - } else { - header.last_commited_frame_no.get() - } - } - - pub fn inc_reader_count(&self) { - self.read_locks().fetch_add(1, Ordering::SeqCst); - } - - /// return true if the reader count is 0 - pub fn dec_reader_count(&self) -> bool { - self.read_locks().fetch_sub(1, Ordering::SeqCst) - 1 == 0 - } - - pub fn read_locks(&self) -> &AtomicU64 { - self.read_locks.as_ref() - } - - pub fn is_sealed(&self) -> bool { - self.sealed.load(Ordering::SeqCst) - } - - pub fn tail(&self) -> &Arc>> { - &self.tail - } - - /// returns all the frames that changed between start_frame_no and the current commit index - pub(crate) fn frame_stream_from<'a>( - &'a self, - start_frame_no: u64, - seen: &'a mut RoaringBitmap, - // not actually used, but ensures that a read lock is held while this method id called - tx: &'a ReadTransaction, - ) -> (impl Stream>> + 'a, u64) - where - F: FileExt, - { - let seg_start_frame_no = tx.current.with_header(|h| h.start_frame_no.get()); - let replicated_until = seg_start_frame_no - // if current is empty, start_frame_no doesn't exist - .min(tx.max_frame_no) - .max(start_frame_no); - - // TODO: optim, we could read less frames if we had a mapping from frame_no to page_no in - // the index - let stream = async_stream::try_stream! { - if !self.is_empty() { - let mut frame_offset = (tx.max_frame_no - seg_start_frame_no) as u32; - loop { - let buf = ZeroCopyBoxIoBuf::new_uninit(Frame::new_box_zeroed()); - let (buf, res) = self.read_frame_offset_async(frame_offset, buf).await; - res?; - - let mut frame = buf.into_inner(); - frame.header_mut().size_after = 0.into(); - let page_no = frame.header().page_no(); - - let frame_no = frame.header().frame_no(); - if frame_no < start_frame_no { - break - } - - if !seen.contains(page_no) { - seen.insert(page_no); - yield frame; - } - - if frame_offset == 0 { - break - } - - frame_offset -= 1; - } - } - }; - - (stream, replicated_until) - } - - fn recompute_checksum(&self, start_offset: u32, until_offset: u32) -> Result - where - F: FileExt, - { - let mut current_checksum = if start_offset == 0 { - self.header.lock().salt.get() - } else { - // we get the checksum from the frame just before the the start offset - let frame_offset = checked_frame_offset(start_offset - 1); - let mut out = U32::new(0); - self.file.read_exact_at(out.as_bytes_mut(), frame_offset)?; - out.get() - }; - - let mut checked_frame: Box = CheckedFrame::new_box_zeroed(); - for offset in start_offset..=until_offset { - let frame_offset = checked_frame_offset(offset); - self.file - .read_exact_at(checked_frame.as_bytes_mut(), frame_offset)?; - current_checksum = checked_frame.frame.checksum(current_checksum); - self.file - .write_all_at(¤t_checksum.to_le_bytes(), frame_offset)?; - } - - Ok(current_checksum) - } - - /// test fuction to ensure checksum integrity - #[cfg(debug_assertions)] - #[track_caller] - fn assert_valid_checksum(&self, from: u32, until: u32) -> Result<()> - where - F: FileExt, - { - let mut frame: Box = CheckedFrame::new_box_zeroed(); - let mut current_checksum = if from != 0 { - let offset = checked_frame_offset(from - 1); - self.file.read_exact_at(frame.as_bytes_mut(), offset)?; - frame.checksum.get() - } else { - self.header.lock().salt.get() - }; - - for i in from..=until { - let offset = checked_frame_offset(i); - self.file.read_exact_at(frame.as_bytes_mut(), offset)?; - current_checksum = frame.frame.checksum(current_checksum); - assert_eq!( - current_checksum, - frame.checksum.get(), - "invalid checksum at offset {i}" - ); - } - - Ok(()) - } -} - -fn frame_list_to_option(frames: Vec>) -> Vec>> { - // this is safe because Option> and Box are the same size and Frame is sized: - // https://doc.rust-lang.org/std/option/index.html#representation - unsafe { std::mem::transmute(frames) } -} - -fn options_to_frame_list(frames: Vec>>) -> Vec> { - debug_assert!(frames.iter().all(|f| f.is_some())); - // this is safe because Option> and Box are the same size and Frame is sized: - // https://doc.rust-lang.org/std/option/index.html#representation - unsafe { std::mem::transmute(frames) } -} - -impl Drop for CurrentSegment { - fn drop(&mut self) { - // todo: if reader is 0 and segment is sealed, register for compaction. - } -} - -/// TODO: implement spill-to-disk when txn is too large -/// TODO: optimize that data structure with something more custom. I can't find a wholy satisfying -/// structure in the wild. -pub(crate) struct SegmentIndex { - start_frame_no: u64, - // TODO: measure perf, and consider using https://docs.rs/bplustree/latest/bplustree/ - index: SkipMap>>, -} - -impl SegmentIndex { - pub fn new(start_frame_no: u64) -> Self { - Self { - start_frame_no, - index: Default::default(), - } - } - - fn locate(&self, page_no: u32, max_offset: u64) -> Option { - let offsets = self.index.get(&page_no)?; - let offsets = offsets.value().read(); - offsets - .iter() - .rev() - .find(|fno| (**fno as u64) < max_offset) - .copied() - } - - #[tracing::instrument(skip_all)] - fn merge_all(&self, writer: W) -> Result<()> { - let mut builder = MapBuilder::new(writer)?; - let Some(mut entry) = self.index.front() else { - return Ok(()); - }; - loop { - let offset = *entry.value().read().last().unwrap(); - builder.insert(entry.key().to_be_bytes(), offset as u64)?; - if !entry.move_next() { - break; - } - } - - builder.finish()?; - Ok(()) - } - - pub(crate) fn insert(&self, page_no: u32, offset: u32) { - let entry = self.index.get_or_insert(page_no, Default::default()); - let mut offsets = entry.value().write(); - if offsets.is_empty() || *offsets.last().unwrap() < offset { - offsets.push(offset); - } - } -} - -#[cfg(test)] -mod test { - use std::io::{self, Read}; - - use chrono::{DateTime, Utc}; - use hashbrown::HashMap; - use insta::assert_debug_snapshot; - use rand::rngs::ThreadRng; - use tempfile::{tempdir, tempfile}; - use tokio_stream::StreamExt; - use uuid::Uuid; - - use crate::io::{FileExt, Io}; - use crate::test::{seal_current_segment, TestEnv}; - - use super::*; - - #[tokio::test] - async fn current_stream_frames() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - for _ in 0..50 { - conn.execute("insert into test values (randomblob(256))", ()) - .unwrap(); - } - - let mut tmp = tempfile().unwrap(); - { - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::new(); - let (stream, replicated_until) = tx.current.frame_stream_from(1, &mut seen, &tx); - tokio::pin!(stream); - assert_eq!(replicated_until, 1); - assert_eq!(tx.db_size, 6); - - while let Some(frame) = stream.next().await { - let frame = frame.unwrap(); - let offset = (frame.header().page_no() - 1) * 4096; - tmp.write_all_at(frame.data(), offset as _).unwrap(); - } - } - - seal_current_segment(&shared); - *shared.durable_frame_no.lock() = 999999; - shared.checkpoint().await.unwrap(); - - let mut orig = Vec::new(); - shared - .db_file - .try_clone() - .unwrap() - .read_to_end(&mut orig) - .unwrap(); - - let mut copy = Vec::new(); - tmp.read_to_end(&mut copy).unwrap(); - - assert_eq!(db_payload(©), db_payload(&orig)); - } - - #[tokio::test] - async fn current_stream_frames_incomplete() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - - for _ in 0..50 { - conn.execute("insert into test values (randomblob(256))", ()) - .unwrap(); - } - - seal_current_segment(&shared); - - for _ in 0..50 { - conn.execute("insert into test values (randomblob(256))", ()) - .unwrap(); - } - - let mut seen = RoaringBitmap::new(); - { - let tx = shared.begin_read(u64::MAX); - let (stream, replicated_until) = tx.current.frame_stream_from(1, &mut seen, &tx); - tokio::pin!(stream); - assert_eq!(replicated_until, 60); - assert_eq!(tx.db_size, 9); - assert_eq!(stream.fold(0, |count, _| count + 1).await, 6); - } - assert_debug_snapshot!(seen); - } - - #[tokio::test] - async fn current_stream_too_recent_frame_no() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - - let mut seen = RoaringBitmap::new(); - let tx = shared.begin_read(u64::MAX); - let (stream, replicated_until) = tx.current.frame_stream_from(100, &mut seen, &tx); - tokio::pin!(stream); - assert_eq!(replicated_until, 100); - assert_eq!(stream.fold(0, |count, _| count + 1).await, 0); - assert_eq!(tx.db_size, 2); - } - - #[tokio::test] - async fn current_stream_empty_segment() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - seal_current_segment(&shared); - - let mut seen = RoaringBitmap::new(); - let tx = shared.begin_read(u64::MAX); - let (stream, replicated_until) = tx.current.frame_stream_from(1, &mut seen, &tx); - tokio::pin!(stream); - assert_eq!(replicated_until, 2); - assert_eq!(tx.db_size, 2); - assert_eq!(stream.fold(0, |count, _| count + 1).await, 0); - } - - #[tokio::test] - async fn crash_on_flush() { - #[derive(Clone, Default)] - struct SyncFailBufferIo { - inner: Arc>>>>>, - } - - struct File { - path: PathBuf, - io: SyncFailBufferIo, - } - - impl File { - fn inner(&self) -> Arc>> { - self.io.inner.lock().get(&self.path).cloned().unwrap() - } - } - - impl FileExt for File { - fn len(&self) -> std::io::Result { - Ok(self.inner().lock().len() as u64) - } - - fn write_at_vectored(&self, bufs: &[IoSlice], offset: u64) -> std::io::Result { - let mut written = 0; - for buf in bufs { - self.write_at(buf.as_bytes(), written + offset)?; - written += buf.len() as u64; - } - Ok(written as _) - } - - fn write_at(&self, buf: &[u8], offset: u64) -> std::io::Result { - let data = self.inner(); - let mut data = data.lock(); - let new_len = offset as usize + buf.len(); - let old_len = data.len(); - if old_len < new_len { - data.extend(std::iter::repeat(0).take(new_len - old_len)); - } - data[offset as usize..offset as usize + buf.len()].copy_from_slice(buf); - Ok(buf.len()) - } - - fn read_at(&self, buf: &mut [u8], offset: u64) -> std::io::Result { - let inner = self.inner(); - let inner = inner.lock(); - if offset >= inner.len() as u64 { - return Ok(0); - } - - let read_len = buf.len().min(inner.len() - offset as usize); - buf[..read_len] - .copy_from_slice(&inner[offset as usize..offset as usize + read_len]); - Ok(read_len) - } - - fn sync_all(&self) -> std::io::Result<()> { - // simulate a flush that only flushes half the pages and then fail - let inner = self.inner(); - let inner = inner.lock(); - // just keep 5 pages from the log. The log will be incomplete and frames will be - // broken. - std::fs::write(&self.path, &inner[..4096 * 5])?; - Err(io::Error::new(io::ErrorKind::BrokenPipe, "")) - } - - fn set_len(&self, _len: u64) -> std::io::Result<()> { - todo!() - } - - async fn read_exact_at_async( - &self, - mut buf: B, - offset: u64, - ) -> (B, std::io::Result<()>) { - let slice = unsafe { - std::slice::from_raw_parts_mut(buf.stable_mut_ptr(), buf.bytes_total()) - }; - let ret = self.read_at(slice, offset); - (buf, ret.map(|_| ())) - } - - async fn read_at_async( - &self, - _buf: B, - _offset: u64, - ) -> (B, std::io::Result) { - todo!() - } - - async fn write_all_at_async( - &self, - _buf: B, - _offset: u64, - ) -> (B, std::io::Result<()>) { - todo!() - } - } - - impl Io for SyncFailBufferIo { - type File = File; - type Rng = ThreadRng; - type TempFile = File; - - fn create_dir_all(&self, path: &std::path::Path) -> std::io::Result<()> { - std::fs::create_dir_all(path) - } - - fn open( - &self, - _create_new: bool, - _read: bool, - _write: bool, - path: &std::path::Path, - ) -> std::io::Result { - let mut inner = self.inner.lock(); - if !inner.contains_key(path) { - let data = if path.exists() { - std::fs::read(path)? - } else { - vec![] - }; - inner.insert(path.to_owned(), Arc::new(Mutex::new(data))); - } - - Ok(File { - path: path.into(), - io: self.clone(), - }) - } - - fn tempfile(&self) -> std::io::Result { - todo!() - } - - fn now(&self) -> DateTime { - Utc::now() - } - - fn uuid(&self) -> uuid::Uuid { - Uuid::new_v4() - } - - fn hard_link( - &self, - _src: &std::path::Path, - _dst: &std::path::Path, - ) -> std::io::Result<()> { - todo!() - } - - fn with_rng(&self, f: F) -> R - where - F: FnOnce(&mut Self::Rng) -> R, - { - f(&mut rand::thread_rng()) - } - - fn remove_file_async( - &self, - path: &std::path::Path, - ) -> impl std::future::Future> + Send { - async move { std::fs::remove_file(path) } - } - } - - let tmp = Arc::new(tempdir().unwrap()); - { - let env = TestEnv::new_io_and_tmp(SyncFailBufferIo::default(), tmp.clone(), false); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("create table test (x)", ()).unwrap(); - for _ in 0..6 { - conn.execute("insert into test values (1234)", ()).unwrap(); - } - - // trigger a flush, that will fail. When we reopen the db, the log should need recovery - // this simulates a crash before flush - { - let mut tx = shared.begin_read(99999).into(); - shared.upgrade(&mut tx).unwrap(); - let mut guard = tx.as_write_mut().unwrap().lock(); - guard.commit(); - let _ = shared.swap_current(&mut guard); - } - } - - { - let env = TestEnv::new_io_and_tmp(SyncFailBufferIo::default(), tmp.clone(), false); - let conn = env.open_conn("test"); - // the db was recovered: we lost some rows, but it still works - conn.query_row("select count(*) from test", (), |row| { - assert_eq!(row.get::<_, u32>(0).unwrap(), 2); - Ok(()) - }) - .unwrap(); - } - } - - fn db_payload(db: &[u8]) -> u32 { - let size = (db.len() / 4096) * 4096; - crc32fast::hash(&db[..size]) - } -} diff --git a/libsql-wal/src/segment/list.rs b/libsql-wal/src/segment/list.rs deleted file mode 100644 index ebf616e058..0000000000 --- a/libsql-wal/src/segment/list.rs +++ /dev/null @@ -1,667 +0,0 @@ -use core::fmt; -use std::ops::Deref; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::sync::Arc; - -use arc_swap::ArcSwapOption; -use fst::raw::IndexedValue; -use fst::Streamer; -use roaring::RoaringBitmap; -use tokio_stream::Stream; -use uuid::Uuid; -use zerocopy::FromZeroes; - -use crate::error::Result; -use crate::io::buf::{ZeroCopyBoxIoBuf, ZeroCopyBuf}; -use crate::io::{FileExt, Io}; -use crate::segment::Frame; -use crate::transaction::ReadTransaction; -use crate::{LibsqlFooter, LIBSQL_MAGIC, LIBSQL_PAGE_SIZE, LIBSQL_WAL_VERSION}; - -use super::Segment; - -#[derive(Debug)] -pub struct SegmentList { - list: List, - checkpointing: AtomicBool, -} - -impl Default for SegmentList { - fn default() -> Self { - Self { - list: Default::default(), - checkpointing: Default::default(), - } - } -} - -impl Deref for SegmentList { - type Target = List; - - fn deref(&self) -> &Self::Target { - &self.list - } -} - -impl SegmentList -where - Seg: Segment, -{ - pub(crate) fn push(&self, segment: Seg) { - self.list.prepend(segment); - } - /// attempt to read page_no with frame_no less than max_frame_no. Returns whether such a page - /// was found - pub(crate) fn read_page( - &self, - page_no: u32, - max_frame_no: u64, - buf: &mut [u8], - ) -> Result { - let mut prev_seg = u64::MAX; - let mut current = self.list.head.load(); - let mut i = 0; - while let Some(link) = &*current { - let last = link.item.last_committed(); - assert!(prev_seg > last); - prev_seg = last; - if link.item.read_page(page_no, max_frame_no, buf)? { - tracing::trace!("found {page_no} in segment {i}"); - return Ok(true); - } - - i += 1; - current = link.next.load(); - } - - Ok(false) - } - - /// Checkpoints as many segments as possible to the main db file, and return the checkpointed - /// frame_no, if anything was checkpointed - #[tracing::instrument(skip_all)] - pub async fn checkpoint( - &self, - db_file: &IO::File, - until_frame_no: u64, - log_id: Uuid, - io: &IO, - ) -> Result> { - struct Guard<'a>(&'a AtomicBool); - impl<'a> Drop for Guard<'a> { - fn drop(&mut self) { - self.0.store(false, Ordering::SeqCst); - } - } - - if self - .checkpointing - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) - .is_err() - { - return Ok(None); - } - - let _g = Guard(&self.checkpointing); - - let mut segs = Vec::new(); - let mut current = self.head.load(); - // find the longest chain of segments that can be checkpointed, iow, segments that do not have - // readers pointing to them - while let Some(segment) = &*current { - // skip any segment more recent than until_frame_no - tracing::debug!( - last_committed = segment.last_committed(), - until = until_frame_no - ); - if segment.last_committed() <= until_frame_no { - if !segment.is_checkpointable() { - segs.clear(); - } else { - segs.push(segment.clone()); - } - } - current = segment.next.load(); - } - - // nothing to checkpoint rn - if segs.is_empty() { - tracing::debug!("nothing to checkpoint"); - return Ok(None); - } - - let size_after = segs.first().unwrap().size_after(); - - let index_iter = segs.iter().map(|s| s.index()); - - let mut union = send_fst_ops::SendUnion::from_index_iter(index_iter); - - let mut buf = ZeroCopyBuf::::new_uninit(); - let mut last_replication_index = 0; - let mut checkpointed = RoaringBitmap::new(); - while let Some((k, v)) = union.next() { - let page_no = u32::from_be_bytes(k.try_into().unwrap()); - checkpointed.insert(page_no); - tracing::trace!(page_no); - let v = v.iter().min_by_key(|i| i.index).unwrap(); - let offset = v.value as u32; - - let seg = &segs[v.index]; - let (frame, ret) = seg.item.read_frame_offset_async(offset, buf).await; - ret?; - assert_eq!(frame.get_ref().header().page_no(), page_no); - last_replication_index = - last_replication_index.max(frame.get_ref().header().frame_no()); - let read_buf = frame.map_slice(|f| f.get_ref().data()); - let (read_buf, ret) = db_file - .write_all_at_async(read_buf, (page_no as u64 - 1) * 4096) - .await; - ret?; - buf = read_buf.into_inner(); - buf.deinit(); - } - - // update the footer at the end of the db file. - let footer = LibsqlFooter { - magic: LIBSQL_MAGIC.into(), - version: LIBSQL_WAL_VERSION.into(), - replication_index: last_replication_index.into(), - log_id: log_id.as_u128().into(), - }; - - db_file.set_len(size_after as u64 * LIBSQL_PAGE_SIZE as u64)?; - - let footer_offset = size_after as usize * LIBSQL_PAGE_SIZE as usize; - let (_, ret) = db_file - .write_all_at_async(ZeroCopyBuf::new_init(footer), footer_offset as u64) - .await; - ret?; - - //// TODO: make async - db_file.sync_all()?; - - for seg in segs.iter() { - seg.destroy(io).await; - } - - let mut current = self.head.compare_and_swap(&segs[0], None); - if Arc::ptr_eq(&segs[0], current.as_ref().unwrap()) { - // nothing to do - } else { - loop { - let next = current - .as_ref() - .unwrap() - .next - .compare_and_swap(&segs[0], None); - if Arc::ptr_eq(&segs[0], next.as_ref().unwrap()) { - break; - } else { - current = next; - } - } - } - - self.len.fetch_sub(segs.len(), Ordering::Relaxed); - - tracing::debug!(until = last_replication_index, "checkpointed"); - - Ok(Some(last_replication_index)) - } - - /// returns a stream of pages from the sealed segment list, and what's the lowest replication index - /// that was covered. If the returned index is less than start frame_no, the missing frames - /// must be read somewhere else. - pub async fn stream_pages_from<'a, F>( - &self, - current_fno: u64, - until_fno: u64, - seen: &'a mut RoaringBitmap, - // not actually used, but ensures that a read lock is held while this method id called - _tx: &ReadTransaction, - ) -> ( - impl Stream>> + 'a, - u64, - ) { - // collect all the segments we need to read from to be up to date. - // We keep a reference to them so that they are not discarded while we read them. - let mut segments = Vec::new(); - let mut current = self.list.head.load(); - while current.is_some() { - let current_ref = current.as_ref().unwrap(); - if current_ref.item.last_committed() >= until_fno { - segments.push(current_ref.clone()); - current = current_ref.next.load(); - } else { - break; - } - } - - if segments.is_empty() { - return ( - tokio_util::either::Either::Left(tokio_stream::empty()), - current_fno, - ); - } - - let new_current = segments - .last() - .map(|s| s.start_frame_no()) - .unwrap() - .max(until_fno); - - let stream = async_stream::try_stream! { - let index_iter = segments.iter().map(|s| s.index()); - let mut union = send_fst_ops::SendUnion::from_index_iter(index_iter); - while let Some((key_bytes, indexes)) = union.next() { - let page_no = u32::from_be_bytes(key_bytes.try_into().unwrap()); - // we already have a more recent version of this page. - if seen.contains(page_no) { - continue; - } - let IndexedValue { index: segment_offset, value: frame_offset } = indexes.iter().min_by_key(|i| i.index).unwrap(); - let segment = &segments[*segment_offset]; - - // we can ignore any frame with a replication index less than start_frame_no - if segment.start_frame_no() + frame_offset < until_fno { - continue - } - - let buf = ZeroCopyBoxIoBuf::new_uninit(Frame::new_box_zeroed()); - let (buf, ret) = segment.read_frame_offset_async(*frame_offset as u32, buf).await; - ret?; - let mut frame = buf.into_inner(); - frame.header_mut().size_after = 0.into(); - seen.insert(page_no); - yield frame; - } - }; - - (tokio_util::either::Either::Right(stream), new_current) - } - - pub(crate) fn last(&self) -> Option - where - Seg: Clone, - { - let mut current = self.list.head.load().clone(); - loop { - match current.as_ref() { - Some(c) => { - if c.next.load().is_none() { - return Some(c.item.clone()); - } - current = c.next.load().clone(); - } - None => return None, - } - } - } -} - -struct Node { - item: T, - next: ArcSwapOption>, -} - -impl Deref for Node { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.item - } -} - -pub struct List { - head: ArcSwapOption>, - len: AtomicUsize, -} - -impl fmt::Debug for List { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut list = f.debug_list(); - let mut current = self.head.load(); - while current.is_some() { - list.entry(¤t.as_ref().unwrap().item); - current = current.as_ref().unwrap().next.load(); - } - list.finish() - } -} - -impl Default for List { - fn default() -> Self { - Self { - head: Default::default(), - len: Default::default(), - } - } -} - -impl List { - /// Prepend the list with the passed sealed segment - pub fn prepend(&self, item: T) { - let node = Arc::new(Node { - item, - next: self.head.load().clone().into(), - }); - - self.head.swap(Some(node)); - self.len.fetch_add(1, Ordering::Relaxed); - } - - /// Call f on the head of the segments list, if it exists. The head of the list is the most - /// recent segment. - pub fn with_head(&self, f: impl FnOnce(&T) -> R) -> Option { - let head = self.head.load(); - head.as_ref().map(|link| f(&link.item)) - } - - pub fn len(&self) -> usize { - self.len.load(Ordering::Relaxed) - } - - pub fn is_empty(&self) -> bool { - self.len() == 0 - } -} - -mod send_fst_ops { - use std::ops::{Deref, DerefMut}; - use std::sync::Arc; - - use fst::map::{OpBuilder, Union}; - - /// Safety: Union contains a Box that doesn't require Send, to it's not send. - /// That's an issue for us, but all the indexes we have are safe to send, so we're good. - /// FIXME: we could implement union ourselves. - unsafe impl Send for SendUnion<'_> {} - unsafe impl Sync for SendUnion<'_> {} - - #[repr(transparent)] - pub(super) struct SendUnion<'a>(Union<'a>); - - impl<'a> SendUnion<'a> { - pub fn from_index_iter(iter: I) -> Self - where - I: Iterator>>, - { - let op = iter.collect::().union(); - Self(op) - } - } - - impl<'a> Deref for SendUnion<'a> { - type Target = Union<'a>; - - fn deref(&self) -> &Self::Target { - &self.0 - } - } - - impl<'a> DerefMut for SendUnion<'a> { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } -} - -#[cfg(test)] -mod test { - use std::io::{Read, Seek, Write}; - use tempfile::{tempfile, NamedTempFile}; - use tokio_stream::StreamExt as _; - - use crate::test::{seal_current_segment, TestEnv}; - - use super::*; - - #[tokio::test] - async fn stream_pages() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB(16));", ()) - .unwrap(); - conn.execute("CREATE INDEX i1 ON t1(b);", ()).unwrap(); - - for _ in 0..100 { - for _ in 0..10 { - conn.execute( - "REPLACE INTO t1 VALUES(abs(random() % 500), randomblob(16));", - (), - ) - .unwrap(); - } - seal_current_segment(&shared); - } - - seal_current_segment(&shared); - - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::new(); - let (stream, _) = tx - .current - .tail() - .stream_pages_from(0, 0, &mut seen, &tx) - .await; - tokio::pin!(stream); - - let mut file = NamedTempFile::new().unwrap(); - let mut tx = shared.begin_read(999999).into(); - while let Some(frame) = stream.next().await { - let frame = frame.unwrap(); - let mut buffer = [0; 4096]; - shared - .read_page(&mut tx, frame.header.page_no(), &mut buffer) - .unwrap(); - assert_eq!(buffer, frame.data()); - file.write_all(frame.data()).unwrap(); - } - - drop(tx); - - *shared.durable_frame_no.lock() = 999999; - shared.checkpoint().await.unwrap(); - file.seek(std::io::SeekFrom::Start(0)).unwrap(); - let mut copy_bytes = Vec::new(); - file.read_to_end(&mut copy_bytes).unwrap(); - - let mut orig_bytes = Vec::new(); - shared - .db_file - .try_clone() - .unwrap() - .read_to_end(&mut orig_bytes) - .unwrap(); - - assert_eq!(db_payload(&orig_bytes), db_payload(©_bytes)); - } - - #[tokio::test] - async fn stream_pages_skip_before_start_fno() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("CREATE TABLE test(x);", ()).unwrap(); - - for _ in 0..10 { - conn.execute("INSERT INTO test VALUES(42)", ()).unwrap(); - } - - seal_current_segment(&shared); - - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::new(); - let (stream, replicated_until) = tx - .current - .tail() - .stream_pages_from(0, 10, &mut seen, &tx) - .await; - tokio::pin!(stream); - - assert_eq!(replicated_until, 10); - - while let Some(frame) = stream.next().await { - let frame = frame.unwrap(); - assert!(frame.header().frame_no() >= 10); - } - } - - #[tokio::test] - async fn stream_pages_ignore_already_seen_pages() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("CREATE TABLE test(x);", ()).unwrap(); - - for _ in 0..10 { - conn.execute("INSERT INTO test VALUES(42)", ()).unwrap(); - } - - seal_current_segment(&shared); - - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::from_sorted_iter([1]).unwrap(); - let (stream, replicated_until) = tx - .current - .tail() - .stream_pages_from(0, 1, &mut seen, &tx) - .await; - tokio::pin!(stream); - - assert_eq!(replicated_until, 1); - - while let Some(frame) = stream.next().await { - let frame = frame.unwrap(); - assert_ne!(!frame.header().page_no(), 1); - } - } - - #[tokio::test] - async fn stream_pages_resume_replication() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("CREATE TABLE test(x);", ()).unwrap(); - - for _ in 0..10 { - conn.execute("INSERT INTO test VALUES(42)", ()).unwrap(); - } - - seal_current_segment(&shared); - - let mut tmp = tempfile().unwrap(); - let mut last_offset = 0; - - { - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::new(); - let (stream, replicated_until) = tx - .current - .tail() - .stream_pages_from(0, 1, &mut seen, &tx) - .await; - tokio::pin!(stream); - - assert_eq!(replicated_until, 1); - - while let Some(frame) = stream.next().await { - let frame = frame.unwrap(); - let offset = (frame.header().page_no() - 1) * 4096; - tmp.write_all_at(frame.data(), offset as u64).unwrap(); - last_offset = last_offset.max(frame.header().frame_no()); - } - } - - for _ in 0..10 { - conn.execute("INSERT INTO test VALUES(42)", ()).unwrap(); - } - - seal_current_segment(&shared); - - { - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::new(); - let (stream, replicated_until) = tx - .current - .tail() - .stream_pages_from(0, last_offset, &mut seen, &tx) - .await; - tokio::pin!(stream); - - assert_eq!(replicated_until, last_offset); - - while let Some(frame) = stream.next().await { - let frame = frame.unwrap(); - let offset = (frame.header().page_no() - 1) * 4096; - tmp.write_all_at(frame.data(), offset as u64).unwrap(); - } - - *shared.durable_frame_no.lock() = 999999; - } - - shared.checkpoint().await.unwrap(); - tmp.seek(std::io::SeekFrom::Start(0)).unwrap(); - let mut copy_bytes = Vec::new(); - tmp.read_to_end(&mut copy_bytes).unwrap(); - - let mut orig_bytes = Vec::new(); - shared - .db_file - .try_clone() - .unwrap() - .read_to_end(&mut orig_bytes) - .unwrap(); - - assert_eq!(db_payload(©_bytes), db_payload(&orig_bytes)); - } - - #[tokio::test] - async fn stream_start_frame_no_before_sealed_segments() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - conn.execute("CREATE TABLE test(x);", ()).unwrap(); - - for _ in 0..10 { - conn.execute("INSERT INTO test VALUES(42)", ()).unwrap(); - } - - seal_current_segment(&shared); - *shared.durable_frame_no.lock() = 999999; - shared.checkpoint().await.unwrap(); - - for _ in 0..10 { - conn.execute("INSERT INTO test VALUES(42)", ()).unwrap(); - } - seal_current_segment(&shared); - - let tx = shared.begin_read(u64::MAX); - let mut seen = RoaringBitmap::new(); - let (stream, replicated_from) = tx - .current - .tail() - .stream_pages_from(0, 0, &mut seen, &tx) - .await; - tokio::pin!(stream); - - let mut count = 0; - while let Some(_) = stream.next().await { - count += 1; - } - - assert_eq!(count, 1); - assert_eq!(replicated_from, 13); - } - - fn db_payload(db: &[u8]) -> u32 { - let size = (db.len() / 4096) * 4096; - crc32fast::hash(&db[..size]) - } -} diff --git a/libsql-wal/src/segment/mod.rs b/libsql-wal/src/segment/mod.rs deleted file mode 100644 index 1b250bd997..0000000000 --- a/libsql-wal/src/segment/mod.rs +++ /dev/null @@ -1,300 +0,0 @@ -//! Libsql-wal is organized as a linked list of segments. Frames are appended to the head segments, -//! and eventually, the head segment is swapped for a new empty one. The previous head segment is -//! sealed and becomes immutable. The head segment is represented by the `CurrentSegment` type, and -//! the sealed segments by the `SealedSegment` type. -//! -//! When a reader starts a transaction, it record the head segment current frame_no. This is the -//! maximum frame_no that this reader is allowed to read. The reader also keeps a reference to the -//! head segment at the moment it was created. -#![allow(dead_code)] -use std::future::Future; -use std::hash::Hasher as _; -use std::io; -use std::mem::offset_of; -use std::mem::size_of; -use std::num::NonZeroU64; -use std::sync::Arc; - -use chrono::DateTime; -use chrono::Utc; -use zerocopy::byteorder::little_endian::{U128, U16, U32, U64}; -use zerocopy::AsBytes; - -use crate::error::{Error, Result}; -use crate::io::buf::IoBufMut; -use crate::io::FileExt; -use crate::io::Io; -use crate::LIBSQL_MAGIC; -use crate::LIBSQL_PAGE_SIZE; - -pub(crate) mod compacted; -pub mod current; -pub mod list; -pub mod sealed; - -bitflags::bitflags! { - pub struct SegmentFlags: u32 { - /// Frames in the segment are ordered in ascending frame_no. - /// This is true for a segment created by a primary, but a replica may insert frames in any - /// order, as long as commit boundaries are preserved. - const FRAME_UNORDERED = 1 << 0; - /// The segment is sealed. If this flag is set, then - const SEALED = 1 << 1; - } -} - -#[repr(C)] -#[derive(Debug, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::FromZeroes, Clone, Copy)] -pub struct SegmentHeader { - /// Set to LIBSQL_MAGIC - pub magic: U64, - /// header version - pub version: U16, - pub start_frame_no: U64, - pub last_commited_frame_no: U64, - /// number of frames in the segment - pub frame_count: U64, - /// size of the database in pages, after applying the segment. - pub size_after: U32, - /// byte offset of the index. If 0, then the index wasn't written, and must be recovered. - /// If non-0, the segment is sealed, and must not be written to anymore - /// the index is followed by its checksum - pub index_offset: U64, - pub index_size: U64, - pub flags: U32, - /// salt for the segment checksum - pub salt: U32, - /// right now we only support 4096, but if se decided to support other sizes, - /// we could do it without changing the header - pub page_size: U16, - pub log_id: U128, - /// ms, from unix epoch - pub sealed_at_timestamp: U64, - - /// checksum of the header fields, excluding the checksum itself. This field must be the last - pub header_cheksum: U32, -} - -impl SegmentHeader { - fn checksum(&self) -> u32 { - let field_bytes: &[u8] = &self.as_bytes()[..offset_of!(SegmentHeader, header_cheksum)]; - let checksum = crc32fast::hash(field_bytes); - checksum - } - - fn check(&self) -> Result<()> { - if self.page_size.get() != LIBSQL_PAGE_SIZE { - return Err(Error::InvalidPageSize); - } - - if self.magic.get() != LIBSQL_MAGIC { - return Err(Error::InvalidHeaderChecksum); - } - - if self.version.get() != 1 { - return Err(Error::InvalidHeaderVersion); - } - - let computed = self.checksum(); - if computed == self.header_cheksum.get() { - return Ok(()); - } else { - return Err(Error::InvalidHeaderChecksum); - } - } - - pub fn flags(&self) -> SegmentFlags { - SegmentFlags::from_bits(self.flags.get()).unwrap() - } - - fn set_flags(&mut self, flags: SegmentFlags) { - self.flags = flags.bits().into(); - } - - fn recompute_checksum(&mut self) { - let checksum = self.checksum(); - self.header_cheksum = checksum.into(); - } - - pub fn last_commited_frame_no(&self) -> u64 { - self.last_commited_frame_no.get() - } - - /// size fo the db after applying this segment - pub fn size_after(&self) -> u32 { - self.size_after.get() - } - - fn is_empty(&self) -> bool { - self.frame_count() == 0 - } - - pub fn frame_count(&self) -> usize { - self.frame_count.get() as usize - } - - pub fn last_committed(&self) -> u64 { - // either the current segment is empty, and the start frame_no is the last frame_no commited on - // the previous segment (start_frame_no - 1), or it's the last committed frame_no from this - // segment. - if self.is_empty() { - self.start_frame_no.get() - 1 - } else { - self.last_commited_frame_no.get() - } - } - - pub(crate) fn next_frame_no(&self) -> NonZeroU64 { - if self.is_empty() { - assert!(self.start_frame_no.get() > 0); - NonZeroU64::new(self.start_frame_no.get()).unwrap() - } else { - NonZeroU64::new(self.last_commited_frame_no.get() + 1).unwrap() - } - } -} - -pub trait Segment: Send + Sync + 'static { - fn compact(&self, out_file: &impl FileExt) -> impl Future>> + Send; - fn start_frame_no(&self) -> u64; - fn last_committed(&self) -> u64; - fn index(&self) -> &fst::Map>; - fn read_page(&self, page_no: u32, max_frame_no: u64, buf: &mut [u8]) -> io::Result; - /// returns the number of readers currently holding a reference to this log. - /// The read count must monotonically decrease. - fn is_checkpointable(&self) -> bool; - /// The size of the database after applying this segment. - fn size_after(&self) -> u32; - async fn read_frame_offset_async(&self, offset: u32, buf: B) -> (B, Result<()>) - where - B: IoBufMut + Send + 'static; - fn timestamp(&self) -> DateTime; - - fn destroy(&self, io: &IO) -> impl Future; -} - -#[repr(C)] -#[derive(Debug, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::FromZeroes)] -pub struct FrameHeader { - pub page_no: U32, - pub size_after: U32, - pub frame_no: U64, -} - -impl FrameHeader { - pub fn page_no(&self) -> u32 { - self.page_no.get() - } - - pub fn size_after(&self) -> u32 { - self.size_after.get() - } - - pub fn frame_no(&self) -> u64 { - self.frame_no.get() - } - - pub fn set_frame_no(&mut self, frame_no: u64) { - self.frame_no = frame_no.into(); - } - - pub fn set_page_no(&mut self, page_no: u32) { - self.page_no = page_no.into(); - } - - pub fn set_size_after(&mut self, size_after: u32) { - self.size_after = size_after.into(); - } - - pub fn is_commit(&self) -> bool { - self.size_after() != 0 - } -} - -/// A page with a running runnign checksum prepended. -/// `checksum` is computed by taking the checksum of the previous frame and crc32'ing it with frame -/// data (header and page content). The first page is hashed with the segment header salt. -#[repr(C)] -#[derive(Debug, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::FromZeroes)] -pub struct CheckedFrame { - checksum: U32, - // frame should always be the last field - frame: Frame, -} - -impl CheckedFrame { - pub(crate) const fn offset_of_frame() -> usize { - offset_of!(Self, frame) - } -} - -#[repr(C)] -#[derive(Debug, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::FromZeroes)] -pub struct Frame { - header: FrameHeader, - data: [u8; LIBSQL_PAGE_SIZE as usize], -} - -impl Frame { - pub(crate) fn checksum(&self, previous_checksum: u32) -> u32 { - let mut digest = crc32fast::Hasher::new_with_initial(previous_checksum); - digest.write(self.as_bytes()); - digest.finalize() - } - - pub fn data(&self) -> &[u8] { - &self.data - } - - pub fn header(&self) -> &FrameHeader { - &self.header - } - - pub fn header_mut(&mut self) -> &mut FrameHeader { - &mut self.header - } - - pub(crate) fn size_after(&self) -> Option { - let size_after = self.header().size_after.get(); - (size_after != 0).then_some(size_after) - } - - pub fn data_mut(&mut self) -> &mut [u8] { - &mut self.data - } -} - -/// offset of the CheckedFrame in a current of sealed segment -#[inline] -fn checked_frame_offset(offset: u32) -> u64 { - (size_of::() + (offset as usize) * size_of::()) as u64 -} -/// offset of a Frame in a current or sealed segment. -#[inline] -fn frame_offset(offset: u32) -> u64 { - checked_frame_offset(offset) + CheckedFrame::offset_of_frame() as u64 -} - -/// offset of a frame's page in a current or sealed segment. -#[inline] -fn page_offset(offset: u32) -> u64 { - frame_offset(offset) + size_of::() as u64 -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn offsets() { - assert_eq!(checked_frame_offset(0) as usize, size_of::()); - assert_eq!( - frame_offset(0) as usize, - size_of::() + CheckedFrame::offset_of_frame() - ); - assert_eq!( - page_offset(0) as usize, - size_of::() + CheckedFrame::offset_of_frame() + size_of::() - ); - } -} diff --git a/libsql-wal/src/segment/sealed.rs b/libsql-wal/src/segment/sealed.rs deleted file mode 100644 index d9e480bd44..0000000000 --- a/libsql-wal/src/segment/sealed.rs +++ /dev/null @@ -1,430 +0,0 @@ -use std::collections::BTreeMap; -use std::hash::Hasher; -use std::io::{BufWriter, ErrorKind, Write}; -use std::mem::size_of; -use std::ops::Deref; -use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Arc; - -use chrono::prelude::{DateTime, Utc}; -use fst::{Map, MapBuilder, Streamer}; -use zerocopy::{AsBytes, FromZeroes}; - -use crate::error::Result; -use crate::io::buf::{IoBuf, IoBufMut, MapSlice, ZeroCopyBuf}; -use crate::io::file::{BufCopy, FileExt}; -use crate::io::Inspect; -use crate::segment::{checked_frame_offset, CheckedFrame}; -use crate::{LIBSQL_MAGIC, LIBSQL_WAL_VERSION}; - -use super::compacted::{ - CompactedFrame, CompactedFrameFlags, CompactedFrameHeader, CompactedSegmentHeader, -}; -use super::{frame_offset, page_offset, Frame, Segment, SegmentFlags, SegmentHeader}; - -/// an immutable, wal segment -#[derive(Debug)] -pub struct SealedSegment { - inner: Arc>, -} - -impl Clone for SealedSegment { - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - } - } -} - -pub struct SealedSegmentInner { - pub read_locks: Arc, - header: SegmentHeader, - file: Arc, - index: Map>, - path: PathBuf, -} - -impl std::fmt::Debug for SealedSegmentInner { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("SealedSegment") - .field("read_locks", &self.read_locks) - .field("header", &self.header) - .field("index", &self.index) - .field("path", &self.path) - .finish() - } -} - -impl SealedSegment { - pub fn empty(f: F) -> Self { - Self { - inner: SealedSegmentInner { - read_locks: Default::default(), - header: SegmentHeader::new_zeroed(), - file: Arc::new(f), - index: Map::default().map_data(Into::into).unwrap(), - path: PathBuf::new(), - } - .into(), - } - } -} - -impl Deref for SealedSegment { - type Target = SealedSegmentInner; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl Segment for SealedSegment -where - F: FileExt, -{ - async fn compact(&self, out_file: &impl FileExt) -> Result> { - let header = CompactedSegmentHeader { - start_frame_no: self.header().start_frame_no, - end_frame_no: self.header().last_commited_frame_no, - size_after: self.header.size_after, - version: LIBSQL_WAL_VERSION.into(), - magic: LIBSQL_MAGIC.into(), - page_size: self.header().page_size, - timestamp: self.header.sealed_at_timestamp, - log_id: self.header().log_id.into(), - }; - - let mut crc_init = crc32fast::hash(header.as_bytes()); - - let (_, ret) = out_file - .write_all_at_async(ZeroCopyBuf::new_init(header), 0) - .await; - ret?; - - let mut count_pages = self.index().len(); - let mut pages = self.index().stream(); - let mut buffer = Box::new(ZeroCopyBuf::::new_uninit()); - let mut out_index = fst::MapBuilder::memory(); - let mut current_offset = 0; - - while let Some((page_no_bytes, offset)) = pages.next() { - count_pages -= 1; - let (mut b, ret) = self.read_frame_offset_async(offset as _, buffer).await; - ret?; - // transaction boundaries in a segment are completely erased. The responsibility is on - // the consumer of the segment to place the transaction boundary such that all frames from - // the segment are applied within the same transaction. - let frame = b.get_mut(); - - let flags = if count_pages == 0 { - CompactedFrameFlags::LAST.bits() - } else { - CompactedFrameFlags::empty().bits() - }; - - let mut compacted_header = CompactedFrameHeader { - checksum: 0.into(), - flags: flags.into(), - page_no: frame.header().page_no, - frame_no: frame.header().frame_no, - }; - - crc_init = compacted_header.update_checksum(crc_init, b.get_ref().data()); - - fn map_data(b: &ZeroCopyBuf) -> &[u8] { - b.get_ref().data() - } - - let data = MapSlice::new(b, map_data); - let mut b = write_compact_frame(out_file, current_offset, compacted_header, data) - .await? - .into_inner(); - - out_index - .insert(page_no_bytes, current_offset as _) - .unwrap(); - current_offset += 1; - - b.deinit(); - buffer = b; - } - - Ok(out_index.into_inner().unwrap()) - } - - #[inline] - fn start_frame_no(&self) -> u64 { - self.header.start_frame_no.get() - } - - #[inline] - fn last_committed(&self) -> u64 { - self.header.last_committed() - } - - fn index(&self) -> &fst::Map> { - &self.index - } - - fn read_page(&self, page_no: u32, max_frame_no: u64, buf: &mut [u8]) -> std::io::Result { - if self.header().start_frame_no.get() > max_frame_no { - return Ok(false); - } - - let index = self.index(); - if let Some(offset) = index.get(page_no.to_be_bytes()) { - self.read_page_offset(offset as u32, buf)?; - - return Ok(true); - } - - Ok(false) - } - - fn is_checkpointable(&self) -> bool { - let read_locks = self.read_locks.load(Ordering::Relaxed); - tracing::debug!(read_locks); - read_locks == 0 - } - - fn size_after(&self) -> u32 { - self.header().size_after() - } - - async fn read_frame_offset_async(&self, offset: u32, buf: B) -> (B, Result<()>) - where - B: IoBufMut + Send + 'static, - { - assert_eq!(buf.bytes_total(), size_of::()); - let frame_offset = frame_offset(offset); - let (buf, ret) = self.file.read_exact_at_async(buf, frame_offset as _).await; - (buf, ret.map_err(Into::into)) - } - - fn destroy(&self, io: &IO) -> impl std::future::Future { - async move { - if let Err(e) = io.remove_file_async(&self.path).await { - tracing::error!("failed to remove segment file {:?}: {e}", self.path); - } - } - } - - fn timestamp(&self) -> DateTime { - assert_ne!( - self.header().sealed_at_timestamp.get(), - 0, - "segment was not sealed properly" - ); - DateTime::from_timestamp_millis(self.header().sealed_at_timestamp.get() as _) - .expect("this should be a guaranteed roundtrip with DateTime::timestamp_millis") - } -} - -async fn write_compact_frame( - file: &impl FileExt, - offset: usize, - header: CompactedFrameHeader, - data: B, -) -> Result { - let header_offset = size_of::() + offset * size_of::(); - - let fut1 = file.write_all_at_async(ZeroCopyBuf::new_init(header), header_offset as u64); - - let data_offset = header_offset + size_of::(); - let fut2 = file.write_all_at_async(data, data_offset as u64); - let ((_, ret1), (b, ret2)) = futures::join!(fut1, fut2); - - ret1?; - ret2?; - - Ok(b) -} - -impl SealedSegment { - pub fn open( - file: Arc, - path: PathBuf, - read_locks: Arc, - now: DateTime, - ) -> Result> { - let mut header: SegmentHeader = SegmentHeader::new_zeroed(); - file.read_exact_at(header.as_bytes_mut(), 0)?; - - header.check()?; - - let index_offset = header.index_offset.get(); - let index_len = header.index_size.get(); - - if header.is_empty() { - std::fs::remove_file(path)?; - return Ok(None); - } - - // This happens in case of crash: the segment is not empty, but it wasn't sealed. We need to - // recover the index, and seal the segment. - if !header.flags().contains(SegmentFlags::SEALED) { - assert_eq!(header.index_offset.get(), 0, "{header:?}"); - return Self::recover(file, path, header, now).map(Some); - } - - let mut slice = vec![0; index_len as usize]; - file.read_exact_at(&mut slice, index_offset)?; - let index = Map::new(slice.into())?; - Ok(Some(Self { - inner: SealedSegmentInner { - file, - path, - read_locks, - index, - header, - } - .into(), - })) - } - - fn recover( - file: Arc, - path: PathBuf, - mut header: SegmentHeader, - now: DateTime, - ) -> Result { - assert!(!header.is_empty()); - assert_eq!(header.index_size.get(), 0); - assert_eq!(header.index_offset.get(), 0); - assert!(!header.flags().contains(SegmentFlags::SEALED)); - - let mut current_checksum = header.salt.get(); - tracing::trace!("recovering unsealed segment at {path:?}"); - let mut index = BTreeMap::new(); - let mut frame: Box = CheckedFrame::new_box_zeroed(); - let mut current_tx = Vec::new(); - let mut last_committed = 0; - let mut size_after = 0; - let mut frame_count = 0; - // When the segment is ordered, then the biggest frame_no is the last commited - // frame. This is not the case for an unordered segment (in case of recovery or - // a replica), so we track the biggest frame_no and set last_commited to that - // value on a commit frame - let mut max_seen_frame_no = 0; - for i in 0.. { - let offset = checked_frame_offset(i as u32); - match file.read_exact_at(frame.as_bytes_mut(), offset) { - Ok(_) => { - let new_checksum = frame.frame.checksum(current_checksum); - // this is the first checksum that doesn't match the checksum chain, drop the - // transaction and any frame after that. - if new_checksum != frame.checksum.get() { - tracing::warn!( - "found invalid checksum in segment, dropping {} frames", - header.last_committed() - last_committed - ); - break; - } - current_checksum = new_checksum; - frame_count += 1; - - // this must always hold for a ordered segment. - #[cfg(debug_assertions)] - { - if !header.flags().contains(SegmentFlags::FRAME_UNORDERED) { - assert!(frame.frame.header().frame_no() > max_seen_frame_no); - } - } - - max_seen_frame_no = max_seen_frame_no.max(frame.frame.header.frame_no()); - - current_tx.push(frame.frame.header().page_no()); - if frame.frame.header.is_commit() { - last_committed = max_seen_frame_no; - size_after = frame.frame.header().size_after(); - let base_offset = (i + 1) - current_tx.len(); - for (frame_offset, page_no) in current_tx.drain(..).enumerate() { - index.insert(page_no, (base_offset + frame_offset) as u32); - } - } - } - Err(e) if e.kind() == ErrorKind::UnexpectedEof => break, - Err(e) => return Err(e.into()), - } - } - - let index_offset = frame_count as u32; - let index_byte_offset = checked_frame_offset(index_offset); - let cursor = file.cursor(index_byte_offset); - let writer = BufCopy::new(cursor); - let writer = BufWriter::new(writer); - let mut digest = crc32fast::Hasher::new_with_initial(current_checksum); - let mut writer = Inspect::new(writer, |data: &[u8]| { - digest.write(data); - }); - let mut builder = MapBuilder::new(&mut writer)?; - for (k, v) in index.into_iter() { - builder.insert(k.to_be_bytes(), v as u64).unwrap(); - } - builder.finish().unwrap(); - let writer = writer.into_inner(); - let index_size = writer.get_ref().get_ref().count(); - let index_checksum = digest.finalize(); - let (mut cursor, index_bytes) = writer - .into_inner() - .map_err(|e| e.into_parts().0)? - .into_parts(); - cursor.write_all(&index_checksum.to_le_bytes())?; - header.index_offset = index_byte_offset.into(); - header.index_size = index_size.into(); - header.last_commited_frame_no = last_committed.into(); - header.size_after = size_after.into(); - header.sealed_at_timestamp = (now.timestamp_millis() as u64).into(); - let flags = header.flags(); - header.set_flags(flags | SegmentFlags::SEALED); - header.recompute_checksum(); - file.write_all_at(header.as_bytes(), 0)?; - let index = Map::new(index_bytes.into()).unwrap(); - - Ok(SealedSegment { - inner: SealedSegmentInner { - read_locks: Default::default(), - header, - file, - index, - path, - } - .into(), - }) - } - - pub fn path(&self) -> &Path { - &self.path - } - - pub fn read_page_offset(&self, offset: u32, buf: &mut [u8]) -> std::io::Result<()> { - let page_offset = page_offset(offset) as usize; - self.file.read_exact_at(buf, page_offset as _)?; - - Ok(()) - } - - pub fn read_frame_offset(&self, offset: u32, frame: &mut Frame) -> Result<()> { - let offset = frame_offset(offset); - self.file.read_exact_at(frame.as_bytes_mut(), offset as _)?; - Ok(()) - } -} - -impl SealedSegment { - pub fn header(&self) -> &SegmentHeader { - &self.header - } - - pub async fn read_page_offset_async(&self, offset: u32, buf: B) -> (B, Result<()>) - where - B: IoBufMut + Send + 'static, - F: FileExt, - { - assert_eq!(buf.bytes_total(), 4096); - let page_offset = page_offset(offset) as usize; - let (buf, ret) = self.file.read_exact_at_async(buf, page_offset as _).await; - (buf, ret.map_err(Into::into)) - } -} diff --git a/libsql-wal/src/segment/snapshots/libsql_wal__segment__current__test__current_stream_frames_incomplete.snap b/libsql-wal/src/segment/snapshots/libsql_wal__segment__current__test__current_stream_frames_incomplete.snap deleted file mode 100644 index 3bd99c71f9..0000000000 --- a/libsql-wal/src/segment/snapshots/libsql_wal__segment__current__test__current_stream_frames_incomplete.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: libsql-wal/src/segment/current.rs -expression: seen ---- -RoaringBitmap<[1, 2, 6, 7, 8, 9]> diff --git a/libsql-wal/src/segment_swap_strategy/duration.rs b/libsql-wal/src/segment_swap_strategy/duration.rs deleted file mode 100644 index 7c31cb1fd6..0000000000 --- a/libsql-wal/src/segment_swap_strategy/duration.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::time::{Duration, Instant}; - -use parking_lot::Mutex; - -use super::SegmentSwapStrategy; - -/// A wal swap strategy that swaps the current wal if it's older that some duration -pub struct DurationSwapStrategy { - swap_after: Duration, - last_swapped_at: Mutex, -} - -impl DurationSwapStrategy { - pub fn new(swap_after: Duration) -> Self { - Self { - swap_after, - last_swapped_at: Mutex::new(Instant::now()), - } - } -} - -impl SegmentSwapStrategy for DurationSwapStrategy { - #[inline(always)] - fn should_swap(&self, _frames_in_wal: usize) -> bool { - let last_swapped_at = self.last_swapped_at.lock(); - last_swapped_at.elapsed() >= self.swap_after - } - - #[inline(always)] - fn swapped(&self) { - *self.last_swapped_at.lock() = Instant::now(); - } -} diff --git a/libsql-wal/src/segment_swap_strategy/frame_count.rs b/libsql-wal/src/segment_swap_strategy/frame_count.rs deleted file mode 100644 index 8e27e33ba6..0000000000 --- a/libsql-wal/src/segment_swap_strategy/frame_count.rs +++ /dev/null @@ -1,22 +0,0 @@ -use super::SegmentSwapStrategy; - -/// A swap strategy that swaps if the count of frames in the wal exceed some threshold -pub struct FrameCountSwapStrategy { - max_frames_in_wal: usize, -} - -impl FrameCountSwapStrategy { - pub fn new(max_frames_in_wal: usize) -> Self { - Self { max_frames_in_wal } - } -} - -impl SegmentSwapStrategy for FrameCountSwapStrategy { - #[inline(always)] - fn should_swap(&self, frames_in_wal: usize) -> bool { - frames_in_wal >= self.max_frames_in_wal - } - - #[inline(always)] - fn swapped(&self) {} -} diff --git a/libsql-wal/src/segment_swap_strategy/mod.rs b/libsql-wal/src/segment_swap_strategy/mod.rs deleted file mode 100644 index b606db12bf..0000000000 --- a/libsql-wal/src/segment_swap_strategy/mod.rs +++ /dev/null @@ -1,59 +0,0 @@ -pub(crate) mod duration; -pub(crate) mod frame_count; - -pub(crate) trait SegmentSwapStrategy: Sync + Send + 'static { - fn should_swap(&self, frames_in_wal: usize) -> bool; - fn swapped(&self); - - fn and(self, other: O) -> And - where - Self: Sized, - { - And(self, other) - } - - fn or(self, other: O) -> Or - where - Self: Sized, - { - Or(self, other) - } -} - -pub struct And(A, B); - -impl SegmentSwapStrategy for And -where - A: SegmentSwapStrategy, - B: SegmentSwapStrategy, -{ - #[inline(always)] - fn should_swap(&self, frames_in_wal: usize) -> bool { - self.0.should_swap(frames_in_wal) && self.1.should_swap(frames_in_wal) - } - - #[inline(always)] - fn swapped(&self) { - self.0.swapped(); - self.1.swapped(); - } -} - -pub struct Or(A, B); - -impl SegmentSwapStrategy for Or -where - A: SegmentSwapStrategy, - B: SegmentSwapStrategy, -{ - #[inline(always)] - fn should_swap(&self, frames_in_wal: usize) -> bool { - self.0.should_swap(frames_in_wal) || self.1.should_swap(frames_in_wal) - } - - #[inline(always)] - fn swapped(&self) { - self.0.swapped(); - self.1.swapped(); - } -} diff --git a/libsql-wal/src/shared_wal.rs b/libsql-wal/src/shared_wal.rs deleted file mode 100644 index 0ca4381d24..0000000000 --- a/libsql-wal/src/shared_wal.rs +++ /dev/null @@ -1,693 +0,0 @@ -use std::num::NonZeroU64; -use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use arc_swap::ArcSwap; -use crossbeam::deque::Injector; -use crossbeam::sync::Unparker; -use futures::Stream; -use libsql_sys::ffi::Sqlite3DbHeader; -use parking_lot::{Mutex, MutexGuard}; -use rand::Rng as _; -use roaring::RoaringBitmap; -use tokio::sync::{mpsc, watch}; -use uuid::Uuid; -use zerocopy::{AsBytes as _, FromZeroes as _}; - -use crate::checkpointer::CheckpointMessage; -use crate::error::{Error, Result}; -use crate::io::buf::ZeroCopyBoxIoBuf; -use crate::io::file::FileExt; -use crate::io::Io; -use crate::replication::storage::{ReplicateFromStorage, StorageReplicator}; -use crate::segment::current::CurrentSegment; -use crate::segment::list::SegmentList; -use crate::segment::sealed::SealedSegment; -use crate::segment::Segment as _; -use crate::segment::{Frame, FrameHeader}; -use crate::segment_swap_strategy::duration::DurationSwapStrategy; -use crate::segment_swap_strategy::frame_count::FrameCountSwapStrategy; -use crate::segment_swap_strategy::SegmentSwapStrategy; -use crate::storage::{OnStoreCallback, Storage}; -use crate::transaction::{ReadTransaction, Savepoint, Transaction, TxGuard, WriteTransaction}; -use crate::{LibsqlFooter, LIBSQL_PAGE_SIZE}; -use libsql_sys::name::NamespaceName; - -#[derive(Default)] -pub struct WalLock { - pub(crate) tx_id: Arc>>, - /// When a writer is popped from the write queue, its write transaction may not be reading from the most recent - /// snapshot. In this case, we return `SQLITE_BUSY_SNAPHSOT` to the caller. If no reads were performed - /// with that transaction before upgrading, then the caller will call us back immediately after re-acquiring - /// a read mark. - /// Without the reserved slot, the writer would be re-enqueued, a writer before it would be inserted, - /// and we'd find ourselves in the initial situation. Instead, we use the reserved slot to bypass the queue when the - /// writer tried to re-acquire the write lock. - pub(crate) reserved: Mutex>, - next_tx_id: AtomicU64, - pub(crate) waiters: Injector<(Unparker, u64)>, -} - -pub struct SharedWal { - pub(crate) current: ArcSwap>, - pub(crate) wal_lock: Arc, - pub(crate) db_file: IO::File, - pub(crate) namespace: NamespaceName, - pub(crate) checkpointed_frame_no: AtomicU64, - /// max frame_no acknowledged by the durable storage - pub(crate) durable_frame_no: Arc>, - pub(crate) new_frame_notifier: tokio::sync::watch::Sender, - pub(crate) stored_segments: Box, - pub(crate) shutdown: AtomicBool, - pub(crate) checkpoint_notifier: mpsc::Sender, - pub(crate) io: Arc, - pub(crate) swap_strategy: Box, - pub(crate) wals_path: PathBuf, - pub(crate) storage: Arc, -} - -impl SharedWal -where - IO: Io, -{ - #[tracing::instrument(skip(self), fields(namespace = self.namespace.as_str()))] - pub fn shutdown(&self) -> Result<()> - where - S: Storage>, - { - tracing::info!("started namespace shutdown"); - self.shutdown.store(true, Ordering::SeqCst); - // fixme: for infinite loop - let mut tx = loop { - let mut tx = Transaction::Read(self.begin_read(u64::MAX)); - match self.upgrade(&mut tx) { - Ok(_) => break tx, - Err(Error::BusySnapshot) => continue, - Err(e) => return Err(e), - } - }; - - { - let mut tx = tx.as_write_mut().unwrap().lock(); - tx.commit(); - self.swap_current(&tx)?; - } - // The current segment will not be used anymore. It's empty, but we still seal it so that - // the next startup doesn't find an unsealed segment. - self.current.load().seal(self.io.now())?; - tracing::info!("namespace shutdown"); - Ok(()) - } - - pub fn new_frame_notifier(&self) -> watch::Receiver { - self.new_frame_notifier.subscribe() - } - - pub fn db_size(&self) -> u32 { - self.current.load().db_size() - } - - pub fn log_id(&self) -> Uuid { - self.current.load().log_id() - } - - pub fn durable_frame_no(&self) -> u64 { - *self.durable_frame_no.lock() - } - - #[tracing::instrument(skip_all)] - pub fn begin_read(&self, conn_id: u64) -> ReadTransaction { - // FIXME: this is not enough to just increment the counter, we must make sure that the segment - // is not sealed. If the segment is sealed, retry with the current segment - let current = self.current.load(); - current.inc_reader_count(); - let (max_frame_no, db_size, max_offset) = current.with_header(|header| { - ( - header.last_committed(), - header.size_after(), - header.frame_count() as u64, - ) - }); - let id = self.wal_lock.next_tx_id.fetch_add(1, Ordering::Relaxed); - ReadTransaction { - id, - max_frame_no, - current: current.clone(), - db_size, - created_at: Instant::now(), - conn_id, - pages_read: 0, - namespace: self.namespace.clone(), - checkpoint_notifier: self.checkpoint_notifier.clone(), - max_offset, - } - } - - /// Upgrade a read transaction to a write transaction - pub fn upgrade(&self, tx: &mut Transaction) -> Result<()> { - loop { - match tx { - Transaction::Write(_) => unreachable!("already in a write transaction"), - Transaction::Read(read_tx) => { - let mut reserved = self.wal_lock.reserved.lock(); - match *reserved { - // we have already reserved the slot, go ahead and try to acquire - Some(id) if id == read_tx.conn_id => { - tracing::trace!("taking reserved slot"); - reserved.take(); - let lock = self.wal_lock.tx_id.lock_blocking(); - assert!(lock.is_none()); - let write_tx = self.acquire_write(read_tx, lock, reserved)?; - *tx = Transaction::Write(write_tx); - return Ok(()); - } - None => { - let lock = self.wal_lock.tx_id.lock_blocking(); - if lock.is_none() && self.wal_lock.waiters.is_empty() { - let write_tx = self.acquire_write(read_tx, lock, reserved)?; - *tx = Transaction::Write(write_tx); - return Ok(()); - } - } - _ => (), - } - - tracing::trace!( - "txn currently held by another connection, registering to wait queue" - ); - - let parker = crossbeam::sync::Parker::new(); - let unparker = parker.unparker().clone(); - self.wal_lock.waiters.push((unparker, read_tx.conn_id)); - drop(reserved); - parker.park(); - } - } - } - } - - fn acquire_write( - &self, - read_tx: &ReadTransaction, - mut tx_id_lock: async_lock::MutexGuard>, - mut reserved: MutexGuard>, - ) -> Result> { - assert!(reserved.is_none() || *reserved == Some(read_tx.conn_id)); - assert!(tx_id_lock.is_none()); - // we read two fields in the header. There is no risk that a transaction commit in - // between the two reads because this would require that: - // 1) there would be a running txn - // 2) that transaction held the lock to tx_id (be in a transaction critical section) - let current = self.current.load(); - let last_commited = current.last_committed(); - if read_tx.max_frame_no != last_commited || current.is_sealed() { - if read_tx.pages_read <= 1 { - // this transaction hasn't read anything yet, it will retry to - // acquire the lock, reserved the slot so that it can make - // progress quickly - // TODO: is it possible that we upgrade the read lock ourselves, so we don't need - // that reserved stuff anymore? If nothing was read, just upgrade the read, - // otherwise return snapshot busy and let the connection do the cleanup. - tracing::debug!("reserving tx slot"); - reserved.replace(read_tx.conn_id); - } - return Err(Error::BusySnapshot); - } - let next_offset = current.count_committed() as u32; - let next_frame_no = current.next_frame_no().get(); - *tx_id_lock = Some(read_tx.id); - let current_checksum = current.current_checksum(); - - Ok(WriteTransaction { - wal_lock: self.wal_lock.clone(), - savepoints: vec![Savepoint::new(next_offset, next_frame_no, current_checksum)], - next_frame_no, - next_offset, - current_checksum, - is_commited: false, - read_tx: read_tx.clone(), - recompute_checksum: None, - }) - } - - #[tracing::instrument(skip(self, tx, buffer))] - pub fn read_page( - &self, - tx: &mut Transaction, - page_no: u32, - buffer: &mut [u8], - ) -> Result<()> { - match tx.current.find_frame(page_no, tx) { - Some(offset) => { - // some debug assertions to make sure invariants hold - #[cfg(debug_assertions)] - { - if let Ok(header) = tx.current.frame_header_at(offset) { - // the frame we got is not more recent than max frame_no - assert!( - header.frame_no() <= tx.max_frame_no(), - "read frame is greater than max frame, {}, {}", - header.frame_no(), - tx.max_frame_no() - ); - // the page we got is the page we asked for - assert_eq!(header.page_no(), page_no); - } - } - - tx.current.read_page_offset(offset, buffer)?; - } - None => { - // locate in segments - if !tx - .current - .tail() - .read_page(page_no, tx.max_frame_no, buffer)? - { - // read from db_file - tracing::trace!(page_no, "reading from main file"); - self.db_file - .read_exact_at(buffer, (page_no as u64 - 1) * 4096)?; - } - } - } - - tx.pages_read += 1; - - Ok(()) - } - - #[tracing::instrument(skip_all, fields(tx_id = tx.id))] - pub fn insert_frames<'a>( - &self, - tx: &mut WriteTransaction, - pages: impl Iterator, - size_after: Option, - ) -> Result<()> - where - S: Storage>, - { - let current = self.current.load(); - let mut tx = tx.lock(); - if let Some(last_committed) = current.insert_pages(pages, size_after, &mut tx)? { - self.new_frame_notifier.send_replace(last_committed); - } - - if tx.is_commited() && self.swap_strategy.should_swap(current.count_committed()) { - self.swap_current(&tx)?; - self.swap_strategy.swapped(); - } - - Ok(()) - } - - /// Cut the current log, and register it for storage - pub fn seal_current(&self) -> Result<()> - where - S: Storage>, - { - let mut tx = self.begin_read(u64::MAX).into(); - self.upgrade(&mut tx)?; - - let ret = { - let mut guard = tx.as_write_mut().unwrap().lock(); - guard.commit(); - self.swap_current(&mut guard) - }; - // make sure the tx is always ended before it's dropped! - // FIXME: this is an issue with this design, since downgrade consume self, we can't have a - // drop implementation. The should probably have a Option, to that we can - // take &mut Self instead. - tx.end(); - - ret - } - - /// Swap the current log. A write lock must be held, but the transaction must be must be committed already. - pub(crate) fn swap_current(&self, tx: &impl TxGuard) -> Result<()> - where - S: Storage>, - { - assert!(tx.is_commited()); - let current = self.current.load(); - if current.is_empty() { - return Ok(()); - } - let start_frame_no = current.next_frame_no(); - let path = self.wals_path.join(format!("{start_frame_no:020}.seg")); - - let segment_file = self.io.open(true, true, true, &path)?; - let salt = self.io.with_rng(|rng| rng.gen()); - let new = CurrentSegment::create( - segment_file, - path, - start_frame_no, - current.db_size(), - current.tail().clone(), - salt, - current.log_id(), - )?; - // sealing must the last fallible operation, because we don't want to end up in a situation - // where the current log is sealed and it wasn't swapped. - if let Some(sealed) = current.seal(self.io.now())? { - new.tail().push(sealed.clone()); - maybe_store_segment( - self.storage.as_ref(), - &self.checkpoint_notifier, - &self.namespace, - &self.durable_frame_no, - sealed, - ); - } - - self.current.swap(Arc::new(new)); - tracing::debug!("current segment swapped"); - - Ok(()) - } - - #[tracing::instrument(skip(self))] - pub async fn checkpoint(&self) -> Result> { - let durable_frame_no = *self.durable_frame_no.lock(); - let checkpointed_frame_no = self - .current - .load() - .tail() - .checkpoint(&self.db_file, durable_frame_no, self.log_id(), &self.io) - .await?; - if let Some(checkpointed_frame_no) = checkpointed_frame_no { - self.checkpointed_frame_no - .store(checkpointed_frame_no, Ordering::SeqCst); - } - - Ok(checkpointed_frame_no) - } - - pub fn last_committed_frame_no(&self) -> u64 { - let current = self.current.load(); - current.last_committed_frame_no() - } - - pub fn namespace(&self) -> &NamespaceName { - &self.namespace - } - - /// read frames from the main db file. - pub(crate) fn replicate_from_db_file<'a>( - &'a self, - seen: &'a RoaringBitmap, - tx: &'a ReadTransaction, - until: u64, - ) -> impl Stream>> + Send + 'a - where - S: Send + Sync, - { - async_stream::try_stream! { - let mut all = RoaringBitmap::new(); - all.insert_range(1..=tx.db_size); - let to_take = all - seen; - for page_no in to_take { - let mut frame = Frame::new_box_zeroed(); - *frame.header_mut() = FrameHeader { - page_no: page_no.into(), - size_after: 0.into(), - // we don't really know what the frame_no is, so we set it to a number less that any other frame_no - frame_no: until.into(), - }; - let buf = unsafe { ZeroCopyBoxIoBuf::new_uninit_partial(frame, size_of::()) }; - let (buf, ret) = self.db_file.read_exact_at_async(buf, (page_no as u64 - 1) * LIBSQL_PAGE_SIZE as u64).await; - ret?; - let frame = buf.into_inner(); - yield frame; - } - } - } - - /// Open the shared wal at path. The caller must ensure that no other process is calling this - /// conccurently. - pub(crate) fn try_open( - io: Arc, - storage: Arc, - checkpoint_notifier: &tokio::sync::mpsc::Sender, - namespace: &NamespaceName, - db_path: &Path, - ) -> Result - where - S: Storage>, - { - let db_file = io.open(false, true, true, db_path)?; - let db_file_len = db_file.len()?; - let header = if db_file_len > 0 { - let mut header: Sqlite3DbHeader = Sqlite3DbHeader::new_zeroed(); - db_file.read_exact_at(header.as_bytes_mut(), 0)?; - Some(header) - } else { - None - }; - - let footer = try_read_footer(&db_file)?; - - let mut checkpointed_frame_no = footer.map(|f| f.replication_index.get()).unwrap_or(0); - - // the trick here to prevent sqlite to open our db is to create a dir -wal. Sqlite - // will think that this is a wal file, but it's in fact a directory and it will not like - // it. - let mut wals_path = db_path.to_owned(); - wals_path.set_file_name(format!( - "{}-wal", - db_path.file_name().unwrap().to_str().unwrap() - )); - io.create_dir_all(&wals_path)?; - // TODO: handle that with abstract io - let dir = walkdir::WalkDir::new(&wals_path) - .sort_by_file_name() - .into_iter(); - - // we only checkpoint durable frame_no so this is a good first estimate without an actual - // network call. - let durable_frame_no = Arc::new(Mutex::new(checkpointed_frame_no)); - - let list = SegmentList::default(); - for entry in dir { - let entry = entry.map_err(|e| e.into_io_error().unwrap())?; - if entry - .path() - .extension() - .map(|e| e.to_str().unwrap() != "seg") - .unwrap_or(true) - { - continue; - } - - let file = io.open(false, true, true, entry.path())?; - - if let Some(sealed) = SealedSegment::open( - file.into(), - entry.path().to_path_buf(), - Default::default(), - io.now(), - )? { - list.push(sealed.clone()); - maybe_store_segment( - storage.as_ref(), - &checkpoint_notifier, - &namespace, - &durable_frame_no, - sealed, - ); - } - } - - let log_id = match footer { - Some(footer) if list.is_empty() => footer.log_id(), - None if list.is_empty() => io.uuid(), - Some(footer) => { - let log_id = list - .with_head(|h| h.header().log_id.get()) - .expect("non-empty list should have a head"); - let log_id = Uuid::from_u128(log_id); - assert_eq!(log_id, footer.log_id()); - log_id - } - None => { - let log_id = list - .with_head(|h| h.header().log_id.get()) - .expect("non-empty list should have a head"); - Uuid::from_u128(log_id) - } - }; - - // if there is a tail, then the latest checkpointed frame_no is one before the the - // start frame_no of the tail. We must read it from the tail, because a partial - // checkpoint may have occured before a crash. - if let Some(last) = list.last() { - checkpointed_frame_no = (last.start_frame_no() - 1).max(1) - } - - let (db_size, next_frame_no) = list - .with_head(|segment| { - let header = segment.header(); - (header.size_after(), header.next_frame_no()) - }) - .unwrap_or_else(|| match header { - Some(header) => ( - header.db_size.get(), - NonZeroU64::new(checkpointed_frame_no + 1) - .unwrap_or(NonZeroU64::new(1).unwrap()), - ), - None => (0, NonZeroU64::new(1).unwrap()), - }); - - let current_segment_path = wals_path.join(format!("{next_frame_no:020}.seg")); - - let segment_file = io.open(true, true, true, ¤t_segment_path)?; - let salt = io.with_rng(|rng| rng.gen()); - - let current = arc_swap::ArcSwap::new(Arc::new(CurrentSegment::create( - segment_file, - current_segment_path, - next_frame_no, - db_size, - list.into(), - salt, - log_id, - )?)); - - let (new_frame_notifier, _) = tokio::sync::watch::channel(next_frame_no.get() - 1); - - // FIXME: make swap strategy configurable - // This strategy will perform a swap if either the wal is bigger than 20k frames, or older - // than 10 minutes, or if the frame count is greater than a 1000 and the wal was last - // swapped more than 30 secs ago - let swap_strategy = Box::new( - DurationSwapStrategy::new(Duration::from_secs(5 * 60)) - .or(FrameCountSwapStrategy::new(20_000)) - .or(FrameCountSwapStrategy::new(1000) - .and(DurationSwapStrategy::new(Duration::from_secs(30)))), - ); - - Ok(Self { - current, - wal_lock: Default::default(), - db_file, - namespace: namespace.clone(), - checkpointed_frame_no: checkpointed_frame_no.into(), - new_frame_notifier, - durable_frame_no, - stored_segments: Box::new(StorageReplicator::new(storage.clone(), namespace.clone())), - shutdown: false.into(), - checkpoint_notifier: checkpoint_notifier.clone(), - io, - storage, - swap_strategy, - wals_path: wals_path.to_owned(), - }) - } -} - -fn try_read_footer(db_file: &impl FileExt) -> Result> { - let len = db_file.len()?; - if len as usize % LIBSQL_PAGE_SIZE as usize == size_of::() { - let mut footer: LibsqlFooter = LibsqlFooter::new_zeroed(); - let footer_offset = (len / LIBSQL_PAGE_SIZE as u64) * LIBSQL_PAGE_SIZE as u64; - db_file.read_exact_at(footer.as_bytes_mut(), footer_offset)?; - footer.validate()?; - Ok(Some(footer)) - } else { - Ok(None) - } -} - -#[tracing::instrument(skip_all, fields(namespace = namespace.as_str(), start_frame_no = seg.start_frame_no()))] -fn maybe_store_segment( - storage: &S, - notifier: &tokio::sync::mpsc::Sender, - namespace: &NamespaceName, - durable_frame_no: &Arc>, - seg: S::Segment, -) { - if seg.last_committed() > *durable_frame_no.lock() { - let cb: OnStoreCallback = Box::new({ - let notifier = notifier.clone(); - let durable_frame_no = durable_frame_no.clone(); - let namespace = namespace.clone(); - move |fno| { - Box::pin(async move { - update_durable(fno, notifier, durable_frame_no, namespace).await; - }) - } - }); - storage.store(namespace, seg, None, cb); - } else { - // segment can be checkpointed right away. - // FIXME: this is only necessary because some tests call this method in an async context. - #[cfg(debug_assertions)] - { - let namespace = namespace.clone(); - let notifier = notifier.clone(); - tokio::spawn(async move { - let _ = notifier.send(CheckpointMessage::Namespace(namespace)).await; - }); - } - - #[cfg(not(debug_assertions))] - { - let _ = notifier.blocking_send(CheckpointMessage::Namespace(namespace.clone())); - } - - tracing::debug!( - segment_end = seg.last_committed(), - durable_frame_no = *durable_frame_no.lock(), - "segment doesn't contain any new data" - ); - } -} - -async fn update_durable( - new_durable: u64, - notifier: mpsc::Sender, - durable_frame_no_slot: Arc>, - namespace: NamespaceName, -) { - { - let mut g = durable_frame_no_slot.lock(); - if *g < new_durable { - *g = new_durable; - } - } - let _ = notifier.send(CheckpointMessage::Namespace(namespace)).await; -} - -#[cfg(test)] -mod test { - use crate::test::{seal_current_segment, TestEnv}; - - use super::*; - - #[tokio::test] - async fn checkpoint() { - let env = TestEnv::new(); - let conn = env.open_conn("test"); - let shared = env.shared("test"); - - assert_eq!(shared.checkpointed_frame_no.load(Ordering::Relaxed), 0); - - conn.execute("create table test (x)", ()).unwrap(); - conn.execute("insert into test values (12)", ()).unwrap(); - conn.execute("insert into test values (12)", ()).unwrap(); - - assert_eq!(shared.checkpointed_frame_no.load(Ordering::Relaxed), 0); - - seal_current_segment(&shared); - - *shared.durable_frame_no.lock() = 999999; - - let frame_no = shared.checkpoint().await.unwrap().unwrap(); - assert_eq!(frame_no, 4); - assert_eq!(shared.checkpointed_frame_no.load(Ordering::Relaxed), 4); - - assert!(shared.checkpoint().await.unwrap().is_none()); - } -} diff --git a/libsql-wal/src/storage/async_storage.rs b/libsql-wal/src/storage/async_storage.rs deleted file mode 100644 index 438d426257..0000000000 --- a/libsql-wal/src/storage/async_storage.rs +++ /dev/null @@ -1,331 +0,0 @@ -//! `AsyncStorage` is a `Storage` implementation that defer storage to a background thread. The -//! durable frame_no is notified asynchronously. - -use std::sync::Arc; - -use chrono::Utc; -use libsql_sys::name::NamespaceName; -use tokio::sync::{mpsc, oneshot}; -use tokio::task::JoinSet; -use tokio_stream::Stream; - -use crate::io::{FileExt, Io, StdIO}; -use crate::segment::compacted::CompactedSegment; -use crate::segment::Segment; - -use super::backend::{Backend, FindSegmentReq}; -use super::scheduler::Scheduler; -use super::{OnStoreCallback, Storage, StoreSegmentRequest}; - -/// Background loop task state. -/// -/// The background loop task is not allowed to exit, unless it was notified for shutdown. -/// -/// On shutdown, attempts to empty the queue, and flush the receiver. When the last handle of the -/// receiver is dropped, and the queue is empty, exit. -pub struct AsyncStorageLoop { - receiver: mpsc::UnboundedReceiver>, - scheduler: Scheduler, - backend: Arc, - io: Arc, - max_in_flight: usize, - force_shutdown: oneshot::Receiver<()>, -} - -impl AsyncStorageLoop -where - FS: Io, - B: Backend + 'static, - S: Segment, -{ - /// Schedules durability jobs. This loop is not allowed to fail, or lose jobs. - /// A job is prepared by calling `Scheduler::prepare(..)`. The job is spawned, and it returns a - /// `JobResult`, which is then returned to the scheduler by calling `Scheduler::report(..)`. - /// When a request is received, it is immediately scheduled by calling `Scheduler::register` - /// with it. - /// - /// The loop is only allowed to shutdown if the receiver is closed, and the scheduler is empty, - /// or if `force_shutdown` is called, in which case everything is dropped in place. - #[tracing::instrument(skip(self))] - pub async fn run(mut self) { - let mut shutting_down = false; - let mut in_flight_futs = JoinSet::new(); - let mut notify_shutdown = None; - // run the loop until shutdown. - loop { - if shutting_down && self.scheduler.is_empty() { - break; - } - - // schedule as much work as possible - while self.scheduler.has_work() && in_flight_futs.len() < self.max_in_flight { - let job = self - .scheduler - .schedule() - .expect("scheduler has work, but didn't return a job"); - in_flight_futs.spawn(job.perform(self.backend.clone(), self.io.clone())); - } - - tokio::select! { - biased; - Some(join_result) = in_flight_futs.join_next(), if !in_flight_futs.is_empty() => { - match join_result { - Ok(job_result) => { - // if shutting down, log progess: - if shutting_down { - tracing::info!("processed job, {} jobs remaining", in_flight_futs.len()); - } - self.scheduler.report(job_result).await; - } - Err(e) => { - // job panicked. report and exit process. The program is crippled, from - // now on, so we just exit, and hope to restart on a fresh state. - tracing::error!("fatal error: bottomless job panicked: {e}"); - std::process::exit(1); - } - } - } - msg = self.receiver.recv(), if !shutting_down => { - match msg { - Some(StorageLoopMessage::StoreReq(req)) => { - self.scheduler.register(req); - } - Some(StorageLoopMessage::DurableFrameNoReq { namespace, ret, config_override }) => { - self.fetch_durable_frame_no_async(namespace, ret, config_override); - } - Some(StorageLoopMessage::Shutdown(ret)) => { - notify_shutdown.replace(ret); - shutting_down = true; - tracing::info!("Storage shutting down"); - } - None => { - shutting_down = true; - } - } - } - shutdown = &mut self.force_shutdown => { - if shutdown.is_ok() { - break - } else { - // force_shutdown sender was dropped without sending a message (likely a - // bug). Log and default to graceful shutdown. - // tracing::error!("bottomless force shutdown handle dropped without notifying; shutting down gracefully"); - } - } - } - } - - tracing::info!("Storage shutdown"); - if let Some(notify) = notify_shutdown { - let _ = notify.send(()); - } - } - - fn fetch_durable_frame_no_async( - &self, - namespace: NamespaceName, - ret: oneshot::Sender>, - config_override: Option, - ) { - let backend = self.backend.clone(); - let config = match config_override { - Some(config) => config, - None => backend.default_config(), - }; - - tokio::spawn(async move { - let res = backend - .meta(&config, &namespace) - .await - .map(|meta| meta.max_frame_no); - let _ = ret.send(res); - }); - } -} - -pub struct BottomlessConfig { - /// The maximum number of store jobs that can be processed conccurently - pub max_jobs_conccurency: usize, - /// The maximum number of jobs that can be enqueued before throttling - pub max_enqueued_jobs: usize, - pub config: C, -} - -enum StorageLoopMessage { - StoreReq(StoreSegmentRequest), - DurableFrameNoReq { - namespace: NamespaceName, - config_override: Option, - ret: oneshot::Sender>, - }, - Shutdown(oneshot::Sender<()>), -} - -pub struct AsyncStorage { - /// send request to the main loop - job_sender: mpsc::UnboundedSender>, - force_shutdown: oneshot::Sender<()>, - backend: Arc, -} - -impl Storage for AsyncStorage -where - B: Backend, - S: Segment, -{ - type Segment = S; - type Config = B::Config; - - async fn shutdown(&self) { - let (snd, rcv) = oneshot::channel(); - let _ = self.job_sender.send(StorageLoopMessage::Shutdown(snd)); - let _ = rcv.await; - } - - fn store( - &self, - namespace: &NamespaceName, - segment: Self::Segment, - config_override: Option, - on_store_callback: OnStoreCallback, - ) { - let req = StoreSegmentRequest { - namespace: namespace.clone(), - segment, - created_at: Utc::now(), - storage_config_override: config_override, - on_store_callback, - }; - - self.job_sender - .send(StorageLoopMessage::StoreReq(req)) - .expect("bottomless loop was closed before the handle was dropped"); - } - - async fn durable_frame_no( - &self, - namespace: &NamespaceName, - config_override: Option, - ) -> super::Result { - let config = config_override.unwrap_or_else(|| self.backend.default_config()); - let meta = self.backend.meta(&config, namespace).await?; - Ok(meta.max_frame_no) - } - - async fn find_segment( - &self, - namespace: &NamespaceName, - req: FindSegmentReq, - config_override: Option, - ) -> super::Result { - let config = config_override.unwrap_or_else(|| self.backend.default_config()); - let key = self.backend.find_segment(&config, namespace, req).await?; - Ok(key) - } - - async fn fetch_segment_index( - &self, - namespace: &NamespaceName, - key: &super::SegmentKey, - config_override: Option, - ) -> super::Result>> { - let config = config_override.unwrap_or_else(|| self.backend.default_config()); - let index = self - .backend - .fetch_segment_index(&config, namespace, key) - .await?; - Ok(index) - } - - async fn fetch_segment_data( - &self, - namespace: &NamespaceName, - key: &super::SegmentKey, - config_override: Option, - ) -> super::Result> { - // TODO: make async - let config = config_override.unwrap_or_else(|| self.backend.default_config()); - let backend = self.backend.clone(); - let file = backend - .fetch_segment_data(config, namespace.clone(), *key) - .await?; - let segment = CompactedSegment::open(file).await?; - Ok(segment) - } - - fn list_segments<'a>( - &'a self, - namespace: &'a NamespaceName, - until: u64, - config_override: Option, - ) -> impl Stream> + 'a { - let config = config_override.unwrap_or_else(|| self.backend.default_config()); - self.backend.list_segments(config, namespace, until) - } -} - -pub struct AsyncStorageInitConfig { - pub backend: Arc, - pub max_in_flight_jobs: usize, -} - -impl AsyncStorage { - pub async fn new( - config: AsyncStorageInitConfig, - ) -> (AsyncStorage, AsyncStorageLoop) - where - B: Backend, - S: Segment, - { - Self::new_with_io(config, Arc::new(StdIO(()))).await - } - - pub async fn new_with_io( - config: AsyncStorageInitConfig, - io: Arc, - ) -> (AsyncStorage, AsyncStorageLoop) - where - B: Backend, - IO: Io, - S: Segment, - { - let (job_snd, job_rcv) = tokio::sync::mpsc::unbounded_channel(); - let (shutdown_snd, shutdown_rcv) = tokio::sync::oneshot::channel(); - let scheduler = Scheduler::new(); - let storage_loop = AsyncStorageLoop { - receiver: job_rcv, - scheduler, - backend: config.backend.clone(), - io, - max_in_flight: config.max_in_flight_jobs, - force_shutdown: shutdown_rcv, - }; - - let this = Self { - job_sender: job_snd, - force_shutdown: shutdown_snd, - backend: config.backend, - }; - - (this, storage_loop) - } - - pub fn backend(&self) -> &B { - &self.backend - } - - /// send shutdown signal to bottomless. - /// return a function that can be called to force shutdown, if necessary - pub fn send_shutdown(self) -> impl FnOnce() { - let force_shutdown = { - // we drop the sender, the loop will finish processing scheduled job and exit - // gracefully. - let Self { force_shutdown, .. } = self; - force_shutdown - }; - - || { - let _ = force_shutdown.send(()); - } - } -} diff --git a/libsql-wal/src/storage/backend/fs.rs b/libsql-wal/src/storage/backend/fs.rs deleted file mode 100644 index 92e0a865a7..0000000000 --- a/libsql-wal/src/storage/backend/fs.rs +++ /dev/null @@ -1,273 +0,0 @@ -use std::future::Future; -use std::path::{Path, PathBuf}; -use std::sync::Arc; - -use tokio::io::{AsyncBufRead, AsyncBufReadExt}; - -use crate::io::{FileExt, Io}; -use crate::segment::compacted::CompactedSegmentDataHeader; -use crate::storage::{Error, Result}; -use libsql_sys::name::NamespaceName; - -use super::{Backend, SegmentMeta}; - -pub struct FsBackend { - prefix: PathBuf, - io: Arc, - remote_storage: Arc, -} - -impl FsBackend { - fn new(prefix: PathBuf, io: I, remote_storage: S) -> Result { - io.create_dir_all(&prefix.join("segments")).unwrap(); - - Ok(FsBackend { - prefix, - io: Arc::new(io), - remote_storage: Arc::new(remote_storage), - }) - } -} - -pub(crate) trait RemoteStorage: Send + Sync + 'static { - type FetchStream: AsyncBufRead + Unpin; - - fn upload( - &self, - file_path: &Path, - meta: &SegmentMeta, - ) -> impl Future> + Send; - - fn fetch( - &self, - namespace: &NamespaceName, - frame_no: u64, - ) -> impl Future> + Send; -} - -impl RemoteStorage for () { - type FetchStream = tokio::io::Empty; - - async fn upload(&self, _file_path: &Path, _meta: &SegmentMeta) -> Result<()> { - Ok(()) - } - - async fn fetch( - &self, - _namespace: &NamespaceName, - frame_no: u64, - ) -> Result<(String, Self::FetchStream)> { - Err(Error::FrameNotFound(frame_no)) - } -} - -// TODO(lucio): handle errors for fs module -impl Backend for FsBackend { - type Config = (); - - async fn store( - &self, - _config: &Self::Config, - meta: super::SegmentMeta, - segment_data: impl crate::io::file::FileExt, - _segment_index: Vec, - ) -> Result<()> { - let key = format!( - "{:019}-{:019}-{:019}.segment", - meta.start_frame_no, - meta.end_frame_no, - meta.created_at.timestamp() - ); - - let path = self.prefix.join("segments").join(&key); - - let buf = Vec::with_capacity(segment_data.len().unwrap() as usize); - - let f = self.io.open(true, false, true, &path).unwrap(); - let (buf, res) = segment_data.read_exact_at_async(buf, 0).await; - res?; - - let (_, res) = f.write_all_at_async(buf, 0).await; - res?; - - self.remote_storage.upload(&path, &meta).await?; - - Ok(()) - } - - async fn fetch_segment( - &self, - _config: &Self::Config, - namespace: NamespaceName, - frame_no: u64, - dest_path: &Path, - ) -> Result<()> { - // TODO(lucio): prefix also via namespace - let dir = self.prefix.join("segments"); - - // TODO(lucio): optimization would be to cache this list, since we update the files in the - // store fn we can keep track without having to go to the OS each time. - let mut dirs = tokio::fs::read_dir(&dir).await?; - - while let Some(entry) = dirs.next_entry().await? { - let file = entry.file_name(); - let key = file.to_str().unwrap().split(".").next().unwrap(); - let mut comp = key.split("-"); - - let start_frame = comp.next().unwrap(); - let end_frame = comp.next().unwrap(); - - let start_frame: u64 = start_frame.parse().unwrap(); - let end_frame: u64 = end_frame.parse().unwrap(); - - if start_frame <= frame_no && end_frame >= frame_no { - #[cfg(debug_assertions)] - { - use crate::io::buf::ZeroCopyBuf; - - let header_buf = ZeroCopyBuf::::new_uninit(); - let file = self.io.open(false, true, false, &entry.path()).unwrap(); - let (header_buf, res) = file.read_exact_at_async(header_buf, 0).await; - res.unwrap(); - - let header = header_buf.get_ref(); - let start_frame_from_header = header.start_frame_no.get(); - let end_frame_from_header = header.end_frame_no.get(); - - // TOOD(lucio): convert these into errors before prod - assert_eq!(start_frame, start_frame_from_header); - assert_eq!(end_frame, end_frame_from_header); - } - - self.io.hard_link(&entry.path(), dest_path)?; - - return Ok(()); - } - } - - // TODO(lucio): fetch from remote storage - let (file_name, mut reader) = self.remote_storage.fetch(&namespace, frame_no).await?; - - let file_path = dir.join(file_name); - - let file = self.io.open(true, true, true, &file_path).unwrap(); - - // TODO(lucio): write buf reader content into the expected destination file then hard link - - let mut offset = 0; - - loop { - let buf = reader.fill_buf().await.unwrap(); - - // TODO: we need to copy here because the buffer needs to be passed by ownership - // we could probably write a ByteStream adapter that uses bytes instead. For now we - // can copy and take that hit. - let buf = Vec::from(buf); - - if buf.is_empty() { - break; - } - - let (buf, res) = file.write_all_at_async(buf, offset).await; - res?; - - offset += buf.len() as u64; - - reader.consume(buf.len()); - } - - self.io.hard_link(&file_path, dest_path)?; - - Ok(()) - } - - async fn meta( - &self, - _config: &Self::Config, - _namespace: NamespaceName, - ) -> Result { - todo!() - } - - fn default_config(&self) -> std::sync::Arc { - todo!() - } -} - -pub(super) fn parse_segment_file_name(name: &str) -> Result<(u64, u64)> { - tracing::debug!("parsing file name: {}", name); - let key = name.split(".").next().unwrap(); - let mut comp = key.split("-"); - - let start_frame = comp.next().unwrap(); - let end_frame = comp.next().unwrap(); - - let start_frame: u64 = start_frame.parse().unwrap(); - let end_frame: u64 = end_frame.parse().unwrap(); - - Ok((start_frame, end_frame)) -} - -pub(super) fn generate_key(meta: &SegmentMeta) -> String { - format!( - "{:019}-{:019}-{:019}.segment", - meta.start_frame_no, - meta.end_frame_no, - meta.created_at.timestamp() - ) -} - -#[cfg(test)] -mod tests { - use std::io::Read; - - use chrono::Utc; - use tempfile::tempdir; - use uuid::Uuid; - use zerocopy::{AsBytes, FromZeroes}; - - use super::*; - use crate::io::StdIO; - - #[tokio::test] - async fn read_write() { - let dir = tempdir().unwrap(); - let fs = FsBackend::new(dir.path().into(), StdIO::default(), ()).unwrap(); - - let namespace = NamespaceName::from_string("".into()); - let segment = CompactedSegmentDataHeader { - start_frame_no: 0.into(), - frame_count: 10.into(), - segment_id: 0.into(), - end_frame_no: 64.into(), - }; - - fs.store( - &(), - crate::storage::backend::SegmentMeta { - namespace: namespace.clone(), - segment_id: Uuid::new_v4(), - start_frame_no: 0, - end_frame_no: 64, - created_at: Utc::now(), - }, - segment.as_bytes().to_vec(), - Vec::new(), - ) - .await - .unwrap(); - - let path = dir.path().join("fetched_segment"); - fs.fetch_segment(&(), namespace.clone(), 5, &path) - .await - .unwrap(); - - let mut file = std::fs::File::open(path).unwrap(); - let mut header: CompactedSegmentDataHeader = CompactedSegmentDataHeader::new_zeroed(); - - file.read_exact(header.as_bytes_mut()).unwrap(); - - assert_eq!(header.start_frame_no.get(), 0); - assert_eq!(header.end_frame_no.get(), 64); - } -} diff --git a/libsql-wal/src/storage/backend/mod.rs b/libsql-wal/src/storage/backend/mod.rs deleted file mode 100644 index 4ff3437b3e..0000000000 --- a/libsql-wal/src/storage/backend/mod.rs +++ /dev/null @@ -1,245 +0,0 @@ -#![allow(dead_code)] -use std::future::Future; -use std::sync::Arc; - -use bytes::Bytes; -use chrono::{DateTime, Utc}; -use fst::Map; -use tokio_stream::Stream; - -use super::{Result, SegmentInfo, SegmentKey}; -use crate::io::file::FileExt; -use crate::segment::compacted::{CompactedFrameHeader, CompactedSegmentHeader}; -use libsql_sys::name::NamespaceName; - -// pub mod fs; -#[cfg(feature = "s3")] -pub mod s3; - -#[derive(Debug)] -pub struct SegmentMeta { - pub namespace: NamespaceName, - pub start_frame_no: u64, - pub end_frame_no: u64, - pub segment_timestamp: DateTime, -} - -pub struct RestoreRequest {} - -pub struct DbMeta { - pub max_frame_no: u64, -} - -#[derive(Debug, Clone, Copy)] -pub enum FindSegmentReq { - /// returns a segment containing this frame - EndFrameNoLessThan(u64), - /// Returns the segment with closest timestamp less than or equal to the requested timestamp - Timestamp(DateTime), -} - -pub trait Backend: Send + Sync + 'static { - /// Config type associated with the Storage - type Config: Clone + Send + Sync + 'static; - - /// Store `segment_data` with its associated `meta` - fn store( - &self, - config: &Self::Config, - meta: SegmentMeta, - segment_data: impl FileExt, - segment_index: Vec, - ) -> impl Future> + Send; - - /// Store `segment_data` with its associated `meta` - fn store_segment_data( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - segment_data: impl Stream> + Send + 'static, - ) -> impl Future> + Send; - - /// Store `segment_data` with its associated `meta` - fn store_segment_index( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - index: Vec, - ) -> impl Future> + Send; - - fn find_segment( - &self, - config: &Self::Config, - namespace: &NamespaceName, - req: FindSegmentReq, - ) -> impl Future> + Send; - - fn fetch_segment_index( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - ) -> impl Future>>> + Send; - - /// Fetch a segment for `namespace` containing `frame_no`, and writes it to `dest`. - async fn fetch_segment_data_to_file( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - file: &impl FileExt, - ) -> Result; - - // this method taking self: Arc is an infortunate consequence of rust type system making - // impl FileExt variant with all the arguments, with no escape hatch... - fn fetch_segment_data( - self: Arc, - config: Self::Config, - namespace: NamespaceName, - key: SegmentKey, - ) -> impl Future> + Send; - - async fn fetch_segment_data_stream( - &self, - config: Self::Config, - namespace: &NamespaceName, - key: SegmentKey, - ) -> Result<( - CompactedSegmentHeader, - impl Stream>, - )>; - - /// Fetch meta for `namespace` - fn meta( - &self, - config: &Self::Config, - namespace: &NamespaceName, - ) -> impl Future> + Send; - - fn list_segments<'a>( - &'a self, - config: Self::Config, - namespace: &'a NamespaceName, - until: u64, - ) -> impl Stream> + 'a; - - /// Returns the default configuration for this storage - fn default_config(&self) -> Self::Config; -} - -impl Backend for Arc { - type Config = T::Config; - - fn store( - &self, - config: &Self::Config, - meta: SegmentMeta, - segment_data: impl FileExt, - segment_index: Vec, - ) -> impl Future> + Send { - self.as_ref() - .store(config, meta, segment_data, segment_index) - } - - async fn meta(&self, config: &Self::Config, namespace: &NamespaceName) -> Result { - self.as_ref().meta(config, namespace).await - } - - fn default_config(&self) -> Self::Config { - self.as_ref().default_config() - } - - async fn find_segment( - &self, - config: &Self::Config, - namespace: &NamespaceName, - req: FindSegmentReq, - ) -> Result { - self.as_ref().find_segment(config, namespace, req).await - } - - async fn fetch_segment_index( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - ) -> Result>> { - self.as_ref() - .fetch_segment_index(config, namespace, key) - .await - } - - async fn fetch_segment_data_to_file( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - file: &impl FileExt, - ) -> Result { - self.as_ref() - .fetch_segment_data_to_file(config, namespace, key, file) - .await - } - - async fn fetch_segment_data( - self: Arc, - config: Self::Config, - namespace: NamespaceName, - key: SegmentKey, - ) -> Result { - // this implementation makes no sense (Arc>) - self.as_ref() - .clone() - .fetch_segment_data(config, namespace, key) - .await - } - - fn list_segments<'a>( - &'a self, - config: Self::Config, - namespace: &'a NamespaceName, - until: u64, - ) -> impl Stream> + 'a { - self.as_ref().list_segments(config, namespace, until) - } - - async fn fetch_segment_data_stream( - &self, - config: Self::Config, - namespace: &NamespaceName, - key: SegmentKey, - ) -> Result<( - CompactedSegmentHeader, - impl Stream>, - )> { - self.as_ref() - .fetch_segment_data_stream(config, namespace, key) - .await - } - - async fn store_segment_data( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - segment_data: impl Stream> + Send + 'static, - ) -> Result<()> { - self.as_ref() - .store_segment_data(config, namespace, key, segment_data) - .await - } - - async fn store_segment_index( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - index: Vec, - ) -> Result<()> { - self.as_ref() - .store_segment_index(config, namespace, key, index) - .await - } -} diff --git a/libsql-wal/src/storage/backend/s3.rs b/libsql-wal/src/storage/backend/s3.rs deleted file mode 100644 index a933560b2a..0000000000 --- a/libsql-wal/src/storage/backend/s3.rs +++ /dev/null @@ -1,1170 +0,0 @@ -//! S3 implementation of storage backend - -use std::fmt::{self, Formatter}; -use std::mem::size_of; -use std::path::Path; -use std::pin::Pin; -use std::str::FromStr; -use std::sync::Arc; -use std::task::Poll; - -use aws_config::SdkConfig; -use aws_sdk_s3::operation::create_bucket::CreateBucketError; -use aws_sdk_s3::operation::get_object::GetObjectOutput; -use aws_sdk_s3::primitives::{ByteStream, SdkBody}; -use aws_sdk_s3::types::{ - CompletedMultipartUpload, CompletedPart, CreateBucketConfiguration, Object, -}; -use aws_sdk_s3::Client; -use bytes::{Bytes, BytesMut}; -use chrono::{DateTime, Utc}; -use futures::future::poll_fn; -use futures::{StreamExt, TryFutureExt as _, TryStreamExt}; -use http_body::{Body, Frame as HttpFrame, SizeHint}; -use libsql_sys::name::NamespaceName; -use pin_project_lite::pin_project; -use tokio::io::{AsyncBufReadExt, AsyncRead, AsyncReadExt, BufReader}; -use tokio_stream::Stream; -use tokio_util::codec::Decoder; -use tokio_util::sync::ReusableBoxFuture; -use zerocopy::byteorder::little_endian::{U16 as lu16, U32 as lu32, U64 as lu64}; -use zerocopy::{AsBytes, FromBytes, FromZeroes}; - -use super::{Backend, FindSegmentReq, SegmentMeta}; -use crate::io::compat::copy_to_file; -use crate::io::{FileExt, Io, StdIO}; -use crate::segment::compacted::{CompactedFrame, CompactedFrameHeader, CompactedSegmentHeader}; -use crate::storage::{Error, Result, SegmentInfo, SegmentKey}; -use crate::LIBSQL_MAGIC; - -pub struct S3Backend { - client: Client, - default_config: Arc, - io: IO, -} - -impl S3Backend { - pub async fn from_sdk_config( - aws_config: SdkConfig, - bucket: String, - cluster_id: String, - ) -> Result> { - Self::from_sdk_config_with_io(aws_config, bucket, cluster_id, StdIO(())).await - } -} - -/// Header for segment index stored into s3 -#[repr(C)] -#[derive(Copy, Clone, Debug, AsBytes, FromZeroes, FromBytes)] -struct SegmentIndexHeader { - magic: lu64, - version: lu16, - len: lu64, - checksum: lu32, -} - -impl S3Backend { - #[doc(hidden)] - pub async fn from_sdk_config_with_io( - aws_config: SdkConfig, - bucket: String, - cluster_id: String, - io: IO, - ) -> Result { - let config = aws_sdk_s3::Config::new(&aws_config) - .to_builder() - .force_path_style(true) - .build(); - - let region = config.region().expect("region must be configured").clone(); - - let client = Client::from_conf(config); - let config = S3Config { - bucket, - cluster_id, - aws_config, - }; - - let bucket_config = CreateBucketConfiguration::builder() - .location_constraint( - aws_sdk_s3::types::BucketLocationConstraint::from_str(®ion.to_string()).unwrap(), - ) - .build(); - - // TODO: we may need to create the bucket for config overrides. Maybe try lazy bucket - // creation? or assume that the bucket exists? - let create_bucket_ret = client - .create_bucket() - .create_bucket_configuration(bucket_config) - .bucket(&config.bucket) - .send() - .await; - - match create_bucket_ret { - Ok(_) => (), - Err(e) => { - if let Some(service_error) = e.as_service_error() { - match service_error { - CreateBucketError::BucketAlreadyExists(_) - | CreateBucketError::BucketAlreadyOwnedByYou(_) => { - tracing::debug!("bucket already exist"); - } - _ => return Err(Error::unhandled(e, "failed to create bucket")), - } - } else { - return Err(Error::unhandled(e, "failed to create bucket")); - } - } - } - - Ok(Self { - client, - default_config: config.into(), - io, - }) - } - - async fn fetch_segment_data_reader( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - segment_key: &SegmentKey, - ) -> Result { - let key = s3_segment_data_key(folder_key, segment_key); - let stream = self.s3_get(config, key).await?; - Ok(stream.body.into_async_read()) - } - - async fn fetch_segment_data_inner( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - segment_key: &SegmentKey, - file: &impl FileExt, - ) -> Result { - let reader = self - .fetch_segment_data_reader(config, folder_key, segment_key) - .await?; - let mut reader = tokio::io::BufReader::with_capacity(8196, reader); - while reader.fill_buf().await?.len() < size_of::() {} - let header = CompactedSegmentHeader::read_from_prefix(reader.buffer()).unwrap(); - - copy_to_file(reader, file).await?; - - Ok(header) - } - - /// returns a stream over raw CompactedFrame bytes - async fn fetch_segment_data_stream_inner( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - segment_key: &SegmentKey, - ) -> Result<( - CompactedSegmentHeader, - impl Stream>, - )> { - let reader = self - .fetch_segment_data_reader(config, folder_key, segment_key) - .await?; - - let mut reader = BufReader::new(reader); - let mut header = CompactedSegmentHeader::new_zeroed(); - reader.read_exact(header.as_bytes_mut()).await?; - - struct FrameDecoder { - verify: bool, - finished: bool, - current_crc: u32, - } - - impl FrameDecoder { - fn new(verify: bool, header: &CompactedSegmentHeader) -> Self { - let current_crc = if verify { - crc32fast::hash(header.as_bytes()) - } else { - 0 - }; - - Self { - finished: false, - verify, - current_crc, - } - } - } - - impl Decoder for FrameDecoder { - type Item = (CompactedFrameHeader, Bytes); - type Error = Error; - - fn decode( - &mut self, - src: &mut BytesMut, - ) -> std::result::Result, Self::Error> { - if self.finished { - return Ok(None); - } - - if src.len() >= size_of::() { - let mut data = src.split_to(size_of::()); - let header_bytes = data.split_to(size_of::()); - let header = CompactedFrameHeader::read_from(&header_bytes).unwrap(); - - if header.is_last() { - self.finished = true; - } - - if self.verify { - let checksum = header.compute_checksum(self.current_crc, &data); - if checksum != header.checksum() { - todo!("invalid frame checksum") - } - self.current_crc = checksum; - } - - return Ok(Some((header, data.freeze()))); - } else { - if src.capacity() < size_of::() { - src.reserve(size_of::() - src.capacity()) - } - Ok(None) - } - } - - fn decode_eof( - &mut self, - buf: &mut BytesMut, - ) -> std::result::Result, Self::Error> { - match self.decode(buf)? { - Some(frame) => Ok(Some(frame)), - None => { - if buf.is_empty() { - Ok(None) - } else { - Err(std::io::Error::new( - std::io::ErrorKind::Other, - "bytes remaining on stream", - ) - .into()) - } - } - } - } - } - - let stream = tokio_util::codec::FramedRead::new(reader, FrameDecoder::new(true, &header)); - - Ok((header, stream)) - } - - async fn s3_get(&self, config: &S3Config, key: impl ToString) -> Result { - Ok(self - .client - .get_object() - .bucket(&config.bucket) - .key(key.to_string()) - .send() - .await - .map_err(|e| Error::unhandled(e, "error sending s3 GET request"))?) - } - - async fn s3_put(&self, config: &S3Config, key: impl ToString, body: ByteStream) -> Result<()> { - self.client - .put_object() - .bucket(&config.bucket) - .body(body) - .key(key.to_string()) - .send() - .await - .map_err(|e| Error::unhandled(e, "error sending s3 PUT request"))?; - Ok(()) - } - - #[tracing::instrument(skip_all, fields(key))] - async fn s3_put_multipart( - &self, - config: &S3Config, - key: impl ToString, - data: B, - ) -> Result<()> - where - B: Body, - { - const MAX_CHUNK_SIZE: u64 = 50 * 1024 * 1024; // 50MB - let (s_chunks, r_chunks) = tokio::sync::mpsc::channel(8); - let key = key.to_string(); - - let upload = self - .client - .create_multipart_upload() - .bucket(&config.bucket) - .key(&key) - .send() - .await - .map_err(|e| Error::unhandled(e, "creating multipart upload"))?; - let upload_id = upload.upload_id(); - - let make_chunk_fut = async { - let mut current_chunk_file = self.io.tempfile()?; - let mut current_chunk_len = 0; - tokio::pin!(data); - loop { - let next_frame_fut = poll_fn(|cx| data.as_mut().poll_frame(cx)); - let Some(frame) = next_frame_fut.await else { - let _ = s_chunks.send(current_chunk_file).await; - break; - }; - let frame = frame?; - assert!(frame.is_data()); - let data = frame.into_data().unwrap(); - let offset = current_chunk_len; - current_chunk_len += data.len() as u64; - let (_, ret) = current_chunk_file.write_all_at_async(data, offset).await; - ret?; - if current_chunk_len >= MAX_CHUNK_SIZE { - let new_chunk_file = self.io.tempfile()?; - current_chunk_len = 0; - let old_chunk_file = std::mem::replace(&mut current_chunk_file, new_chunk_file); - if s_chunks.send(old_chunk_file).await.is_err() { - break; - } - } - } - - // make sure we move the sender in the future so the chunk sender eventually exits. - drop(s_chunks); - - Ok(()) - }; - - let send_chunks_fut = async { - let builder = tokio_stream::wrappers::ReceiverStream::new(r_chunks) - .enumerate() - .map(|(i, chunk)| { - let i = i; - self.client - .upload_part() - .bucket(&config.bucket) - .key(&key) - .part_number(i as i32 + 1) // part number must be between 1-10000 - .set_upload_id(upload_id.map(ToString::to_string)) - .body(FileStreamBody::new(chunk).into_byte_stream()) - .send() - .map_err(|e| Error::unhandled(e, format!("sending chunk"))) - .map_ok(move |resp| { - CompletedPart::builder() - .set_e_tag(resp.e_tag) - .set_part_number(Some(i as i32 + 1)) - .build() - }) - }) - .buffered(8) - .try_fold(CompletedMultipartUpload::builder(), |builder, completed| { - std::future::ready(Ok(builder.parts(completed))) - }) - .await?; - - Ok(builder.build()) - }; - - let ret = tokio::try_join!(send_chunks_fut, make_chunk_fut); - - match ret { - Ok((parts, _)) => { - self.client - .complete_multipart_upload() - .bucket(&config.bucket) - .set_upload_id(upload_id.map(ToString::to_string)) - .multipart_upload(parts) - .key(&key) - .send() - .await - .map_err(|e| Error::unhandled(e, format!("completing multipart upload")))?; - - Ok(()) - } - Err(e) => { - self.client - .abort_multipart_upload() - .bucket(&config.bucket) - .set_upload_id(upload_id.map(ToString::to_string)) - .key(&key) - .send() - .await - .map_err(|e| Error::unhandled(e, format!("aborting multipart upload")))?; - Err(e) - } - } - } - - async fn fetch_segment_index_inner( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - segment_key: &SegmentKey, - ) -> Result>> { - let s3_index_key = s3_segment_index_key(folder_key, segment_key); - let mut stream = self - .s3_get(config, s3_index_key) - .await? - .body - .into_async_read(); - let mut header: SegmentIndexHeader = SegmentIndexHeader::new_zeroed(); - stream.read_exact(header.as_bytes_mut()).await?; - if header.magic.get() != LIBSQL_MAGIC && header.version.get() != 1 { - return Err(Error::InvalidIndex("index header magic or version invalid")); - } - let mut data = Vec::with_capacity(header.len.get() as _); - while stream.read_buf(&mut data).await? != 0 {} - let checksum = crc32fast::hash(&data); - if checksum != header.checksum.get() { - return Err(Error::InvalidIndex("invalid index data checksum")); - } - let index = - fst::Map::new(data.into()).map_err(|_| Error::InvalidIndex("invalid index bytes"))?; - Ok(index) - } - - /// Find the most recent, and biggest segment that may contain `frame_no` - async fn find_segment_by_frame_no( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - frame_no: u64, - ) -> Result> { - let lookup_key_prefix = s3_segment_index_lookup_key_prefix(&folder_key); - let lookup_key = s3_segment_index_ends_before_lookup_key(&folder_key, frame_no); - - let objects = self - .client - .list_objects_v2() - .bucket(&config.bucket) - .prefix(lookup_key_prefix.to_string()) - .start_after(lookup_key.to_string()) - .send() - .await - .map_err(|e| Error::unhandled(e, "failed to list bucket"))?; - - let Some(contents) = objects.contents().first() else { - return Ok(None); - }; - let key = contents.key().expect("misssing key?"); - let key_path: &Path = key.as_ref(); - - let key = SegmentKey::validate_from_path(key_path, &folder_key.namespace); - - Ok(key) - } - - /// We are kinda bruteforcing out way into finding a segment that fits the bill, this can very - /// probably be optimized - #[tracing::instrument(skip(self, config, folder_key))] - async fn find_segment_by_timestamp( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - timestamp: DateTime, - ) -> Result> { - let object_to_key = |o: &Object| { - let key_path = o.key().unwrap(); - SegmentKey::validate_from_path(key_path.as_ref(), &folder_key.namespace) - }; - - let lookup_key_prefix = s3_segment_index_lookup_key_prefix(&folder_key); - - let mut continuation_token = None; - loop { - let objects = self - .client - .list_objects_v2() - .set_continuation_token(continuation_token.take()) - .bucket(&config.bucket) - .prefix(lookup_key_prefix.to_string()) - .send() - .await - .map_err(|e| Error::unhandled(e, "failed to list bucket"))?; - - // there is noting to restore - if objects.contents().is_empty() { - return Ok(None); - } - - let ts = timestamp.timestamp_millis() as u64; - let search_result = - objects - .contents() - .binary_search_by_key(&std::cmp::Reverse(ts), |o| { - let key = object_to_key(o).unwrap(); - std::cmp::Reverse(key.timestamp) - }); - - match search_result { - Ok(i) => { - let key = object_to_key(&objects.contents()[i]).unwrap(); - tracing::trace!("found perfect match for `{timestamp}`: {key}"); - return Ok(Some(key)); - } - Err(i) if i == 0 => { - // this is caught by the first iteration of the loop, anything that's more - // recent than the most recent should be interpret as most recent - let key = object_to_key(&objects.contents()[i]).unwrap(); - tracing::trace!("best match for `{timestamp}` is most recent segment: {key}"); - return Ok(Some(key)); - } - Err(i) if i == objects.contents().len() => { - // there are two scenarios. Either there are more pages with the request, and - // we fetch older entries, or there aren't. If there are older segment, search - // in those, otherwise, just take the oldest segment and return that - if objects.continuation_token().is_some() { - // nothing to do; fetch next page - } else { - let key = object_to_key(&objects.contents().last().unwrap()).unwrap(); - return Ok(Some(key)); - } - } - // This is the index where timestamp would be inserted, we look left and right of that - // key and pick the closest one. - Err(i) => { - // i - 1 is well defined since we already catch the case where i == 0 above - let left_key = object_to_key(&objects.contents()[i - 1]).unwrap(); - let right_key = object_to_key(&objects.contents()[i]).unwrap(); - let time_to_left = left_key.timestamp().signed_duration_since(timestamp).abs(); - let time_to_right = - right_key.timestamp().signed_duration_since(timestamp).abs(); - - if time_to_left < time_to_right { - return Ok(Some(left_key)); - } else { - return Ok(Some(right_key)); - } - } - } - - match objects.continuation_token { - Some(token) => { - continuation_token = Some(token); - } - None => { - unreachable!("the absence of continuation token should be dealt with earlier"); - } - } - } - } - - async fn fetch_segment_from_key( - &self, - config: &S3Config, - folder_key: &FolderKey<'_>, - segment_key: &SegmentKey, - dest_file: &impl FileExt, - ) -> Result>> { - let (_, index) = tokio::try_join!( - self.fetch_segment_data_inner(config, &folder_key, &segment_key, dest_file), - self.fetch_segment_index_inner(config, &folder_key, &segment_key), - )?; - - Ok(index) - } - - fn list_segments_inner<'a>( - &'a self, - config: Arc, - namespace: &'a NamespaceName, - _until: u64, - ) -> impl Stream> + 'a { - async_stream::try_stream! { - let folder_key = FolderKey { cluster_id: &config.cluster_id, namespace }; - let lookup_key_prefix = s3_segment_index_lookup_key_prefix(&folder_key); - - let mut continuation_token = None; - loop { - let objects = self - .client - .list_objects_v2() - .bucket(&config.bucket) - .prefix(lookup_key_prefix.to_string()) - .set_continuation_token(continuation_token.take()) - .send() - .await - .map_err(|e| Error::unhandled(e, "failed to list bucket"))?; - - for entry in objects.contents() { - let key = entry.key().expect("misssing key?"); - let key_path: &Path = key.as_ref(); - let Some(key) = SegmentKey::validate_from_path(key_path, &folder_key.namespace) else { continue }; - - let infos = SegmentInfo { - key, - size: entry.size().unwrap_or(0) as usize, - }; - - yield infos; - } - - if objects.is_truncated().unwrap_or(false) { - assert!(objects.next_continuation_token.is_some()); - continuation_token = objects.next_continuation_token; - } else { - break - } - } - } - } - - async fn store_segment_data_inner( - &self, - config: &S3Config, - namespace: &NamespaceName, - body: B, - segment_key: &SegmentKey, - ) -> Result<()> - where - B: Body, - { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace, - }; - let s3_data_key = s3_segment_data_key(&folder_key, segment_key); - - self.s3_put_multipart(config, s3_data_key, body).await - } - - async fn store_segment_index_inner( - &self, - config: &S3Config, - namespace: &NamespaceName, - index: Vec, - segment_key: &SegmentKey, - ) -> Result<()> { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace, - }; - let s3_index_key = s3_segment_index_key(&folder_key, segment_key); - - let checksum = crc32fast::hash(&index); - let header = SegmentIndexHeader { - version: 1.into(), - len: (index.len() as u64).into(), - checksum: checksum.into(), - magic: LIBSQL_MAGIC.into(), - }; - - let mut bytes = BytesMut::with_capacity(size_of::() + index.len()); - bytes.extend_from_slice(header.as_bytes()); - bytes.extend_from_slice(&index); - - let body = ByteStream::from(bytes.freeze()); - - self.s3_put(config, s3_index_key, body).await?; - - Ok(()) - } -} - -pub struct S3Config { - bucket: String, - aws_config: SdkConfig, - cluster_id: String, -} - -struct FolderKey<'a> { - cluster_id: &'a str, - namespace: &'a NamespaceName, -} - -impl fmt::Display for FolderKey<'_> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "v2/clusters/{}/namespaces/{}", - self.cluster_id, self.namespace - ) - } -} - -pub struct SegmentDataKey<'a>(&'a FolderKey<'a>, &'a SegmentKey); - -impl fmt::Display for SegmentDataKey<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}/segments/{}", self.0, self.1) - } -} - -fn s3_segment_data_key<'a>( - folder_key: &'a FolderKey, - segment_key: &'a SegmentKey, -) -> SegmentDataKey<'a> { - SegmentDataKey(folder_key, segment_key) -} - -pub struct SegmentIndexKey<'a>(&'a FolderKey<'a>, &'a SegmentKey); - -impl fmt::Display for SegmentIndexKey<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}/indexes/{}", self.0, self.1) - } -} - -fn s3_segment_index_key<'a>( - folder_key: &'a FolderKey, - segment_key: &'a SegmentKey, -) -> SegmentIndexKey<'a> { - SegmentIndexKey(folder_key, segment_key) -} - -pub struct SegmentIndexLookupKeyPrefix<'a>(&'a FolderKey<'a>); - -impl fmt::Display for SegmentIndexLookupKeyPrefix<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}/indexes/", self.0) - } -} - -fn s3_segment_index_lookup_key_prefix<'a>( - folder_key: &'a FolderKey, -) -> SegmentIndexLookupKeyPrefix<'a> { - SegmentIndexLookupKeyPrefix(folder_key) -} - -pub struct SegmentIndexLookupKey<'a>(&'a FolderKey<'a>, u64); - -impl fmt::Display for SegmentIndexLookupKey<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}/indexes/{:020}", self.0, u64::MAX - self.1) - } -} - -/// return the biggest segment whose end frame number is less than frame_no -fn s3_segment_index_ends_before_lookup_key<'a>( - folder_key: &'a FolderKey, - frame_no: u64, -) -> SegmentIndexLookupKey<'a> { - SegmentIndexLookupKey(folder_key, frame_no) -} - -impl Backend for S3Backend -where - IO: Io, -{ - type Config = Arc; - - async fn store( - &self, - config: &Self::Config, - meta: SegmentMeta, - segment_data: impl FileExt, - segment_index: Vec, - ) -> Result<()> { - let segment_key = SegmentKey::from(&meta); - let body = FileStreamBody::new(segment_data); - self.store_segment_data_inner(config, &meta.namespace, body, &segment_key) - .await?; - self.store_segment_index(config, &meta.namespace, &segment_key, segment_index) - .await?; - Ok(()) - } - - async fn meta( - &self, - config: &Self::Config, - namespace: &NamespaceName, - ) -> Result { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace: &namespace, - }; - - // request a key bigger than any other to get the last segment - let max_segment_key = self - .find_segment_by_frame_no(config, &folder_key, u64::MAX) - .await?; - - Ok(super::DbMeta { - max_frame_no: max_segment_key.map(|s| s.end_frame_no).unwrap_or(0), - }) - } - - fn default_config(&self) -> Self::Config { - self.default_config.clone() - } - - async fn find_segment( - &self, - config: &Self::Config, - namespace: &NamespaceName, - req: FindSegmentReq, - ) -> Result { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace: &namespace, - }; - - match req { - FindSegmentReq::EndFrameNoLessThan(frame_no) => self - .find_segment_by_frame_no(config, &folder_key, frame_no) - .await? - .ok_or_else(|| Error::SegmentNotFound(req)), - FindSegmentReq::Timestamp(ts) => self - .find_segment_by_timestamp(config, &folder_key, ts) - .await? - .ok_or_else(|| Error::SegmentNotFound(req)), - } - } - - async fn fetch_segment_index( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - ) -> Result>> { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace: &namespace, - }; - self.fetch_segment_index_inner(config, &folder_key, key) - .await - } - - async fn fetch_segment_data_to_file( - &self, - config: &Self::Config, - namespace: &NamespaceName, - key: &SegmentKey, - file: &impl FileExt, - ) -> Result { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace: &namespace, - }; - let header = self - .fetch_segment_data_inner(config, &folder_key, key, file) - .await?; - Ok(header) - } - - async fn fetch_segment_data( - self: Arc, - config: Self::Config, - namespace: NamespaceName, - key: SegmentKey, - ) -> Result { - let file = self.io.tempfile()?; - self.fetch_segment_data_to_file(&config, &namespace, &key, &file) - .await?; - Ok(file) - } - - fn list_segments<'a>( - &'a self, - config: Self::Config, - namespace: &'a NamespaceName, - until: u64, - ) -> impl Stream> + 'a { - self.list_segments_inner(config, namespace, until) - } - - async fn fetch_segment_data_stream( - &self, - config: Self::Config, - namespace: &NamespaceName, - key: SegmentKey, - ) -> Result<( - CompactedSegmentHeader, - impl Stream>, - )> { - let folder_key = FolderKey { - cluster_id: &config.cluster_id, - namespace: &namespace, - }; - self.fetch_segment_data_stream_inner(&config, &folder_key, &key) - .await - } - - async fn store_segment_data( - &self, - config: &Self::Config, - namespace: &NamespaceName, - segment_key: &SegmentKey, - segment_data: impl Stream> + Send + 'static, - ) -> Result<()> { - let byte_stream = StreamBody::new(segment_data); - self.store_segment_data_inner(config, namespace, byte_stream, &segment_key) - .await?; - - Ok(()) - } - - async fn store_segment_index( - &self, - config: &Self::Config, - namespace: &NamespaceName, - segment_key: &SegmentKey, - index: Vec, - ) -> Result<()> { - self.store_segment_index_inner(config, namespace, index, segment_key) - .await?; - - Ok(()) - } -} - -pin_project! { - struct StreamBody { - #[pin] - s: S, - } -} - -impl StreamBody { - fn new(s: S) -> Self { - Self { s } - } -} - -impl http_body::Body for StreamBody -where - S: Stream>, -{ - type Data = bytes::Bytes; - type Error = crate::storage::Error; - - fn poll_frame( - self: Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> Poll, Self::Error>>> { - let this = self.project(); - match std::task::ready!(this.s.poll_next(cx)) { - Some(Ok(data)) => Poll::Ready(Some(Ok(HttpFrame::data(data)))), - Some(Err(e)) => Poll::Ready(Some(Err(e))), - None => Poll::Ready(None), - } - } -} - -#[derive(Clone, Copy)] -enum StreamState { - Init, - WaitingChunk, - Done, -} - -struct FileStreamBody { - inner: Arc, - current_offset: u64, - chunk_size: usize, - state: StreamState, - fut: ReusableBoxFuture<'static, std::io::Result>, -} - -impl FileStreamBody { - fn new(inner: F) -> Self { - Self::new_inner(inner.into()) - } - - fn new_inner(inner: Arc) -> Self { - Self { - inner, - current_offset: 0, - chunk_size: 4096, - state: StreamState::Init, - fut: ReusableBoxFuture::new(std::future::pending()), - } - } - - fn into_byte_stream(self) -> ByteStream - where - F: FileExt, - { - let body = SdkBody::retryable(move || { - let s = Self::new_inner(self.inner.clone()); - SdkBody::from_body_1_x(s) - }); - - ByteStream::new(body) - } -} - -impl http_body::Body for FileStreamBody -where - F: FileExt, -{ - type Data = Bytes; - type Error = crate::storage::Error; - - fn poll_frame( - mut self: Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> Poll, Self::Error>>> { - loop { - match self.state { - StreamState::Init => { - let f = self.inner.clone(); - let chunk_size = self.chunk_size; - let current_offset = self.current_offset; - let fut = async move { - let buf = BytesMut::with_capacity(chunk_size); - let (buf, ret) = f.read_at_async(buf, current_offset).await; - ret.map(|_| buf.freeze()) - }; - self.fut.set(fut); - self.state = StreamState::WaitingChunk; - } - StreamState::WaitingChunk => match self.fut.poll(cx) { - Poll::Ready(Ok(buf)) => { - // TODO: we perform one too many read, - if buf.is_empty() { - self.state = StreamState::Done; - return Poll::Ready(None); - } else { - self.state = StreamState::Init; - self.current_offset += buf.len() as u64; - return Poll::Ready(Some(Ok(HttpFrame::data(buf)))); - } - } - Poll::Ready(Err(e)) => { - self.state = StreamState::Done; - return Poll::Ready(Some(Err(e.into()))); - } - Poll::Pending => return Poll::Pending, - }, - StreamState::Done => return Poll::Ready(None), - } - } - } - - fn size_hint(&self) -> SizeHint { - match self.inner.len() { - Ok(n) => SizeHint::with_exact(n), - Err(_) => SizeHint::new(), - } - } -} - -#[cfg(test)] -mod tests { - use std::path::Path; - - use aws_config::{BehaviorVersion, Region, SdkConfig}; - use aws_sdk_s3::config::SharedCredentialsProvider; - use chrono::Utc; - use fst::MapBuilder; - use s3s::auth::SimpleAuth; - use s3s::service::{S3ServiceBuilder, SharedS3Service}; - - use crate::io::StdIO; - - use super::*; - - #[track_caller] - fn setup(dir: impl AsRef) -> (SdkConfig, SharedS3Service) { - std::fs::create_dir_all(&dir).unwrap(); - let s3_impl = s3s_fs::FileSystem::new(dir).unwrap(); - - let cred = aws_credential_types::Credentials::for_tests(); - - let mut s3 = S3ServiceBuilder::new(s3_impl); - s3.set_auth(SimpleAuth::from_single( - cred.access_key_id(), - cred.secret_access_key(), - )); - s3.set_base_domain("localhost:8014"); - let s3 = s3.build().into_shared(); - - let client = s3s_aws::Client::from(s3.clone()); - - let config = aws_config::SdkConfig::builder() - .http_client(client) - .behavior_version(BehaviorVersion::latest()) - .region(Region::from_static("us-west-2")) - .credentials_provider(SharedCredentialsProvider::new(cred)) - .endpoint_url("http://localhost:8014") - .build(); - - (config, s3) - } - - #[tokio::test] - async fn s3_basic() { - let _ = tracing_subscriber::fmt::try_init(); - let dir = tempfile::tempdir().unwrap(); - let (aws_config, _s3) = setup(&dir); - - let s3_config = Arc::new(S3Config { - bucket: "testbucket".into(), - aws_config: aws_config.clone(), - cluster_id: "123456789".into(), - }); - - let storage = S3Backend::from_sdk_config_with_io( - aws_config, - "testbucket".into(), - "123456789".into(), - StdIO(()), - ) - .await - .unwrap(); - - let f_path = dir.path().join("fs-segments"); - std::fs::write(&f_path, vec![123; 8092]).unwrap(); - - let ns = NamespaceName::from_string("foobarbaz".into()); - - let mut builder = MapBuilder::memory(); - builder.insert(42u32.to_be_bytes(), 42).unwrap(); - let index = builder.into_inner().unwrap(); - storage - .store( - &s3_config, - SegmentMeta { - namespace: ns.clone(), - start_frame_no: 1u64.into(), - end_frame_no: 64u64.into(), - segment_timestamp: Utc::now(), - }, - std::fs::File::open(&f_path).unwrap(), - index, - ) - .await - .unwrap(); - - let db_meta = storage.meta(&s3_config, &ns).await.unwrap(); - assert_eq!(db_meta.max_frame_no, 64); - - let mut builder = MapBuilder::memory(); - builder.insert(44u32.to_be_bytes(), 44).unwrap(); - let index = builder.into_inner().unwrap(); - storage - .store( - &s3_config, - SegmentMeta { - namespace: ns.clone(), - start_frame_no: 64u64.into(), - end_frame_no: 128u64.into(), - segment_timestamp: Utc::now(), - }, - std::fs::File::open(&f_path).unwrap(), - index, - ) - .await - .unwrap(); - - let db_meta = storage.meta(&s3_config, &ns).await.unwrap(); - assert_eq!(db_meta.max_frame_no, 128); - - let key = storage - .find_segment(&s3_config, &ns, FindSegmentReq::EndFrameNoLessThan(65)) - .await - .unwrap(); - assert_eq!(key.start_frame_no, 1); - assert_eq!(key.end_frame_no, 64); - - let index = storage - .fetch_segment_index(&s3_config, &ns, &key) - .await - .unwrap(); - assert_eq!(index.get(42u32.to_be_bytes()).unwrap(), 42); - } -} diff --git a/libsql-wal/src/storage/compaction/mod.rs b/libsql-wal/src/storage/compaction/mod.rs deleted file mode 100644 index df7b50a023..0000000000 --- a/libsql-wal/src/storage/compaction/mod.rs +++ /dev/null @@ -1,824 +0,0 @@ -use std::io::Write as _; -use std::ops::Deref; -use std::path::Path; -use std::path::PathBuf; -use std::sync::Arc; - -use bytes::Bytes; -use fst::raw::IndexedValue; -use fst::MapBuilder; -use fst::Streamer; -use futures::FutureExt as _; -use futures::Stream; -use futures::StreamExt as _; -use futures::TryStreamExt; -use libsql_sys::name::NamespaceName; -use libsql_sys::rusqlite::OptionalExtension; -use libsql_sys::rusqlite::{self, TransactionBehavior}; -use roaring::RoaringBitmap; -use tempfile::tempdir; -use tokio::io::AsyncWriteExt; -use tokio::task::JoinHandle; -use zerocopy::AsBytes; - -use crate::io::FileExt as _; -use crate::segment::compacted::CompactedFrameHeader; -use crate::segment::compacted::CompactedSegmentHeader; -use crate::LibsqlFooter; -use crate::LIBSQL_MAGIC; -use crate::LIBSQL_PAGE_SIZE; -use crate::LIBSQL_WAL_VERSION; - -use super::backend::Backend; -use super::{SegmentInfo, SegmentKey}; - -pub mod strategy; - -type Result = std::result::Result; - -#[derive(Debug, thiserror::Error)] -pub enum Error { - #[error("error reading from meta db: {0}")] - Meta(#[from] rusqlite::Error), - #[error("io error: {0}")] - Io(#[from] std::io::Error), - #[error("storage error: {0}")] - Storage(#[from] crate::storage::Error), -} - -pub struct Compactor { - backend: Arc, - conn: rusqlite::Connection, - path: PathBuf, -} - -impl Compactor { - pub fn new(backend: Arc, compactor_path: &Path) -> Result { - let conn = rusqlite::Connection::open(compactor_path.join("meta.db"))?; - // todo! set pragmas: wal + foreign key check - conn.pragma_update(None, "journal_mode", "wal")?; - conn.execute(r#"CREATE TABLE IF NOT EXISTS monitored_namespaces (id INTEGER PRIMARY KEY AUTOINCREMENT, namespace_name BLOB NOT NULL, UNIQUE(namespace_name))"#, ()).unwrap(); - conn.execute( - r#"CREATE TABLE IF NOT EXISTS segments ( - start_frame_no INTEGER, - end_frame_no INTEGER, - timestamp DATE, - size INTEGER, - namespace_id INTEGER REFERENCES monitored_namespaces(id) ON DELETE CASCADE, - PRIMARY KEY (start_frame_no, end_frame_no)) - "#, - (), - )?; - - Ok(Self { - backend, - conn, - path: compactor_path.into(), - }) - } - - pub async fn monitor(&mut self, namespace: &NamespaceName) -> Result<()> - where - B: Backend, - { - let tx = self.conn.transaction()?; - let id = { - let mut stmt = tx.prepare_cached("INSERT OR IGNORE INTO monitored_namespaces(namespace_name) VALUES (?) RETURNING id")?; - stmt.query_row([namespace.as_str()], |r| r.get(0)) - .optional()? - }; - - if let Some(id) = id { - sync_one(self.backend.as_ref(), namespace, id, &tx, true).await?; - } - - tx.commit()?; - - Ok(()) - } - - pub fn analyze(&self, namespace: &NamespaceName) -> Result { - let mut stmt = self.conn.prepare_cached( - r#" - SELECT start_frame_no, end_frame_no, timestamp - FROM segments as s - JOIN monitored_namespaces as m - ON m.id = s.namespace_id - WHERE m.namespace_name = ?"#, - )?; - let mut rows = stmt.query([namespace.as_str()])?; - let mut graph = petgraph::graphmap::DiGraphMap::new(); - let mut last_frame_no = 0; - while let Some(row) = rows.next()? { - let start_frame_no: u64 = row.get(0)?; - let end_frame_no: u64 = row.get(1)?; - let timestamp: u64 = row.get(2)?; - graph.add_edge(start_frame_no, end_frame_no, timestamp); - if start_frame_no != 1 { - graph.add_edge(start_frame_no - 1, start_frame_no, 0); - } - last_frame_no = last_frame_no.max(end_frame_no); - } - - Ok(AnalyzedSegments { - graph, - last_frame_no, - namespace: namespace.clone(), - }) - } - - pub fn get_segment_range( - &self, - namespace: &NamespaceName, - ) -> Result> { - segments_range(&self.conn, namespace) - } - - /// Polls storage for new frames since last sync - #[tracing::instrument(skip(self))] - async fn sync_latest(&self) -> Result<()> - where - B: Backend, - { - // let tx = self.meta.transaction()?; - // let stream = self.storage.list_segments(); - - Ok(()) - } - - /// sync all segments from storage with local cache - pub async fn sync_all(&mut self, full: bool) -> Result<()> - where - B: Backend, - { - let tx = self - .conn - .transaction_with_behavior(TransactionBehavior::Immediate)?; - { - let mut stmt = tx.prepare("SELECT namespace_name, id FROM monitored_namespaces")?; - let mut namespace_rows = stmt.query(())?; - while let Some(row) = namespace_rows.next()? { - let namespace = NamespaceName::from_string(row.get::<_, String>(0)?); - let id = row.get::<_, u64>(1)?; - sync_one(self.backend.as_ref(), &namespace, id, &tx, full).await?; - } - } - - tx.commit()?; - - Ok(()) - } - - pub async fn sync_one(&mut self, namespace: &NamespaceName, full: bool) -> Result<()> - where - B: Backend, - { - let tx = self - .conn - .transaction_with_behavior(TransactionBehavior::Immediate)?; - { - let mut stmt = - tx.prepare_cached("SELECT id FROM monitored_namespaces WHERE namespace_name = ?")?; - let id = stmt - .query_row([namespace.as_str()], |row| row.get(0)) - .optional()?; - if let Some(id) = id { - sync_one(self.backend.as_ref(), &namespace, id, &tx, full).await?; - } - } - - tx.commit()?; - - Ok(()) - } - - /// `dedup_frames` takes a segment set and returns a stream of deduplicated raw frames, - /// containing the most recent version of every frame in the segments covered by the set. - /// - /// if out_index is passed, the index of the new segement is generated and put there - /// - /// the progress callback is called with (count_pages, total_pages), as new pages are found - /// - /// returns a stream of the most recent deduplicated frames, and the size_after for that new - /// segment - async fn dedup_stream<'a>( - &'a self, - set: SegmentSet, - out_index: Option<&'a mut MapBuilder>>, - mut progress: impl FnMut(u32, u32) + 'a, - ) -> ( - impl Stream> + 'a, - CompactedSegmentHeader, - ) - where - B: Backend, - { - let (snd, rcv) = tokio::sync::oneshot::channel(); - let mut snd = Some(snd); - - let stream = async_stream::try_stream! { - assert!(!set.is_empty()); - let tmp = tempdir()?; - let config = self.backend.default_config(); - // We fetch indexes in reverse order so that the most recent index comes first - let indexes_stream = futures::stream::iter(set.iter().rev()).map(|k| { - self - .backend - .fetch_segment_index(&config, &set.namespace, k) - .map(|i| i.map(|i| (i, *k))) - }) - // we download indexes in the background as we read from their data files to reduce - // latencies - .buffered(4); - - tokio::pin!(indexes_stream); - - let mut size_after = u64::MAX; - let mut seen_pages = RoaringBitmap::new(); - // keep track of the indexes for segments that we took frames from. This is a vec of - // memory mapped segments, sorted by descending segment timestamp. - let mut saved_indexes = Vec::new(); - // this map keeps a mapping from index in the saved indexed to the count of frames - // taken from that segment. It is necessary to rebuild the new index and compute the - // actual position of a frame in the streamed segement. - let mut index_offset_mapping = Vec::new(); - let mut page_count = 0; - let mut current_crc = 0; - - while let Some((index, key)) = indexes_stream.try_next().await? { - let mut s = index.stream(); - // how many frames to take from that segment - let mut frames_to_take = 0; - while let Some((pno, _)) = s.next() { - let pno = u32::from_be_bytes(pno.try_into().unwrap()); - if !seen_pages.contains(pno) { - // this segment contains data that we haven't seen before, download that - // segment - frames_to_take += 1; - } - tokio::task::consume_budget().await; - } - - tracing::debug!(key = ?key, "taking {} frames from segment", frames_to_take); - - // no frames to take - if frames_to_take == 0 { continue } - - // we need to build an index at the end, so we keep the indexes. - // To reduce the amount of RAM needed to handle all the potential indexes, we write - // it to disk, and map the file. - if out_index.is_some() { - let mut index_file = std::fs::File::options() - .create(true) - .read(true) - .write(true) - .open(tmp.path().join(&format!("{key}")))?; - index_file.write_all(index.as_fst().as_bytes())?; - let map = unsafe { memmap::Mmap::map(&index_file)? }; - let index = fst::Map::new(map).unwrap(); - saved_indexes.push(index); - index_offset_mapping.push(page_count); - } - - let (segment_header, frames) = self.backend.fetch_segment_data_stream(config.clone(), &set.namespace, key).await?; - - if size_after == u64::MAX { - size_after = segment_header.size_after() as u64; - let key = set.compact_key().expect("we asserted that the segment wasn't empty"); - let segment_header = CompactedSegmentHeader::new(key.start_frame_no, key.end_frame_no, size_after as u32, key.timestamp(), uuid::Uuid::from_u128(segment_header.log_id.get())); - current_crc = crc32fast::hash(segment_header.as_bytes()); - let _ = snd.take().unwrap().send(segment_header); - } - - tokio::pin!(frames); - - let mut frames_taken = 0; - while let Some((mut frame_header, frame_data)) = frames.try_next().await ? { - // we took all the frames that we needed from that segment, no need to read the - // rest of it - if frames_taken == frames_to_take { - break - } - - - if seen_pages.insert(frame_header.page_no()) { - frames_taken += 1; - page_count += 1; - let is_last = if page_count == size_after { - frame_header.set_last(); - true - } else { - frame_header.reset_flags(); - false - }; - - current_crc = frame_header.update_checksum(current_crc, &frame_data); - progress(page_count as u32, size_after as _); - yield (frame_header, frame_data); - if is_last { - break - } - } - } - } - - // now, we need to construct the index. - if let Some(out_index) = out_index { - let op_builder = saved_indexes.iter().collect::(); - let mut union = op_builder.union(); - while let Some((pno, idxs)) = union.next() { - let &IndexedValue { index, .. } = idxs.iter().min_by_key(|idx| idx.index).unwrap(); - let offset = index_offset_mapping[index]; - index_offset_mapping[index] += 1; - out_index.insert(pno, offset as _).unwrap(); - tokio::task::consume_budget().await; - } - } - }.peekable(); - - let mut stream = Box::pin(stream); - let header = { - stream.as_mut().peek().await; - rcv.await.unwrap() - }; - - (stream, header) - } - - /// compact the passed segment set to out_path if provided, otherwise, uploads it to the - /// backend - pub async fn compact( - &self, - set: SegmentSet, - out_path: Option<&Path>, - progress: impl FnMut(u32, u32), - ) -> Result<()> - where - B: Backend, - { - let Some(new_key) = set.compact_key() else { - return Ok(()); - }; - - let mut builder = MapBuilder::new(Vec::new()).unwrap(); - - let (sender, mut receiver) = tokio::sync::mpsc::channel::>(1); - let mut handle: JoinHandle> = match out_path { - Some(path) => { - let path = path.join(&format!("{new_key}.seg")); - let mut data_file = tokio::fs::File::create(path).await?; - tokio::task::spawn(async move { - while let Some(data) = receiver.recv().await { - let data = data?; - data_file.write_all(&data).await?; - } - - data_file.flush().await?; - - Ok(()) - }) - } - None => { - let backend = self.backend.clone(); - let config = self.backend.default_config(); - let ns = set.namespace.clone(); - let key = new_key.clone(); - tokio::task::spawn(async move { - backend - .store_segment_data( - &config, - &ns, - &key, - tokio_stream::wrappers::ReceiverStream::new(receiver), - ) - .await?; - Ok(()) - }) - } - }; - - let send_fut = async { - let (stream, segment_header) = self - .dedup_stream(set.clone(), Some(&mut builder), progress) - .await; - - if sender - .send(Ok(Bytes::copy_from_slice(segment_header.as_bytes()))) - .await - .is_err() - { - return; - } - - { - tokio::pin!(stream); - loop { - match stream.next().await { - Some(Ok((frame_header, frame_data))) => { - if sender - .send(Ok(Bytes::copy_from_slice(frame_header.as_bytes()))) - .await - .is_err() - { - return; - } - if sender.send(Ok(frame_data)).await.is_err() { - return; - } - } - Some(Err(e)) => { - sender.send(Err(e.into())).await.unwrap(); - return; - } - None => break, - } - } - - drop(sender); - } - }; - - tokio::select! { - res = &mut handle => { - res.unwrap()?; - }, - _ = send_fut => { - handle.await.unwrap()?; - - } - } - - let index = builder.into_inner().unwrap(); - match out_path { - Some(path) => { - let mut index_file = - tokio::fs::File::create(path.join(&format!("{new_key}.idx"))).await?; - index_file.write_all(&index).await?; - index_file.flush().await?; - } - None => { - self.backend - .store_segment_index( - &self.backend.default_config(), - &set.namespace, - &new_key, - index, - ) - .await?; - } - } - - Ok(()) - } - - /// Restore a datatase file from a segment set - /// set must start at frame_no 1 - pub async fn restore( - &self, - set: SegmentSet, - to: impl AsRef, - progress: impl FnMut(u32, u32), - ) -> Result<()> - where - B: Backend, - { - let file = std::fs::File::create(to)?; - let (stream, header) = self.dedup_stream(set.clone(), None, progress).await; - let _footer = LibsqlFooter { - magic: LIBSQL_MAGIC.into(), - version: LIBSQL_WAL_VERSION.into(), - replication_index: set.range().unwrap().1.into(), - log_id: header.log_id.get().into(), - }; - - tokio::pin!(stream); - - while let Some((frame_header, frame_data)) = stream.try_next().await? { - let (_, ret) = file - .write_all_at_async( - frame_data, - LIBSQL_PAGE_SIZE as u64 * (frame_header.page_no() as u64 - 1), - ) - .await; - ret?; - } - - Ok(()) - } - - pub fn list_all_segments( - &self, - namespace: &NamespaceName, - f: impl FnMut(SegmentInfo), - ) -> Result<()> { - list_segments(&self.conn, namespace, f) - } - - pub fn list_monitored_namespaces(&self, f: impl FnMut(NamespaceName)) -> Result<()> { - list_namespace(&self.conn, f) - } - - pub fn unmonitor(&self, ns: &NamespaceName) -> Result<()> { - unmonitor(&self.conn, ns) - } - - pub fn segment_info(&self, ns: &NamespaceName, key: SegmentKey) -> Result { - segment_infos(&self.conn, ns, key) - } -} - -pub struct AnalyzedSegments { - graph: petgraph::graphmap::DiGraphMap, - last_frame_no: u64, - namespace: NamespaceName, -} - -impl AnalyzedSegments { - /// returns a list of keys that covers frame_no 1 to last in the shortest amount of segments - pub fn shortest_restore_path(&self) -> SegmentSet { - if self.graph.node_count() == 0 { - return SegmentSet { - namespace: self.namespace.clone(), - segments: Vec::new(), - }; - } - - let path = petgraph::algo::astar( - &self.graph, - 1, - |n| n == self.last_frame_no, - // it's always free to go from one end of the segment to the other, and it costs us to - // fetch a new segment. edges between segments are always 0, and edges within segments - // are the segment timestamp - |(_, _, &x)| if x == 0 { 1 } else { 0 }, - |n| self.last_frame_no - n, - ); - let mut segments = Vec::new(); - match path { - Some((_len, nodes)) => { - for chunk in nodes.chunks(2) { - let start_frame_no = chunk[0]; - let end_frame_no = chunk[1]; - let timestamp = *self - .graph - .edges(start_frame_no) - .find_map(|(_, to, ts)| (to == end_frame_no).then_some(ts)) - .unwrap(); - let key = SegmentKey { - start_frame_no, - end_frame_no, - timestamp, - }; - segments.push(key); - } - } - None => (), - } - SegmentSet { - segments, - namespace: self.namespace.clone(), - } - } - - pub fn last_frame_no(&self) -> u64 { - self.last_frame_no - } - - pub fn segment_count(&self) -> usize { - self.graph.node_count() / 2 - } -} - -/// A set of segments, with the guarantee that segments are non-overlapping and increasing in -/// frameno -#[derive(Clone, Debug)] -pub struct SegmentSet { - namespace: NamespaceName, - segments: Vec, -} - -impl SegmentSet { - /// return segments end - start - pub fn span(&self) -> u64 { - if self.is_empty() { - 0 - } else { - self.segments.last().unwrap().end_frame_no - - self.segments.first().unwrap().start_frame_no - } - } - - pub fn range(&self) -> Option<(u64, u64)> { - self.segments - .first() - .zip(self.segments.last()) - .map(|(f, l)| (f.start_frame_no, l.end_frame_no)) - } - - pub fn compact_key(&self) -> Option { - match self.segments.first().zip(self.segments.last()) { - Some((f, l)) => Some(SegmentKey { - start_frame_no: f.start_frame_no, - end_frame_no: l.end_frame_no, - timestamp: l.timestamp, - }), - None => None, - } - } -} - -impl Deref for SegmentSet { - type Target = [SegmentKey]; - - fn deref(&self) -> &Self::Target { - &self.segments - } -} - -async fn sync_one( - backend: &B, - namespace: &NamespaceName, - id: u64, - conn: &rusqlite::Connection, - full: bool, -) -> Result<()> { - let until = if full { - get_last_frame_no(conn, id)? - } else { - None - }; - - let segs = backend.list_segments(backend.default_config(), &namespace, 0); - tokio::pin!(segs); - - while let Some(info) = segs.next().await { - let info = info.unwrap(); - register_segment_info(&conn, &info, id)?; - if let Some(until) = until { - if info.key.start_frame_no <= until { - break; - } - } - } - - Ok(()) -} - -fn list_segments<'a>( - conn: &'a rusqlite::Connection, - namespace: &'a NamespaceName, - mut f: impl FnMut(SegmentInfo), -) -> Result<()> { - let mut stmt = conn.prepare_cached( - r#" - SELECT timestamp, size, start_frame_no, end_frame_no - FROM segments as s - JOIN monitored_namespaces as m - ON m.id == s.namespace_id - WHERE m.namespace_name = ? - ORDER BY end_frame_no, start_frame_no - "#, - )?; - - let iter = stmt.query_map([namespace.as_str()], |r| { - Ok(SegmentInfo { - key: SegmentKey { - start_frame_no: r.get(2)?, - end_frame_no: r.get(3)?, - timestamp: r.get(0)?, - }, - size: r.get(1)?, - }) - })?; - - for info in iter { - let info = info?; - f(info); - } - - Ok(()) -} - -fn list_namespace<'a>( - conn: &'a rusqlite::Connection, - mut f: impl FnMut(NamespaceName), -) -> Result<()> { - let mut stmt = conn.prepare_cached(r#"SELECT namespace_name FROM monitored_namespaces"#)?; - - stmt.query_map((), |r| { - let n = NamespaceName::from_string(r.get(0)?); - f(n); - Ok(()) - })? - .try_for_each(|c| c)?; - - Ok(()) -} - -fn register_segment_info( - conn: &rusqlite::Connection, - info: &SegmentInfo, - namespace_id: u64, -) -> Result<()> { - let mut stmt = conn.prepare_cached( - r#" - INSERT OR IGNORE INTO segments ( - start_frame_no, - end_frame_no, - timestamp, - size, - namespace_id - ) - VALUES (?, ?, ?, ?, ?)"#, - )?; - stmt.execute(( - info.key.start_frame_no, - info.key.end_frame_no, - info.key.timestamp, - info.size, - namespace_id, - ))?; - Ok(()) -} - -fn segments_range( - conn: &rusqlite::Connection, - namespace: &NamespaceName, -) -> Result> { - let mut stmt = conn.prepare_cached( - r#" - SELECT min(timestamp), size, start_frame_no, end_frame_no - FROM segments as s - JOIN monitored_namespaces as m - ON m.id == s.namespace_id - WHERE m.namespace_name = ? - LIMIT 1 -"#, - )?; - let first = stmt - .query_row([namespace.as_str()], |r| { - Ok(SegmentInfo { - key: SegmentKey { - start_frame_no: r.get(2)?, - end_frame_no: r.get(3)?, - timestamp: r.get(0)?, - }, - size: r.get(1)?, - }) - }) - .optional()?; - - let mut stmt = conn.prepare_cached( - r#" - SELECT max(timestamp), size, start_frame_no, end_frame_no - FROM segments as s - JOIN monitored_namespaces as m - ON m.id == s.namespace_id - WHERE m.namespace_name = ? - LIMIT 1 -"#, - )?; - let last = stmt - .query_row([namespace.as_str()], |r| { - Ok(SegmentInfo { - key: SegmentKey { - start_frame_no: r.get(2)?, - end_frame_no: r.get(3)?, - timestamp: r.get(0)?, - }, - size: r.get(1)?, - }) - }) - .optional()?; - - Ok(first.zip(last)) -} - -fn get_last_frame_no(conn: &rusqlite::Connection, namespace_id: u64) -> Result> { - let mut stmt = - conn.prepare_cached("SELECT MAX(end_frame_no) FROM segments WHERE namespace_id = ?")?; - Ok(stmt.query_row([namespace_id], |row| row.get(0))?) -} - -fn unmonitor(conn: &rusqlite::Connection, namespace: &NamespaceName) -> Result<()> { - conn.execute( - "DELETE FROM monitored_namespaces WHERE namespace_name = ?", - [namespace.as_str()], - )?; - Ok(()) -} - -fn segment_infos( - conn: &rusqlite::Connection, - namespace: &NamespaceName, - key: SegmentKey, -) -> Result { - let mut stmt = conn.prepare("SELECT size FROM segments AS s JOIN monitored_namespaces AS ns WHERE s.start_frame_no=? AND s.end_frame_no=? AND ns.namespace_name=? LIMIT 1")?; - let mut rows = stmt.query((key.start_frame_no, key.end_frame_no, namespace.as_str()))?; - - let row = rows.next()?.unwrap(); - Ok(SegmentInfo { - key, - size: row.get(0)?, - }) -} diff --git a/libsql-wal/src/storage/compaction/strategy/identity.rs b/libsql-wal/src/storage/compaction/strategy/identity.rs deleted file mode 100644 index 4bdc8cd953..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/identity.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::storage::compaction::SegmentSet; - -use super::CompactionStrategy; - -/// partition strategy that doesn't split the passed set -pub struct IdentityStrategy; - -impl CompactionStrategy for IdentityStrategy { - fn partition(&self, segments: &SegmentSet) -> Vec { - let mut out = Vec::with_capacity(1); - out.push(segments.clone()); - out - } -} diff --git a/libsql-wal/src/storage/compaction/strategy/log_strategy.rs b/libsql-wal/src/storage/compaction/strategy/log_strategy.rs deleted file mode 100644 index 806e18a3a2..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/log_strategy.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::ops::Deref as _; - -use crate::storage::compaction::SegmentSet; - -use super::CompactionStrategy; - -/// partition the SegmentSet in logarithmically reducing sets -pub struct LogReductionStrategy; - -impl CompactionStrategy for LogReductionStrategy { - fn partition(&self, segments: &SegmentSet) -> Vec { - let mut segs = segments.deref(); - let mut out = Vec::new(); - while !segs.is_empty() { - let (lhs, rhs) = segs.split_at(segs.len() / 2); - out.push(SegmentSet { - segments: lhs.to_vec(), - namespace: segments.namespace.clone(), - }); - segs = rhs; - if segs.len() == 1 { - out.push(SegmentSet { - segments: rhs.to_vec(), - namespace: segments.namespace.clone(), - }); - break; - } - } - - out - } -} diff --git a/libsql-wal/src/storage/compaction/strategy/mod.rs b/libsql-wal/src/storage/compaction/strategy/mod.rs deleted file mode 100644 index 51fc849d3a..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -use super::SegmentSet; - -pub mod identity; -pub mod log_strategy; -pub mod tiered; - -pub trait CompactionStrategy { - fn partition(&self, segments: &SegmentSet) -> Vec; -} diff --git a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tier_reduction__test__partition_tiered-2.snap b/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tier_reduction__test__partition_tiered-2.snap deleted file mode 100644 index dbd2d6a7df..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tier_reduction__test__partition_tiered-2.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: libsql-wal/src/storage/compaction/strategy/tier_reduction.rs -expression: partition.first().unwrap() ---- -SegmentSet { - namespace: test, - segments: [ - SegmentKey { - start_frame_no: 101, - end_frame_no: 105, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 106, - end_frame_no: 110, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 111, - end_frame_no: 115, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 116, - end_frame_no: 120, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 121, - end_frame_no: 122, - timestamp: 1970-01-01T00:00:00Z, - }, - ], -} diff --git a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tier_reduction__test__partition_tiered.snap b/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tier_reduction__test__partition_tiered.snap deleted file mode 100644 index 8750d63eb5..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tier_reduction__test__partition_tiered.snap +++ /dev/null @@ -1,39 +0,0 @@ ---- -source: libsql-wal/src/storage/compaction/strategy/tier_reduction.rs -expression: partition.first().unwrap() ---- -SegmentSet { - namespace: test, - segments: [ - SegmentKey { - start_frame_no: 1, - end_frame_no: 20, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 21, - end_frame_no: 27, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 28, - end_frame_no: 41, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 42, - end_frame_no: 70, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 71, - end_frame_no: 81, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 82, - end_frame_no: 100, - timestamp: 1970-01-01T00:00:00Z, - }, - ], -} diff --git a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tiered__test__partition_tiered-2.snap b/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tiered__test__partition_tiered-2.snap deleted file mode 100644 index 67d0bd6ea4..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tiered__test__partition_tiered-2.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: libsql-wal/src/storage/compaction/strategy/tiered.rs -expression: partition.first().unwrap() ---- -SegmentSet { - namespace: test, - segments: [ - SegmentKey { - start_frame_no: 101, - end_frame_no: 105, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 106, - end_frame_no: 110, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 111, - end_frame_no: 115, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 116, - end_frame_no: 120, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 121, - end_frame_no: 122, - timestamp: 1970-01-01T00:00:00Z, - }, - ], -} diff --git a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tiered__test__partition_tiered.snap b/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tiered__test__partition_tiered.snap deleted file mode 100644 index 9ab2186b10..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/snapshots/libsql_wal__storage__compaction__strategy__tiered__test__partition_tiered.snap +++ /dev/null @@ -1,39 +0,0 @@ ---- -source: libsql-wal/src/storage/compaction/strategy/tiered.rs -expression: partition.first().unwrap() ---- -SegmentSet { - namespace: test, - segments: [ - SegmentKey { - start_frame_no: 1, - end_frame_no: 20, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 21, - end_frame_no: 27, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 28, - end_frame_no: 41, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 42, - end_frame_no: 70, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 71, - end_frame_no: 81, - timestamp: 1970-01-01T00:00:00Z, - }, - SegmentKey { - start_frame_no: 82, - end_frame_no: 100, - timestamp: 1970-01-01T00:00:00Z, - }, - ], -} diff --git a/libsql-wal/src/storage/compaction/strategy/tiered.rs b/libsql-wal/src/storage/compaction/strategy/tiered.rs deleted file mode 100644 index 917cd726bc..0000000000 --- a/libsql-wal/src/storage/compaction/strategy/tiered.rs +++ /dev/null @@ -1,180 +0,0 @@ -//! The `LevelsStrategy` is a partial compaction strategy that compacts segments in increasingly -//! bigger sizes. Is squashes segments starting from the most recent, and working towards the -//! oldest. Segments are added to the result set as follow: -//! - if the number of segments in the set is less than the strategy's threshold, no compaction -//! occurs -//! - else, add all segments above the threshold to the result set -//! - while the span of the result set is greater than the next considered segment, add that -//! segmetn to the set too. -//! -//! In the following example, we identify segments to their span for clarity: -//! -//! initial : input_set: [10, 7, 21, 14] result_set: [], threshold: 3 -//! step 1 => input_set: [10, 7] result_set: [21, 14] | span of the result set: 21 + 14 = 35 -//! step 2 => input_set: [10] result_set: [7, 21, 14] | 35 > 7, new span: 35 + 7 = 42 -//! step 3 => input_set: [] result_set: [10, 7, 21, 14] | 42 > 10, new span: 42 + 10 = 52 -//! resulting segment (after compaction) [52] -//! after more segment are added to the set: -//! [52, 5, 6, 4] -> [52, 15] (15 is less than 52) -//! -//! remarks: -//! - this compaction will always shrink the input set size, as long as it's length is greater than -//! the strategy threshold: the input set will at worst be threshold - 1 segments long -//! - segments grow toward the size of the first segment in the set. The goal is to delays having -//! to merge large segments, so that we don't need to fetch them too often, and write back large -//! segments to the storage. The idea is that we maximize the 'useful' information contained by -//! smaller segments toward the head of the set. -use crate::storage::{compaction::SegmentSet, SegmentKey}; - -use super::CompactionStrategy; - -pub struct LevelsStrategy { - threshold: usize, -} - -impl LevelsStrategy { - pub fn new(threshold: usize) -> Self { - Self { threshold } - } -} - -impl CompactionStrategy for LevelsStrategy { - fn partition(&self, segments: &SegmentSet) -> Vec { - // no need to compact, not enough segments - if segments.len() < self.threshold { - return Vec::new(); - } - - let overflow = segments.len() - self.threshold + 1; - - let mut out = segments - .iter() - .rev() - .cloned() - .take(overflow) - .collect::>(); - - let remaining_segs = &segments[..segments.len() - overflow]; - - for seg in remaining_segs.iter().rev() { - if span(&out) >= seg.span() { - out.push(seg.clone()); - } - } - - // segments are in inverted order, so we need to reverse the array - out.reverse(); - - vec![SegmentSet { - namespace: segments.namespace.clone(), - segments: out, - }] - } -} - -// returns the amount of frame spanned by the passed set of segments. -// -// the passed set is expected to be non-emtpy, in reverse segment order -fn span(segs: &[SegmentKey]) -> u64 { - debug_assert!(!segs.is_empty()); - debug_assert!(segs.first().unwrap().start_frame_no >= segs.last().unwrap().start_frame_no); - - segs.first().unwrap().end_frame_no - segs.last().unwrap().start_frame_no -} - -#[cfg(test)] -mod test { - use insta::assert_debug_snapshot; - use libsql_sys::name::NamespaceName; - - use super::*; - - #[test] - fn partition_tiered() { - let ns = NamespaceName::from_string("test".into()); - let s = LevelsStrategy { threshold: 5 }; - let mut set = SegmentSet { - namespace: ns.clone(), - segments: vec![ - SegmentKey { - start_frame_no: 1, - end_frame_no: 20, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 21, - end_frame_no: 27, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 28, - end_frame_no: 41, - timestamp: 0, - }, - ], - }; - - assert!(s.partition(&set).is_empty()); - - set.segments.push(SegmentKey { - start_frame_no: 42, - end_frame_no: 70, - timestamp: 0, - }); - set.segments.push(SegmentKey { - start_frame_no: 71, - end_frame_no: 81, - timestamp: 0, - }); - set.segments.push(SegmentKey { - start_frame_no: 82, - end_frame_no: 100, - timestamp: 0, - }); - - let partition = s.partition(&set); - assert_eq!(partition.len(), 1); - // we should compact all segments into one - assert_debug_snapshot!(partition.first().unwrap()); - - let set = SegmentSet { - namespace: ns.clone(), - segments: vec![ - SegmentKey { - start_frame_no: 1, - end_frame_no: 100, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 101, - end_frame_no: 105, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 106, - end_frame_no: 110, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 111, - end_frame_no: 115, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 116, - end_frame_no: 120, - timestamp: 0, - }, - SegmentKey { - start_frame_no: 121, - end_frame_no: 122, - timestamp: 0, - }, - ], - }; - - let partition = s.partition(&set); - assert_eq!(partition.len(), 1); - assert_debug_snapshot!(partition.first().unwrap()); - } -} diff --git a/libsql-wal/src/storage/error.rs b/libsql-wal/src/storage/error.rs deleted file mode 100644 index 6c9b0cf04a..0000000000 --- a/libsql-wal/src/storage/error.rs +++ /dev/null @@ -1,40 +0,0 @@ -use std::panic::Location; - -use super::backend::FindSegmentReq; - -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("io error: {0}")] - Io(#[from] std::io::Error), - #[error("an error occured while storing a segment: {0}")] - Store(String), - #[error("error compacting segment: {0}")] - Compact(#[from] crate::error::Error), - #[error("segment not found for request {0:?}")] - SegmentNotFound(FindSegmentReq), - #[error("unhandled storage error: {error}, in {context}")] - UnhandledStorageError { - error: Box, - context: String, - loc: String, - }, - // We may recover from this error, and rebuild the index from the data file. - #[error("invalid index: {0}")] - InvalidIndex(&'static str), - #[error("Provided config is of an invalid type")] - InvalidConfigType, -} - -impl Error { - #[track_caller] - pub(crate) fn unhandled( - e: impl std::error::Error + Send + Sync + 'static, - ctx: impl Into, - ) -> Self { - Self::UnhandledStorageError { - error: Box::new(e), - context: ctx.into(), - loc: Location::caller().to_string(), - } - } -} diff --git a/libsql-wal/src/storage/job.rs b/libsql-wal/src/storage/job.rs deleted file mode 100644 index b3351db023..0000000000 --- a/libsql-wal/src/storage/job.rs +++ /dev/null @@ -1,94 +0,0 @@ -use std::ops::Deref; - -use super::backend::Backend; -use super::backend::SegmentMeta; -use super::Result; -use super::StoreSegmentRequest; -use crate::io::Io; -use crate::segment::Segment; - -/// A request, with an id -#[derive(Debug)] -pub(crate) struct IndexedRequest { - pub(crate) request: StoreSegmentRequest, - pub(crate) id: u64, -} - -impl Deref for IndexedRequest { - type Target = StoreSegmentRequest; - - fn deref(&self) -> &Self::Target { - &self.request - } -} - -/// A storage Job to be performed -#[derive(Debug)] -pub(crate) struct Job { - /// Segment to store. - // TODO: implement request batching (merge segment and send). - pub(crate) request: IndexedRequest, -} - -impl Job -where - Seg: Segment, - C: Clone, -{ - /// Perform the job and return the JobResult. This is not allowed to panic. - pub(crate) async fn perform(self, backend: B, io: IO) -> JobResult - where - B: Backend, - IO: Io, - { - let result = self.try_perform(backend, io).await; - JobResult { job: self, result } - } - - async fn try_perform(&self, backend: B, io: IO) -> Result - where - B: Backend, - IO: Io, - { - let segment = &self.request.segment; - let tmp = io.tempfile()?; - - tracing::debug!( - namespace = self.request.namespace.as_str(), - "sending segment to durable storage" - ); - - let new_index = segment.compact(&tmp).await.map_err(super::Error::Compact)?; - - let meta = SegmentMeta { - namespace: self.request.namespace.clone(), - start_frame_no: segment.start_frame_no(), - end_frame_no: segment.last_committed(), - segment_timestamp: segment.timestamp(), - }; - let config = self - .request - .storage_config_override - .clone() - .unwrap_or_else(|| backend.default_config()); - - backend.store(&config, meta, tmp, new_index).await?; - - tracing::info!( - namespace = self.request.namespace.as_str(), - start_frame_no = segment.start_frame_no(), - end_frame_no = segment.last_committed(), - "stored segment" - ); - - Ok(segment.last_committed()) - } -} - -#[derive(Debug)] -pub(crate) struct JobResult { - /// The job that was performed - pub(crate) job: Job, - /// The outcome of the job: the new durable index, or an error. - pub(crate) result: Result, -} diff --git a/libsql-wal/src/storage/mod.rs b/libsql-wal/src/storage/mod.rs deleted file mode 100644 index aa10cfded7..0000000000 --- a/libsql-wal/src/storage/mod.rs +++ /dev/null @@ -1,625 +0,0 @@ -use std::collections::BTreeMap; -use std::fmt::Debug; -use std::path::{Path, PathBuf}; -use std::pin::Pin; -use std::str::FromStr; -use std::sync::Arc; -use std::{fmt, future::Future}; - -use chrono::{DateTime, Utc}; -use fst::Map; -use hashbrown::HashMap; -use libsql_sys::name::NamespaceName; -use libsql_sys::wal::either::Either; -use tempfile::{tempdir, TempDir}; -use tokio_stream::Stream; - -use crate::io::{FileExt, Io, StdIO}; -use crate::segment::compacted::CompactedSegment; -use crate::segment::{sealed::SealedSegment, Segment}; - -use self::backend::{FindSegmentReq, SegmentMeta}; -pub use self::error::Error; - -pub mod async_storage; -pub mod backend; -pub mod compaction; -pub(crate) mod error; -mod job; -mod scheduler; - -pub type Result = std::result::Result; - -pub enum RestoreOptions { - Latest, - Timestamp(DateTime), -} - -/// SegmentKey is used to index segment data, where keys a lexicographically ordered. -/// The scheme is `{u64::MAX - start_frame_no}-{u64::MAX - end_frame_no}`. With that naming convention, when looking for -/// the segment containing 'n', we can perform a prefix search with "{u64::MAX - n}". The first -/// element of the range will be the biggest segment that contains n if it exists. -/// Beware that if no segments contain n, either the smallest segment not containing n, if n < argmin -/// {start_frame_no}, or the largest segment if n > argmax {end_frame_no} will be returned. -/// e.g: -/// ```ignore -/// let mut map = BTreeMap::new(); -/// -/// let meta = SegmentMeta { start_frame_no: 1, end_frame_no: 100 }; -/// map.insert(SegmentKey(&meta).to_string(), meta); -/// -/// let meta = SegmentMeta { start_frame_no: 101, end_frame_no: 500 }; -/// map.insert(SegmentKey(&meta).to_string(), meta); -/// -/// let meta = SegmentMeta { start_frame_no: 101, end_frame_no: 1000 }; -/// map.insert(SegmentKey(&meta).to_string(), meta); -/// -/// map.range(format!("{:020}", u64::MAX - 50)..).next(); -/// map.range(format!("{:020}", u64::MAX - 0)..).next(); -/// map.range(format!("{:020}", u64::MAX - 1)..).next(); -/// map.range(format!("{:020}", u64::MAX - 100)..).next(); -/// map.range(format!("{:020}", u64::MAX - 101)..).next(); -/// map.range(format!("{:020}", u64::MAX - 5000)..).next(); -/// ``` -#[derive(Clone, Copy, PartialEq, Eq)] -pub struct SegmentKey { - pub start_frame_no: u64, - pub end_frame_no: u64, - pub timestamp: u64, -} - -impl Debug for SegmentKey { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SegmentKey") - .field("start_frame_no", &self.start_frame_no) - .field("end_frame_no", &self.end_frame_no) - .field("timestamp", &self.timestamp()) - .finish() - } -} - -impl PartialOrd for SegmentKey { - fn partial_cmp(&self, other: &Self) -> Option { - match self.start_frame_no.partial_cmp(&other.start_frame_no) { - Some(core::cmp::Ordering::Equal) => {} - ord => return ord, - } - self.end_frame_no.partial_cmp(&other.end_frame_no) - } -} - -impl Ord for SegmentKey { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.partial_cmp(other).unwrap() - } -} - -impl SegmentKey { - pub(crate) fn includes(&self, frame_no: u64) -> bool { - (self.start_frame_no..=self.end_frame_no).contains(&frame_no) - } - - #[tracing::instrument] - fn validate_from_path(mut path: &Path, ns: &NamespaceName) -> Option { - // path in the form "v2/clusters/{cluster-id}/namespaces/{namespace}/indexes/{index-key}" - let key: Self = path.file_name()?.to_str()?.parse().ok()?; - - path = path.parent()?; - - if path.file_name()? != "indexes" { - tracing::debug!("invalid key, ignoring"); - return None; - } - - path = path.parent()?; - - if path.file_name()? != ns.as_str() { - tracing::debug!("invalid namespace for key"); - return None; - } - - Some(key) - } - - fn timestamp(&self) -> DateTime { - DateTime::from_timestamp_millis(self.timestamp as _) - .unwrap() - .to_utc() - } - - pub fn span(&self) -> u64 { - self.end_frame_no - self.start_frame_no - } -} - -impl From<&SegmentMeta> for SegmentKey { - fn from(value: &SegmentMeta) -> Self { - Self { - start_frame_no: value.start_frame_no, - end_frame_no: value.end_frame_no, - timestamp: value.segment_timestamp.timestamp_millis() as _, - } - } -} - -impl FromStr for SegmentKey { - type Err = (); - - fn from_str(s: &str) -> std::result::Result { - let (rev_end_fno, s) = s.split_at(20); - let end_frame_no = u64::MAX - rev_end_fno.parse::().map_err(|_| ())?; - let (start_fno, timestamp) = s[1..].split_at(20); - let start_frame_no = start_fno.parse::().map_err(|_| ())?; - let timestamp = timestamp[1..].parse().map_err(|_| ())?; - Ok(Self { - start_frame_no, - end_frame_no, - timestamp, - }) - } -} - -impl fmt::Display for SegmentKey { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{:020}-{:020}-{:020}", - u64::MAX - self.end_frame_no, - self.start_frame_no, - self.timestamp, - ) - } -} - -/// takes the new durable frame_no and returns a future -pub type OnStoreCallback = Box< - dyn FnOnce(u64) -> Pin + Send + Sync + 'static>> - + Send - + Sync - + 'static, ->; - -pub trait Storage: Send + Sync + 'static { - type Segment: Segment; - type Config: Clone + Send; - /// store the passed segment for `namespace`. This function is called in a context where - /// blocking is acceptable. - /// returns a future that resolves when the segment is stored - /// The segment should be stored whether or not the future is polled. - fn store( - &self, - namespace: &NamespaceName, - seg: Self::Segment, - config_override: Option, - on_store: OnStoreCallback, - ); - - fn durable_frame_no( - &self, - namespace: &NamespaceName, - config_override: Option, - ) -> impl Future> + Send; - - fn find_segment( - &self, - namespace: &NamespaceName, - frame_no: FindSegmentReq, - config_override: Option, - ) -> impl Future> + Send; - - fn fetch_segment_index( - &self, - namespace: &NamespaceName, - key: &SegmentKey, - config_override: Option, - ) -> impl Future>>> + Send; - - fn fetch_segment_data( - &self, - namespace: &NamespaceName, - key: &SegmentKey, - config_override: Option, - ) -> impl Future>> + Send; - - fn shutdown(&self) -> impl Future + Send { - async { () } - } - - fn list_segments<'a>( - &'a self, - namespace: &'a NamespaceName, - until: u64, - config_override: Option, - ) -> impl Stream> + 'a; -} - -#[derive(Debug)] -pub struct SegmentInfo { - pub key: SegmentKey, - pub size: usize, -} - -/// special zip function for Either storage implementation -fn zip( - x: &Either, - y: Option>, -) -> Either<(&A, Option), (&B, Option)> { - match (x, y) { - (Either::A(a), Some(Either::A(c))) => Either::A((a, Some(c))), - (Either::B(b), Some(Either::B(d))) => Either::B((b, Some(d))), - (Either::A(a), None) => Either::A((a, None)), - (Either::B(b), None) => Either::B((b, None)), - _ => panic!("incompatible options"), - } -} - -impl Storage for Either -where - A: Storage, - B: Storage, - S: Segment, -{ - type Segment = S; - type Config = Either; - - fn store( - &self, - namespace: &NamespaceName, - seg: Self::Segment, - config_override: Option, - on_store: OnStoreCallback, - ) { - match zip(self, config_override) { - Either::A((s, c)) => s.store(namespace, seg, c, on_store), - Either::B((s, c)) => s.store(namespace, seg, c, on_store), - } - } - - async fn durable_frame_no( - &self, - namespace: &NamespaceName, - config_override: Option, - ) -> Result { - match zip(self, config_override) { - Either::A((s, c)) => s.durable_frame_no(namespace, c).await, - Either::B((s, c)) => s.durable_frame_no(namespace, c).await, - } - } - - fn find_segment( - &self, - namespace: &NamespaceName, - frame_no: FindSegmentReq, - config_override: Option, - ) -> impl Future> + Send { - async move { - match zip(self, config_override) { - Either::A((s, c)) => s.find_segment(namespace, frame_no, c).await, - Either::B((s, c)) => s.find_segment(namespace, frame_no, c).await, - } - } - } - - fn fetch_segment_index( - &self, - namespace: &NamespaceName, - key: &SegmentKey, - config_override: Option, - ) -> impl Future>>> + Send { - async move { - match zip(self, config_override) { - Either::A((s, c)) => s.fetch_segment_index(namespace, key, c).await, - Either::B((s, c)) => s.fetch_segment_index(namespace, key, c).await, - } - } - } - - fn fetch_segment_data( - &self, - namespace: &NamespaceName, - key: &SegmentKey, - config_override: Option, - ) -> impl Future>> + Send { - async move { - match zip(self, config_override) { - Either::A((s, c)) => { - let seg = s.fetch_segment_data(namespace, key, c).await?; - let seg = seg.remap_file_type(Either::A); - Ok(seg) - } - Either::B((s, c)) => { - let seg = s.fetch_segment_data(namespace, key, c).await?; - let seg = seg.remap_file_type(Either::B); - Ok(seg) - } - } - } - } - - async fn shutdown(&self) { - match self { - Either::A(a) => a.shutdown().await, - Either::B(b) => b.shutdown().await, - } - } - - fn list_segments<'a>( - &'a self, - namespace: &'a NamespaceName, - until: u64, - config_override: Option, - ) -> impl Stream> + 'a { - match zip(self, config_override) { - Either::A((s, c)) => { - tokio_util::either::Either::Left(s.list_segments(namespace, until, c)) - } - Either::B((s, c)) => { - tokio_util::either::Either::Right(s.list_segments(namespace, until, c)) - } - } - } -} - -/// a placeholder storage that doesn't store segment -#[derive(Debug, Clone, Copy)] -pub struct NoStorage; - -impl Storage for NoStorage { - type Config = (); - type Segment = SealedSegment; - - fn store( - &self, - _namespace: &NamespaceName, - _seg: Self::Segment, - _config: Option, - _on_store: OnStoreCallback, - ) { - } - - async fn durable_frame_no( - &self, - _namespace: &NamespaceName, - _config: Option, - ) -> Result { - Ok(u64::MAX) - } - - async fn find_segment( - &self, - _namespace: &NamespaceName, - _frame_no: FindSegmentReq, - _config_override: Option, - ) -> Result { - unimplemented!() - } - - async fn fetch_segment_index( - &self, - _namespace: &NamespaceName, - _key: &SegmentKey, - _config_override: Option, - ) -> Result>> { - unimplemented!() - } - - async fn fetch_segment_data( - &self, - _namespace: &NamespaceName, - _key: &SegmentKey, - _config_override: Option, - ) -> Result> { - unimplemented!(); - #[allow(unreachable_code)] - Result::>::Err(Error::InvalidIndex("")) - } - - fn list_segments<'a>( - &'a self, - _namespace: &'a NamespaceName, - _until: u64, - _config_override: Option, - ) -> impl Stream> + 'a { - unimplemented!("no storage!"); - #[allow(unreachable_code)] - tokio_stream::empty() - } -} - -#[doc(hidden)] -#[derive(Debug)] -pub struct TestStorage { - inner: Arc>>, -} - -#[derive(Debug)] -struct TestStorageInner { - stored: HashMap>)>>, - dir: TempDir, - io: IO, - store: bool, -} - -impl Clone for TestStorage { - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - } - } -} - -impl TestStorage { - pub fn new() -> Self { - Self::new_io(false, StdIO(())) - } - - pub fn new_store() -> Self { - Self::new_io(true, StdIO(())) - } -} - -impl TestStorage { - pub fn new_io(store: bool, io: IO) -> Self { - let dir = tempdir().unwrap(); - Self { - inner: Arc::new( - TestStorageInner { - dir, - stored: Default::default(), - io, - store, - } - .into(), - ), - } - } -} - -impl Storage for TestStorage { - type Segment = SealedSegment; - type Config = (); - - fn store( - &self, - namespace: &NamespaceName, - seg: Self::Segment, - _config: Option, - on_store: OnStoreCallback, - ) { - let mut inner = self.inner.lock_blocking(); - if inner.store { - let out_path = inner.dir.path().join(uuid::Uuid::new_v4().to_string()); - let out_file = inner.io.open(true, true, true, &out_path).unwrap(); - let index = tokio::runtime::Handle::current() - .block_on(seg.compact(&out_file)) - .unwrap(); - let end_frame_no = seg.header().last_committed(); - let key = SegmentKey { - start_frame_no: seg.header().start_frame_no.get(), - end_frame_no, - timestamp: seg.header().sealed_at_timestamp.get(), - }; - let index = Map::new(index.into()).unwrap(); - inner - .stored - .entry(namespace.clone()) - .or_default() - .insert(key, (out_path, index)); - tokio::runtime::Handle::current().block_on(on_store(end_frame_no)); - } else { - // HACK: we need to spawn because many tests just call this method indirectly in - // async context. That makes tests easier to write. - tokio::task::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(on_store(u64::MAX)); - }); - } - } - - async fn durable_frame_no( - &self, - _namespace: &NamespaceName, - _config: Option, - ) -> Result { - Ok(u64::MAX) - } - - async fn find_segment( - &self, - namespace: &NamespaceName, - req: FindSegmentReq, - _config_override: Option, - ) -> Result { - let inner = self.inner.lock().await; - if inner.store { - let FindSegmentReq::EndFrameNoLessThan(fno) = req else { - panic!("unsupported lookup by ts") - }; - if let Some(segs) = inner.stored.get(namespace) { - let Some((key, _path)) = segs.iter().find(|(k, _)| k.includes(fno)) else { - return Err(Error::SegmentNotFound(req)); - }; - return Ok(*key); - } else { - panic!("namespace not found"); - } - } else { - panic!("store not enabled") - } - } - - async fn fetch_segment_index( - &self, - namespace: &NamespaceName, - key: &SegmentKey, - _config_override: Option, - ) -> Result>> { - let inner = self.inner.lock().await; - if inner.store { - match inner.stored.get(namespace) { - Some(segs) => Ok(segs.get(&key).unwrap().1.clone()), - None => panic!("unknown namespace"), - } - } else { - panic!("not storing") - } - } - - async fn fetch_segment_data( - &self, - namespace: &NamespaceName, - key: &SegmentKey, - _config_override: Option, - ) -> Result> { - let inner = self.inner.lock().await; - if inner.store { - match inner.stored.get(namespace) { - Some(segs) => { - let path = &segs.get(&key).unwrap().0; - let file = inner.io.open(false, true, false, path).unwrap(); - Ok(CompactedSegment::open(file).await?) - } - None => panic!("unknown namespace"), - } - } else { - panic!("not storing") - } - } - - fn list_segments<'a>( - &'a self, - _namespace: &'a NamespaceName, - _until: u64, - _config_override: Option, - ) -> impl Stream> + 'a { - todo!(); - #[allow(unreachable_code)] - tokio_stream::empty() - } -} - -pub struct StoreSegmentRequest { - namespace: NamespaceName, - /// Path to the segment. Read-only for bottomless - segment: S, - /// When this segment was created - created_at: DateTime, - - /// alternative configuration to use with the storage layer. - /// e.g: S3 overrides - storage_config_override: Option, - /// Called after the segment was stored, with the new durable index - on_store_callback: OnStoreCallback, -} - -impl Debug for StoreSegmentRequest -where - S: Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("StoreSegmentRequest") - .field("namespace", &self.namespace) - .field("segment", &self.segment) - .field("created_at", &self.created_at) - .finish() - } -} diff --git a/libsql-wal/src/storage/scheduler.rs b/libsql-wal/src/storage/scheduler.rs deleted file mode 100644 index a9de9a746a..0000000000 --- a/libsql-wal/src/storage/scheduler.rs +++ /dev/null @@ -1,317 +0,0 @@ -use std::cmp::Reverse; -use std::collections::{HashMap, VecDeque}; - -use super::job::{IndexedRequest, Job, JobResult}; -use super::StoreSegmentRequest; -use libsql_sys::name::NamespaceName; - -struct NamespaceRequests { - requests: VecDeque>, - /// there's work in flight for this namespace - in_flight: bool, -} - -impl Default for NamespaceRequests { - fn default() -> Self { - Self { - requests: Default::default(), - in_flight: false, - } - } -} - -/// When segments are received, they are enqueued in the `SegmentQueue`, stored by namespace. each -/// request is associated with a request id, so that when a request is popped from the queue, the -/// one with the smallest id is processed first. If there are multiple requests for the same -/// namespace, the segments can be merged together, for faster processing. -/// A new segment can not be enqueued until the previous segment for the same namespace has been -/// processed, because only the most recent segment is checked for durability. This property -/// ensures that all segments are present up to the max durable index. -/// It is generic over C: the storage config type (for config overrides), and T, the segment type -pub(crate) struct Scheduler { - /// notify new durability index for namespace - requests: HashMap>, - queue: priority_queue::PriorityQueue>, - next_request_id: u64, -} - -impl Scheduler { - pub fn new() -> Self { - Self { - requests: Default::default(), - queue: Default::default(), - next_request_id: Default::default(), - } - } - - /// Register a new request with the scheduler - #[tracing::instrument(skip_all)] - pub fn register(&mut self, request: StoreSegmentRequest) { - // invariant: new segment comes immediately after the latest segment for that namespace. This means: - // - immediately after the last registered segment, if there is any - // - immediately after the last durable index - let id = self.next_request_id; - self.next_request_id += 1; - let name = request.namespace.clone(); - let slot = IndexedRequest { request, id }; - let requests = self.requests.entry(name.clone()).or_default(); - requests.requests.push_back(slot); - - tracing::debug!(job_id = id, "job registered"); - - // if there is a priority for this namespace already, it must be higher than ours, because - // it was registered earlier - if !requests.in_flight && self.queue.get_priority(&name).is_none() { - tracing::debug!(job_id = id, "job queued"); - self.queue.push(name, Reverse(id)); - } - } - - /// Get the next job to be executed. Gather as much work as possible from the next namespace to - /// be scheduled, and returns description of the job to be performed. No other job for this - /// namespace will be scheduled, until the `JobResult` is reported - #[tracing::instrument(skip_all)] - pub fn schedule(&mut self) -> Option> { - let (name, _) = self.queue.pop()?; - let requests = self - .requests - .get_mut(&name) - .expect("work scheduled but not requests?"); - requests.in_flight = true; - let request = requests.requests.pop_front().unwrap(); - - tracing::debug!(job_id = request.id, "scheduled job"); - - let job = Job { request }; - - Some(job) - } - - /// Report the job result to the scheduler. If the job result was a success, the request as - /// removed from the queue, else, the job is rescheduled - #[tracing::instrument(skip_all, fields(req_id = result.job.request.id))] - pub async fn report(&mut self, result: JobResult) { - // re-schedule, or report new max durable frame_no for segment - let name = result.job.request.request.namespace.clone(); - let requests = self - .requests - .get_mut(&name) - .expect("request slot must exist"); - - requests.in_flight = false; - - match result.result { - Ok(durable_index) => { - tracing::debug!("job success registered"); - (result.job.request.request.on_store_callback)(durable_index).await; - } - Err(e) => { - tracing::error!("error processing request, re-enqueuing: {e}"); - // put it back at the front of the queue - requests.requests.push_front(result.job.request); - } - } - - assert!( - self.queue.get_priority(&name).is_none(), - "there should be not enqueued jobs at this point" - ); - - if !requests.requests.is_empty() { - let first_id = requests.requests.front().unwrap().id; - self.queue.push(name, Reverse(first_id)); - } else { - self.requests.remove(&name); - } - } - - /// Returns true if the scheduler is empty, that is, there are no scheduler requests, and - /// no not-scheduled request: iow, it's empty. - pub fn is_empty(&self) -> bool { - self.requests.is_empty() - } - - /// Scheduler has work to do. Calling `schedule` after this method must always return some job - pub fn has_work(&self) -> bool { - !self.queue.is_empty() - } -} - -#[cfg(test)] -mod test { - use std::future::ready; - - use chrono::Utc; - use tokio::sync::oneshot; - - use crate::storage::Error; - use libsql_sys::name::NamespaceName; - - use super::*; - - #[tokio::test] - async fn schedule_simple() { - let mut scheduler = Scheduler::<(), ()>::new(); - - let ns1 = NamespaceName::from("test1"); - let ns2 = NamespaceName::from("test2"); - - let (job_1_snd, job_1_rcv) = oneshot::channel(); - scheduler.register(StoreSegmentRequest { - namespace: ns1.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(move |n| { - Box::pin(async move { - let _ = job_1_snd.send(n); - }) - }), - }); - - let (job_2_snd, job_2_rcv) = oneshot::channel(); - scheduler.register(StoreSegmentRequest { - namespace: ns2.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(move |n| { - Box::pin(async move { - let _ = job_2_snd.send(n); - }) - }), - }); - - scheduler.register(StoreSegmentRequest { - namespace: ns1.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(move |_| Box::pin(ready(()))), - }); - - let job1 = scheduler.schedule().unwrap(); - assert_eq!(job1.request.request.namespace, ns1); - // assert_eq!(job1.request.request.start_frame_no, 0); - - let job2 = scheduler.schedule().unwrap(); - assert_eq!(job2.request.request.namespace, ns2); - - assert!(scheduler.schedule().is_none()); - - scheduler - .report(JobResult { - job: job2, - result: Ok(42), - }) - .await; - - assert!(scheduler.schedule().is_none()); - assert_eq!(job_2_rcv.await.unwrap(), 42); - - scheduler - .report(JobResult { - job: job1, - result: Ok(10), - }) - .await; - assert_eq!(job_1_rcv.await.unwrap(), 10); - - let job1 = scheduler.schedule().unwrap(); - assert_eq!(job1.request.request.namespace, ns1); - assert_eq!(job1.request.id, 2); - } - - #[tokio::test] - async fn job_error_reschedule() { - let mut scheduler = Scheduler::<(), ()>::new(); - - let ns1 = NamespaceName::from("test1"); - let ns2 = NamespaceName::from("test2"); - - scheduler.register(StoreSegmentRequest { - namespace: ns1.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(|_| Box::pin(ready(()))), - }); - - scheduler.register(StoreSegmentRequest { - namespace: ns2.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(|_| Box::pin(ready(()))), - }); - - let job1 = scheduler.schedule().unwrap(); - assert_eq!(job1.request.request.namespace, ns1); - assert_eq!(job1.request.id, 0); - - scheduler - .report(JobResult { - job: job1, - result: Err(Error::Store("oops".into())), - }) - .await; - - // the same job is immediately re-scheduled - let job1 = scheduler.schedule().unwrap(); - assert_eq!(job1.request.request.namespace, ns1); - assert_eq!(job1.request.id, 0); - } - - #[tokio::test] - async fn schedule_while_in_flight() { - let mut scheduler = Scheduler::<(), ()>::new(); - - let ns1 = NamespaceName::from("test1"); - - scheduler.register(StoreSegmentRequest { - namespace: ns1.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(|_| Box::pin(ready(()))), - }); - - let job = scheduler.schedule().unwrap(); - assert_eq!(job.request.request.namespace, ns1); - assert_eq!(job.request.id, 0); - - scheduler.register(StoreSegmentRequest { - namespace: ns1.clone(), - segment: (), - created_at: Utc::now(), - storage_config_override: None, - on_store_callback: Box::new(|_| Box::pin(ready(()))), - }); - - assert!(scheduler.schedule().is_none()); - - scheduler - .report(JobResult { - job, - result: Err(Error::Store("oops".into())), - }) - .await; - - let job = scheduler.schedule().unwrap(); - assert_eq!(job.request.request.namespace, ns1); - assert_eq!(job.request.id, 0); - - assert!(scheduler.schedule().is_none()); - - scheduler - .report(JobResult { - job, - result: Ok(10), - }) - .await; - - let job = scheduler.schedule().unwrap(); - assert_eq!(job.request.request.namespace, ns1); - assert_eq!(job.request.id, 1); - } -} diff --git a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-2.snap b/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-2.snap deleted file mode 100644 index 441383c4cd..0000000000 --- a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-2.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: libsql-wal/src/bottomless/job.rs -expression: "crc32fast::hash(&segment_index)" ---- -1844457043 diff --git a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-3.snap b/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-3.snap deleted file mode 100644 index 127e085e24..0000000000 --- a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-3.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: libsql-wal/src/bottomless/job.rs -expression: segment_index.len() ---- -50 diff --git a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-4.snap b/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-4.snap deleted file mode 100644 index c8d573c864..0000000000 --- a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-4.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: libsql-wal/src/bottomless/job.rs -expression: data.len() ---- -8268 diff --git a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-5.snap b/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-5.snap deleted file mode 100644 index 74f1abb95d..0000000000 --- a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store-5.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: libsql-wal/src/bottomless/job.rs -expression: "crc32fast::hash(&data)" ---- -558161692 diff --git a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store.snap b/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store.snap deleted file mode 100644 index 4de19a5f37..0000000000 --- a/libsql-wal/src/storage/snapshots/libsql_wal__bottomless__job__test__store.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: libsql-wal/src/bottomless/job.rs -expression: meta ---- -SegmentMeta { - namespace: db, - segment_id: 00000000-0000-0000-0000-000000000000, - start_frame_no: 1, - end_frame_no: 102, - created_at: 1970-01-01T00:00:00Z, -} diff --git a/libsql-wal/src/transaction.rs b/libsql-wal/src/transaction.rs deleted file mode 100644 index a45b666a71..0000000000 --- a/libsql-wal/src/transaction.rs +++ /dev/null @@ -1,375 +0,0 @@ -use std::collections::BTreeMap; -use std::ops::{Deref, DerefMut}; -use std::sync::Arc; -use std::time::Instant; - -use libsql_sys::name::NamespaceName; -use tokio::sync::mpsc; - -use crate::checkpointer::CheckpointMessage; -use crate::segment::current::{CurrentSegment, SegmentIndex}; -use crate::shared_wal::WalLock; - -pub enum Transaction { - Write(WriteTransaction), - Read(ReadTransaction), -} - -impl From> for Transaction { - fn from(value: ReadTransaction) -> Self { - Self::Read(value) - } -} - -impl Transaction { - pub fn as_write_mut(&mut self) -> Option<&mut WriteTransaction> { - if let Self::Write(ref mut v) = self { - Some(v) - } else { - None - } - } - - pub fn into_write(self) -> Result, Self> { - if let Self::Write(v) = self { - Ok(v) - } else { - Err(self) - } - } - - pub fn max_frame_no(&self) -> u64 { - match self { - Transaction::Write(w) => w.next_frame_no - 1, - Transaction::Read(read) => read.max_frame_no, - } - } - - pub(crate) fn end(self) { - match self { - Transaction::Write(tx) => { - tx.downgrade(); - } - Transaction::Read(_) => (), - } - } -} - -impl Deref for Transaction { - type Target = ReadTransaction; - - fn deref(&self) -> &Self::Target { - match self { - Transaction::Write(tx) => &tx, - Transaction::Read(tx) => &tx, - } - } -} - -impl DerefMut for Transaction { - fn deref_mut(&mut self) -> &mut Self::Target { - match self { - Transaction::Write(ref mut tx) => tx, - Transaction::Read(ref mut tx) => tx, - } - } -} - -pub struct ReadTransaction { - pub id: u64, - /// Max frame number that this transaction can read - pub max_frame_no: u64, - // max offset that can be read from the current log - pub max_offset: u64, - pub db_size: u32, - /// The segment to which we have a read lock - pub current: Arc>, - pub created_at: Instant, - pub conn_id: u64, - /// number of pages read by this transaction. This is used to determine whether a write lock - /// will be re-acquired. - pub pages_read: usize, - pub namespace: NamespaceName, - pub checkpoint_notifier: mpsc::Sender, -} - -// fixme: clone should probably not be implemented for this type, figure a way to do it -impl Clone for ReadTransaction { - fn clone(&self) -> Self { - self.current.inc_reader_count(); - Self { - id: self.id, - max_frame_no: self.max_frame_no, - current: self.current.clone(), - db_size: self.db_size, - created_at: self.created_at, - conn_id: self.conn_id, - pages_read: self.pages_read, - namespace: self.namespace.clone(), - checkpoint_notifier: self.checkpoint_notifier.clone(), - max_offset: self.max_offset, - } - } -} - -impl Drop for ReadTransaction { - fn drop(&mut self) { - // FIXME: it would be more approriate to wait till the segment is stored before notfying, - // because we are not waiting for read to be released before that - if self.current.dec_reader_count() && self.current.is_sealed() { - let _: Result<_, _> = self - .checkpoint_notifier - .try_send(self.namespace.clone().into()); - } - } -} - -pub struct Savepoint { - pub next_offset: u32, - pub next_frame_no: u64, - pub current_checksum: u32, - pub index: BTreeMap, -} - -impl Savepoint { - pub fn new(next_offset: u32, next_frame_no: u64, current_checksum: u32) -> Self { - Self { - next_offset, - next_frame_no, - current_checksum, - index: Default::default(), - } - } -} - -/// The savepoints must be passed from most recent to oldest -pub(crate) fn merge_savepoints<'a>( - savepoints: impl Iterator>, - out: &SegmentIndex, -) { - for savepoint in savepoints { - for (k, v) in savepoint.iter() { - out.insert(*k, *v); - } - } -} - -pub struct WriteTransaction { - /// id of the transaction currently holding the lock - pub wal_lock: Arc, - pub savepoints: Vec, - pub next_frame_no: u64, - pub next_offset: u32, - pub current_checksum: u32, - pub is_commited: bool, - pub read_tx: ReadTransaction, - /// if transaction overwrote frames, then the running checksum needs to be recomputed. - /// We store here the lowest segment offset at which a frame was overwritten - pub recompute_checksum: Option, -} - -pub struct TxGuardOwned { - lock: Option>>, - inner: Option>, -} - -impl TxGuardOwned { - pub(crate) fn into_inner(mut self) -> WriteTransaction { - self.lock.take(); - self.inner.take().unwrap() - } -} - -impl Drop for TxGuardOwned { - fn drop(&mut self) { - let _ = self.lock.take(); - if let Some(inner) = self.inner.take() { - inner.downgrade(); - } - } -} - -impl Deref for TxGuardOwned { - type Target = WriteTransaction; - - fn deref(&self) -> &Self::Target { - self.inner.as_ref().expect("guard used after drop") - } -} - -impl DerefMut for TxGuardOwned { - fn deref_mut(&mut self) -> &mut Self::Target { - self.inner.as_mut().expect("guard used after drop") - } -} - -pub trait TxGuard: Deref> + DerefMut + Send + Sync {} - -impl<'a, F: Send + Sync> TxGuard for TxGuardShared<'a, F> {} -impl TxGuard for TxGuardOwned {} - -pub struct TxGuardShared<'a, F> { - _lock: async_lock::MutexGuardArc>, - inner: &'a mut WriteTransaction, -} - -impl<'a, F> Deref for TxGuardShared<'a, F> { - type Target = WriteTransaction; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl<'a, F> DerefMut for TxGuardShared<'a, F> { - fn deref_mut(&mut self) -> &mut Self::Target { - self.inner - } -} - -impl WriteTransaction { - pub(crate) fn merge_savepoints(&self, out: &SegmentIndex) { - let savepoints = self.savepoints.iter().rev().map(|s| &s.index); - merge_savepoints(savepoints, out); - } - - pub fn savepoint(&mut self) -> usize { - let savepoint_id = self.savepoints.len(); - self.savepoints.push(Savepoint::new( - self.next_offset, - self.next_frame_no, - self.current_checksum, - )); - savepoint_id - } - - pub fn lock(&mut self) -> TxGuardShared { - let g = self.wal_lock.tx_id.lock_arc_blocking(); - match *g { - // we still hold the lock, we can proceed - Some(id) if self.id == id => TxGuardShared { - _lock: g, - inner: self, - }, - // Somebody took the lock from us - Some(_) => todo!("lock stolen"), - None => todo!("not a transaction"), - } - } - - pub fn into_lock_owned(self) -> TxGuardOwned { - let g = self.wal_lock.tx_id.lock_arc_blocking(); - match *g { - // we still hold the lock, we can proceed - Some(id) if self.id == id => TxGuardOwned { - lock: Some(g), - inner: Some(self), - }, - // Somebody took the lock from us - Some(_) => todo!("lock stolen"), - None => todo!("not a transaction"), - } - } - - pub fn reset(&mut self, savepoint_id: usize) { - if savepoint_id >= self.savepoints.len() { - unreachable!("savepoint doesn't exist"); - } - - self.savepoints.drain(savepoint_id + 1..).count(); - self.savepoints[savepoint_id].index.clear(); - let last_savepoint = self.savepoints.last().unwrap(); - self.next_frame_no = last_savepoint.next_frame_no; - self.next_offset = last_savepoint.next_offset; - } - - pub fn index_page_iter(&self) -> impl Iterator + '_ { - self.savepoints - .iter() - .map(|s| s.index.keys().copied()) - .flatten() - } - - pub fn not_empty(&self) -> bool { - self.savepoints.iter().any(|s| !s.index.is_empty()) - } - - #[tracing::instrument(skip(self))] - pub fn downgrade(self) -> ReadTransaction { - tracing::trace!("downgrading write transaction"); - let Self { - wal_lock, read_tx, .. - } = self; - // always acquire lock in this order: reserved, then tx_id - let mut reserved = wal_lock.reserved.lock(); - let mut lock = wal_lock.tx_id.lock_blocking(); - match *lock { - Some(lock_id) if lock_id == read_tx.id => { - lock.take(); - } - _ => (), - } - - if let Some(id) = *reserved { - tracing::trace!("tx already reserved by {id}"); - return read_tx; - } - - loop { - match wal_lock.waiters.steal() { - crossbeam::deque::Steal::Empty => { - tracing::trace!("no connection waiting"); - break; - } - crossbeam::deque::Steal::Success((unparker, id)) => { - tracing::trace!("waking up {id}"); - reserved.replace(id); - unparker.unpark(); - break; - } - crossbeam::deque::Steal::Retry => (), - } - } - - tracing::trace!(id = read_tx.id, "lock released"); - - read_tx - } - - pub fn is_commited(&self) -> bool { - self.is_commited - } - - pub(crate) fn find_frame_offset(&self, page_no: u32) -> Option { - let iter = self.savepoints.iter().rev().map(|s| &s.index); - for index in iter { - if let Some(val) = index.get(&page_no) { - return Some(*val); - } - } - - None - } - - pub(crate) fn commit(&mut self) { - self.is_commited = true; - } - - pub(crate) fn current_checksum(&self) -> u32 { - self.savepoints.last().unwrap().current_checksum - } -} - -impl Deref for WriteTransaction { - type Target = ReadTransaction; - - fn deref(&self) -> &Self::Target { - &self.read_tx - } -} - -impl DerefMut for WriteTransaction { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.read_tx - } -} diff --git a/libsql-wal/src/wal.rs b/libsql-wal/src/wal.rs deleted file mode 100644 index 6c89ce848f..0000000000 --- a/libsql-wal/src/wal.rs +++ /dev/null @@ -1,347 +0,0 @@ -use std::ffi::OsStr; -use std::os::unix::prelude::OsStrExt; -use std::sync::atomic::AtomicU64; -use std::sync::Arc; - -use libsql_sys::name::NamespaceResolver; -use libsql_sys::wal::{Wal, WalManager}; - -use crate::io::Io; -use crate::registry::WalRegistry; -use crate::segment::sealed::SealedSegment; -use crate::shared_wal::SharedWal; -use crate::storage::Storage; -use crate::transaction::Transaction; - -pub struct LibsqlWalManager { - registry: Arc>, - next_conn_id: Arc, - namespace_resolver: Arc, -} - -impl Clone for LibsqlWalManager { - fn clone(&self) -> Self { - Self { - registry: self.registry.clone(), - next_conn_id: self.next_conn_id.clone(), - namespace_resolver: self.namespace_resolver.clone(), - } - } -} - -impl LibsqlWalManager { - pub fn new( - registry: Arc>, - namespace_resolver: Arc, - ) -> Self { - Self { - registry, - next_conn_id: Default::default(), - namespace_resolver, - } - } -} - -pub struct LibsqlWal { - last_read_frame_no: Option, - tx: Option>, - shared: Arc>, - conn_id: u64, -} - -impl>> WalManager for LibsqlWalManager { - type Wal = LibsqlWal; - - fn use_shared_memory(&self) -> bool { - false - } - - fn open( - &self, - _vfs: &mut libsql_sys::wal::Vfs, - _file: &mut libsql_sys::wal::Sqlite3File, - _no_shm_mode: std::ffi::c_int, - _max_log_size: i64, - db_path: &std::ffi::CStr, - ) -> libsql_sys::wal::Result { - let db_path = OsStr::from_bytes(&db_path.to_bytes()); - let namespace = self.namespace_resolver.resolve(db_path.as_ref()); - let shared = self - .registry - .clone() - .open(db_path.as_ref(), &namespace) - .map_err(|e| e.into())?; - let conn_id = self - .next_conn_id - .fetch_add(1, std::sync::atomic::Ordering::Relaxed); - Ok(LibsqlWal { - last_read_frame_no: None, - tx: None, - shared, - conn_id, - }) - } - - fn close( - &self, - wal: &mut Self::Wal, - _db: &mut libsql_sys::wal::Sqlite3Db, - _sync_flags: std::ffi::c_int, - _scratch: Option<&mut [u8]>, - ) -> libsql_sys::wal::Result<()> { - wal.end_read_txn(); - Ok(()) - } - - fn destroy_log( - &self, - _vfs: &mut libsql_sys::wal::Vfs, - _db_path: &std::ffi::CStr, - ) -> libsql_sys::wal::Result<()> { - Ok(()) - } - - fn log_exists( - &self, - _vfs: &mut libsql_sys::wal::Vfs, - _db_path: &std::ffi::CStr, - ) -> libsql_sys::wal::Result { - Ok(true) - } - - fn destroy(self) - where - Self: Sized, - { - } -} - -impl Wal for LibsqlWal -where - IO: Io, - S: Storage>, -{ - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn limit(&mut self, _size: i64) {} - - #[tracing::instrument(skip_all, fields(id = self.conn_id, ns = self.shared.namespace().as_str()))] - fn begin_read_txn(&mut self) -> libsql_sys::wal::Result { - tracing::trace!("begin read"); - let tx = self.shared.begin_read(self.conn_id); - let invalidate_cache = self - .last_read_frame_no - .map(|idx| tx.max_frame_no != idx) - .unwrap_or(true); - self.last_read_frame_no = Some(tx.max_frame_no); - self.tx = Some(Transaction::Read(tx)); - - tracing::trace!(invalidate_cache, "read started"); - Ok(invalidate_cache) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn end_read_txn(&mut self) { - self.tx.take().map(|tx| tx.end()); - tracing::trace!("end read tx"); - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn find_frame( - &mut self, - page_no: std::num::NonZeroU32, - ) -> libsql_sys::wal::Result> { - tracing::trace!(page_no, "find frame"); - // this is a trick: we defer the frame read to the `read_frame` method. The read_frame - // method will read from the journal if the page exist, or from the db_file if it doesn't - Ok(Some(page_no)) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn read_frame( - &mut self, - page_no: std::num::NonZeroU32, - buffer: &mut [u8], - ) -> libsql_sys::wal::Result<()> { - tracing::trace!(page_no, "reading frame"); - let tx = self.tx.as_mut().unwrap(); - self.shared - .read_page(tx, page_no.get(), buffer) - .map_err(Into::into)?; - Ok(()) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn read_frame_raw( - &mut self, - _page_no: std::num::NonZeroU32, - _buffer: &mut [u8], - ) -> libsql_sys::wal::Result<()> { - Err(libsql_sys::wal::Error::new(10)) // SQLITE_IOERR - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn db_size(&self) -> u32 { - let db_size = match self.tx.as_ref() { - Some(tx) => tx.db_size, - None => 0, - }; - tracing::trace!(db_size, "db_size"); - db_size - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn begin_write_txn(&mut self) -> libsql_sys::wal::Result<()> { - tracing::trace!("begin write"); - match self.tx.as_mut() { - Some(tx) => { - self.shared.upgrade(tx).map_err(Into::into)?; - tracing::trace!("write lock acquired"); - } - None => panic!("should acquire read txn first"), - } - - Ok(()) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn end_write_txn(&mut self) -> libsql_sys::wal::Result<()> { - tracing::trace!("end write"); - match self.tx.take() { - Some(Transaction::Write(tx)) => { - self.last_read_frame_no = Some(tx.next_frame_no - 1); - self.tx = Some(Transaction::Read(tx.downgrade())); - } - other => { - self.tx = other; - } - } - - Ok(()) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn undo( - &mut self, - handler: Option<&mut U>, - ) -> libsql_sys::wal::Result<()> { - match self.tx { - Some(Transaction::Write(ref mut tx)) => { - if tx.is_commited() { - return Ok(()); - } - if let Some(handler) = handler { - for page_no in tx.index_page_iter() { - // FIXME: maybe it's not OK to call that callback with duplicated pages_no, - // need to test that - if let Err(e) = handler.handle_undo(page_no) { - tracing::debug!("undo handler error: {e}"); - break; - } - } - } - - tx.reset(0); - - tracing::debug!("rolled back tx"); - - Ok(()) - } - _ => Ok(()), - } - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn savepoint(&mut self, rollback_data: &mut [u32]) { - match self.tx { - Some(Transaction::Write(ref mut tx)) => { - let id = tx.savepoint() as u32; - rollback_data[0] = id; - } - _ => { - // if we don't have a write tx, we always point to the beginning of the tx - rollback_data[0] = 0; - } - } - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn savepoint_undo(&mut self, rollback_data: &mut [u32]) -> libsql_sys::wal::Result<()> { - match self.tx { - Some(Transaction::Write(ref mut tx)) => { - tx.reset(rollback_data[0] as usize); - Ok(()) - } - _ => Ok(()), - } - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn frame_count(&self, _locked: i32) -> libsql_sys::wal::Result { - Err(libsql_sys::wal::Error::new(10)) // SQLITE_IOERR - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn insert_frames( - &mut self, - page_size: std::ffi::c_int, - page_headers: &mut libsql_sys::wal::PageHeaders, - size_after: u32, - _is_commit: bool, - _sync_flags: std::ffi::c_int, - ) -> libsql_sys::wal::Result { - assert_eq!(page_size, 4096); - match self.tx.as_mut() { - Some(Transaction::Write(ref mut tx)) => { - self.shared - .insert_frames( - tx, - page_headers.iter(), - (size_after != 0).then_some(size_after), - ) - .map_err(Into::into)?; - } - _ => todo!("no write transaction"), - } - Ok(0) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn checkpoint( - &mut self, - _db: &mut libsql_sys::wal::Sqlite3Db, - _mode: libsql_sys::wal::CheckpointMode, - _busy_handler: Option<&mut dyn libsql_sys::wal::BusyHandler>, - _sync_flags: u32, - _buf: &mut [u8], - _checkpoint_cb: Option<&mut dyn libsql_sys::wal::CheckpointCallback>, - _in_wal: Option<&mut i32>, - _backfilled: Option<&mut i32>, - ) -> libsql_sys::wal::Result<()> { - // self.shared.segments.checkpoint(); - Ok(()) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn exclusive_mode(&mut self, op: std::ffi::c_int) -> libsql_sys::wal::Result<()> { - tracing::trace!(op, "trying to acquire exclusive mode"); - Ok(()) - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn uses_heap_memory(&self) -> bool { - true - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn set_db(&mut self, _db: &mut libsql_sys::wal::Sqlite3Db) {} - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn callback(&self) -> i32 { - 0 - } - - #[tracing::instrument(skip_all, fields(id = self.conn_id))] - fn frames_in_wal(&self) -> u32 { - 0 - } -} diff --git a/libsql-wal/tests/assets/fixtures/8_3_names.test b/libsql-wal/tests/assets/fixtures/8_3_names.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/affinity2.test b/libsql-wal/tests/assets/fixtures/affinity2.test deleted file mode 100644 index 2521be98dd..0000000000 --- a/libsql-wal/tests/assets/fixtures/affinity2.test +++ /dev/null @@ -1,99 +0,0 @@ - - CREATE TABLE t1( - xi INTEGER, - xr REAL, - xb BLOB, - xn NUMERIC, - xt TEXT - ); - INSERT INTO t1(rowid,xi,xr,xb,xn,xt) VALUES(1,1,1,1,1,1); - INSERT INTO t1(rowid,xi,xr,xb,xn,xt) VALUES(2,'2','2','2','2','2'); - INSERT INTO t1(rowid,xi,xr,xb,xn,xt) VALUES(3,'03','03','03','03','03'); - - - - SELECT xi, typeof(xi) FROM t1 ORDER BY rowid; - - - SELECT xr, typeof(xr) FROM t1 ORDER BY rowid; - - - SELECT xb, typeof(xb) FROM t1 ORDER BY rowid; - - - SELECT xn, typeof(xn) FROM t1 ORDER BY rowid; - - - SELECT xt, typeof(xt) FROM t1 ORDER BY rowid; - - - SELECT rowid, xi==xt, xi==xb, xi==+xt FROM t1 ORDER BY rowid; - - - SELECT rowid, xr==xt, xr==xb, xr==+xt FROM t1 ORDER BY rowid; - - - SELECT rowid, xn==xt, xn==xb, xn==+xt FROM t1 ORDER BY rowid; - - - SELECT rowid, xt==+xi, xt==xi, xt==xb FROM t1 ORDER BY rowid; - - - CREATE TABLE ttt(c0, c1); - CREATE INDEX ii ON ttt(CAST(c0 AS NUMERIC)); - INSERT INTO ttt VALUES('abc', '-1'); - - - SELECT * FROM ttt WHERE CAST(c0 AS NUMERIC) > c1 GROUP BY rowid; - - - SELECT * FROM ttt INDEXED BY ii WHERE CAST(c0 AS NUMERIC) > c1 GROUP BY rowid; - - - CREATE TABLE t3(a, b, c INTEGER); - CREATE INDEX t3ac ON t3(a, c-1); - INSERT INTO t3 VALUES(1, 1, 1); - INSERT INTO t3 VALUES(2, 1, 0); - INSERT INTO t3 VALUES(3, 1, 1); - INSERT INTO t3 VALUES(4, 1, 0); - INSERT INTO t3 VALUES(5, 1, 1); - - - SELECT * FROM t3 WHERE c='0' ORDER BY a; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 TEXT UNIQUE, c1); - INSERT INTO t0(c0) VALUES (-1); - SELECT quote(- x'ce'), quote(t0.c0), quote(- x'ce' >= t0.c0) FROM t0; - - - SELECT * FROM t0 WHERE - x'ce' >= t0.c0; - - - SELECT quote(+-+x'ce'), quote(t0.c0), quote(+-+x'ce' >= t0.c0) FROM t0; - - - SELECT * FROM t0 WHERE +-+x'ce' >= t0.c0; - - - SELECT quote(- 'ce'), quote(t0.c0), quote(- 'ce' >= t0.c0) FROM t0; - - - SELECT * FROM t0 WHERE - 'ce' >= t0.c0; - - - SELECT quote(+-+'ce'), quote(t0.c0), quote(+-+'ce' >= t0.c0) FROM t0; - - - SELECT * FROM t0 WHERE +-+'ce' >= t0.c0; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 REAL UNIQUE); - INSERT INTO t0(c0) VALUES (3175546974276630385); - SELECT 3175546974276630385 < c0 FROM t0; - - - SELECT 1 FROM t0 WHERE 3175546974276630385 < c0; - diff --git a/libsql-wal/tests/assets/fixtures/affinity3.test b/libsql-wal/tests/assets/fixtures/affinity3.test deleted file mode 100644 index 9452967783..0000000000 --- a/libsql-wal/tests/assets/fixtures/affinity3.test +++ /dev/null @@ -1,92 +0,0 @@ - - CREATE TABLE customer (id INT PRIMARY KEY); - CREATE TABLE apr (id INT PRIMARY KEY, apr REAL); - - CREATE VIEW v1 AS - SELECT c.id, i.apr - FROM customer c - LEFT JOIN apr i ON i.id=c.id; - - CREATE VIEW v1rj AS - SELECT c.id, i.apr - FROM apr i - RIGHT JOIN customer c ON i.id=c.id; - - CREATE VIEW v2 AS - SELECT c.id, v1.apr - FROM customer c - LEFT JOIN v1 ON v1.id=c.id; - - CREATE VIEW v2rj AS - SELECT c.id, v1.apr - FROM v1 RIGHT JOIN customer c ON v1.id=c.id; - - CREATE VIEW v2rjrj AS - SELECT c.id, v1rj.apr - FROM v1rj RIGHT JOIN customer c ON v1rj.id=c.id; - - INSERT INTO customer (id) VALUES (1); - INSERT INTO apr (id, apr) VALUES (1, 12); - INSERT INTO customer (id) VALUES (2); - INSERT INTO apr (id, apr) VALUES (2, 12.01); - - - PRAGMA automatic_index=ON; - SELECT id, (apr / 100), typeof(apr) apr_type FROM v1; - - - PRAGMA automatic_index=ON; - SELECT id, (apr / 100), typeof(apr) apr_type FROM v1rj; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v2; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v2rj; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v2rjrj; - - - PRAGMA automatic_index=OFF; - SELECT id, (apr / 100), typeof(apr) apr_type FROM v1; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v1rj; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v2; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v2rj; - - - SELECT id, (apr / 100), typeof(apr) apr_type FROM v2rjrj; - - - CREATE TABLE map_integer (id INT, name); - INSERT INTO map_integer VALUES(1,'a'); - CREATE TABLE map_text (id TEXT, name); - INSERT INTO map_text VALUES('4','e'); - CREATE TABLE data (id TEXT, name); - INSERT INTO data VALUES(1,'abc'); - INSERT INTO data VALUES('4','xyz'); - CREATE VIEW idmap as - SELECT * FROM map_integer - UNION SELECT * FROM map_text; - CREATE TABLE mzed AS SELECT * FROM idmap; - - - PRAGMA automatic_index=ON; - SELECT * FROM data JOIN idmap USING(id); - - - SELECT * FROM data JOIN mzed USING(id); - - - PRAGMA automatic_index=OFF; - SELECT * FROM data JOIN idmap USING(id); - - - SELECT * FROM data JOIN mzed USING(id); - diff --git a/libsql-wal/tests/assets/fixtures/aggerror.test b/libsql-wal/tests/assets/fixtures/aggerror.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/aggfault.test b/libsql-wal/tests/assets/fixtures/aggfault.test deleted file mode 100644 index dfac950914..0000000000 --- a/libsql-wal/tests/assets/fixtures/aggfault.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(x); - CREATE INDEX t1x ON t1(x, x=0); - diff --git a/libsql-wal/tests/assets/fixtures/aggnested.test b/libsql-wal/tests/assets/fixtures/aggnested.test deleted file mode 100644 index eccc55d66d..0000000000 --- a/libsql-wal/tests/assets/fixtures/aggnested.test +++ /dev/null @@ -1,90 +0,0 @@ - - DROP TABLE IF EXISTS aa; - DROP TABLE IF EXISTS bb; - CREATE TABLE aa(x INT); INSERT INTO aa(x) VALUES(123); - CREATE TABLE bb(y INT); INSERT INTO bb(y) VALUES(456); - SELECT (SELECT sum(x+(SELECT y)) FROM bb) FROM aa; - - - SELECT (SELECT sum(x+y) FROM bb) FROM aa; - - - DROP TABLE IF EXISTS tx; - DROP TABLE IF EXISTS ty; - CREATE TABLE tx(x INT); - INSERT INTO tx VALUES(1),(2),(3),(4),(5); - CREATE TABLE ty(y INT); - INSERT INTO ty VALUES(91),(92),(93); - SELECT min((SELECT count(y) FROM ty)) FROM tx; - - - SELECT max((SELECT a FROM (SELECT count(*) AS a FROM ty) AS s)) FROM tx; - - - CREATE TABLE x1(a, b); - INSERT INTO x1 VALUES(1, 2); - CREATE TABLE x2(x); - INSERT INTO x2 VALUES(NULL), (NULL), (NULL); - - - SELECT ( SELECT total( (SELECT b FROM x1) ) ) FROM x2; - - - SELECT ( SELECT total( (SELECT 2 FROM x1) ) ) FROM x2; - - - CREATE TABLE t1(a); - CREATE TABLE t2(b); - - - SELECT( - SELECT max(b) LIMIT ( - SELECT total( (SELECT a FROM t1) ) - ) - ) - FROM t2; - - - CREATE TABLE a(b); - WITH c AS(SELECT a) - SELECT(SELECT(SELECT string_agg(b, b) - LIMIT(SELECT 0.100000 * - AVG(DISTINCT(SELECT 0 FROM a ORDER BY b, b, b)))) - FROM a GROUP BY b, - b, b) FROM a EXCEPT SELECT b FROM a ORDER BY b, - b, b; - - - CREATE TABLE t1(a); - CREATE TABLE t2(b); - - INSERT INTO t1 VALUES('x'); - INSERT INTO t2 VALUES(1); - - - SELECT ( - SELECT t2.b FROM (SELECT t2.b AS c FROM t1) GROUP BY 1 HAVING t2.b - ) - FROM t2 GROUP BY 'constant_string'; - - - SELECT ( - SELECT c FROM (SELECT t2.b AS c FROM t1) GROUP BY c HAVING t2.b - ) - FROM t2 GROUP BY 'constant_string'; - - - UPDATE t2 SET b=0 - - - SELECT ( - SELECT t2.b FROM (SELECT t2.b AS c FROM t1) GROUP BY 1 HAVING t2.b - ) - FROM t2 GROUP BY 'constant_string'; - - - SELECT ( - SELECT c FROM (SELECT t2.b AS c FROM t1) GROUP BY c HAVING t2.b - ) - FROM t2 GROUP BY 'constant_string'; - diff --git a/libsql-wal/tests/assets/fixtures/aggorderby.test b/libsql-wal/tests/assets/fixtures/aggorderby.test deleted file mode 100644 index 00803f27f7..0000000000 --- a/libsql-wal/tests/assets/fixtures/aggorderby.test +++ /dev/null @@ -1,82 +0,0 @@ - - CREATE TABLE t1(a TEXT,b INT,c INT,d INT); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<9) - INSERT INTO t1(a,b,c,d) SELECT printf('%d',(x*7)%10),1,x,10-x FROM c; - INSERT INTO t1(a,b,c,d) SELECT a, 2, c, 10-d FROM t1; - CREATE INDEX t1b ON t1(b); - - - SELECT group_concat(a ORDER BY a) FROM t1 WHERE b=1; - - - SELECT group_concat(a ORDER BY c) FROM t1 WHERE b=1; - - - SELECT group_concat(a ORDER BY b, d) FROM t1; - - - SELECT string_agg(a, ',' ORDER BY b DESC, d) FROM t1; - - - SELECT b, group_concat(a ORDER BY d) FROM t1 GROUP BY b ORDER BY b; - - - SELECT group_concat(DISTINCT a ORDER BY a) FROM t1; - - - SELECT group_concat(DISTINCT a ORDER BY c) FROM t1; - - - SELECT count(ORDER BY a) FROM t1; - - - SELECT c, max(a ORDER BY a) FROM t1; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t3; - CREATE TABLE t1(a TEXT); INSERT INTO t1 VALUES('aaa'),('bbb'); - CREATE TABLE t3(d TEXT); INSERT INTO t3 VALUES('/'),('-'); - SELECT (SELECT string_agg(a,d) FROM t3) FROM t1; - - - SELECT (SELECT group_concat(a,d ORDER BY d) FROM t3) FROM t1; - - - SELECT (SELECT string_agg(a,d ORDER BY d DESC) FROM t3) FROM t1; - - - SELECT (SELECT string_agg(a,'#' ORDER BY d) FROM t3) FROM t1; - - - WITH c(x) AS (VALUES('abc'),('DEF'),('xyz'),('ABC'),('XYZ')) - SELECT string_agg(x,',' ORDER BY x COLLATE nocase), - string_agg(x,',' ORDER BY x) FROM c; - - - WITH c(x,y) AS (VALUES(1,'a'),(2,'B'),(3,'c'),(4,'D')) - SELECT group_concat(x ORDER BY y COLLATE nocase), - group_concat(x ORDER BY y COLLATE binary) FROM c; - - - WITH c(x) AS (VALUES(1),(NULL),(2.5),(NULL),('three')) - SELECT json_group_array(x ORDER BY x NULLS FIRST), - json_group_array(x ORDER BY x NULLS LAST) FROM c; - - - WITH c(x,y) AS (VALUES(1,9),(2,null),(3,5),(4,null),(5,1)) - SELECT json_group_array(x ORDER BY y NULLS FIRST, x), - json_group_array(x ORDER BY y NULLS LAST, x) FROM c; - - - WITH c(x,y,z) AS (VALUES('a',4,5),('b',3,6),('c',2,7),('c',1,8)) - SELECT group_concat(DISTINCT x ORDER BY y, z) FROM c; - - - WITH c(x,y,z) AS (VALUES('a',4,5),('b',3,6),('b',2,7),('c',1,8)) - SELECT group_concat(DISTINCT x ORDER BY y, z) FROM c; - - - WITH c(x,y) AS (VALUES(1,1),(2,2),(3,3),(3,4),(3,5),(3,6)) - SELECT sum(DISTINCT x ORDER BY y) FROM c; - diff --git a/libsql-wal/tests/assets/fixtures/alias.test b/libsql-wal/tests/assets/fixtures/alias.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/all.test b/libsql-wal/tests/assets/fixtures/all.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/alter.test b/libsql-wal/tests/assets/fixtures/alter.test deleted file mode 100644 index cef17298d9..0000000000 --- a/libsql-wal/tests/assets/fixtures/alter.test +++ /dev/null @@ -1,47 +0,0 @@ - - CREATE TABLE t16a(a TEXT, b REAL, c INT, PRIMARY KEY(a,b)) WITHOUT rowid; - INSERT INTO t16a VALUES('abc',1.25,99); - ALTER TABLE t16a ADD COLUMN d TEXT DEFAULT 'xyzzy'; - INSERT INTO t16a VALUES('cba',5.5,98,'fizzle'); - SELECT * FROM t16a ORDER BY a; - - - ALTER TABLE t16a RENAME TO t16a_rn; - SELECT * FROM t16a_rn ORDER BY a; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - CREATE VIRTUAL TABLE t2 USING rtree(id,x0,x1); - INSERT INTO t1 VALUES(1,'apple'),(2,'fig'),(3,'pear'); - INSERT INTO t2 VALUES(1,1.0,2.0),(2,2.0,3.0),(3,1.5,3.5); - CREATE TRIGGER r1 AFTER UPDATE ON t1 BEGIN - DELETE FROM t2 WHERE id = OLD.a; - END; - ALTER TABLE t1 RENAME TO t3; - UPDATE t3 SET b='peach' WHERE a=2; - SELECT * FROM t2 ORDER BY 1; - - - CREATE TABLE t1(x); - CREATE TABLE t2(c); - CREATE TRIGGER r1 AFTER INSERT ON t2 BEGIN - UPDATE t2 SET (c)=( - EXISTS(SELECT 1 WHERE (WITH cte1(a) AS (SELECT 1 FROM t1 WHERE (SELECT 1 WHERE (WITH cte2(b) AS (VALUES(1))SELECT b FROM cte2)))SELECT a FROM cte1)) - ); - END; - ALTER TABLE t2 RENAME TO t3; - - - SELECT name FROM sqlite_schema WHERE sql LIKE '%t2%'; - - - SELECT name FROM sqlite_schema WHERE sql LIKE '%t3%' ORDER BY name; - - - CREATE TABLE t1(a INT) STRICT; - INSERT INTO t1(a) VALUES(45); - - - DELETE FROM t1; - ALTER TABLE t1 ADD COLUMN b TEXT DEFAULT x'313233'; - diff --git a/libsql-wal/tests/assets/fixtures/alter2.test b/libsql-wal/tests/assets/fixtures/alter2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/alter3.test b/libsql-wal/tests/assets/fixtures/alter3.test deleted file mode 100644 index 253dd403b2..0000000000 --- a/libsql-wal/tests/assets/fixtures/alter3.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1, 2), ('null!',NULL), (3,4); - - - CREATE TEMP TABLE t0(m,n); - INSERT INTO t0 VALUES(1, 2), ('null!',NULL), (3,4); - ATTACH ':memory:' AS aux1; - CREATE TABLE aux1.t2(x,y); - INSERT INTO t2 VALUES(1, 2), ('null!',NULL), (3,4); - diff --git a/libsql-wal/tests/assets/fixtures/alter4.test b/libsql-wal/tests/assets/fixtures/alter4.test deleted file mode 100644 index b67f8d10fe..0000000000 --- a/libsql-wal/tests/assets/fixtures/alter4.test +++ /dev/null @@ -1,24 +0,0 @@ - - CREATE TABLE t5( - a INTEGER DEFAULT -9223372036854775808, - b INTEGER DEFAULT (-(-9223372036854775808)) - ); - INSERT INTO t5 DEFAULT VALUES; - - SELECT typeof(a), a, typeof(b), b FROM t5; - - ALTER TABLE t5 ADD COLUMN c INTEGER DEFAULT (-(-9223372036854775808)); - SELECT typeof(c), c FROM t5; - - - CREATE TABLE t1(c INTEGER PRIMARY KEY, d); - INSERT INTO t1(c,d) VALUES(1,2); - PRAGMA foreign_keys = on; - ALTER TABLE t1 ADD COLUMN e; - - - ALTER TABLE t1 ADD COLUMN f REFERENCES t1; - - - CREATE VIRTUAL TABLE fff USING fts5(f); - diff --git a/libsql-wal/tests/assets/fixtures/alterauth.test b/libsql-wal/tests/assets/fixtures/alterauth.test deleted file mode 100644 index 4e141a18e3..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterauth.test +++ /dev/null @@ -1 +0,0 @@ - CREATE TABLE t1(a, b, c); diff --git a/libsql-wal/tests/assets/fixtures/alterauth2.test b/libsql-wal/tests/assets/fixtures/alterauth2.test deleted file mode 100644 index 3c4b1871e4..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterauth2.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - DELETE FROM t1 WHERE a=40 AND rid>0 ) - ); - - - ALTER TABLE "blob" RENAME COLUMN "rid" TO "a1"; - - - SELECT "where" FROM blob; - - - CREATE TABLE c(x); - INSERT INTO c VALUES(0); - CREATE TABLE t6("col a", "col b", "col c"); - CREATE TRIGGER zzz AFTER UPDATE OF "col a", "col c" ON t6 BEGIN - UPDATE c SET x=x+1; - END; - - - INSERT INTO t6 VALUES(0, 0, 0); - UPDATE t6 SET "col c" = 1; - SELECT * FROM c; - - - ALTER TABLE t6 RENAME "col c" TO "col 3"; - - - UPDATE t6 SET "col 3" = 0; - SELECT * FROM c; - - - CREATE TABLE a1(x INTEGER, y TEXT, z BLOB, PRIMARY KEY(x)); - CREATE TABLE a2(a, b, c); - CREATE VIEW v1 AS SELECT x, y, z FROM a1; - - - ALTER TABLE a1 RENAME y TO yyy; - SELECT sql FROM sqlite_master WHERE type='view'; - - - DROP VIEW v1; - CREATE VIEW v2 AS SELECT x, x+x, a, a+a FROM a1, a2; - - - ALTER TABLE a1 RENAME x TO xxx; - - - SELECT sql FROM sqlite_master WHERE type='view'; - - - DROP TABLE a2; - DROP VIEW v2; - CREATE TABLE a2(a INTEGER PRIMARY KEY, b, c); - CREATE VIEW v2 AS SELECT xxx, xxx+xxx, a, a+a FROM a1, a2; - - - ALTER TABLE a1 RENAME xxx TO x; - - - SELECT sql FROM sqlite_master WHERE type='view'; - - - CREATE TABLE b1(a, b, c); - CREATE TABLE b2(x, y, z); - - - CREATE VIEW vvv AS SELECT c+c || coalesce(c, c) FROM b1, b2 WHERE x=c GROUP BY c HAVING c>0; - ALTER TABLE b1 RENAME c TO "a;b"; - SELECT sql FROM sqlite_master WHERE name='vvv'; - - - CREATE VIEW www AS SELECT b FROM b1 UNION ALL SELECT y FROM b2; - ALTER TABLE b1 RENAME b TO bbb; - SELECT sql FROM sqlite_master WHERE name='www'; - - - CREATE VIEW xxx AS SELECT a FROM b1 UNION SELECT x FROM b2 ORDER BY 1 COLLATE nocase; - - - ALTER TABLE b2 RENAME x TO hello; - SELECT sql FROM sqlite_master WHERE name='xxx'; - - - DROP VIEW zzz; - CREATE TABLE t5(a TEXT, b INT); - INSERT INTO t5(a,b) VALUES('aaa',7),('bbb',3),('ccc',4); - CREATE VIEW vt5(x) AS SELECT group_concat(a ORDER BY b) FROM t5; - SELECT x FROM vt5; - - - ALTER TABLE t5 RENAME COLUMN b TO bbb; - SELECT sql FROM sqlite_schema WHERE name='vt5'; - - - SELECT x FROM vt5; - - - CREATE TABLE x1(a, b, c); - CREATE VIRTUAL TABLE e1 USING echo(x1); - - - ALTER TABLE x1 RENAME b TO bbb; - SELECT sql FROM sqlite_master; - - - CREATE VIEW v1 AS SELECT e1.*, x1.c FROM e1, x1; - - - CREATE TABLE t1(a, b); - CREATE INDEX t1a ON t1(a); - INSERT INTO t1 VALUES(1, 1), (2, 2), (3, 4); - ANALYZE; - - - SELECT sql FROM sqlite_master WHERE tbl_name = 'sqlite_stat1' - - - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE VIEW v2(c, d) AS SELECT * FROM t1; - - - CREATE VIRTUAL TABLE ft USING fts5(a, b, c); - - - CREATE TABLE t2(x, y, z); - - - CREATE TABLE x1(i INTEGER, t TEXT UNIQUE); - CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN - SELECT * FROM nosuchtable; - END; - - - DROP TRIGGER tr1; - CREATE INDEX x1i ON x1(i); - SELECT sql FROM sqlite_master WHERE name='x1i'; - - - PRAGMA writable_schema = ON; - UPDATE sqlite_master SET sql = 'CREATE INDEX x1i ON x1(j)' WHERE name='x1i'; - PRAGMA writable_schema = OFF; - - - PRAGMA writable_schema = ON; - UPDATE sqlite_master SET sql = '' WHERE name='x1i'; - PRAGMA writable_schema = OFF; - - - PRAGMA writable_schema = ON; - DELETE FROM sqlite_master WHERE name = 'x1i'; - PRAGMA writable_schema = OFF; - - - CREATE TABLE data(x UNIQUE, y, z); - - - CREATE TABLE ddd(sql, type, object, db, tbl, icol, znew, bquote); - INSERT INTO ddd VALUES( - 'CREATE TABLE x1(i INTEGER, t TEXT)', - 'table', 'x1', 'main', 'x1', -1, 'zzz', 0 - ), ( - 'CREATE TABLE x1(i INTEGER, t TEXT)', - 'table', 'x1', 'main', 'x1', 2, 'zzz', 0 - ), ( - 'CREATE TABLE x1(i INTEGER, t TEXT)', - 'table', 'x1', 'main', 'notable', 0, 'zzz', 0 - ), ( - 'CREATE TABLE x1(i INTEGER, t TEXT)', - 'table', 'x1', 'main', 'ddd', -1, 'zzz', 0 - ); - - - SELECT - sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote, 0) - FROM ddd; - - - CREATE TABLE xxx(a, b, c); - SELECT a AS d FROM xxx WHERE d=0; - - - CREATE VIEW vvv AS SELECT a AS d FROM xxx WHERE d=0; - ALTER TABLE xxx RENAME a TO xyz; - - - SELECT sql FROM sqlite_master WHERE type='view'; - - - CREATE TABLE t1(a,b,c); - CREATE TABLE t2(d,e,f); - INSERT INTO t1 VALUES(1,2,3); - INSERT INTO t2 VALUES(4,5,6); - CREATE VIEW v4 AS SELECT a, d FROM t1, t2; - SELECT * FROM v4; - - - SELECT * FROM v4; - - - CREATE UNIQUE INDEX t2d ON t2(d); - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO t2 VALUES(new.a, new.b, new.c) - ON CONFLICT(d) DO UPDATE SET f = excluded.f; - END; - - - INSERT INTO t1 VALUES(4, 8, 456); - SELECT * FROM t2; - - - ALTER TABLE t2 RENAME COLUMN f TO "big f"; - INSERT INTO t1 VALUES(4, 0, 20456); - SELECT * FROM t2; - - - ALTER TABLE t1 RENAME COLUMN c TO "big c"; - INSERT INTO t1 VALUES(4, 0, 0); - SELECT * FROM t2; - - - CREATE VIEW temp.v5 AS SELECT "big c" FROM t1; - SELECT * FROM v5; - - - ALTER TABLE t1 RENAME COLUMN "big c" TO reallybigc; - - - SELECT * FROM v5; - - - CREATE TABLE u7(x, y, z); - CREATE TRIGGER u7t AFTER INSERT ON u7 BEGIN - INSERT INTO u8 VALUES(new.x, new.y, new.z); - END; - - - CREATE TEMP TABLE uu7(x, y, z); - CREATE TRIGGER uu7t AFTER INSERT ON uu7 BEGIN - INSERT INTO u8 VALUES(new.x, new.y, new.z); - END; - - - ATTACH 'test.db2' AS aux; - CREATE TABLE t1(a); - CREATE TABLE aux.log(v); - CREATE TEMP TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO log VALUES(new.a); - END; - INSERT INTO t1 VALUES(111); - SELECT v FROM log; - - - ALTER TABLE t1 RENAME a TO b; - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.a) FROM t1, t2 WHERE t1.b=t2.d; - - - ALTER TABLE t1 RENAME a TO f; - SELECT sql FROM sqlite_master WHERE name = 'v2'; - - - CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA)); - ALTER TABLE t1 RENAME aaa TO bbb; - SELECT sql FROM sqlite_master WHERE name='t1'; - - - DROP TABLE t1; - CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA))WITHOUT ROWID; - ALTER TABLE t1 RENAME aaa TO bbb; - SELECT sql FROM sqlite_master WHERE name='t1'; - - - DROP TABLE t1; - CREATE TABLE t1(aa UNIQUE,bb UNIQUE,cc UNIQUE,UNIQUE(aA),PRIMARY KEY(bB),UNIQUE(cC)); - ALTER TABLE t1 RENAME aa TO xx; - ALTER TABLE t1 RENAME bb TO yy; - ALTER TABLE t1 RENAME cc TO zz; - SELECT sql FROM sqlite_master WHERE name='t1'; - - - CREATE TABLE t1(a, b, c NOT NULL); - CREATE TRIGGER tr1 AFTER INSERT ON t1 WHEN new.c IS NOT NULL BEGIN - SELECT c NOT NULL FROM t1; - END; - - - ALTER TABLE t1 RENAME c TO d; - - - SELECT sql FROM sqlite_schema WHERE name IS 'tr1' - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, othername, extra AS (c + 1)); - ALTER TABLE t1 RENAME a to othername; - SELECT sql FROM sqlite_schema; - - - CREATE TABLE t1(a, b); - CREATE INDEX x1 on t1("c"=b); - INSERT INTO t1 VALUES('a', 'a'); - INSERT INTO t1 VALUES('b', 'b'); - INSERT INTO t1 VALUES('c', 'c'); - ALTER TABLE t1 RENAME COLUMN a TO "c"; - PRAGMA integrity_check; - - - CREATE TABLE t1('a'"b",c); - CREATE INDEX i1 ON t1('a'); - INSERT INTO t1 VALUES(1,2), (3,4); - ALTER TABLE t1 RENAME COLUMN a TO x; - PRAGMA integrity_check; - SELECT sql FROM sqlite_schema WHERE name='t1'; - - - - CREATE TABLE t1(a INT, b REAL, c TEXT, d BLOB, e ANY); - CREATE INDEX t1abx ON t1(a, b, a+b) WHERE c IS NOT NULL; - CREATE VIEW t2 AS SELECT a+10, b*5.0, xyz FROM t1; -- unknown column "xyz" - CREATE TABLE schema_copy(name TEXT, sql TEXT); - INSERT INTO schema_copy(name,sql) SELECT name, sql FROM sqlite_schema WHERE sql IS NOT NULL; - - - SELECT name, sql FROM sqlite_master - EXCEPT SELECT name, sql FROM schema_copy; - - - BEGIN; - PRAGMA writable_schema=ON; - ALTER TABLE t1 RENAME COLUMN e TO eeee; - PRAGMA writable_schema=OFF; - SELECT name FROM sqlite_master - WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); - ROLLBACK; - - - DROP VIEW t2; - CREATE TRIGGER r3 AFTER INSERT ON t1 BEGIN - INSERT INTO t3(x,y) VALUES(new.a, new.b); - INSERT INTO t4(p) VALUES(new.c); -- no such table "t4" - END; - DELETE FROM schema_copy; - INSERT INTO schema_copy(name,sql) SELECT name, sql FROM sqlite_schema WHERE sql IS NOT NULL; - - - SELECT name, sql FROM sqlite_master - EXCEPT SELECT name, sql FROM schema_copy; - - - BEGIN; - PRAGMA writable_schema=ON; - ALTER TABLE t1 RENAME COLUMN e TO eeee; - PRAGMA writable_schema=OFF; - SELECT name FROM sqlite_master - WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); - ROLLBACK; - - - CREATE TABLE t4(id INTEGER PRIMARY KEY, c1 INT, c2 INT); - CREATE VIEW t4v1 AS SELECT id, c1, c99 FROM t4; - DELETE FROM schema_copy; - INSERT INTO schema_copy SELECT name, sql FROM sqlite_schema; - BEGIN; - PRAGMA writable_schema=ON; - ALTER TABLE t4 RENAME to t4new; - SELECT name FROM sqlite_schema WHERE (name,sql) NOT IN (SELECT * FROM schema_copy); - ROLLBACK; - diff --git a/libsql-wal/tests/assets/fixtures/altercorrupt.test b/libsql-wal/tests/assets/fixtures/altercorrupt.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/alterdropcol.test b/libsql-wal/tests/assets/fixtures/alterdropcol.test deleted file mode 100644 index f1248a9d77..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterdropcol.test +++ /dev/null @@ -1,83 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t1; - - CREATE TABLE t2(x INTEGER PRIMARY KEY, y, z UNIQUE); - CREATE INDEX t2y ON t2(y); - - CREATE TABLE t3(q, r, s); - CREATE INDEX t3rs ON t3(r+s); - - - CREATE VIRTUAL TABLE ft1 USING fts5(one, two); - - - ALTER TABLE t1 DROP COLUMN b; - - - SELECT sql FROM sqlite_schema WHERE name = 't1' - - - ALTER TABLE t1 DROP COLUMN c; - - - SELECT sql FROM sqlite_schema WHERE name = 't1' - - - CREATE TABLE t12(a, b, c, CHECK(c>10)); - CREATE TABLE t13(a, b, c CHECK(c>10)); - - - CREATE TABLE p1(a PRIMARY KEY, b UNIQUE); - CREATE TABLE c1(x, y, z REFERENCES p1(c)); - CREATE TABLE c2(x, y, z, w REFERENCES p1(b)); - - - ALTER TABLE c1 DROP COLUMN z; - ALTER TABLE c2 DROP COLUMN z; - SELECT sql FROM sqlite_schema WHERE name IN ('c1', 'c2'); - - - CREATE VIEW v1 AS SELECT d, e FROM p1 - - - DROP VIEW v1; - CREATE VIEW v1 AS SELECT x, y FROM c1; - - - CREATE TRIGGER tr AFTER INSERT ON c1 BEGIN - INSERT INTO p1 VALUES(new.y, new.xyz); - END; - - - DROP TRIGGER tr; - CREATE TRIGGER tr AFTER INSERT ON c1 BEGIN - INSERT INTO p1 VALUES(new.y, new.z); - END; - - - CREATE TABLE t1(a, b, c, PRIMARY KEY(a COLLATE nocase, a)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - - - ALTER TABLE t1 DROP COLUMN c; - - - SELECT sql FROM sqlite_schema; - - - SELECT * FROM t1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - PRAGMA writable_schema = 1; - UPDATE sqlite_schema - SET sql = 'CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b)' - - - ALTER TABLE t1 DROP COLUMN b; - - - SELECT sql FROM sqlite_schema; - diff --git a/libsql-wal/tests/assets/fixtures/alterdropcol2.test b/libsql-wal/tests/assets/fixtures/alterdropcol2.test deleted file mode 100644 index b30f227ce3..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterdropcol2.test +++ /dev/null @@ -1,23 +0,0 @@ - - CREATE TABLE t1(c, b, a, PRIMARY KEY(b, a)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1, 2, 3), (4, 5, 6); - - - ALTER TABLE t1 DROP c; - - - SELECT * FROM t1; - - - SELECT sql FROM sqlite_schema; - - - CREATE TABLE yyy(q, w, e CHECK (e > 0), r); - INSERT INTO yyy VALUES(1,1,1,1), (2,2,2,2); - - CREATE TABLE zzz(q, w, e, r, CHECK (e > 0)); - INSERT INTO zzz VALUES(1,1,1,1), (2,2,2,2); - - - ALTER TABLE yyy DROP e; - diff --git a/libsql-wal/tests/assets/fixtures/alterfault.test b/libsql-wal/tests/assets/fixtures/alterfault.test deleted file mode 100644 index b7966758bf..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterfault.test +++ /dev/null @@ -1,3 +0,0 @@ - - CREATE TABLE t1(a); - diff --git a/libsql-wal/tests/assets/fixtures/alterlegacy.test b/libsql-wal/tests/assets/fixtures/alterlegacy.test deleted file mode 100644 index dcde424417..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterlegacy.test +++ /dev/null @@ -1,274 +0,0 @@ - - PRAGMA legacy_alter_table = 1; - CREATE TABLE t1(a, b, CHECK(t1.a != t1.b)); - CREATE TABLE t2(a, b); - CREATE INDEX t2expr ON t2(a) WHERE t2.b>0; - - - SELECT sql FROM sqlite_master - - - CREATE TABLE t3(c, d); - ALTER TABLE t3 RENAME TO t3new; - DROP TABLE t3new; - - - SELECT sql FROM sqlite_master - - - SELECT sql FROM sqlite_master - - - PRAGMA legacy_alter_table = 1; - CREATE TABLE abc(a, b, c); - INSERT INTO abc VALUES(1, 2, 3); - CREATE VIRTUAL TABLE eee USING echo('abc'); - SELECT * FROM eee; - - - ALTER TABLE eee RENAME TO fff; - SELECT * FROM fff; - - - PRAGMA legacy_alter_table = 1; - CREATE TABLE txx(a, b, c); - INSERT INTO txx VALUES(1, 2, 3); - CREATE VIEW vvv AS SELECT main.txx.a, txx.b, c FROM txx; - CREATE VIEW uuu AS SELECT main.one.a, one.b, c FROM txx AS one; - CREATE VIEW temp.ttt AS SELECT main.txx.a, txx.b, one.b, main.one.a FROM txx AS one, txx; - - - SELECT * FROM vvv; - - - ALTER TABLE txx RENAME TO "t xx"; - - - SELECT sql FROM sqlite_master WHERE name='vvv'; - - - SELECT sql FROM sqlite_master WHERE name='uuu';; - - - SELECT sql FROM sqlite_temp_master WHERE name='ttt'; - - - PRAGMA legacy_alter_table = 1; - CREATE table t1(x, y); - CREATE table t2(a, b); - - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - SELECT t1.x, * FROM t1, t2; - INSERT INTO t2 VALUES(new.x, new.y); - END; - - - INSERT INTO t1 VALUES(1, 1); - ALTER TABLE t1 RENAME TO t11; - - - ALTER TABLE t11 RENAME TO t1; - ALTER TABLE t2 RENAME TO t22; - - - PRAGMA legacy_alter_table = 1; - CREATE TABLE t9(a, b, c); - CREATE TABLE t10(a, b, c); - CREATE TEMP TABLE t9(a, b, c); - - CREATE TRIGGER temp.t9t AFTER INSERT ON temp.t9 BEGIN - INSERT INTO t10 VALUES(new.a, new.b, new.c); - END; - - INSERT INTO temp.t9 VALUES(1, 2, 3); - SELECT * FROM t10; - - - ALTER TABLE temp.t9 RENAME TO 't1234567890' - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t2 VALUES(3, 4); - CREATE VIEW v AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2; - SELECT * FROM v; - - - ALTER TABLE t2 RENAME TO one; - - - ALTER TABLE one RENAME TO t2; - DROP VIEW v; - CREATE VIEW temp.vv AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2; - SELECT * FROM vv; - - - ALTER TABLE t2 RENAME TO one; - - - CREATE VIRTUAL TABLE x1 USING tcl(tcl_command); - - - ALTER TABLE x1 RENAME TO x2; - SELECT sql FROM sqlite_master WHERE name = 'x2' - - - CREATE TABLE ddd(db, sql, zOld, zNew, bTemp); - INSERT INTO ddd VALUES( - 'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', 'ddd', NULL, 0 - ), ( - 'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', NULL, 'eee', 0 - ), ( - 'main', NULL, 'ddd', 'eee', 0 - ); - - - PRAGMA legacy_alter_table = 1; - ATTACH 'test.db2' AS aux; - PRAGMA foreign_keys = on; - CREATE TABLE aux.p1(a INTEGER PRIMARY KEY, b); - CREATE TABLE aux.c1(x INTEGER PRIMARY KEY, y REFERENCES p1(a)); - INSERT INTO aux.p1 VALUES(1, 1); - INSERT INTO aux.p1 VALUES(2, 2); - INSERT INTO aux.c1 VALUES(NULL, 2); - CREATE TABLE aux.c2(x INTEGER PRIMARY KEY, y REFERENCES c1(a)); - - - ALTER TABLE aux.p1 RENAME TO ppp; - - - INSERT INTO aux.c1 VALUES(NULL, 1); - SELECT sql FROM aux.sqlite_master WHERE name = 'c1'; - - - PRAGMA legacy_alter_table = 1; - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t2; - - - ALTER TABLE t1 RENAME TO t3; - - - ALTER TABLE t3 RENAME TO t1; - - - DROP VIEW v1; - CREATE TRIGGER tr AFTER INSERT ON t1 BEGIN - INSERT INTO t2 VALUES(new.a); - END; - - - ALTER TABLE t1 RENAME TO t3; - - - ALTER TABLE t3 RENAME TO t1; - DROP TRIGGER tr; - - ATTACH 'test.db2' AS aux; - CREATE TRIGGER tr AFTER INSERT ON t1 WHEN new.a IS NULL BEGIN SELECT 1, 2, 3; END; - - CREATE TABLE aux.t1(x); - CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN SELECT 1, 2, 3; END; - - - ALTER TABLE main.t1 RENAME TO t3; - - - SELECT sql FROM sqlite_temp_master; - SELECT sql FROM sqlite_master WHERE type='trigger'; - - - PRAGMA legacy_alter_table = 1; - CREATE VIRTUAL TABLE fff USING fts5(x, y, z); - - - BEGIN; - INSERT INTO fff VALUES('a', 'b', 'c'); - ALTER TABLE fff RENAME TO ggg; - COMMIT; - - - SELECT * FROM ggg; - - - PRAGMA legacy_alter_table = 1; - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t1(a, b, c); - CREATE TABLE main.t1(a, b, c); - CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN - SELECT trigger(new.a, new.b, new.c); - END; - - - INSERT INTO main.t1 VALUES(1, 2, 3); - INSERT INTO aux.t1 VALUES(4, 5, 6); - - - SELECT name, tbl_name FROM sqlite_temp_master; - - - ALTER TABLE main.t1 RENAME TO t2; - SELECT name, tbl_name FROM sqlite_temp_master; - - - ALTER TABLE aux.t1 RENAME TO t2; - SELECT name, tbl_name FROM sqlite_temp_master; - - - INSERT INTO aux.t2 VALUES(7, 8, 9); - - - PRAGMA legacy_alter_table = 1; - CREATE TABLE t1(a); - CREATE TABLE t2(w); - CREATE TRIGGER temp.r1 AFTER INSERT ON main.t2 BEGIN - INSERT INTO t1(a) VALUES(new.w); - END; - CREATE TEMP TABLE t2(x); - - - ALTER TABLE main.t2 RENAME TO t3; - - - INSERT INTO t3 VALUES('WWW'); - SELECT * FROM t1; - - - PRAGMA legacy_alter_table = 1; - CREATE VIRTUAL TABLE rt USING rtree(id, minx, maxx, miny, maxy); - - CREATE TABLE "mytable" ( "fid" INTEGER PRIMARY KEY, "geom" BLOB); - - CREATE TRIGGER tr1 AFTER UPDATE OF "geom" ON "mytable" - WHEN OLD."fid" = NEW."fid" AND NEW."geom" IS NULL BEGIN - DELETE FROM rt WHERE id = OLD."fid"; - END; - - INSERT INTO mytable VALUES(1, X'abcd'); - - - UPDATE mytable SET geom = X'1234' - - - ALTER TABLE mytable RENAME TO mytable_renamed; - - - CREATE TRIGGER tr2 AFTER INSERT ON mytable_renamed BEGIN - DELETE FROM rt WHERE id=(SELECT min(id) FROM rt); - END; - - - ALTER TABLE mytable_renamed RENAME TO mytable2; - - - PRAGMA legacy_alter_table = 1; - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE TRIGGER xyz AFTER INSERT ON t1 BEGIN - SELECT a, b FROM v1; - END; - - - ALTER TABLE t1 RENAME TO tt1; - diff --git a/libsql-wal/tests/assets/fixtures/altermalloc.test b/libsql-wal/tests/assets/fixtures/altermalloc.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/altermalloc2.test b/libsql-wal/tests/assets/fixtures/altermalloc2.test deleted file mode 100644 index 47a236ea0b..0000000000 --- a/libsql-wal/tests/assets/fixtures/altermalloc2.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE t1(abcd, efgh); - - - PRAGMA encoding = 'utf-16'; - CREATE TABLE t1(abcd, efgh); - - - CREATE TABLE t1(abcd, efgh); - CREATE VIEW v1 AS SELECT * FROM t1 WHERE abcd>efgh; - - - CREATE TABLE rr(a, b); - CREATE VIEW vv AS SELECT * FROM rr; - - CREATE TRIGGER vv1 INSTEAD OF INSERT ON vv BEGIN - SELECT 1, 2, 3; - END; - CREATE TRIGGER tr1 AFTER INSERT ON rr BEGIN - INSERT INTO vv VALUES(new.a, new.b); - END; - - - CREATE TABLE rr(a, b); - CREATE VIEW vv AS SELECT * FROM ( - WITH abc(d, e) AS (SELECT * FROM rr) - SELECT * FROM abc - ); - diff --git a/libsql-wal/tests/assets/fixtures/altermalloc3.test b/libsql-wal/tests/assets/fixtures/altermalloc3.test deleted file mode 100644 index 33c889c754..0000000000 --- a/libsql-wal/tests/assets/fixtures/altermalloc3.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE x1( - one, two, three, PRIMARY KEY(one), - CHECK (three!="xyz"), CHECK (two!="one") - ) WITHOUT ROWID; - CREATE INDEX x1i ON x1(one+"two"+"four") WHERE "five"; - CREATE TEMP TRIGGER AFTER INSERT ON x1 BEGIN - UPDATE x1 SET two=new.three || "new" WHERE one=new.one||""; - END; - CREATE TABLE t1(a, b, c, d, PRIMARY KEY(d, b)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1, 2, 3, 4); - - - CREATE TABLE t2(k,v); - CREATE TRIGGER r2 AFTER INSERT ON t2 BEGIN - UPDATE t2 SET (k,v)= ( - (WITH cte1(a) AS ( SELECT 1 FROM ( SELECT * FROM t2 ) ) - SELECT a FROM cte1 - ), 1); - END; - - CREATE TRIGGER r1 AFTER INSERT ON t2 BEGIN - UPDATE t2 SET k=1 FROM t2 AS one, t2 AS two NATURAL JOIN t2 AS three - WHERE one.k=two.v; - END; - - - ALTER TABLE t2 RENAME TO t2x; - diff --git a/libsql-wal/tests/assets/fixtures/alterqf.test b/libsql-wal/tests/assets/fixtures/alterqf.test deleted file mode 100644 index be606dd467..0000000000 --- a/libsql-wal/tests/assets/fixtures/alterqf.test +++ /dev/null @@ -1,18 +0,0 @@ - - CREATE TABLE t1(a, b, c); - - - CREATE TABLE x1( - one, two, three, PRIMARY KEY(one), - CHECK (three!="xyz"), CHECK (two!="one") - ) WITHOUT ROWID; - CREATE INDEX x1i ON x1(one+"two"+"four") WHERE "five"; - CREATE TEMP TRIGGER AFTER INSERT ON x1 BEGIN - UPDATE x1 SET two=new.three || "new" WHERE one=new.one||""; - END; - - - ALTER TABLE x1 RENAME two TO 'four'; - SELECT sql FROM sqlite_schema; - SELECT sql FROM sqlite_temp_schema; - diff --git a/libsql-wal/tests/assets/fixtures/altertab.test b/libsql-wal/tests/assets/fixtures/altertab.test deleted file mode 100644 index cade2ae211..0000000000 --- a/libsql-wal/tests/assets/fixtures/altertab.test +++ /dev/null @@ -1,571 +0,0 @@ - - CREATE TABLE t1(a, b, CHECK(t1.a != t1.b)); - - CREATE TABLE t2(a, b); - CREATE INDEX t2expr ON t2(a) WHERE t2.b>0; - - - SELECT sql FROM sqlite_master - - - ALTER TABLE t1 RENAME TO t1new; - - - CREATE TABLE t3(c, d); - ALTER TABLE t3 RENAME TO t3new; - DROP TABLE t3new; - - - SELECT sql FROM sqlite_master - - - ALTER TABLE t2 RENAME TO t2new; - - - SELECT sql FROM sqlite_master - - - CREATE TABLE abc(a, b, c); - INSERT INTO abc VALUES(1, 2, 3); - CREATE VIRTUAL TABLE eee USING echo('abc'); - SELECT * FROM eee; - - - ALTER TABLE eee RENAME TO fff; - SELECT * FROM fff; - - - CREATE TABLE txx(a, b, c); - INSERT INTO txx VALUES(1, 2, 3); - CREATE VIEW vvv AS SELECT main.txx.a, txx.b, c FROM txx; - CREATE VIEW uuu AS SELECT main.one.a, one.b, c FROM txx AS one; - CREATE VIEW temp.ttt AS SELECT main.txx.a, txx.b, one.b, main.one.a FROM txx AS one, txx; - - - SELECT * FROM vvv; - - - ALTER TABLE txx RENAME TO "t xx"; - SELECT * FROM vvv; - - - SELECT sql FROM sqlite_master WHERE name='vvv'; - - - SELECT * FROM uuu; - - - SELECT sql FROM sqlite_master WHERE name='uuu';; - - - SELECT * FROM ttt; - - - SELECT sql FROM sqlite_temp_master WHERE name='ttt'; - - - CREATE table t1(x, y); - CREATE table t2(a, b); - - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - SELECT t1.x, * FROM t1, t2; - INSERT INTO t2 VALUES(new.x, new.y); - END; - - - INSERT INTO t1 VALUES(1, 1); - ALTER TABLE t1 RENAME TO t11; - INSERT INTO t11 VALUES(2, 2); - ALTER TABLE t2 RENAME TO t22; - INSERT INTO t11 VALUES(3, 3); - - - CREATE TABLE t9(a, b, c); - CREATE TABLE t10(a, b, c); - CREATE TEMP TABLE t9(a, b, c); - - CREATE TRIGGER temp.t9t AFTER INSERT ON temp.t9 BEGIN - INSERT INTO t10 VALUES(new.a, new.b, new.c); - END; - - INSERT INTO temp.t9 VALUES(1, 2, 3); - SELECT * FROM t10; - - - ALTER TABLE temp.t9 RENAME TO 't1234567890' - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t2 VALUES(3, 4); - CREATE VIEW v AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2; - SELECT * FROM v; - - - SELECT * FROM v - - - DROP VIEW v; - CREATE VIEW temp.vv AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2; - SELECT * FROM vv; - - - CREATE VIRTUAL TABLE x1 USING tcl(tcl_command); - - - ALTER TABLE x1 RENAME TO x2; - SELECT sql FROM sqlite_master WHERE name = 'x2' - - - CREATE TABLE ddd(db, sql, zOld, zNew, bTemp); - INSERT INTO ddd VALUES( - 'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', 'ddd', NULL, 0 - ), ( - 'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', NULL, 'eee', 0 - ), ( - 'main', NULL, 'ddd', 'eee', 0 - ); - - - SELECT - sqlite_rename_table(db, 0, 0, sql, zOld, zNew, bTemp) - FROM ddd; - - - ATTACH 'test.db2' AS aux; - PRAGMA foreign_keys = on; - CREATE TABLE aux.p1(a INTEGER PRIMARY KEY, b); - CREATE TABLE aux.c1(x INTEGER PRIMARY KEY, y REFERENCES p1(a)); - INSERT INTO aux.p1 VALUES(1, 1); - INSERT INTO aux.p1 VALUES(2, 2); - INSERT INTO aux.c1 VALUES(NULL, 2); - CREATE TABLE aux.c2(x INTEGER PRIMARY KEY, y REFERENCES c1(a)); - - - ALTER TABLE aux.p1 RENAME TO ppp; - - - INSERT INTO aux.c1 VALUES(NULL, 1); - SELECT sql FROM aux.sqlite_master WHERE name = 'c1'; - - - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t2; - - - DROP VIEW v1; - CREATE TRIGGER tr AFTER INSERT ON t1 BEGIN - INSERT INTO t2 VALUES(new.a); - END; - - - DROP TRIGGER tr; - - ATTACH 'test.db2' AS aux; - CREATE TRIGGER tr AFTER INSERT ON t1 WHEN new.a IS NULL BEGIN SELECT 1, 2, 3; END; - - CREATE TABLE aux.t1(x); - CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN SELECT 1, 2, 3; END; - - - ALTER TABLE main.t1 RENAME TO t3; - - - SELECT sql FROM sqlite_temp_master; - SELECT sql FROM sqlite_master WHERE type='trigger'; - - - CREATE VIRTUAL TABLE fff USING fts5(x, y, z); - - - BEGIN; - INSERT INTO fff VALUES('a', 'b', 'c'); - ALTER TABLE fff RENAME TO ggg; - COMMIT; - - - SELECT * FROM ggg; - - - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t1(a, b, c); - CREATE TABLE main.t1(a, b, c); - CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN - SELECT trigger(new.a, new.b, new.c); - END; - - - INSERT INTO main.t1 VALUES(1, 2, 3); - INSERT INTO aux.t1 VALUES(4, 5, 6); - - - SELECT name, tbl_name FROM sqlite_temp_master; - - - ALTER TABLE main.t1 RENAME TO t2; - SELECT name, tbl_name FROM sqlite_temp_master; - - - ALTER TABLE aux.t1 RENAME TO t2; - SELECT name, tbl_name FROM sqlite_temp_master; - - - INSERT INTO aux.t2 VALUES(7, 8, 9); - - - CREATE TABLE t1(a); - CREATE TABLE t2(w); - CREATE TRIGGER temp.r1 AFTER INSERT ON main.t2 BEGIN - INSERT INTO t1(a) VALUES(new.w); - END; - CREATE TEMP TABLE t2(x); - - - ALTER TABLE main.t2 RENAME TO t3; - - - INSERT INTO t3 VALUES('WWW'); - SELECT * FROM t1; - - - CREATE TABLE t1(x, y); - CREATE TABLE t2(a, b); - CREATE TABLE log(c); - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO log SELECT y FROM t1, t2; - END; - - - INSERT INTO t1 VALUES(1, 2); - - - CREATE VIRTUAL TABLE rt USING rtree(id, minx, maxx, miny, maxy); - - CREATE TABLE "mytable" ( "fid" INTEGER PRIMARY KEY, "geom" BLOB); - - CREATE TRIGGER tr1 AFTER UPDATE OF "geom" ON "mytable" - WHEN OLD."fid" = NEW."fid" AND NEW."geom" IS NULL BEGIN - DELETE FROM rt WHERE id = OLD."fid"; - END; - - INSERT INTO mytable VALUES(1, X'abcd'); - - - UPDATE mytable SET geom = X'1234' - - - ALTER TABLE mytable RENAME TO mytable_renamed; - - - CREATE TRIGGER tr2 AFTER INSERT ON mytable_renamed BEGIN - DELETE FROM rt WHERE id=(SELECT min(id) FROM rt); - END; - - - ALTER TABLE mytable_renamed RENAME TO mytable2; - - - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE TRIGGER xyz AFTER INSERT ON t1 BEGIN - SELECT a, b FROM v1; - END; - - - ALTER TABLE t1 RENAME TO tt1; - - - CREATE TABLE t1(a integer NOT NULL PRIMARY KEY); - CREATE VIEW v1 AS SELECT a FROM t1; - CREATE TRIGGER tr1 INSTEAD OF INSERT ON v1 BEGIN - UPDATE t1 SET a = NEW.a; - END; - CREATE TRIGGER tr2 INSTEAD OF INSERT ON v1 BEGIN - SELECT new.a; - END; - CREATE TABLE t2 (b); - - - INSERT INTO v1 VALUES(1); - ALTER TABLE t2 RENAME TO t3; - - - CREATE TABLE x(f1 integer NOT NULL); - CREATE VIEW y AS SELECT f1 AS f1 FROM x; - CREATE TRIGGER t INSTEAD OF UPDATE OF f1 ON y BEGIN - UPDATE x SET f1 = NEW.f1; - END; - CREATE TABLE z (f1 integer NOT NULL PRIMARY KEY); - ALTER TABLE z RENAME TO z2; - - - INSERT INTO x VALUES(1), (2), (3); - ALTER TABLE x RENAME f1 TO f2; - SELECT * FROM x; - - - UPDATE y SET f1 = 'x' WHERE f1 = 1; - SELECT * FROM x; - - - SELECT sql FROM sqlite_master WHERE name = 'y'; - - - CREATE VIRTUAL TABLE y1 USING fts3; - VACUUM; - - - ALTER TABLE y1 RENAME TO z1; - - - SELECT * FROM z1_segments; - - - CREATE TABLE sqlite1234 (id integer); - ALTER TABLE sqlite1234 RENAME TO User; - SELECT name, sql FROM sqlite_master WHERE sql IS NOT NULL; - - - CREATE TABLE t0 (c0 INTEGER, PRIMARY KEY(c0)) WITHOUT ROWID; - - - ALTER TABLE t0 RENAME COLUMN c0 TO c1; - - - SELECT sql FROM sqlite_master; - - - CREATE TABLE t0 (c0 INTEGER, PRIMARY KEY(c0)); - - - ALTER TABLE t0 RENAME COLUMN c0 TO c1; - - - SELECT sql FROM sqlite_master; - - - CREATE TABLE t1(x); - CREATE VIEW t2 AS SELECT 1 FROM t1, (t1 AS a0, t1); - ALTER TABLE t1 RENAME TO t3; - SELECT sql FROM sqlite_master; - - - INSERT INTO t3(x) VALUES(123); - SELECT * FROM t2; - - - INSERT INTO t3(x) VALUES('xyz'); - SELECT * FROM t2; - - - CREATE TABLE a(a); - CREATE VIEW b AS SELECT(SELECT *FROM c JOIN a USING(d, a, a, a) JOIN a) IN(); - - - ALTER TABLE a RENAME a TO e; - - - CREATE TABLE a(b); - CREATE VIEW c AS - SELECT NULL INTERSECT - SELECT NULL ORDER BY - likelihood(NULL, (d, (SELECT c))); - - - CREATE TABLE t1(a INT, b TEXT NOT NULL); - INSERT INTO t1 VALUES(1,2),('a','b'); - BEGIN; - PRAGMA writable_schema=ON; - UPDATE sqlite_schema SET sql='CREATE TABLE t1(a INT, b TEXT)' WHERE name LIKE 't1'; - PRAGMA schema_version=1234; - COMMIT; - PRAGMA integrity_check; - - - ALTER TABLE t1 ADD COLUMN c INT DEFAULT 78; - SELECT * FROM t1; - - - CREATE TABLE gigo(a text); - CREATE TABLE idx(x text COLLATE compare64); - CREATE VIEW v1 AS SELECT * FROM idx WHERE x='abc'; - - - alter table gigo rename to ggiiggoo; - alter table idx rename to idx2; - - - SELECT sql FROM sqlite_master; - - - ALTER TABLE idx2 RENAME x TO y; - SELECT sql FROM sqlite_master; - - - CREATE TABLE t1(a, b); - CREATE TRIGGER AFTER INSERT ON t1 BEGIN - INSERT INTO nosuchtable VALUES(new.a) ON CONFLICT(a) DO NOTHING; - END; - - - CREATE TABLE t1(a, b); - CREATE TRIGGER AFTER INSERT ON t1 BEGIN - INSERT INTO v1 VALUES(new.a) ON CONFLICT(a) DO NOTHING; - END; - CREATE VIEW v1 AS SELECT * FROM nosuchtable; - - - CREATE TABLE xx(x); - CREATE VIEW v3(b) AS WITH b AS (SELECT b FROM (SELECT * FROM t2)) VALUES(1); - - - CREATE TABLE t1(k,v); - CREATE TABLE t2_a(k,v); - CREATE VIEW t2 AS SELECT * FROM t2_a; - CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN - UPDATE t1 - SET (k,v)=((WITH cte1(a) AS (SELECT 1 FROM t2) SELECT t2.k FROM t2, cte1),1); - END; - ALTER TABLE t1 RENAME TO t1x; - INSERT INTO t2_a VALUES(2,3); - INSERT INTO t1x VALUES(98,99); - SELECT * FROM t1x; - - - - create table t_sa ( - c_muyat INTEGER NOT NULL, - c_d4u TEXT - ); - - create table t2 ( abc ); - - CREATE TRIGGER trig AFTER DELETE ON t_sa - BEGIN - DELETE FROM t_sa WHERE ( - SELECT 123 FROM t2 - WINDOW oamat7fzf AS ( PARTITION BY t_sa.c_d4u ) - ); - END; - - - alter table t_sa rename column c_muyat to c_dg; - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('a', 'b', 'c'); - - CREATE VIEW v0 AS - WITH p AS ( SELECT 1 FROM t1 ), - g AS ( SELECT 1 FROM p, t1 ) - SELECT 1 FROM g; - - - SELECT * FROM v0 - - - ALTER TABLE t1 RENAME TO t2 - - - SELECT sql FROM sqlite_schema WHERE name='v0' - - - CREATE VIEW v2 AS - WITH p AS ( SELECT 1 FROM t2 ), - g AS ( SELECT 1 FROM ( - WITH i AS (SELECT 1 FROM p, t2) - SELECT * FROM i - ) - ) - SELECT 1 FROM g; - - - SELECT * FROM v2; - - - ALTER TABLE t2 RENAME TO t3; - - - SELECT sql FROM sqlite_schema WHERE name='v2' - - - CREATE TABLE t1(a); - CREATE TABLE t2(b,c); - CREATE TABLE t4(b,c); - INSERT INTO t2 VALUES(1,2),(1,3),(2,5); - INSERT INTO t4 VALUES(1,2),(1,3),(2,5); - - CREATE VIEW v3 AS - WITH RECURSIVE t3(x,y,z) AS ( - SELECT b,c,NULL FROM t4 - UNION - SELECT x,y,NULL FROM t3, t2 - ) - SELECT * FROM t3 AS xyz; - - - SELECT * FROM v3 - - - ALTER TABLE t1 RENAME a TO a2; -- fails in v3 - - - ALTER TABLE t2 RENAME TO t5; - - - SELECT sql FROM sqlite_schema WHERE name='v3' - - - CREATE TABLE t1(a,b,c,d,e,f); - CREATE TABLE t2(a,b,c); - CREATE INDEX t1abc ON t1(a,b,c+d+e); - CREATE VIEW v1(x,y) AS - SELECT t1.b,t2.b FROM t1,t2 WHERE t1.a=t2.a - GROUP BY 1 HAVING t2.c NOT NULL LIMIT 10; - CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN 'no' NOT NULL BEGIN - INSERT INTO t2(a,a,b,c) VALUES(new.b,new.a,new.c-7); - WITH c1(x) AS ( - VALUES(0) - UNION ALL - SELECT current_time+x FROM c1 WHERE x - UNION ALL - SELECT 1+x FROM c1 WHERE x<1 - ), c2(x) AS (VALUES(0),(1)) - SELECT * FROM c1 AS x1, c2 AS x2, ( - SELECT x+1 FROM c1 WHERE x IS NOT TRUE - UNION ALL - SELECT 1+x FROM c1 WHERE 1='d' ORDER BY name; - SELECT new.c; - END; - - - ALTER TABLE t1 RENAME TO t1x; - SELECT sql FROM sqlite_master WHERE name = 'r1'; - - - CREATE TABLE t1(a, b, c, d); - CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ()); - - - ALTER TABLE t1 RENAME b TO bbb; - - - SELECT sql FROM sqlite_master WHERE name = 'v1' - - - CREATE TABLE t1(a, b); - CREATE TABLE t3(e, f); - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO t2 VALUES(new.a, new.b); - END; - - - COMMIT; - - - SELECT type, name, tbl_name, sql - FROM sqlite_master WHERE type='table' AND name!='t1'; - - - COMMIT; - - - SELECT type, name, tbl_name, sql - FROM sqlite_master WHERE type='table' AND name!='t1'; - - - CREATE TABLE t1 ( - c1 integer, c2, PRIMARY KEY(c1 collate rtrim), - UNIQUE(c2) - ) - - - ALTER TABLE t1 RENAME c1 TO c3; - - - CREATE TEMPORARY TABLE Table0 ( - Col0 INTEGER, - PRIMARY KEY(Col0 COLLATE RTRIM), - FOREIGN KEY (Col0) REFERENCES Table0 - ); - - - ALTER TABLE Table0 RENAME Col0 TO Col0; - - - CREATE TABLE t1(a,b,c); - CREATE TRIGGER AFTER INSERT ON t1 BEGIN - SELECT a, rank() OVER w1 FROM t1 - WINDOW w1 AS (PARTITION BY b, percent_rank() OVER w1); - END; - - - ALTER TABLE t1 RENAME TO t1x; - SELECT sql FROM sqlite_master; - - - DROP TRIGGER after; - CREATE TRIGGER AFTER INSERT ON t1x BEGIN - SELECT a, rank() OVER w1 FROM t1x - WINDOW w1 AS (PARTITION BY b, percent_rank() OVER w1 ORDER BY d); - END; - - - CREATE TABLE t0(c0); - CREATE INDEX i0 ON t0('1' IN ()); - - - ALTER TABLE t0 RENAME TO t1; - SELECT sql FROM sqlite_master; - - - CREATE TABLE t2 (c0); - CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ())); - ALTER TABLE t2 RENAME COLUMN c0 TO c1; - - - SELECT sql FROM sqlite_master WHERE tbl_name = 't2'; - - - CREATE TABLE t1(a,b,c); - CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN - SELECT true WHERE (SELECT a, b FROM (t1)) IN (); - END; - - - ALTER TABLE t1 RENAME TO t1x; - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(a, b, c); - CREATE VIEW v1 AS SELECT * FROM t1 WHERE ( - SELECT t1.a FROM t1, t2 - ) IN () OR t1.a=5; - - - ALTER TABLE t2 RENAME TO t3; - SELECT sql FROM sqlite_master WHERE name='v1'; - - - CREATE TABLE t1( - a,b,c,d,e,f,g,h,j,jj,jjb,k,aa,bb,cc,dd,ee DEFAULT 3.14, - ff DEFAULT('hiccup'),Wg NOD NULL DEFAULT(false) - ); - - CREATE TRIGGER b AFTER INSERT ON t1 WHEN new.a BEGIN - SELECT a, sum() w3 FROM t1 - WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM abc)); - END; - - - DROP TRIGGER b; - CREATE TRIGGER b AFTER INSERT ON t1 WHEN new.a BEGIN - SELECT a, sum() w3 FROM t1 - WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM t1)); - END; - - - ALTER TABLE t1 RENAME TO t1x; - SELECT sql FROM sqlite_master WHERE name = 'b'; - - -CREATE TABLE t1(a,b,c,d,e,f,g,h,j,jj,Zjj,k,aQ,bb,cc,dd,ee DEFAULT 3.14, -ff DEFAULT('hiccup'),gg NOD NULL DEFAULT(false)); -CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN - -SELECT b () OVER , dense_rank() OVER d, d () OVER w1 -FROM t1 -WINDOW -w1 AS -( w1 ORDER BY d -ROWS BETWEEN 2 NOT IN(SELECT a, sum(d) w2,max(d)OVER FROM t1 -WINDOW -w1 AS -(PARTITION BY d -ROWS BETWEEN '' PRECEDING AND false FOLLOWING), -d AS -(PARTITION BY b ORDER BY d -ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -) PRECEDING AND 1 FOLLOWING), -w2 AS -(PARTITION BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), -w3 AS -(PARTITION BY b ORDER BY d -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -; -SELECT a, sum(d) w2,max(d)OVER FROM t1 -WINDOW -w1 AS -(PARTITION BY d -ROWS BETWEEN '' PRECEDING AND false FOLLOWING), -d AS -(PARTITION BY b ORDER BY d -ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -; - -END; - - - ALTER TABLE t1 RENAME TO t1x; - - - CREATE TABLE t1(a); - CREATE TRIGGER r1 INSERT ON t1 BEGIN - SELECT a(*) OVER (ORDER BY (SELECT 1)) FROM t1; - END; - - - ALTER TABLE t1 RENAME TO t1x; - - - CREATE TABLE t1(a); - CREATE TABLE t2(b); - CREATE TRIGGER AFTER INSERT ON t1 BEGIN - SELECT sum() FILTER (WHERE (SELECT sum() FILTER (WHERE 0)) AND a); - END; - - - CREATE TABLE t1(x); - CREATE TRIGGER AFTER INSERT ON t1 BEGIN - SELECT (WITH t2 AS (WITH t3 AS (SELECT true) - SELECT * FROM t3 ORDER BY true COLLATE nocase) - SELECT 11); - - WITH t4 AS (SELECT * FROM t1) SELECT 33; - END; - - - ALTER TABLE t1 RENAME TO t1x; - - - CREATE TABLE t1(a,b,c); - CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN - SELECT a () FILTER (WHERE a>0) FROM t1; - END; - - - ALTER TABLE t1 RENAME TO t1x; - ALTER TABLE t1x RENAME a TO aaa; - SELECT sql FROM sqlite_master WHERE type='trigger'; - - - CREATE TABLE t1(a,b); - CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN - SELECT a, b FROM t1 - INTERSECT SELECT b,a FROM t1 - ORDER BY b IN ( - SELECT a UNION SELECT b - FROM t1 - ORDER BY b COLLATE nocase - ) - ; - END; - - - CREATE TABLE a(a,h CONSTRAINT a UNIQUE ON CONFLICT FAIL,CONSTRAINT a); - - - CREATE TABLE s(col); - CREATE VIEW v AS SELECT ( - WITH x(a) AS(SELECT * FROM s) VALUES(RIGHT) - ) IN() ; - CREATE TABLE a(a); - ALTER TABLE a RENAME a TO b; - - - CREATE TABLE t1(a); - CREATE VIEW v2(b) AS SELECT * FROM v2; - - - DROP VIEW v2; - CREATE VIEW v2(b) AS WITH t3 AS (SELECT b FROM v2) SELECT * FROM t3; - - - DROP VIEW v2; - CREATE VIEW v2(b) AS WITH t3 AS (SELECT b FROM v2) VALUES(1); - - - CREATE TABLE t1(x); - CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN - UPDATE t1 SET (c,d)=((SELECT 1 FROM t1 JOIN t2 ON b=x),1); - END; - - - CREATE TABLE v0 (a); - CREATE VIEW v2 (v3) AS - WITH x1 AS (SELECT * FROM v2) - SELECT v3 AS x, v3 AS y FROM v2; - - - CREATE TABLE v0 (v1); - CREATE TABLE v2 (v3 INTEGER UNIQUE ON CONFLICT ABORT); - CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( - ( SELECT v1 AS PROMO_REVENUE FROM v2 JOIN v0 USING ( VALUE ) ) AND 0 ) - BEGIN - DELETE FROM v2; - END; - - - DROP TRIGGER x; - CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( - 0 AND (SELECT rowid FROM v0) - ) BEGIN - DELETE FROM v2; - END; - - - ALTER TABLE v0 RENAME TO xyz; - SELECT sql FROM sqlite_master WHERE type='trigger' - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(a, b, c); - CREATE TRIGGER ttt AFTER INSERT ON t1 BEGIN - UPDATE t1 SET a=t2.a FROM t2 WHERE t1.a=t2.a; - END; - - -# ALTER TABLE t2 RENAME COLUMN a TO aaa; -# - - CREATE TABLE t1(x); - - CREATE TABLE t3(y); - CREATE TABLE t4(z); - - CREATE TRIGGER tr1 INSERT ON t3 BEGIN - UPDATE t3 SET y=z FROM (SELECT z FROM t4); - END; - - CREATE TRIGGER tr2 INSERT ON t3 BEGIN - UPDATE t3 SET y=abc FROM (SELECT x AS abc FROM t1); - END; - - - ALTER TABLE t1 RENAME TO t2; - - - ALTER TABLE t2 RENAME x TO xx; - - - SELECT sql FROM sqlite_schema WHERE name='tr2' - - - CREATE TABLE t1(xx); - CREATE TRIGGER xx INSERT ON t1 BEGIN - UPDATE t1 SET xx=xx FROM(SELECT xx); - END; - - - CREATE TABLE t1(a, b AS ((WITH w1 (xyz) AS ( SELECT t1.b FROM t1 ) SELECT 123) IN ()), c); - - - ALTER TABLE t1 DROP COLUMN c; - SELECT sql FROM sqlite_schema WHERE name = 't1'; - - - CREATE TABLE t0(c0 , c1 AS (CASE TRUE NOT IN () WHEN NULL THEN CASE + 0xa ISNULL WHEN NOT + 0x9 THEN t0.c1 ELSE CURRENT_TIME LIKE CAST (t0.c1 REGEXP '-([1-9]\d*.\d*|0\.\d*[1-9]\d*)'ESCAPE (c1) COLLATE BINARY BETWEEN c1 AND c1 NOT IN (WITH t4 (c0) AS (WITH t3 (c0) AS NOT MATERIALIZED (WITH RECURSIVE t2 (c0) AS (WITH RECURSIVE t1 AS (VALUES (x'717171ff71717171' ) ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY 0x9 ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c1 ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY typeof(0x9 ) ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY typeof(typeof(0x9 ) ) ) IN t0 BETWEEN typeof(typeof(typeof(hex(*) FILTER (WHERE + x'5ccd1e68' ) ) ) ) AND 1 >0xa AS BLOB (+4.4E4 , -0xe ) ) END <> c1 IN () END ) VIRTUAL , c35 PRIMARY KEY , c60 , c64 NUMERIC (-6.8 , -0xE ) ) WITHOUT ROWID ; - - - ALTER TABLE t0 DROP COLUMN c60; - - - CREATE TABLE t1(a,b,c,d); - CREATE TRIGGER AFTER INSERT ON t1 BEGIN - UPDATE t1 SET (c,d)=(a,b); - END; - ALTER TABLE t1 RENAME TO t2; - - - SELECT sql FROM sqlite_schema WHERE type='trigger' - - - CREATE TABLE t1(x, y); - CREATE TRIGGER Trigger1 DELETE ON t1 - BEGIN - SELECT t1.*, t1.x FROM t1 ORDER BY t1.x; - END; - - - ALTER TABLE t1 RENAME x TO z; - - - ALTER TABLE t1 RENAME TO t2; - - - CREATE TRIGGER tr2 AFTER DELETE ON t2 BEGIN - SELECT z, y FROM ( - SELECT t2.* FROM t2 - ); - END; - - - DELETE FROM t2 - - - ALTER TABLE t2 RENAME TO t3; - - - SELECT sql FROM sqlite_schema WHERE type='trigger' - diff --git a/libsql-wal/tests/assets/fixtures/altertrig.test b/libsql-wal/tests/assets/fixtures/altertrig.test deleted file mode 100644 index 9ef2d3887c..0000000000 --- a/libsql-wal/tests/assets/fixtures/altertrig.test +++ /dev/null @@ -1,16 +0,0 @@ - - CREATE TABLE t1(x); - CREATE TABLE t2(y); - CREATE TABLE t3(z); - CREATE TABLE t4(a); - - CREATE TRIGGER r1 INSERT ON t1 BEGIN - UPDATE t1 SET d='xyz' FROM t2, t3; - END; - - - DROP TRIGGER r1; - CREATE TRIGGER r1 INSERT ON t1 BEGIN - UPDATE t1 SET d='xyz' FROM t2, (SELECT * FROM t5); - END; - diff --git a/libsql-wal/tests/assets/fixtures/amatch1.test b/libsql-wal/tests/assets/fixtures/amatch1.test deleted file mode 100644 index 84cc7696e9..0000000000 --- a/libsql-wal/tests/assets/fixtures/amatch1.test +++ /dev/null @@ -1,55 +0,0 @@ - - CREATE TABLE costs(iLang, cFrom, cTo, Cost); - INSERT INTO costs VALUES(0, '', '?', 100); - INSERT INTO costs VALUES(0, '?', '', 100); - INSERT INTO costs VALUES(0, '?', '?', 150); - CREATE TABLE vocab(w TEXT UNIQUE); - INSERT OR IGNORE INTO vocab SELECT term FROM t1aux; - CREATE VIRTUAL TABLE t2 USING approximate_match( - vocabulary_table=t1aux, - vocabulary_word=term, - edit_distances=costs - ); - CREATE VIRTUAL TABLE t3 USING approximate_match( - vocabulary_table=vocab, - vocabulary_word=w, - edit_distances=costs - ); - CREATE VIRTUAL TABLE t4 USING approximate_match( - vocabulary_table=vtemp, - vocabulary_word=w, - edit_distances=costs - ); - - - SELECT word, distance FROM t2 - WHERE word MATCH 'josxph' AND distance<300; - - - SELECT word, distance FROM t3 - WHERE word MATCH 'josxph' AND distance<300; - - - CREATE TEMP TABLE vtemp(w TEXT UNIQUE); - INSERT OR IGNORE INTO vtemp SELECT term FROM t1aux; - - - SELECT word, distance FROM t4 - WHERE word MATCH 'josxph' AND distance<300; - - - SELECT word, distance FROM t2 - WHERE word MATCH 'joxxph' AND distance<=300; - - - SELECT word, distance FROM t3 - WHERE word MATCH 'joxxph' AND distance<=300; - - - SELECT word, distance FROM t2 - WHERE word MATCH 'joxxph' AND distance<300; - - - SELECT word, distance FROM t3 - WHERE word MATCH 'joxxph' AND distance<300; - diff --git a/libsql-wal/tests/assets/fixtures/analyze.test b/libsql-wal/tests/assets/fixtures/analyze.test deleted file mode 100644 index 8b78d1ff3f..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyze.test +++ /dev/null @@ -1,21 +0,0 @@ - - CREATE TABLE sqliteDemo(a); - INSERT INTO sqliteDemo(a) VALUES(1),(2),(3),(4),(5); - CREATE TABLE SQLiteDemo2(a INTEGER PRIMARY KEY AUTOINCREMENT); - INSERT INTO SQLiteDemo2 SELECT * FROM sqliteDemo; - CREATE TABLE t1(b); - INSERT INTO t1(b) SELECT a FROM sqliteDemo; - ANALYZE; - SELECT tbl FROM sqlite_stat1 WHERE idx IS NULL ORDER BY tbl; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); - INSERT INTO t1 VALUES(1, 7223372036854775); - INSERT INTO t1 VALUES(2, 7223372036854776); - INSERT INTO t1 VALUES(3, 7223372036854777); - CREATE INDEX i1 ON t1(b); - ANALYZE; - UPDATE sqlite_stat4 SET sample = substr(sample, 0, 4); - ANALYZE sqlite_schema; - SELECT * FROM t1 WHERE b>7223372036854775 - diff --git a/libsql-wal/tests/assets/fixtures/analyze3.test b/libsql-wal/tests/assets/fixtures/analyze3.test deleted file mode 100644 index 2648d8de29..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyze3.test +++ /dev/null @@ -1,46 +0,0 @@ - - SELECT count(*) FROM t1 WHERE x>200 AND x<300; - SELECT count(*) FROM t1 WHERE x>0 AND x<1100; - - - SELECT count(*) FROM t2 WHERE x>1 AND x<2; - SELECT count(*) FROM t2 WHERE x>0 AND x<99; - - - SELECT count(*) FROM t3 WHERE x>200 AND x<300; - SELECT count(*) FROM t3 WHERE x>0 AND x<1100 - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - INSERT INTO t1 VALUES(1,1,'0000'); - CREATE INDEX t0b ON t1(b); - ANALYZE; - SELECT c FROM t1 WHERE b=3 AND a BETWEEN 30 AND hex(1); - - - CREATE TABLE t1(a,b,c); - CREATE INDEX t1a ON t1(a); - ANALYZE; - SELECT * FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t1','t1a','12000'); - INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t1','t1a','12000'); - ANALYZE sqlite_master; - - - CREATE TABLE t1(a PRIMARY KEY, v) WITHOUT ROWID; - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1','t1','1 1'); - INSERT INTO sqlite_stat4 VALUES('t1','t1','1','0','0',X'021b76657273696f6e'); - INSERT INTO sqlite_stat4 VALUES('T1','T1','1','0','0',X'021b76657273696f6e'); - ANALYZE sqlite_schema; - - - CREATE TABLE t1(a INT PRIMARY KEY, b INT) WITHOUT ROWID; - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat4 VALUES - ('t1','t1','1','2','2',X'03000103'), - ('t1','sqlite_autoindex_t1_1','1','2','2',X'03000103'); - ANALYZE sqlite_schema; - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/analyze4.test b/libsql-wal/tests/assets/fixtures/analyze4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/analyze5.test b/libsql-wal/tests/assets/fixtures/analyze5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/analyze6.test b/libsql-wal/tests/assets/fixtures/analyze6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/analyze7.test b/libsql-wal/tests/assets/fixtures/analyze7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/analyze8.test b/libsql-wal/tests/assets/fixtures/analyze8.test deleted file mode 100644 index 2abd5b1429..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyze8.test +++ /dev/null @@ -1,5 +0,0 @@ - - SELECT count(*) FROM t1 WHERE b BETWEEN 30 AND 34; - SELECT count(*) FROM t1 WHERE c BETWEEN 0 AND 100000; - SELECT count(*) FROM t1 WHERE c BETWEEN 800000 AND 900000; - diff --git a/libsql-wal/tests/assets/fixtures/analyze9.test b/libsql-wal/tests/assets/fixtures/analyze9.test deleted file mode 100644 index 0889a3864b..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyze9.test +++ /dev/null @@ -1,327 +0,0 @@ - - CREATE TABLE t1(a TEXT, b TEXT); - INSERT INTO t1 VALUES('(0)', '(0)'); - INSERT INTO t1 VALUES('(1)', '(1)'); - INSERT INTO t1 VALUES('(2)', '(2)'); - INSERT INTO t1 VALUES('(3)', '(3)'); - INSERT INTO t1 VALUES('(4)', '(4)'); - CREATE INDEX i1 ON t1(a, b); - - - ANALYZE; - - - SELECT tbl,idx,nEq,nLt,nDLt,test_decode(sample) FROM sqlite_stat4; - - - SELECT tbl,idx,nEq,nLt,nDLt,s(sample) FROM sqlite_stat4; - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('some text', 14, NULL); - INSERT INTO t1 VALUES(22.0, NULL, x'656667'); - CREATE INDEX i1 ON t1(a, b, c); - ANALYZE; - SELECT test_decode(sample) FROM sqlite_stat4; - - - CREATE TABLE t2(a, b); - CREATE INDEX i2 ON t2(a, b); - BEGIN; - - - SELECT count(*) FROM t2 GROUP BY a; - - - ANALYZE; - SELECT lindex(nEq, 0) FROM sqlite_stat4; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - INSERT INTO t1 VALUES(1, 1, 'one-a'); - INSERT INTO t1 VALUES(11, 1, 'one-b'); - INSERT INTO t1 VALUES(21, 1, 'one-c'); - INSERT INTO t1 VALUES(31, 1, 'one-d'); - INSERT INTO t1 VALUES(41, 1, 'one-e'); - INSERT INTO t1 VALUES(51, 1, 'one-f'); - INSERT INTO t1 VALUES(61, 1, 'one-g'); - INSERT INTO t1 VALUES(71, 1, 'one-h'); - INSERT INTO t1 VALUES(81, 1, 'one-i'); - INSERT INTO t1 VALUES(91, 1, 'one-j'); - INSERT INTO t1 SELECT a+1,2,'two' || substr(c,4) FROM t1; - INSERT INTO t1 SELECT a+2,3,'three'||substr(c,4) FROM t1 WHERE c GLOB 'one-*'; - INSERT INTO t1 SELECT a+3,4,'four'||substr(c,4) FROM t1 WHERE c GLOB 'one-*'; - INSERT INTO t1 SELECT a+4,5,'five'||substr(c,4) FROM t1 WHERE c GLOB 'one-*'; - INSERT INTO t1 SELECT a+5,6,'six'||substr(c,4) FROM t1 WHERE c GLOB 'one-*'; - CREATE INDEX t1b ON t1(b); - ANALYZE; - SELECT c FROM t1 WHERE b=3 AND a BETWEEN 30 AND 60; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a, b, c); - CREATE INDEX i1 ON t1(c, b, a); - - - SELECT - neq, - lrange(nlt, 0, 2), - lrange(ndlt, 0, 2), - lrange(test_decode(sample), 0, 2) - FROM sqlite_stat4 - ORDER BY rowid LIMIT 16; - - - SELECT - neq, - lrange(nlt, 0, 2), - lrange(ndlt, 0, 2), - lrange(test_decode(sample), 0, 1) - FROM sqlite_stat4 - ORDER BY rowid DESC LIMIT 2; - - SELECT count(DISTINCT c) FROM t1 WHERE c<201 - SELECT count(DISTINCT c) FROM t1 WHERE c<200 - - SELECT count(*) FROM sqlite_stat4 - WHERE lindex(test_decode(sample), 3) IN - ('34', '68', '102', '136', '170', '204', '238', '272') - - - SELECT test_decode(sample) FROM sqlite_stat4; - - - PRAGMA encoding = 'utf-16'; - CREATE TABLE t0(v); - ANALYZE; - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a); - CREATE INDEX i2 ON t1(b); - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t1 VALUES(2, 2); - INSERT INTO t1 VALUES(3, 3); - INSERT INTO t1 VALUES(4, 4); - INSERT INTO t1 VALUES(5, 5); - ANALYZE; - PRAGMA writable_schema = 1; - CREATE TEMP TABLE x1 AS - SELECT tbl,idx,neq,nlt,ndlt,sample FROM sqlite_stat4 - ORDER BY (rowid%5), rowid; - DELETE FROM sqlite_stat4; - INSERT INTO sqlite_stat4 SELECT * FROM x1; - PRAGMA writable_schema = 0; - ANALYZE sqlite_master; - - - SELECT * FROM t1 WHERE a = 'abc'; - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t1 VALUES(2, 2); - INSERT INTO t1 VALUES(3, 3); - INSERT INTO t1 VALUES(4, 4); - INSERT INTO t1 VALUES(5, 5); - ANALYZE; - UPDATE sqlite_stat4 SET sample = X'' WHERE rowid = 1; - ANALYZE sqlite_master; - - - UPDATE sqlite_stat4 SET sample = X'FFFF'; - ANALYZE sqlite_master; - SELECT * FROM t1 WHERE a = 1; - - - ANALYZE; - UPDATE sqlite_stat4 SET neq = '0 0 0'; - ANALYZE sqlite_master; - SELECT * FROM t1 WHERE a = 1; - - - ANALYZE; - UPDATE sqlite_stat4 SET ndlt = '0 0 0'; - ANALYZE sqlite_master; - SELECT * FROM t1 WHERE a = 3; - - - ANALYZE; - UPDATE sqlite_stat4 SET nlt = '0 0 0'; - ANALYZE sqlite_master; - SELECT * FROM t1 WHERE a = 5; - - - CREATE TABLE t1(x TEXT); - CREATE INDEX i1 ON t1(x); - INSERT INTO t1 VALUES('1'); - INSERT INTO t1 VALUES('2'); - INSERT INTO t1 VALUES('3'); - INSERT INTO t1 VALUES('4'); - ANALYZE; - - - SELECT * FROM t1 WHERE x = 3; - - - CREATE TABLE t1(a, b, c, d, e); - CREATE INDEX i1 ON t1(a, b, c, d); - CREATE INDEX i2 ON t1(e); - - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a, b); - CREATE INDEX t3a ON t3(a); - CREATE INDEX t3b ON t3(b); - - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(x, a, b); - CREATE INDEX t3a ON t3(x, a); - CREATE INDEX t3b ON t3(x, b); - - - SELECT lrange(test_decode(sample), 0, 1) AS s FROM sqlite_stat4 - WHERE lindex(s, 1)=='1' ORDER BY rowid - - - CREATE TABLE x1(a, b, UNIQUE(a, b)); - INSERT INTO x1 VALUES(1, 2); - INSERT INTO x1 VALUES(3, 4); - INSERT INTO x1 VALUES(5, 6); - ANALYZE; - INSERT INTO sqlite_stat4 VALUES(NULL, NULL, NULL, NULL, NULL, NULL); - - SELECT * FROM x1 - - INSERT INTO sqlite_stat4 VALUES(42, 42, 42, 42, 42, 42); - - SELECT * FROM x1 - - UPDATE sqlite_stat1 SET stat = NULL; - - SELECT * FROM x1 - - ANALYZE; - UPDATE sqlite_stat1 SET tbl = 'no such tbl'; - - SELECT * FROM x1 - - ANALYZE; - UPDATE sqlite_stat4 SET neq = NULL, nlt=NULL, ndlt=NULL; - - SELECT * FROM x1 - - ANALYZE; - UPDATE sqlite_stat1 SET stat = stat || ' unordered'; - - SELECT * FROM x1 - - CREATE INDEX i2 ON t1(c, d); - ANALYZE main.i2; - - ANALYZE - - CREATE TABLE t2(a, b); - CREATE INDEX i2 ON t2(a); - - - CREATE TABLE t3(a, b, c, d, PRIMARY KEY(a, b)) WITHOUT ROWID; - SELECT * FROM t3; - - - WITH r(x) AS ( - SELECT 1 - UNION ALL - SELECT x+1 FROM r WHERE x<=100 - ) - - INSERT INTO t3 SELECT - CASE WHEN (x>45 AND x<96) THEN 'B' ELSE 'A' END, /* Column "a" */ - x, /* Column "b" */ - CASE WHEN (x<51) THEN 'one' ELSE 'two' END, /* Column "c" */ - x /* Column "d" */ - FROM r; - - CREATE INDEX i3 ON t3(c); - CREATE INDEX i4 ON t3(d); - ANALYZE; - - - CREATE TABLE t4( - a COLLATE nocase, b, c, - d, e, f, - PRIMARY KEY(c, b, a) - ) WITHOUT ROWID; - CREATE INDEX i41 ON t4(e); - CREATE INDEX i42 ON t4(f); - - WITH data(a, b, c, d, e, f) AS ( - SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 - UNION ALL - SELECT - int_to_char(f+1), b, c, d, (e+1) % 2, f+1 - FROM data WHERE f<1024 - ) - INSERT INTO t4 SELECT a, b, c, d, e, f FROM data; - ANALYZE; - - - CREATE TABLE t5(c, d, b, e, a, PRIMARY KEY(a, b, c)) WITHOUT ROWID; - WITH data(a, b, c, d, e) AS ( - SELECT 'z', 'y', 0, 0, 0 - UNION ALL - SELECT - a, CASE WHEN b='y' THEN 'n' ELSE 'y' END, c+1, e/250, e+1 - FROM data - WHERE e<1000 - ) - INSERT INTO t5(a, b, c, d, e) SELECT * FROM data; - CREATE INDEX t5d ON t5(d); - CREATE INDEX t5e ON t5(e); - ANALYZE; - - - CREATE TABLE t6(a, b); - WITH ints(i,j) AS ( - SELECT 1,1 UNION ALL SELECT i+1,j+1 FROM ints WHERE i<100 - ) INSERT INTO t6 SELECT * FROM ints; - CREATE INDEX aa ON t6(a); - CREATE INDEX bb ON t6(b); - ANALYZE; - - - SELECT count(*) FROM t1 WHERE x = 10000 AND y < 50; - - - SELECT count(*) FROM t1 WHERE z = 444; - - - BEGIN; - CREATE TABLE t1(x, y, z); - CREATE INDEX i1 ON t1(x, y); - CREATE INDEX i2 ON t1(z); - - WITH - cnt(y) AS (SELECT 0 UNION ALL SELECT y+1 FROM cnt WHERE y<99), - letters(x) AS ( - SELECT 'A' UNION SELECT 'B' UNION SELECT 'C' UNION SELECT 'D' - ) - INSERT INTO t1(x, y) SELECT x, y FROM letters, cnt; - - WITH - letters(x) AS ( - SELECT 'A' UNION SELECT 'B' UNION SELECT 'C' UNION SELECT 'D' - ) - INSERT INTO t1(x, y) SELECT x, 70 FROM letters; - - WITH - cnt(i) AS (SELECT 0 UNION ALL SELECT i+1 FROM cnt WHERE i<9999) - INSERT INTO t1(x, y) SELECT i, i FROM cnt; - - UPDATE t1 SET z = (rowid / 95); - ANALYZE; - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/analyzeC.test b/libsql-wal/tests/assets/fixtures/analyzeC.test deleted file mode 100644 index 23876bdd46..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyzeC.test +++ /dev/null @@ -1,125 +0,0 @@ - - CREATE TABLE t1(a,b,c); - INSERT INTO t1(a,b,c) - VALUES(1,2,3),(7,8,9),(4,5,6),(10,11,12),(4,8,12),(1,11,111); - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1b ON t1(b); - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) - VALUES('t1','t1a','12345 2'),('t1','t1b','12345 4'); - ANALYZE sqlite_master; - SELECT *, '#' FROM t1 WHERE a BETWEEN 3 AND 8 ORDER BY c; - - - EXPLAIN QUERY PLAN - SELECT *, '#' FROM t1 WHERE a BETWEEN 3 AND 8 ORDER BY c; - - - SELECT c FROM t1 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 ORDER BY a; - - - UPDATE sqlite_stat1 SET stat='12345 2 unordered' WHERE idx='t1a'; - ANALYZE sqlite_master; - SELECT *, '#' FROM t1 WHERE a BETWEEN 3 AND 8 ORDER BY c; - - - EXPLAIN QUERY PLAN - SELECT *, '#' FROM t1 WHERE a BETWEEN 3 AND 8 ORDER BY c; - - - SELECT c FROM t1 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 ORDER BY a; - - - UPDATE sqlite_stat1 SET stat='12345 2 whatever=5 unordered xyzzy=11' - WHERE idx='t1a'; - ANALYZE sqlite_master; - SELECT *, '#' FROM t1 WHERE a BETWEEN 3 AND 8 ORDER BY c; - - - EXPLAIN QUERY PLAN - SELECT *, '#' FROM t1 WHERE a BETWEEN 3 AND 8 ORDER BY c; - - - SELECT c FROM t1 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 ORDER BY a; - - - DROP INDEX t1a; - CREATE INDEX t1ab ON t1(a,b); - CREATE INDEX t1ca ON t1(c,a); - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) - VALUES('t1','t1ab','12345 3 2 sz=10'),('t1','t1ca','12345 3 2 sz=20'); - ANALYZE sqlite_master; - SELECT count(a) FROM t1; - - - EXPLAIN QUERY PLAN - SELECT count(a) FROM t1; - - - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) - VALUES('t1','t1ab','12345 3 2 sz=20'),('t1','t1ca','12345 3 2 sz=10'); - ANALYZE sqlite_master; - SELECT count(a) FROM t1; - - - EXPLAIN QUERY PLAN - SELECT count(a) FROM t1; - - - DROP TABLE IF EXISTS t44; - CREATE TABLE t44(a PRIMARY KEY); - INSERT INTO sqlite_stat1 VALUES('t44',null,'sz=0'); - ANALYZE sqlite_master; - SELECT 0 FROM t44 WHERE a IN(1,2,3); - - - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) - VALUES('t1','t1ab','12345 3 2 x=5 sz=10 y=10'), - ('t1','t1ca','12345 3 2 whatever sz=20 junk'); - ANALYZE sqlite_master; - SELECT count(a) FROM t1; - - - EXPLAIN QUERY PLAN - SELECT count(a) FROM t1; - - - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) - VALUES('t1','t1ca','12345 3 2 x=5 sz=10 y=10'), - ('t1','t1ab','12345 3 2 whatever sz=20 junk'); - ANALYZE sqlite_master; - SELECT count(a) FROM t1; - - - EXPLAIN QUERY PLAN - SELECT count(a) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/analyzeD.test b/libsql-wal/tests/assets/fixtures/analyzeD.test deleted file mode 100644 index b81d0fca95..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyzeD.test +++ /dev/null @@ -1,3 +0,0 @@ - - CREATE TABLE t1(a, b, c); - diff --git a/libsql-wal/tests/assets/fixtures/analyzeE.test b/libsql-wal/tests/assets/fixtures/analyzeE.test deleted file mode 100644 index 7897f66710..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyzeE.test +++ /dev/null @@ -1,241 +0,0 @@ - - CREATE TABLE t1(a,b); - WITH RECURSIVE - cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000) - INSERT INTO t1(a,b) SELECT x, x FROM cnt; - CREATE INDEX t1a ON t1(a); - ANALYZE; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<500 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>2500 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1900 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1100 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1100 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1900 - - - DROP INDEX t1a; - CREATE INDEX t1a ON t1(a DESC); - ANALYZE; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<500 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>2500 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1900 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1100 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1100 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1900 - - - DROP TABLE t1; - CREATE TABLE t1(a,b,c); - WITH RECURSIVE - cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000) - INSERT INTO t1(a,b,c) SELECT x, x, 123 FROM cnt; - CREATE INDEX t1ca ON t1(c,a); - ANALYZE; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500 AND c=123; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000 AND c=123; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750 AND c=123; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<500 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>2500 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1900 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1100 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1100 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1900 AND c=123 - - - DROP INDEX t1ca; - CREATE INDEX t1ca ON t1(c ASC,a DESC); - ANALYZE; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500 AND c=123; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000 AND c=123; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1700 AND 1750 AND c=123; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 1 AND 500 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a BETWEEN 3000 AND 3000000 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<500 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>2500 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1900 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a>1100 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1100 AND c=123 - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a<1900 AND c=123 - - - PRAGMA encoding = 'UTF-16'; - CREATE TABLE t0 (c1 TEXT); - INSERT INTO t0 VALUES (''); - CREATE INDEX i0 ON t0(c1); - ANALYZE; - SELECT * FROM t0 WHERE t0.c1 BETWEEN '' AND (ABS('')); - - - CREATE TABLE t1(x); - CREATE INDEX i1 ON t1(x,x,x,x,x||2); - CREATE INDEX i2 ON t1(1<2); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t1(x) SELECT x FROM c; - ANALYZE; - - - SELECT count(*)>1 FROM sqlite_stat4 WHERE idx='i2' AND neq='1000 1'; - - - SELECT count(*) FROM sqlite_stat4 WHERE idx='i2' AND neq<>'1000 1'; - - - SELECT count(*)>1 FROM sqlite_stat4 WHERE idx='i1' AND neq='1 1 1 1 1 1'; - - - SELECT count(*) FROM sqlite_stat4 WHERE idx='i1' AND neq<>'1 1 1 1 1 1'; - - - CREATE TABLE t1(a TEXT COLLATE binary); - CREATE INDEX t1x ON t1(a); - INSERT INTO t1(a) VALUES(0),('apple'),(NULL),(''),('banana'); - ANALYZE; - SELECT format('(%s)',a) FROM t1 WHERE t1.a > CAST(zeroblob(5) AS TEXT); - - - SELECT format('(%s)',a) FROM t1 WHERE t1.a <= CAST(zeroblob(5) AS TEXT); - diff --git a/libsql-wal/tests/assets/fixtures/analyzeF.test b/libsql-wal/tests/assets/fixtures/analyzeF.test deleted file mode 100644 index e2a0fc27e7..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyzeF.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE t1(x INTEGER, y INTEGER); - WITH data(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM data - ) - INSERT INTO t1 SELECT isqrt(i), isqrt(i) FROM data LIMIT 400; - CREATE INDEX t1x ON t1(x); - CREATE INDEX t1y ON t1(y); - ANALYZE; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c INT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10000) - INSERT INTO t1(a, c) SELECT x, x FROM c; - UPDATE t1 SET b=printf('x%02x',a/500) WHERE a>4000; - UPDATE t1 SET b='xyz' where a>=9998; - CREATE INDEX t1b ON t1(b); - ANALYZE; - SELECT count(*), b FROM t1 GROUP BY 2 ORDER BY 2; - - - explain query plan - SELECT * FROM t1 WHERE b='xyz' AND b IS NOT NULL ORDER BY +a; - /* v---- Should be "=", not ">" */ - - - SELECT * FROM t1 WHERE b='xyz' AND b IS NOT NULL ORDER BY +a; - diff --git a/libsql-wal/tests/assets/fixtures/analyzeG.test b/libsql-wal/tests/assets/fixtures/analyzeG.test deleted file mode 100644 index 20ad0fb665..0000000000 --- a/libsql-wal/tests/assets/fixtures/analyzeG.test +++ /dev/null @@ -1,17 +0,0 @@ - - PRAGMA automatic_index = 0; - CREATE TABLE t1(a, x); - CREATE TABLE t2(b, y); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 - ) - INSERT INTO t1 SELECT (i%50), NULL FROM s; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 - ) - INSERT INTO t2 SELECT (CASE WHEN i<95 THEN 44 ELSE i END), NULL FROM s; - - - CREATE INDEX t2b ON t2(b); - ANALYZE; - diff --git a/libsql-wal/tests/assets/fixtures/analyzer1.test b/libsql-wal/tests/assets/fixtures/analyzer1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/async.test b/libsql-wal/tests/assets/fixtures/async.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/async2.test b/libsql-wal/tests/assets/fixtures/async2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/async3.test b/libsql-wal/tests/assets/fixtures/async3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/async4.test b/libsql-wal/tests/assets/fixtures/async4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/async5.test b/libsql-wal/tests/assets/fixtures/async5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/atof1.test b/libsql-wal/tests/assets/fixtures/atof1.test deleted file mode 100644 index ad6e3f464f..0000000000 --- a/libsql-wal/tests/assets/fixtures/atof1.test +++ /dev/null @@ -1,16 +0,0 @@ - - PRAGMA encoding = 'UTF16be'; - CREATE TABLE t1(a, b); - INSERT INTO t1(rowid,a) VALUES (1,x'00'),(2,3); - SELECT substr(a,',') is true FROM t1 ORDER BY rowid; - - - SELECT substr(a,',') is true FROM t1 ORDER BY rowid DESC; - - - CREATE INDEX i1 ON t1(a); - SELECT count(*) FROM t1 WHERE substr(a,','); - - - SELECT randomblob(0) - 1; - diff --git a/libsql-wal/tests/assets/fixtures/atomic.test b/libsql-wal/tests/assets/fixtures/atomic.test deleted file mode 100644 index 4ade6edb73..0000000000 --- a/libsql-wal/tests/assets/fixtures/atomic.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(x, y); - BEGIN; - INSERT INTO t1 VALUES(1, 2); - - - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/atomic2.test b/libsql-wal/tests/assets/fixtures/atomic2.test deleted file mode 100644 index 8ed233d287..0000000000 --- a/libsql-wal/tests/assets/fixtures/atomic2.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(x, y); - CREATE INDEX i1x ON t1(x); - CREATE INDEX i2x ON t1(y); - - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/attach.test b/libsql-wal/tests/assets/fixtures/attach.test deleted file mode 100644 index fcc54ddc0e..0000000000 --- a/libsql-wal/tests/assets/fixtures/attach.test +++ /dev/null @@ -1,16 +0,0 @@ - - ATTACH test.db AS aux1; - CREATE TABLE aux1.t1(x,y); - INSERT INTO aux1.t1(x,y) VALUES(1,2),(3,4); - SELECT * FROM aux1.t1; - - - CREATE TABLE Table1 (col TEXT NOT NULL PRIMARY KEY); - ATTACH ':memory:' AS db2; - CREATE TABLE db2.Table2(col1 INTEGER, col2 INTEGER, col3 INTEGER, col4); - CREATE UNIQUE INDEX db2.idx_col1_unique ON Table2 (col1); - CREATE UNIQUE INDEX db2.idx_col23_unique ON Table2 (col2, col3); - CREATE INDEX db2.idx_col2 ON Table2 (col2); - INSERT INTO Table2 VALUES(1,2,3,4); - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/attach2.test b/libsql-wal/tests/assets/fixtures/attach2.test deleted file mode 100644 index 2e26da69e8..0000000000 --- a/libsql-wal/tests/assets/fixtures/attach2.test +++ /dev/null @@ -1,14 +0,0 @@ - - PRAGMA encoding = 'utf16'; - ATTACH 'test.db2' AS aux; - SELECT * FROM t2; - - - ATTACH 'test.db4' AS aux; - SELECT * FROM t4; - - - ATTACH 'test.db3' AS aux; - SELECT * FROM t3; - SELECT * FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/attach3.test b/libsql-wal/tests/assets/fixtures/attach3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/attach4.test b/libsql-wal/tests/assets/fixtures/attach4.test deleted file mode 100644 index 1d1e6b99cd..0000000000 --- a/libsql-wal/tests/assets/fixtures/attach4.test +++ /dev/null @@ -1,14 +0,0 @@ - - ATTACH DATABASE '' AS aux; - CREATE TABLE IF NOT EXISTS aux.t1(a, b); - CREATE TEMPORARY TRIGGER tr1 DELETE ON t1 BEGIN - DELETE FROM t1; - END; - CREATE TABLE temp.t1(a, b); - - - DETACH DATABASE aux; - - - DROP TRIGGER tr1; - diff --git a/libsql-wal/tests/assets/fixtures/attachmalloc.test b/libsql-wal/tests/assets/fixtures/attachmalloc.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/auth.test b/libsql-wal/tests/assets/fixtures/auth.test deleted file mode 100644 index a696b888bc..0000000000 --- a/libsql-wal/tests/assets/fixtures/auth.test +++ /dev/null @@ -1,23 +0,0 @@ - - ALTER TABLE t5 DROP COLUMN new_col_1; - - - ALTER TABLE t5 DROP COLUMN new_col_1; - SELECT 1 FROM sqlite_schema WHERE name='t5' AND sql LIKE '%new_col_1%'; - - - SELECT 1 FROM sqlite_schema WHERE name='t5' AND sql LIKE '%new_col_1%'; - - - SELECT name FROM pragma_table_info('t1') ORDER BY cid; - - - SELECT name FROM pragma_table_info('t1') ORDER BY cid; - - - SELECT name FROM pragma_table_info('t1') ORDER BY cid; - - - CREATE TABLE t7(a, b, c); - CREATE VIEW v7 AS SELECT * FROM t7; - diff --git a/libsql-wal/tests/assets/fixtures/auth2.test b/libsql-wal/tests/assets/fixtures/auth2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/auth3.test b/libsql-wal/tests/assets/fixtures/auth3.test deleted file mode 100644 index bdad7fb40d..0000000000 --- a/libsql-wal/tests/assets/fixtures/auth3.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TEMPORARY TABLE TempTable ( - key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, - value TEXT NOT NULL ON CONFLICT FAIL); - ALTER TABLE TempTable RENAME TO DoNotRead; - SELECT name FROM temp.sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/autoanalyze1.test b/libsql-wal/tests/assets/fixtures/autoanalyze1.test deleted file mode 100644 index 444ead9160..0000000000 --- a/libsql-wal/tests/assets/fixtures/autoanalyze1.test +++ /dev/null @@ -1,62 +0,0 @@ - - -- Build up a test table with some indexes - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d); - CREATE UNIQUE INDEX t1bc ON t1(b,c); - CREATE INDEX t1d ON t1(d); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c,d) SELECT x, x, x, x FROM c; - -- Verify that the hasStat1 flag is clear on on indexes - SELECT idx, flgs FROM pragma_stats - WHERE idx IS NOT NULL - ORDER BY idx; - -- Verify that the TF_HasStat1 flag is clear on the table - SELECT tbl, (flgs & 0x10)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE a=55; - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE a IN (55,199,299); - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE (b,c)=(45,45); - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE d=45; - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE d=45 AND a=45; - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE d=45 AND a IN (45,46); - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT * FROM t1 WHERE b=45; - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - - - SELECT (flgs & 0x0100)!=0 FROM pragma_stats WHERE tbl='t1' AND idx IS NULL; - diff --git a/libsql-wal/tests/assets/fixtures/autoinc.test b/libsql-wal/tests/assets/fixtures/autoinc.test deleted file mode 100644 index 9d3ca143a9..0000000000 --- a/libsql-wal/tests/assets/fixtures/autoinc.test +++ /dev/null @@ -1,32 +0,0 @@ - - DELETE FROM sqlite_sequence; - CREATE TABLE t10a(a INTEGER PRIMARY KEY AUTOINCREMENT, b UNIQUE); - INSERT INTO t10a VALUES(888,9999); - CREATE TABLE t10b(x INTEGER PRIMARY KEY AUTOINCREMENT, y UNIQUE); - INSERT INTO t10b SELECT * FROM t10a; - SELECT * FROM sqlite_sequence; - - - CREATE TABLE t11(a INTEGER PRIMARY KEY AUTOINCREMENT,b UNIQUE); - INSERT INTO t11(a,b) VALUES(2,3),(5,6),(4,3),(1,2) - ON CONFLICT(b) DO UPDATE SET a=a+1000; - SELECT seq FROM sqlite_sequence WHERE name='t11'; - - - CREATE TABLE t1(i INTEGER PRIMARY KEY AUTOINCREMENT, j); - CREATE TABLE t2(i INTEGER PRIMARY KEY AUTOINCREMENT, j); - CREATE TABLE t3(i INTEGER PRIMARY KEY AUTOINCREMENT, j); - - INSERT INTO t1 VALUES(NULL, 1); - INSERT INTO t2 VALUES(NULL, 2); - INSERT INTO t3 VALUES(NULL, 3); - - SELECT name FROM sqlite_sequence; - - - UPDATE sqlite_sequence SET name=NULL WHERE name='t2'; - INSERT INTO t3 VALUES(NULL, 4); - DELETE FROM t3; - INSERT INTO t3 VALUES(NULL, 5); - SELECT * FROM t3; - diff --git a/libsql-wal/tests/assets/fixtures/autoindex1.test b/libsql-wal/tests/assets/fixtures/autoindex1.test deleted file mode 100644 index d74091bdca..0000000000 --- a/libsql-wal/tests/assets/fixtures/autoindex1.test +++ /dev/null @@ -1,293 +0,0 @@ - - UPDATE sqlite_stat1 SET stat='10000' WHERE tbl='t2'; - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN - SELECT b, d FROM t1 CROSS JOIN t2 ON (c=a); - - - CREATE TABLE t501(a INTEGER PRIMARY KEY, b); - CREATE TABLE t502(x INTEGER PRIMARY KEY, y); - INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t501',null,'1000000'); - INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t502',null,'1000'); - ANALYZE sqlite_master; - - - CREATE TABLE flock_owner( - owner_rec_id INTEGER CONSTRAINT flock_owner_key PRIMARY KEY, - flock_no VARCHAR(6) NOT NULL REFERENCES flock (flock_no), - owner_person_id INTEGER NOT NULL REFERENCES person (person_id), - owner_change_date TEXT, last_changed TEXT NOT NULL, - CONSTRAINT fo_owner_date UNIQUE (flock_no, owner_change_date) - ); - CREATE TABLE sheep ( - Sheep_No char(7) NOT NULL, - Date_of_Birth char(8), - Sort_DoB text, - Flock_Book_Vol char(2), - Breeder_No char(6), - Breeder_Person integer, - Originating_Flock char(6), - Registering_Flock char(6), - Tag_Prefix char(9), - Tag_No char(15), - Sort_Tag_No integer, - Breeders_Temp_Tag char(15), - Sex char(1), - Sheep_Name char(32), - Sire_No char(7), - Dam_No char(7), - Register_Code char(1), - Colour char(48), - Colour_Code char(2), - Pattern_Code char(8), - Horns char(1), - Litter_Size char(1), - Coeff_of_Inbreeding real, - Date_of_Registration text, - Date_Last_Changed text, - UNIQUE(Sheep_No)); - CREATE INDEX fo_flock_no_index - ON flock_owner (flock_no); - CREATE INDEX fo_owner_change_date_index - ON flock_owner (owner_change_date); - CREATE INDEX fo_owner_person_id_index - ON flock_owner (owner_person_id); - CREATE INDEX sheep_org_flock_index - ON sheep (originating_flock); - CREATE INDEX sheep_reg_flock_index - ON sheep (registering_flock); - - - CREATE TABLE t5(a, b, c); - - - CREATE TABLE accounts( - _id INTEGER PRIMARY KEY AUTOINCREMENT, - account_name TEXT, - account_type TEXT, - data_set TEXT - ); - CREATE TABLE data( - _id INTEGER PRIMARY KEY AUTOINCREMENT, - package_id INTEGER REFERENCES package(_id), - mimetype_id INTEGER REFERENCES mimetype(_id) NOT NULL, - raw_contact_id INTEGER REFERENCES raw_contacts(_id) NOT NULL, - is_read_only INTEGER NOT NULL DEFAULT 0, - is_primary INTEGER NOT NULL DEFAULT 0, - is_super_primary INTEGER NOT NULL DEFAULT 0, - data_version INTEGER NOT NULL DEFAULT 0, - data1 TEXT, - data2 TEXT, - data3 TEXT, - data4 TEXT, - data5 TEXT, - data6 TEXT, - data7 TEXT, - data8 TEXT, - data9 TEXT, - data10 TEXT, - data11 TEXT, - data12 TEXT, - data13 TEXT, - data14 TEXT, - data15 TEXT, - data_sync1 TEXT, - data_sync2 TEXT, - data_sync3 TEXT, - data_sync4 TEXT - ); - CREATE TABLE mimetypes( - _id INTEGER PRIMARY KEY AUTOINCREMENT, - mimetype TEXT NOT NULL - ); - CREATE TABLE raw_contacts( - _id INTEGER PRIMARY KEY AUTOINCREMENT, - account_id INTEGER REFERENCES accounts(_id), - sourceid TEXT, - raw_contact_is_read_only INTEGER NOT NULL DEFAULT 0, - version INTEGER NOT NULL DEFAULT 1, - dirty INTEGER NOT NULL DEFAULT 0, - deleted INTEGER NOT NULL DEFAULT 0, - contact_id INTEGER REFERENCES contacts(_id), - aggregation_mode INTEGER NOT NULL DEFAULT 0, - aggregation_needed INTEGER NOT NULL DEFAULT 1, - custom_ringtone TEXT, - send_to_voicemail INTEGER NOT NULL DEFAULT 0, - times_contacted INTEGER NOT NULL DEFAULT 0, - last_time_contacted INTEGER, - starred INTEGER NOT NULL DEFAULT 0, - display_name TEXT, - display_name_alt TEXT, - display_name_source INTEGER NOT NULL DEFAULT 0, - phonetic_name TEXT, - phonetic_name_style TEXT, - sort_key TEXT, - sort_key_alt TEXT, - name_verified INTEGER NOT NULL DEFAULT 0, - sync1 TEXT, - sync2 TEXT, - sync3 TEXT, - sync4 TEXT, - sync_uid TEXT, - sync_version INTEGER NOT NULL DEFAULT 1, - has_calendar_event INTEGER NOT NULL DEFAULT 0, - modified_time INTEGER, - is_restricted INTEGER DEFAULT 0, - yp_source TEXT, - method_selected INTEGER DEFAULT 0, - custom_vibration_type INTEGER DEFAULT 0, - custom_ringtone_path TEXT, - message_notification TEXT, - message_notification_path TEXT - ); - CREATE INDEX data_mimetype_data1_index ON data (mimetype_id,data1); - CREATE INDEX data_raw_contact_id ON data (raw_contact_id); - CREATE UNIQUE INDEX mime_type ON mimetypes (mimetype); - CREATE INDEX raw_contact_sort_key1_index ON raw_contacts (sort_key); - CREATE INDEX raw_contact_sort_key2_index ON raw_contacts (sort_key_alt); - CREATE INDEX raw_contacts_contact_id_index ON raw_contacts (contact_id); - CREATE INDEX raw_contacts_source_id_account_id_index - ON raw_contacts (sourceid, account_id); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 - VALUES('raw_contacts','raw_contact_sort_key2_index','1600 4'); - INSERT INTO sqlite_stat1 - VALUES('raw_contacts','raw_contact_sort_key1_index','1600 4'); - INSERT INTO sqlite_stat1 - VALUES('raw_contacts','raw_contacts_source_id_account_id_index', - '1600 1600 1600'); - INSERT INTO sqlite_stat1 - VALUES('raw_contacts','raw_contacts_contact_id_index','1600 1'); - INSERT INTO sqlite_stat1 VALUES('mimetypes','mime_type','12 1'); - INSERT INTO sqlite_stat1 - VALUES('data','data_mimetype_data1_index','9819 2455 3'); - INSERT INTO sqlite_stat1 VALUES('data','data_raw_contact_id','9819 7'); - INSERT INTO sqlite_stat1 VALUES('accounts',NULL,'1'); - DROP TABLE IF EXISTS sqlite_stat3; - ANALYZE sqlite_master; - - EXPLAIN QUERY PLAN - SELECT * FROM - data JOIN mimetypes ON (data.mimetype_id=mimetypes._id) - JOIN raw_contacts ON (data.raw_contact_id=raw_contacts._id) - JOIN accounts ON (raw_contacts.account_id=accounts._id) - WHERE mimetype_id=10 AND data14 IS NOT NULL; - - - EXPLAIN QUERY PLAN - SELECT * FROM - data JOIN mimetypes ON (data.mimetype_id=mimetypes._id) - JOIN raw_contacts ON (data.raw_contact_id=raw_contacts._id) - JOIN accounts ON (raw_contacts.account_id=accounts._id) - WHERE mimetypes._id=10 AND data14 IS NOT NULL; - - - CREATE TABLE messages (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id, document_id BLOB, in_reply_to, remote_id INTEGER, sender INTEGER, subject_prefix, subject INTEGER, date_sent INTEGER, date_received INTEGER, date_created INTEGER, date_last_viewed INTEGER, mailbox INTEGER, remote_mailbox INTEGER, original_mailbox INTEGER, flags INTEGER, read, flagged, size INTEGER, color, encoding, type INTEGER, pad, conversation_id INTEGER DEFAULT -1, snippet TEXT DEFAULT NULL, fuzzy_ancestor INTEGER DEFAULT NULL, automated_conversation INTEGER DEFAULT 0, root_status INTEGER DEFAULT -1, conversation_position INTEGER DEFAULT -1); - CREATE INDEX date_index ON messages(date_received); - CREATE INDEX date_last_viewed_index ON messages(date_last_viewed); - CREATE INDEX date_created_index ON messages(date_created); - CREATE INDEX message_message_id_mailbox_index ON messages(message_id, mailbox); - CREATE INDEX message_document_id_index ON messages(document_id); - CREATE INDEX message_read_index ON messages(read); - CREATE INDEX message_flagged_index ON messages(flagged); - CREATE INDEX message_mailbox_index ON messages(mailbox, date_received); - CREATE INDEX message_remote_mailbox_index ON messages(remote_mailbox, remote_id); - CREATE INDEX message_type_index ON messages(type); - CREATE INDEX message_conversation_id_conversation_position_index ON messages(conversation_id, conversation_position); - CREATE INDEX message_fuzzy_ancestor_index ON messages(fuzzy_ancestor); - CREATE INDEX message_subject_fuzzy_ancestor_index ON messages(subject, fuzzy_ancestor); - CREATE INDEX message_sender_subject_automated_conversation_index ON messages(sender, subject, automated_conversation); - CREATE INDEX message_sender_index ON messages(sender); - CREATE INDEX message_root_status ON messages(root_status); - CREATE TABLE subjects (ROWID INTEGER PRIMARY KEY, subject COLLATE RTRIM, normalized_subject COLLATE RTRIM); - CREATE INDEX subject_subject_index ON subjects(subject); - CREATE INDEX subject_normalized_subject_index ON subjects(normalized_subject); - CREATE TABLE addresses (ROWID INTEGER PRIMARY KEY, address COLLATE NOCASE, comment, UNIQUE(address, comment)); - CREATE INDEX addresses_address_index ON addresses(address); - CREATE TABLE mailboxes (ROWID INTEGER PRIMARY KEY, url UNIQUE, total_count INTEGER DEFAULT 0, unread_count INTEGER DEFAULT 0, unseen_count INTEGER DEFAULT 0, deleted_count INTEGER DEFAULT 0, unread_count_adjusted_for_duplicates INTEGER DEFAULT 0, change_identifier, source INTEGER, alleged_change_identifier); - CREATE INDEX mailboxes_source_index ON mailboxes(source); - CREATE TABLE labels (ROWID INTEGER PRIMARY KEY, message_id INTEGER NOT NULL, mailbox_id INTEGER NOT NULL, UNIQUE(message_id, mailbox_id)); - CREATE INDEX labels_message_id_mailbox_id_index ON labels(message_id, mailbox_id); - CREATE INDEX labels_mailbox_id_index ON labels(mailbox_id); - - explain query plan - SELECT messages.ROWID, - messages.message_id, - messages.remote_id, - messages.date_received, - messages.date_sent, - messages.flags, - messages.size, - messages.color, - messages.date_last_viewed, - messages.subject_prefix, - subjects.subject, - sender.comment, - sender.address, - NULL, - messages.mailbox, - messages.original_mailbox, - NULL, - NULL, - messages.type, - messages.document_id, - sender, - NULL, - messages.conversation_id, - messages.conversation_position, - agglabels.labels - FROM mailboxes AS mailbox - JOIN messages ON mailbox.ROWID = messages.mailbox - LEFT OUTER JOIN subjects ON messages.subject = subjects.ROWID - LEFT OUTER JOIN addresses AS sender ON messages.sender = sender.ROWID - LEFT OUTER JOIN ( - SELECT message_id, group_concat(mailbox_id) as labels - FROM labels GROUP BY message_id - ) AS agglabels ON messages.ROWID = agglabels.message_id - WHERE (mailbox.url = 'imap://email.app@imap.gmail.com/%5BGmail%5D/All%20Mail') - AND (messages.ROWID IN ( - SELECT labels.message_id - FROM labels JOIN mailboxes ON labels.mailbox_id = mailboxes.ROWID - WHERE mailboxes.url = 'imap://email.app@imap.gmail.com/INBOX')) - AND messages.mailbox in (6,12,18,24,30,36,42,1,7,13,19,25,31,37,43,2,8, - 14,20,26,32,38,3,9,15,21,27,33,39,4,10,16,22,28, - 34,40,5,11,17,23,35,41) - ORDER BY date_received DESC; - - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z); - CREATE TABLE t2(a, b); - CREATE VIEW agg2 AS SELECT a, sum(b) AS m FROM t2 GROUP BY a; - EXPLAIN QUERY PLAN - SELECT t1.z, agg2.m - FROM t1 JOIN agg2 ON t1.y=agg2.m - WHERE t1.x IN (1,2,3); - - - CREATE TABLE t920(x); - INSERT INTO t920 VALUES(3),(4),(5); - SELECT * FROM t920,(SELECT 0 FROM t920),(VALUES(9)) WHERE 5 IN (x); - - - CREATE TABLE t11(w); - CREATE TABLE t12(y); - INSERT INTO t11 VALUES(NULL); - INSERT INTO t12 VALUES('notnull'); - - - SELECT count(*) FROM t11 LEFT JOIN t12 WHERE t12.y IS t11.w; - - - CREATE TABLE t1(a INT, b INT); - CREATE TABLE t2(c INT, d INT); - CREATE TABLE t3(e TEXT, f TEXT); - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t2 VALUES(1, 2); - INSERT INTO t3 VALUES('abc', 'def'); - - - SELECT * FROM t1, t2 LEFT JOIN t3 ON (t2.d=1) WHERE t2.c = +t1.a; - - - SELECT * FROM t1 LEFT JOIN t2 ON (t2.c=+t1.a) LEFT JOIN t3 ON (t2.d IS NULL); - diff --git a/libsql-wal/tests/assets/fixtures/autoindex2.test b/libsql-wal/tests/assets/fixtures/autoindex2.test deleted file mode 100644 index 4546398879..0000000000 --- a/libsql-wal/tests/assets/fixtures/autoindex2.test +++ /dev/null @@ -1,199 +0,0 @@ - - CREATE TABLE t1( - t1_id largeint, - did char(9), - ptime largeint, - exbyte char(4), - pe_id int, - field_id int, - mass float, - param10 float, - param11 float, - exmass float, - deviation float, - trange float, - vstatus int, - commit_status int, - formula char(329), - tier int DEFAULT 2, - ssid int DEFAULT 0, - last_operation largeint DEFAULT 0, - admin_uuid int DEFAULT 0, - previous_value float, - job_id largeint, - last_t1 largeint DEFAULT 0, - data_t1 int, - previous_date largeint DEFAULT 0, - flg8 int DEFAULT 1, - failed_fields char(100) - ); - CREATE INDEX t1x0 on t1 (t1_id); - CREATE INDEX t1x1 on t1 (ptime, vstatus); - CREATE INDEX t1x2 on t1 (did, ssid, ptime, vstatus, exbyte, t1_id); - CREATE INDEX t1x3 on t1 (job_id); - - CREATE TABLE t2( - did char(9), - client_did char(30), - description char(49), - uid int, - tzid int, - privilege int, - param2 int, - type char(30), - subtype char(32), - dparam1 char(7) DEFAULT '', - param5 char(3) DEFAULT '', - notional float DEFAULT 0.000000, - create_time largeint, - sample_time largeint DEFAULT 0, - param6 largeint, - frequency int, - expiration largeint, - uw_status int, - next_sample largeint, - last_sample largeint, - reserve1 char(29) DEFAULT '', - reserve2 char(29) DEFAULT '', - reserve3 char(29) DEFAULT '', - bxcdr char(19) DEFAULT 'XY', - ssid int DEFAULT 1, - last_t1_id largeint, - reserve4 char(29) DEFAULT '', - reserve5 char(29) DEFAULT '', - param12 int DEFAULT 0, - long_did char(100) DEFAULT '', - gr_code int DEFAULT 0, - drx char(100) DEFAULT '', - parent_id char(9) DEFAULT '', - param13 int DEFAULT 0, - position float DEFAULT 1.000000, - client_did3 char(100) DEFAULT '', - client_did4 char(100) DEFAULT '', - dlib_id char(9) DEFAULT '' - ); - CREATE INDEX t2x0 on t2 (did); - CREATE INDEX t2x1 on t2 (client_did); - CREATE INDEX t2x2 on t2 (long_did); - CREATE INDEX t2x3 on t2 (uid); - CREATE INDEX t2x4 on t2 (param2); - CREATE INDEX t2x5 on t2 (type); - CREATE INDEX t2x6 on t2 (subtype); - CREATE INDEX t2x7 on t2 (last_sample); - CREATE INDEX t2x8 on t2 (param6); - CREATE INDEX t2x9 on t2 (frequency); - CREATE INDEX t2x10 on t2 (privilege); - CREATE INDEX t2x11 on t2 (sample_time); - CREATE INDEX t2x12 on t2 (notional); - CREATE INDEX t2x13 on t2 (tzid); - CREATE INDEX t2x14 on t2 (gr_code); - CREATE INDEX t2x15 on t2 (parent_id); - - CREATE TABLE t3( - uid int, - param3 int, - uuid int, - acc_id int, - cust_num int, - numerix_id int, - pfy char(29), - param4 char(29), - param15 int DEFAULT 0, - flg7 int DEFAULT 0, - param21 int DEFAULT 0, - bxcdr char(2) DEFAULT 'PC', - c31 int DEFAULT 0, - c33 int DEFAULT 0, - c35 int DEFAULT 0, - c37 int, - mgr_uuid int, - back_up_uuid int, - priv_mars int DEFAULT 0, - is_qc int DEFAULT 0, - c41 int DEFAULT 0, - deleted int DEFAULT 0, - c47 int DEFAULT 1 - ); - CREATE INDEX t3x0 on t3 (uid); - CREATE INDEX t3x1 on t3 (param3); - CREATE INDEX t3x2 on t3 (uuid); - CREATE INDEX t3x3 on t3 (acc_id); - CREATE INDEX t3x4 on t3 (param4); - CREATE INDEX t3x5 on t3 (pfy); - CREATE INDEX t3x6 on t3 (is_qc); - SELECT count(*) FROM sqlite_master; - - - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('t1','t1x3','10747267 260'); - INSERT INTO sqlite_stat1 VALUES('t1','t1x2','10747267 121 113 2 2 2 1'); - INSERT INTO sqlite_stat1 VALUES('t1','t1x1','10747267 50 40'); - INSERT INTO sqlite_stat1 VALUES('t1','t1x0','10747267 1'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x15','39667 253'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x14','39667 19834'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x13','39667 13223'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x12','39667 7'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x11','39667 17'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x10','39667 19834'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x9','39667 7934'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x8','39667 11'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x7','39667 5'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x6','39667 242'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x5','39667 1984'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x4','39667 4408'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x3','39667 81'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x2','39667 551'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x1','39667 2'); - INSERT INTO sqlite_stat1 VALUES('t2','t2x0','39667 1'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x6','569 285'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x5','569 2'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x4','569 2'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x3','569 5'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x2','569 3'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x1','569 6'); - INSERT INTO sqlite_stat1 VALUES('t3','t3x0','569 1'); - ANALYZE sqlite_master; - - - EXPLAIN QUERY PLAN - SELECT - t1_id, - t1.did, - param2, - param3, - t1.ptime, - t1.trange, - t1.exmass, - t1.mass, - t1.vstatus, - type, - subtype, - t1.deviation, - t1.formula, - dparam1, - reserve1, - reserve2, - param4, - t1.last_operation, - t1.admin_uuid, - t1.previous_value, - t1.job_id, - client_did, - t1.last_t1, - t1.data_t1, - t1.previous_date, - param5, - param6, - mgr_uuid - FROM - t1, - t2, - t3 - WHERE - t1.ptime > 1393520400 - AND param3<>9001 - AND t3.flg7 = 1 - AND t1.did = t2.did - AND t2.uid = t3.uid - ORDER BY t1.ptime desc LIMIT 500; - diff --git a/libsql-wal/tests/assets/fixtures/autoindex3.test b/libsql-wal/tests/assets/fixtures/autoindex3.test deleted file mode 100644 index 1c04519c87..0000000000 --- a/libsql-wal/tests/assets/fixtures/autoindex3.test +++ /dev/null @@ -1,38 +0,0 @@ - - CREATE TABLE t1(a,b,x); - CREATE TABLE t2(c,d,y); - CREATE INDEX t1b ON t1(b); - CREATE INDEX t2d ON t2(d); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('t1','t1b','10000 500'); - INSERT INTO sqlite_stat1 VALUES('t2','t2d','10000 500'); - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1, t2 WHERE d=b; - - - EXPLAIN QUERY PLAN SELECT * FROM t1, t2 WHERE d>b AND x=y; - - - EXPLAIN QUERY PLAN SELECT * FROM t1, t2 WHERE d ''), - fixed_version_id INTEGER NOT NULL DEFAULT 0, - release TEXT NOT NULL, - package_kind TEXT NOT NULL DEFAULT 'unknown', - urgency TEXT NOT NULL, - bug_origin TEXT NOT NULL DEFAULT ''); - CREATE INDEX package_notes_package - ON package_notes(package); - CREATE UNIQUE INDEX package_notes_bug - ON package_notes(bug_name, package, release); - - CREATE TABLE debian_bugs - (bug INTEGER NOT NULL, - note INTEGER NOT NULL, - PRIMARY KEY (bug, note)); - - - CREATE VIEW debian_cve AS - SELECT DISTINCT debian_bugs.bug, st.bug_name - FROM package_notes, debian_bugs, source_package_status AS st - WHERE package_notes.bug_name = st.bug_name - AND debian_bugs.note = package_notes.id - ORDER BY debian_bugs.bug; - - - CREATE TABLE one(o); - INSERT INTO one DEFAULT VALUES; - - CREATE TABLE t1(x, z); - INSERT INTO t1 VALUES('aaa', 4.0); - INSERT INTO t1 VALUES('aaa', 4.0); - CREATE VIEW vvv AS - SELECT * FROM t1 - UNION ALL - SELECT 0, 0 WHERE 0; - - SELECT ( - SELECT sum(z) FROM vvv WHERE x='aaa' - ) FROM one; - - - -- This is the original test case reported on the mailing list - CREATE TABLE artists ( - id integer NOT NULL PRIMARY KEY AUTOINCREMENT, - name varchar(255) - ); - CREATE TABLE albums ( - id integer NOT NULL PRIMARY KEY AUTOINCREMENT, - name varchar(255), - artist_id integer REFERENCES artists - ); - INSERT INTO artists (name) VALUES ('Ar'); - INSERT INTO albums (name, artist_id) VALUES ('Al', 1); - SELECT artists.* - FROM artists - INNER JOIN artists AS 'b' ON (b.id = artists.id) - WHERE (artists.id IN ( - SELECT albums.artist_id - FROM albums - WHERE ((name = 'Al') - AND (albums.artist_id IS NOT NULL) - AND (albums.id IN ( - SELECT id - FROM ( - SELECT albums.id, - row_number() OVER ( - PARTITION BY albums.artist_id - ORDER BY name - ) AS 'x' - FROM albums - WHERE (name = 'Al') - ) AS 't1' - WHERE (x = 1) - )) - AND (albums.id IN (1, 2))) - )); - - - CREATE TABLE t1 (a); INSERT INTO t1 (a) VALUES (104); - CREATE TABLE t2 (b); INSERT INTO t2 (b) VALUES (104); - CREATE TABLE t3 (c); INSERT INTO t3 (c) VALUES (104); - CREATE TABLE t4 (d); INSERT INTO t4 (d) VALUES (104); - SELECT * - FROM t1 CROSS JOIN t2 ON (t1.a = t2.b) WHERE t2.b IN ( - SELECT t3.c - FROM t3 - WHERE t3.c IN ( - SELECT d FROM (SELECT DISTINCT d FROM t4) AS x WHERE x.d=104 - ) - ); - - - CREATE TABLE t5(a, b, c, d); - CREATE INDEX t5a ON t5(a); - CREATE INDEX t5b ON t5(b); - CREATE TABLE t6(e); - INSERT INTO t6 VALUES(1); - INSERT INTO t5 VALUES(1,1,1,1), (2,2,2,2); - SELECT * FROM t5 WHERE (a=1 OR b=2) AND c IN ( - SELECT e FROM (SELECT DISTINCT e FROM t6) WHERE e=1 - ); - - - CREATE TABLE t1(a1, a2, a3); - CREATE INDEX t1a2 ON t1(a2, a1); - CREATE INDEX t1a3 ON t1(a3, a1); - CREATE TABLE t2(d); - INSERT INTO t1 VALUES(3, 1, 1), (3, 2, 2); - INSERT INTO t2 VALUES(3); - SELECT *, 'x' FROM t1 WHERE (a2=1 OR a3=2) AND a1 = ( - SELECT d FROM (SELECT DISTINCT d FROM t2) WHERE d=3 - ); - diff --git a/libsql-wal/tests/assets/fixtures/autovacuum.test b/libsql-wal/tests/assets/fixtures/autovacuum.test deleted file mode 100644 index 819798e9a6..0000000000 --- a/libsql-wal/tests/assets/fixtures/autovacuum.test +++ /dev/null @@ -1,7 +0,0 @@ - - DROP TABLE t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(25, randomblob(104)); - REPLACE INTO t1 VALUES(25, randomblob(1117)); - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/autovacuum2.test b/libsql-wal/tests/assets/fixtures/autovacuum2.test deleted file mode 100644 index 7ddd675562..0000000000 --- a/libsql-wal/tests/assets/fixtures/autovacuum2.test +++ /dev/null @@ -1,36 +0,0 @@ - - PRAGMA page_size=1024; - PRAGMA auto_vacuum=FULL; - CREATE TABLE t1(x); - VACUUM; - INSERT INTO t1(x) VALUES(zeroblob(10000)); - PRAGMA page_count; - - - BEGIN; - DELETE FROM t1; - PRAGMA freelist_count; - PRAGMA page_count; - - - COMMIT; - - - PRAGMA freelist_count; - PRAGMA page_count; - - - PRAGMA integrity_check; - - - CREATE TABLE t2(x); - PRAGMA freelist_count; - - - BEGIN; - INSERT INTO t1(x) VALUES(zeroblob(10000)); - DELETE FROM t1; - PRAGMA freelist_count; - COMMIT; - PRAGMA freelist_count; - diff --git a/libsql-wal/tests/assets/fixtures/autovacuum_ioerr2.test b/libsql-wal/tests/assets/fixtures/autovacuum_ioerr2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/avfs.test b/libsql-wal/tests/assets/fixtures/avfs.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/avtrans.test b/libsql-wal/tests/assets/fixtures/avtrans.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/backcompat.test b/libsql-wal/tests/assets/fixtures/backcompat.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/backup.test b/libsql-wal/tests/assets/fixtures/backup.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/backup2.test b/libsql-wal/tests/assets/fixtures/backup2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/backup4.test b/libsql-wal/tests/assets/fixtures/backup4.test deleted file mode 100644 index d83c522fde..0000000000 --- a/libsql-wal/tests/assets/fixtures/backup4.test +++ /dev/null @@ -1,19 +0,0 @@ - - CREATE TABLE t1(x, y, UNIQUE(x, y)); - INSERT INTO t1 VALUES('one', 'two'); - SELECT * FROM t1 WHERE x='one'; - PRAGMA integrity_check; - - - SELECT * FROM t1 WHERE x='one'; - PRAGMA integrity_check; - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - - - PRAGMA page_size = 4096; - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/backup5.test b/libsql-wal/tests/assets/fixtures/backup5.test deleted file mode 100644 index 305f722abc..0000000000 --- a/libsql-wal/tests/assets/fixtures/backup5.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - INSERT INTO t2 VALUES(1, 1); - INSERT INTO t2 VALUES(2, 2); - INSERT INTO t2 VALUES(3, 3); - diff --git a/libsql-wal/tests/assets/fixtures/backup_ioerr.test b/libsql-wal/tests/assets/fixtures/backup_ioerr.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/backup_malloc.test b/libsql-wal/tests/assets/fixtures/backup_malloc.test deleted file mode 100644 index faa5a11313..0000000000 --- a/libsql-wal/tests/assets/fixtures/backup_malloc.test +++ /dev/null @@ -1,7 +0,0 @@ - - PRAGMA page_size = 16384; - BEGIN; - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/badutf.test b/libsql-wal/tests/assets/fixtures/badutf.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/badutf2.test b/libsql-wal/tests/assets/fixtures/badutf2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/basexx1.test b/libsql-wal/tests/assets/fixtures/basexx1.test deleted file mode 100644 index eecf852951..0000000000 --- a/libsql-wal/tests/assets/fixtures/basexx1.test +++ /dev/null @@ -1,71 +0,0 @@ - - SELECT base64(x'')||base85(x''); - - - SELECT hex(x'01'||base64('')||base85('')||x'02'); - - - SELECT base64(x'000102030405'); - SELECT base64(x'0001020304'); - SELECT base64(x'00010203'); - - - SELECT hex(base64('AAECAwQF')); - SELECT hex(base64('AAECAwQ=')); - SELECT hex(base64('AAECAw==')); - - - SELECT hex(base64(' AAECAwQF ')); - SELECT hex(base64(' AAECAwQ')); - SELECT hex(base64('AAECAw ')); - - - SELECT base85(x'000102030405'); - SELECT base85(x'0001020304'); - SELECT base85(x'00010203'); - - - SELECT hex(base85('##/2,#2/')); - SELECT hex(base85('##/2,#*')); - SELECT hex(base85('##/2,')); - SELECT hex(base85(' ##/2,#2/ ')); - SELECT hex(base85(' ##/2,#*')); - SELECT hex(base85('##/2, ')); - - - CREATE TEMP TABLE rb( len int, b blob ) STRICT; - INSERT INTO rb(len) VALUES (1),(2),(3),(4),(5),(150),(151),(152),(153),(1054); - UPDATE rb SET b = randomblob(len); - SELECT len, base64(base64(b))=b, base85(base85(b))=b - FROM rb ORDER BY len; - - - CREATE TEMP TABLE junk(j text, rank int); - INSERT INTO junk VALUES ('',0),(' ',1),('~',2); - SELECT len, base64(j.j||base64(b)||j.j)=b, base85(j.j||base85(b)||j.j)=b - FROM rb r, junk j WHERE j.rank=(r.len+r.len/25)%3 ORDER BY len; - - - SELECT is_base85(' '||base85(x'123456')||char(10)), - is_base85('#$%&*+,-./0123456789:;<=>?@' - ||'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - ||'[\]^_`' - ||'abcdefghijklmnopqrstuvwxyz'), - is_base85('!'), is_base85('"'), is_base85(''''), is_base85('('), - is_base85(')'), is_base85(char(123)), is_base85('|'), is_base85(char(125)), - is_base85('~'), is_base85(char(127)); - - - SELECT is_base85(NULL) IS NULL; - - - CREATE TABLE bs(b blob, num); - INSERT INTO bs SELECT randomblob(4000 + n%3), n - FROM ( - WITH RECURSIVE seq(n) AS ( - VALUES(1) UNION ALL SELECT n+1 - FROM seq WHERE n<100 - ) SELECT n FROM seq); - SELECT num FROM bs WHERE base64(base64(b))!=b; - SELECT num FROM bs WHERE base85(base85(b))!=b; - diff --git a/libsql-wal/tests/assets/fixtures/bestindex1.test b/libsql-wal/tests/assets/fixtures/bestindex1.test deleted file mode 100644 index 8e19a9371a..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex1.test +++ /dev/null @@ -1,28 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING tcl(vtab_command); - - - CREATE TABLE t1x(i INTEGER PRIMARY KEY, a, b); - INSERT INTO t1x VALUES(1, 'one', 1); - INSERT INTO t1x VALUES(2, 'two', 2); - INSERT INTO t1x VALUES(3, 'three', 3); - INSERT INTO t1x VALUES(4, 'four', 4); - - - CREATE VIRTUAL TABLE VirtualTableA USING tcl(vtab_command); - CREATE VIRTUAL TABLE VirtualTableB USING tcl(vtab_command); - - SELECT primarykey FROM VirtualTableA - - SELECT * FROM - VirtualTableA a CROSS JOIN VirtualTableB b ON b.PrimaryKey=a.PrimaryKey - WHERE a.ColumnA IN ('ValueA', 'ValueB') AND a.FlagA=0 - - - SELECT * FROM - VirtualTableA a CROSS JOIN VirtualTableB b ON b.PrimaryKey=a.PrimaryKey - WHERE a.FlagA=0 AND a.ColumnA IN ('ValueA', 'ValueB') - - - CREATE VIRTUAL TABLE x1 USING tcl(vtab_command); - diff --git a/libsql-wal/tests/assets/fixtures/bestindex2.test b/libsql-wal/tests/assets/fixtures/bestindex2.test deleted file mode 100644 index 175424c72a..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex2.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING tcl("vtab_cmd t1 {a b - - CREATE TABLE x1(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/bestindex3.test b/libsql-wal/tests/assets/fixtures/bestindex3.test deleted file mode 100644 index 9c98e44d3f..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex3.test +++ /dev/null @@ -1,20 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING tcl("vtab_cmd 0"); - - - CREATE TABLE ttt(a, b, c); - - INSERT INTO ttt VALUES(1, 'two', 'three'); - INSERT INTO ttt VALUES(2, 'one', 'two'); - INSERT INTO ttt VALUES(3, 'three', 'one'); - INSERT INTO ttt VALUES(4, 'y', 'one'); - INSERT INTO ttt VALUES(5, 'x', 'two'); - INSERT INTO ttt VALUES(6, 'y', 'three'); - - - CREATE TABLE t2(x TEXT COLLATE nocase, y TEXT); - CREATE INDEX t2x ON t2(x COLLATE nocase); - CREATE INDEX t2y ON t2(y); - - CREATE VIRTUAL TABLE t3 USING tcl('vvv_command') - CREATE VIRTUAL TABLE t4 USING tcl('yyy_command') diff --git a/libsql-wal/tests/assets/fixtures/bestindex4.test b/libsql-wal/tests/assets/fixtures/bestindex4.test deleted file mode 100644 index 0d8b1d9292..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex4.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING tcl(vtab_command); - CREATE TABLE t1 (x INT PRIMARY KEY); - diff --git a/libsql-wal/tests/assets/fixtures/bestindex5.test b/libsql-wal/tests/assets/fixtures/bestindex5.test deleted file mode 100644 index 910c2360a9..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex5.test +++ /dev/null @@ -1,43 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING tcl('vtab_cmd'); - CREATE TABLE t1x(a INTEGER, b TEXT, c REAL); - INSERT INTO t1x VALUES(1, 2, 3); - INSERT INTO t1x VALUES(4, 5, 6); - INSERT INTO t1x VALUES(7, 8, 9); - - CREATE VIRTUAL TABLE t2 USING tcl('vtab_simple'); - CREATE TABLE t2x(x INTEGER); - INSERT INTO t2x VALUES(1); - - - DELETE FROM t1x; - INSERT INTO t1x VALUES('a', 'b', 'c'); - - SELECT * FROM t1 - SELECT * FROM t1 WHERE (a, b) != ('a', 'b'); - - DELETE FROM t1x; - INSERT INTO t1x VALUES(7, 8, 9); - - SELECT * FROM t1 - SELECT * FROM t1 WHERE (a, b) != (7, '8') - SELECT * FROM t1 WHERE a!=7 OR b!='8' - SELECT * FROM t1 WHERE a!=7 OR b!='8' - - CREATE TABLE t3(a INTEGER, b TEXT); - INSERT INTO t3 VALUES(45, 46); - - SELECT * FROM t3 WHERE (a, b) != (45, 46); - SELECT * FROM t3 WHERE (a, b) != ('45', '46'); - SELECT * FROM t3 WHERE (a, b) == (45, 46); - SELECT * FROM t3 WHERE (a, b) == ('45', '46'); - - CREATE TABLE t4x(a INTEGER); - INSERT INTO t4x VALUES(245); - CREATE VIRTUAL TABLE t4 USING tcl('vtab_simple_integer'); - - SELECT rowid, * FROM t4 WHERE x=245; - SELECT rowid, * FROM t4 WHERE x='245'; - SELECT rowid, * FROM t4 WHERE x!=245; - SELECT rowid, * FROM t4 WHERE x!='245'; - SELECT rowid, * FROM t4 WHERE rowid!=1 OR x!='245'; diff --git a/libsql-wal/tests/assets/fixtures/bestindex6.test b/libsql-wal/tests/assets/fixtures/bestindex6.test deleted file mode 100644 index 6ac63cd570..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex6.test +++ /dev/null @@ -1,23 +0,0 @@ - - CREATE TABLE t1(id int, value text); - CREATE TABLE t2(ctx int, id int, value text); - - INSERT INTO t1 VALUES(1,'try'); - INSERT INTO t2 VALUES(1,1,'good'); - INSERT INTO t2 VALUES(2,2,'evil'); - - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - CREATE VIRTUAL TABLE vt2 USING tcl(vtab_command t2); - - - select * from t2 left join t1 on t1.id=t2.ctx where t1.value is null; - - - select * from vt2 left join vt1 on vt1.id=vt2.ctx where vt1.value is null; - - - select * from vt2 left join vt1 on vt1.id=vt2.ctx where vt1.value is $xxx; - - - select * from t2 left join vt1 on vt1.id=t2.ctx where vt1.value = 3 - diff --git a/libsql-wal/tests/assets/fixtures/bestindex7.test b/libsql-wal/tests/assets/fixtures/bestindex7.test deleted file mode 100644 index b44b9d0872..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex7.test +++ /dev/null @@ -1,20 +0,0 @@ - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(0), (2); - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - - select * from vt1 - select * from vt1 WHERE a=0 - select * from vt1 WHERE a=1 - select * from vt1 WHERE a=1 OR a=0 - - UPDATE t1 SET x=NULL WHERE x=2; - - select * from vt1 - select * from vt1 WHERE a=0 - select * from vt1 WHERE a=1 - select * from vt1 WHERE a=1 OR a=0 - select * from vt1 WHERE a IN (2) - select * from vt1 WHERE a IN (0,1,2,3) - select * from vt1 WHERE a IN (0, NULL) - select * from vt1 WHERE a IN (NULL) diff --git a/libsql-wal/tests/assets/fixtures/bestindex8.test b/libsql-wal/tests/assets/fixtures/bestindex8.test deleted file mode 100644 index 57bbb6dad5..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindex8.test +++ /dev/null @@ -1,36 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - INSERT INTO t1 VALUES('a', 'b'), ('c', 'd'); - INSERT INTO t1 VALUES('a', 'b'), ('c', 'd'); - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES (1), (0); - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - - - CREATE TABLE t1(a, b, c); - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - - - CREATE TABLE t1(a, b, c); - CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1); - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(2, 3, 4); - INSERT INTO t1 VALUES(3, 4, 5); - INSERT INTO t1 VALUES(1, 5, 6); - INSERT INTO t1 VALUES(2, 6, 7); - INSERT INTO t1 VALUES(3, 7, 8); - INSERT INTO t1 VALUES(1, 8, 9); - INSERT INTO t1 VALUES(2, 9, 0); - diff --git a/libsql-wal/tests/assets/fixtures/bestindex9.test b/libsql-wal/tests/assets/fixtures/bestindex9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/bestindexA.test b/libsql-wal/tests/assets/fixtures/bestindexA.test deleted file mode 100644 index 5622b4617c..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindexA.test +++ /dev/null @@ -1,3 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING tcl(vtab_command); - diff --git a/libsql-wal/tests/assets/fixtures/bestindexB.test b/libsql-wal/tests/assets/fixtures/bestindexB.test deleted file mode 100644 index 8ec157a668..0000000000 --- a/libsql-wal/tests/assets/fixtures/bestindexB.test +++ /dev/null @@ -1,20 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING tcl(vtab_command); - CREATE TABLE y1(a, b); - CREATE TABLE y2(a, b); - - - SELECT * FROM x1 - - - INSERT INTO y1 VALUES(1, 2) RETURNING rowid; - - - CREATE TRIGGER y1tr BEFORE INSERT ON y1 BEGIN - SELECT * FROM x1; - END; - INSERT INTO y1 VALUES(3, 4) RETURNING rowid; - - - INSERT INTO y1 VALUES(5, 6) RETURNING rowid; - diff --git a/libsql-wal/tests/assets/fixtures/between.test b/libsql-wal/tests/assets/fixtures/between.test deleted file mode 100644 index 3ed4034856..0000000000 --- a/libsql-wal/tests/assets/fixtures/between.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(x TEXT, y TEXT COLLATE nocase); - INSERT INTO t1 VALUES('0', 'abc'); - diff --git a/libsql-wal/tests/assets/fixtures/bigfile.test b/libsql-wal/tests/assets/fixtures/bigfile.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/bigfile2.test b/libsql-wal/tests/assets/fixtures/bigfile2.test deleted file mode 100644 index f59d67ca14..0000000000 --- a/libsql-wal/tests/assets/fixtures/bigfile2.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - diff --git a/libsql-wal/tests/assets/fixtures/bigmmap.test b/libsql-wal/tests/assets/fixtures/bigmmap.test deleted file mode 100644 index e54c02825c..0000000000 --- a/libsql-wal/tests/assets/fixtures/bigmmap.test +++ /dev/null @@ -1,6 +0,0 @@ - - PRAGMA page_size = 4096; - CREATE TABLE t0(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c)); - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 100 ) - INSERT INTO t0 SELECT i, 't0', randomblob(800) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/bigrow.test b/libsql-wal/tests/assets/fixtures/bigrow.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/bigsort.test b/libsql-wal/tests/assets/fixtures/bigsort.test deleted file mode 100644 index 44eb20f293..0000000000 --- a/libsql-wal/tests/assets/fixtures/bigsort.test +++ /dev/null @@ -1,11 +0,0 @@ - - PRAGMA page_size = 1024; - CREATE TABLE t1(a, b); - BEGIN; - WITH data(x,y) AS ( SELECT 1, zeroblob(10000) UNION ALL SELECT x+1, y FROM data WHERE x < 30000) INSERT INTO t1 SELECT * FROM data; - COMMIT; - - - PRAGMA cache_size = 4194304; - CREATE INDEX i1 ON t1(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/bind.test b/libsql-wal/tests/assets/fixtures/bind.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/bind2.test b/libsql-wal/tests/assets/fixtures/bind2.test deleted file mode 100644 index 95caad09be..0000000000 --- a/libsql-wal/tests/assets/fixtures/bind2.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE TABLE t1(a REAL); - INSERT INTO t1 VALUES(42.0); - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/bindxfer.test b/libsql-wal/tests/assets/fixtures/bindxfer.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/bitvec.test b/libsql-wal/tests/assets/fixtures/bitvec.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/blob.test b/libsql-wal/tests/assets/fixtures/blob.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/bloom1.test b/libsql-wal/tests/assets/fixtures/bloom1.test deleted file mode 100644 index e624d8a082..0000000000 --- a/libsql-wal/tests/assets/fixtures/bloom1.test +++ /dev/null @@ -1,86 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c INTEGER PRIMARY KEY, d); - - - INSERT INTO t1 VALUES('hello', 'world'); - INSERT INTO t2 VALUES(14, 'fourteen'); - - - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t2','idx1','6 6'); - ANALYZE sqlite_schema; - - - SELECT 'affinity!' FROM t1 CROSS JOIN t2 WHERE t2.c = '14'; - - - CREATE TABLE t1(a, b TEXT); - CREATE TABLE t2(c INTEGER PRIMARY KEY, d); - CREATE TABLE t3(e INTEGER PRIMARY KEY, f); - - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1','idx1','600 6'); - INSERT INTO sqlite_stat1 VALUES('t2','idx1','6 6'); - INSERT INTO sqlite_stat1 VALUES('t3','idx2','6 6'); - ANALYZE sqlite_schema; - - INSERT INTO t1 VALUES(1, '123'); - INSERT INTO t2 VALUES(123, 'one'); - INSERT INTO t3 VALUES(123, 'two'); - - - SELECT 'result' FROM t1, t2, t3 - WHERE t2.c=t1.b AND t2.d!='silly' - AND t3.e=t1.b AND t3.f!='silly' - - - CREATE TABLE objs(c INTEGER, s INTEGER, p INTEGER, o INTEGER); - CREATE UNIQUE INDEX objs_cspo ON objs(o,p,c,s); - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1 VALUES('objs','objs_cspo','520138 21 20 19 1'); - ANALYZE sqlite_schema; - - - CREATE TABLE t0(x TEXT COLLATE rtrim); - INSERT INTO t0(x) VALUES ('a'), ('b'), ('c'); - CREATE VIEW v0(y) AS SELECT DISTINCT x FROM t0; - SELECT count(*) FROM t0, v0 WHERE x='b '; - - - CREATE TABLE t1(x INT COLLATE rtrim); - INSERT INTO t1(x) VALUES ('a'), ('b'), ('c'); - CREATE VIEW v1(y) AS SELECT DISTINCT x FROM t1; - SELECT count(*) FROM t1, v1 WHERE x='b '; - - - CREATE TABLE t1(x TEXT, y INT, z TEXT); - INSERT INTO t1(rowid,x,y,z) VALUES(12,'aa','bb','aa'); - CREATE INDEX i1x ON t1(1 IS true,z); - CREATE TABLE t0(x TEXT); - INSERT INTO t0(rowid,x) VALUES(4,'aa'); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t0',NULL,'20'); - INSERT INTO sqlite_stat1 VALUES('t1','i1x','18 18 2'); - ANALYZE sqlite_schema; - - - SELECT * FROM t0 NATURAL JOIN t1 WHERE z=t1.x; - - - DROP TABLE t0; - CREATE TABLE t0(a TEXT); - INSERT INTO t0 VALUES ('xyz'); - CREATE INDEX t0x ON t0(a IS FALSE) WHERE false; - DROP TABLE t1; - CREATE TABLE t1(b INT); - INSERT INTO t1 VALUES('aaa'),('bbb'),('ccc'),('ddd'),(NULL); - CREATE TABLE t2(c REAL); - INSERT INTO t2 VALUES(7); - ANALYZE; - CREATE INDEX t2x ON t2(true IN ()); - - - SELECT * FROM t0 LEFT JOIN t1 LEFT JOIN t2 ON (b NOTNULL)==(c IN ()) WHERE c; - diff --git a/libsql-wal/tests/assets/fixtures/boundary1.test b/libsql-wal/tests/assets/fixtures/boundary1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/boundary2.test b/libsql-wal/tests/assets/fixtures/boundary2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/boundary3.test b/libsql-wal/tests/assets/fixtures/boundary3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/boundary4.test b/libsql-wal/tests/assets/fixtures/boundary4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/btree01.test b/libsql-wal/tests/assets/fixtures/btree01.test deleted file mode 100644 index 322cc5931d..0000000000 --- a/libsql-wal/tests/assets/fixtures/btree01.test +++ /dev/null @@ -1,23 +0,0 @@ - - PRAGMA page_size=65536; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB); - WITH RECURSIVE - c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) - INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; - UPDATE t1 SET b=zeroblob(3000); - UPDATE t1 SET b=zeroblob(64000) WHERE a=2; - PRAGMA integrity_check; - - - PRAGMA page_size=1024; - CREATE TABLE t1(a INT PRIMARY KEY, b BLOB, c INT) WITHOUT ROWID; - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c) SELECT x*2, zeroblob(100), x FROM c; - UPDATE t1 SET b=zeroblob(1000) WHERE a=198; - CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); - INSERT INTO t2(y) VALUES(198),(187),(100); - SELECT y, c FROM t2 LEFT JOIN t1 ON y=a ORDER BY x; - - - SELECT y, c FROM t1 RIGHT JOIN t2 ON y=a ORDER BY x; - diff --git a/libsql-wal/tests/assets/fixtures/btree02.test b/libsql-wal/tests/assets/fixtures/btree02.test deleted file mode 100644 index 8614267171..0000000000 --- a/libsql-wal/tests/assets/fixtures/btree02.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE TABLE t1(a TEXT, ax INTEGER, b INT, PRIMARY KEY(a,ax)) WITHOUT ROWID; - WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<10) - INSERT INTO t1(a,ax,b) SELECT printf('%02x',i+160), random(), i FROM c; - CREATE INDEX t1a ON t1(a); - CREATE TABLE t2(x,y); - CREATE TABLE t3(cnt); - WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<4) - INSERT INTO t3(cnt) SELECT i FROM c; - SELECT count(*) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/btreefault.test b/libsql-wal/tests/assets/fixtures/btreefault.test deleted file mode 100644 index 6eb7dd3045..0000000000 --- a/libsql-wal/tests/assets/fixtures/btreefault.test +++ /dev/null @@ -1,9 +0,0 @@ - - CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b); - CREATE INDEX i1 ON t1(b); - CREATE TABLE t2(x, y); - - - INSERT INTO t1 VALUES(25, 25, 25); - INSERT INTO t2 VALUES(25, 'a'), (25, 'b'), (25, 'c'); - diff --git a/libsql-wal/tests/assets/fixtures/busy.test b/libsql-wal/tests/assets/fixtures/busy.test deleted file mode 100644 index b31c8d2f61..0000000000 --- a/libsql-wal/tests/assets/fixtures/busy.test +++ /dev/null @@ -1,15 +0,0 @@ - - CREATE TABLE t1(x); - CREATE TABLE t2(y); - CREATE TABLE t3(z); - - CREATE INDEX i1 ON t1(x); - CREATE INDEX i2 ON t2(y); - - INSERT INTO t1 VALUES(1); - INSERT INTO t2 VALUES(1); - ANALYZE; - - SELECT * FROM t1 WHERE x=1; - SELECT * FROM t2 WHERE y=1; - diff --git a/libsql-wal/tests/assets/fixtures/busy2.test b/libsql-wal/tests/assets/fixtures/busy2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/cache.test b/libsql-wal/tests/assets/fixtures/cache.test deleted file mode 100644 index aaf0f1325a..0000000000 --- a/libsql-wal/tests/assets/fixtures/cache.test +++ /dev/null @@ -1,34 +0,0 @@ - - PRAGMA auto_vacuum=OFF; - PRAGMA journal_mode=DELETE; - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - INSERT INTO t1 VALUES('x', 'y'); - INSERT INTO t2 VALUES('i', 'j'); - - - PRAGMA cache_size = 1; - BEGIN; - INSERT INTO t1 VALUES(1, 2); - PRAGMA lock_status; - - - INSERT INTO t2 VALUES(1, 2); - PRAGMA lock_status; - - - SELECT * FROM t1 UNION SELECT * FROM t2; - - - PRAGMA cache_size = 0; - BEGIN; - INSERT INTO t1 VALUES(1, 2); - PRAGMA lock_status; - - - INSERT INTO t2 VALUES(1, 2); - PRAGMA lock_status; - - - SELECT * FROM t1 UNION SELECT * FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/cacheflush.test b/libsql-wal/tests/assets/fixtures/cacheflush.test deleted file mode 100644 index e8d787924f..0000000000 --- a/libsql-wal/tests/assets/fixtures/cacheflush.test +++ /dev/null @@ -1,49 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - BEGIN; - INSERT INTO t1 VALUES(3, 4); - - - COMMIT; - CREATE TABLE t2(a, b); - BEGIN; - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t2 VALUES('a', 'b'); - - - COMMIT; - CREATE TABLE t3(a, b); - BEGIN; - INSERT INTO t1 VALUES(7, 8); - INSERT INTO t2 VALUES('c', 'd'); - INSERT INTO t3 VALUES('i', 'ii'); - - - COMMIT; - BEGIN; - INSERT INTO t1 VALUES(9, 10); - - COMMIT - - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t4(x, y); - INSERT INTO t4 VALUES('A', 'B'); - BEGIN; - INSERT INTO t1 VALUES(11, 12); - INSERT INTO t4 VALUES('C', 'D'); - - COMMIT - - BEGIN; - INSERT INTO t1 VALUES(13, 14); - INSERT INTO t4 VALUES('E', 'F'); - - COMMIT - PRAGMA integrity_check - COMMIT - PRAGMA integrity_check - - SELECT count(*) FROM t1; - SELECT count(*) FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/cachespill.test b/libsql-wal/tests/assets/fixtures/cachespill.test deleted file mode 100644 index 07806cb266..0000000000 --- a/libsql-wal/tests/assets/fixtures/cachespill.test +++ /dev/null @@ -1,7 +0,0 @@ - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 1024; - PRAGMA cache_size = 100; - CREATE TABLE t1(a); - - ROLLBACK diff --git a/libsql-wal/tests/assets/fixtures/capi2.test b/libsql-wal/tests/assets/fixtures/capi2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/capi3.test b/libsql-wal/tests/assets/fixtures/capi3.test deleted file mode 100644 index 76a16d3ac0..0000000000 --- a/libsql-wal/tests/assets/fixtures/capi3.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t4(x); - INSERT INTO t4 VALUES('abcdefghij'); - diff --git a/libsql-wal/tests/assets/fixtures/capi3b.test b/libsql-wal/tests/assets/fixtures/capi3b.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/capi3c.test b/libsql-wal/tests/assets/fixtures/capi3c.test deleted file mode 100644 index ee86fa7f9d..0000000000 --- a/libsql-wal/tests/assets/fixtures/capi3c.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t11(a VARCHAR(10), b INTEGER); - CREATE TABLE t12(a VARCHAR(15), b FLOAT); - diff --git a/libsql-wal/tests/assets/fixtures/capi3d.test b/libsql-wal/tests/assets/fixtures/capi3d.test deleted file mode 100644 index 00d4fe67b1..0000000000 --- a/libsql-wal/tests/assets/fixtures/capi3d.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t4(x,y); - BEGIN; - diff --git a/libsql-wal/tests/assets/fixtures/capi3e.test b/libsql-wal/tests/assets/fixtures/capi3e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/carray01.test b/libsql-wal/tests/assets/fixtures/carray01.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/cast.test b/libsql-wal/tests/assets/fixtures/cast.test deleted file mode 100644 index b397cb4b3d..0000000000 --- a/libsql-wal/tests/assets/fixtures/cast.test +++ /dev/null @@ -1,153 +0,0 @@ - - SELECT CAST('9223372036854775808' AS integer); - SELECT CAST(' +000009223372036854775808' AS integer); - SELECT CAST('12345678901234567890123' AS INTEGER); - - - SELECT CAST('-9223372036854775808' AS integer); - SELECT CAST('-9223372036854775809' AS integer); - SELECT CAST('-12345678901234567890123' AS INTEGER); - - - SELECT CAST('123e+5' AS INTEGER); - SELECT CAST('123e+5' AS NUMERIC); - SELECT CAST('123e+5' AS REAL); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a NUMERIC); - INSERT INTO t1 VALUES - ('9000000000000000001'), - ('9000000000000000001 '), - (' 9000000000000000001'), - (' 9000000000000000001 '); - SELECT * FROM t1; - - - SELECT CAST('-' AS NUMERIC); - - - SELECT CAST('-0' AS NUMERIC); - - - SELECT CAST('+' AS NUMERIC); - - - SELECT CAST('/' AS NUMERIC); - - - SELECT '' - 2851427734582196970; - - - SELECT 0 - 2851427734582196970; - - - SELECT '' - 1; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0 (c0 TEXT); - INSERT INTO t0(c0) VALUES ('1.0'); - SELECT CAST(c0 AS NUMERIC) FROM t0; - - - SELECT -'.'; - - - SELECT '.'+0; - - - SELECT CAST('.' AS numeric); - - - SELECT -CAST('.' AS numeric); - - - SELECT CAST('-0.0' AS numeric); - - - SELECT CAST('0.0' AS numeric); - - - SELECT CAST('+0.0' AS numeric); - - - SELECT CAST('-1.0' AS numeric); - - - SELECT quote(X'310032003300')==quote(substr(X'310032003300', 1)) - - - SELECT CAST(X'310032003300' AS TEXT) - ==CAST(substr(X'310032003300', 1) AS TEXT) - - - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES (0); - CREATE VIEW v1(c0, c1) AS - SELECT CAST(0.0 AS NUMERIC), COUNT(*) OVER () FROM t0; - SELECT v1.c0 FROM v1, t0 WHERE v1.c0=0; - - - CREATE TABLE dual(dummy TEXT); - INSERT INTO dual VALUES('X'); - SELECT CAST(4 AS NUMERIC); - - - SELECT CAST(4.0 AS NUMERIC); - - - SELECT CAST(4.5 AS NUMERIC); - - - SELECT x, typeof(x) FROM (SELECT CAST(4 AS NUMERIC) AS x) JOIN dual; - - - SELECT x, typeof(x) FROM dual CROSS JOIN (SELECT CAST(4 AS NUMERIC) AS x); - - - SELECT x, typeof(x) FROM (SELECT CAST(4.0 AS NUMERIC) AS x) JOIN dual; - - - SELECT x, typeof(x) FROM dual CROSS JOIN (SELECT CAST(4.0 AS NUMERIC) AS x); - - - SELECT x, typeof(x) FROM (SELECT CAST(4.5 AS NUMERIC) AS x) JOIN dual; - - - SELECT x, typeof(x) FROM dual CROSS JOIN (SELECT CAST(4.5 AS NUMERIC) AS x); - - - VALUES(CAST(44 AS REAL)),(55); - - - SELECT CAST(44 AS REAL) AS 'm' UNION ALL SELECT 55; - - - SELECT * FROM (VALUES(CAST(44 AS REAL)),(55)); - - - SELECT * FROM (SELECT CAST(44 AS REAL) AS 'm' UNION ALL SELECT 55); - - - SELECT * FROM dual CROSS JOIN (VALUES(CAST(44 AS REAL)),(55)); - - - SELECT * FROM dual CROSS JOIN (SELECT CAST(44 AS REAL) AS 'm' - UNION ALL SELECT 55); - - - DROP VIEW v1; - CREATE VIEW v1 AS SELECT CAST(44 AS REAL) AS 'm' UNION ALL SELECT 55; - SELECT name, type FROM pragma_table_info('v1'); - - - CREATE VIEW v2 AS VALUES(CAST(44 AS REAL)),(55); - SELECT type FROM pragma_table_info('v2'); - - - SELECT * FROM v1; - - - SELECT * FROM v2; - diff --git a/libsql-wal/tests/assets/fixtures/cffault.test b/libsql-wal/tests/assets/fixtures/cffault.test deleted file mode 100644 index 8e157c69ca..0000000000 --- a/libsql-wal/tests/assets/fixtures/cffault.test +++ /dev/null @@ -1,18 +0,0 @@ - - CREATE TABLE t1(a PRIMARY KEY, b); - CREATE INDEX i1 ON t1(b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t1 VALUES(7, 8); - - - CREATE TABLE t1(a PRIMARY KEY, b, c); - CREATE INDEX i1 ON t1(b); - CREATE INDEX i2 ON t1(c, b); - INSERT INTO t1 VALUES(1, 2, randomblob(600)); - INSERT INTO t1 VALUES(3, 4, randomblob(600)); - INSERT INTO t1 VALUES(5, 6, randomblob(600)); - INSERT INTO t1 VALUES(7, 8, randomblob(600)); - INSERT INTO t1 VALUES(9, 10, randomblob(600)); - diff --git a/libsql-wal/tests/assets/fixtures/changes.test b/libsql-wal/tests/assets/fixtures/changes.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/changes2.test b/libsql-wal/tests/assets/fixtures/changes2.test deleted file mode 100644 index 8e326f4367..0000000000 --- a/libsql-wal/tests/assets/fixtures/changes2.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE some_table ( - id INTEGER NOT NULL, value VARCHAR(40) NOT NULL, PRIMARY KEY (id) - ); - INSERT INTO some_table (id, value) VALUES (1, 'v1'); - - - DROP TABLE some_table; - CREATE TABLE some_table ( - id INTEGER NOT NULL, value VARCHAR(40) NOT NULL, PRIMARY KEY (id) - ); - INSERT INTO some_table (id, value) VALUES (1, 'v1'); - - - CREATE TABLE t1(a, b); - CREATE TABLE log(t); - - - INSERT INTO t1 VALUES (1, 'v1'), (2, 'v2'); - - - CREATE TABLE t3(x); - - - INSERT INTO t1 VALUES (3, 'v1'), (4, 'v2'); - - - SELECT * FROM log; - diff --git a/libsql-wal/tests/assets/fixtures/check.test b/libsql-wal/tests/assets/fixtures/check.test deleted file mode 100644 index 25538836d9..0000000000 --- a/libsql-wal/tests/assets/fixtures/check.test +++ /dev/null @@ -1,90 +0,0 @@ - - PRAGMA ignore_check_constraints=OFF; - PRAGMA integrity_check; - - - CREATE TABLE t810(a, CHECK( main.t810.a>0 )); - CREATE TABLE t811(b, CHECK( xyzzy.t811.b BETWEEN 5 AND 10 )); - - - CREATE TABLE t1( - a INTEGER PRIMARY KEY, - b INTEGER NOT NULL CONSTRAINT 'b-check' CHECK( b>a ), - c INTEGER NOT NULL CONSTRAINT 'c-check' CHECK( c>rowid*2 ), - d INTEGER NOT NULL CONSTRAINT 'd-check' CHECK( d BETWEEN b AND c ) - ); - INSERT INTO t1(a,b,c,d) VALUES(1,2,4,3),(2,4,6,5),(3,10,30,20); - - - CREATE TABLE t1(x); - CREATE VIEW v1(y) AS SELECT x FROM t1; - PRAGMA integrity_check; - - - CREATE TABLE t1 (Col0 CHECK(1 COLLATE BINARY BETWEEN 1 AND 1) ) ; - - - INSERT INTO t1 VALUES (NULL); - - - INSERT INTO t1 VALUES (NULL); - - - CREATE TABLE t2(b, a CHECK( - CASE 'abc' COLLATE nocase WHEN a THEN 1 ELSE 0 END) - ); - - - INSERT INTO t2(a) VALUES('abc'); - - - INSERT INTO t2(b, a) VALUES(1, 'abc'||''); - - - INSERT INTO t2(b, a) VALUES(2, 'abc'); - - - CREATE TABLE t1(a TEXT, CHECK(a=+a)); - INSERT INTO t1(a) VALUES(NULL),('xyz'),(5),(x'303132'),(4.75); - SELECT quote(a) FROM t1 ORDER BY rowid; - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(a<>+a)); - INSERT INTO t1(a) VALUES(NULL); - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(NOT(a=+a))); - INSERT INTO t1(a) VALUES(NULL); - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(NOT(a<>+a))); - INSERT INTO t1(a) VALUES(NULL),('xyz'),(5),(x'303132'),(4.75); - SELECT quote(a) FROM t1 ORDER BY rowid; - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(a BETWEEN 0 AND +a)); - INSERT INTO t1(a) VALUES(NULL),('xyz'),(5),(x'303132'),(4.75); - SELECT quote(a) FROM t1 ORDER BY rowid; - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(a NOT BETWEEN 0 AND +a)); - INSERT INTO t1(a) VALUES(NULL); - SELECT quote(a) FROM t1 ORDER BY rowid; - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(a BETWEEN +a AND 999999)); - INSERT INTO t1(a) VALUES(NULL),(5); - SELECT quote(a) FROM t1 ORDER BY rowid; - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, CHECK(a NOT BETWEEN +a AND 999999)); - INSERT INTO t1(a) VALUES(NULL); - SELECT quote(a) FROM t1 ORDER BY rowid; - diff --git a/libsql-wal/tests/assets/fixtures/checkfault.test b/libsql-wal/tests/assets/fixtures/checkfault.test deleted file mode 100644 index 7eecfb026d..0000000000 --- a/libsql-wal/tests/assets/fixtures/checkfault.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1 (Col0 CHECK(1 COLLATE BINARY BETWEEN 1 AND 1) ) ; - CREATE TABLE t2(b, a CHECK( - CASE 'abc' COLLATE nocase WHEN a THEN 1 ELSE 0 END) - ); - diff --git a/libsql-wal/tests/assets/fixtures/chunksize.test b/libsql-wal/tests/assets/fixtures/chunksize.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/close.test b/libsql-wal/tests/assets/fixtures/close.test deleted file mode 100644 index 84bda5b3b2..0000000000 --- a/libsql-wal/tests/assets/fixtures/close.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('one'); - INSERT INTO t1 VALUES('two'); - INSERT INTO t1 VALUES('three'); - diff --git a/libsql-wal/tests/assets/fixtures/closure01.test b/libsql-wal/tests/assets/fixtures/closure01.test deleted file mode 100644 index 07dd0e08f4..0000000000 --- a/libsql-wal/tests/assets/fixtures/closure01.test +++ /dev/null @@ -1,100 +0,0 @@ - - BEGIN; - CREATE TABLE t1(x INTEGER PRIMARY KEY, y INTEGER); - WITH RECURSIVE - cnt(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM cnt LIMIT 131072) - INSERT INTO t1(x, y) SELECT i, nullif(i,1)/2 FROM cnt; - CREATE INDEX t1y ON t1(y); - COMMIT; - CREATE VIRTUAL TABLE cx - USING transitive_closure(tablename=t1, idcolumn=x, parentcolumn=y); - - - SELECT id, depth, root, tablename, idcolumn, parentcolumn FROM cx - WHERE root=16384 - AND depth=1 - ORDER BY id; - - - SELECT count(*), depth FROM cx WHERE root=1 AND depth<=5 - GROUP BY depth ORDER BY 1; - - - SELECT count(*), depth FROM cx WHERE root=1 AND depth=5 - GROUP BY depth ORDER BY 1; - - - SELECT count(*), depth FROM cx WHERE root=1 AND depth BETWEEN 3 AND 5 - GROUP BY depth ORDER BY 1; - - - SELECT count(*), min(id), max(id) FROM c2 WHERE root=1; - - - SELECT id FROM c2 WHERE root=10; - - - SELECT id FROM c2 WHERE root=12; - - - SELECT id FROM c2 WHERE root IN (10,12) ORDER BY id; - - - SELECT id FROM c2 WHERE root IN (10,12) ORDER BY +id; - - - CREATE VIRTUAL TABLE c2up USING transitive_closure( - tablename = t2, - idcolumn = y, - parentcolumn = x - ); - SELECT id FROM c2up WHERE root=20; - - - SELECT id FROM cx - WHERE root=20 - AND tablename='t2' - AND idcolumn='y' - AND parentcolumn='x'; - - - SELECT DISTINCT id FROM c2 - WHERE root IN (SELECT id FROM c2up - WHERE root=20 AND depth<=2) - ORDER BY id; - - - SELECT id FROM c2 - WHERE root=(SELECT id FROM c2up - WHERE root=20 AND depth=2) - AND depth=2 - EXCEPT - SELECT id FROM c2 - WHERE root=(SELECT id FROM c2up - WHERE root=20 AND depth=1) - AND depth<=1 - ORDER BY id; - - - CREATE VIRTUAL TABLE temp.closure USING transitive_closure; - SELECT id FROM closure - WHERE root=1 - AND depth=3 - AND tablename='t1' - AND idcolumn='x' - AND parentcolumn='y' - ORDER BY id; - - - CREATE TABLE t4 ( - id INTEGER PRIMARY KEY, - name TEXT NOT NULL, - parent_id INTEGER - ); - CREATE VIRTUAL TABLE vt4 USING transitive_closure ( - idcolumn=id, parentcolumn=parent_id, tablename=t4 - ); - - - SELECT * FROM t4, vt4 WHERE t4.id = vt4.root AND vt4.id=4 AND vt4.depth=2; - diff --git a/libsql-wal/tests/assets/fixtures/coalesce.test b/libsql-wal/tests/assets/fixtures/coalesce.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collate1.test b/libsql-wal/tests/assets/fixtures/collate1.test deleted file mode 100644 index 72da3eed9c..0000000000 --- a/libsql-wal/tests/assets/fixtures/collate1.test +++ /dev/null @@ -1,51 +0,0 @@ - - SELECT """"""""; - - - PRAGMA foreign_keys = ON; - CREATE TABLE p1(a PRIMARY KEY COLLATE '"""'); - CREATE TABLE c1(x, y REFERENCES p1); - - - INSERT INTO p1 VALUES('abc'); - INSERT INTO c1 VALUES(1, 'ABC'); - - - INSERT INTO p1 VALUES('abb'); - INSERT INTO p1 VALUES('wxz'); - INSERT INTO p1 VALUES('wxy'); - - INSERT INTO c1 VALUES(2, 'abb'); - INSERT INTO c1 VALUES(3, 'wxz'); - INSERT INTO c1 VALUES(4, 'WXY'); - SELECT x, y FROM c1 ORDER BY y COLLATE """"""""; - - - SELECT 'abc' UNION ALL SELECT 'DEF' - ORDER BY 1 COLLATE nocase COLLATE nocase COLLATE nocase COLLATE nocase; - - - SELECT 'abc' UNION ALL SELECT 'DEF' - ORDER BY 1 COLLATE nocase COLLATE nocase COLLATE nocase COLLATE binary; - - - SELECT 'abc' UNION ALL SELECT 'DEF' - ORDER BY 1 COLLATE binary COLLATE binary COLLATE binary COLLATE nocase; - - - SELECT ' ' > char(20) COLLATE rtrim; - - - SELECT '' < char(20) COLLATE rtrim; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 COLLATE RTRIM, c1 BLOB UNIQUE, - PRIMARY KEY (c0, c1)) WITHOUT ROWID; - INSERT INTO t0 VALUES (123, 3), (' ', 1), (' ', 2), ('', 4); - SELECT * FROM t0 WHERE c1 = 1; - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - diff --git a/libsql-wal/tests/assets/fixtures/collate2.test b/libsql-wal/tests/assets/fixtures/collate2.test deleted file mode 100644 index 0fcc454042..0000000000 --- a/libsql-wal/tests/assets/fixtures/collate2.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('b'); - INSERT INTO t1 VALUES('B'); - - - SELECT * FROM t1 WHERE x COLLATE nocase BETWEEN 'a' AND 'c'; - - - SELECT * FROM t1 WHERE x BETWEEN 'a' COLLATE nocase AND 'c' COLLATE nocase; - - - SELECT * FROM t1 - WHERE x COLLATE nocase BETWEEN 'a' COLLATE nocase AND 'c' COLLATE nocase; - - - SELECT * FROM t1 WHERE +x COLLATE nocase BETWEEN 'a' AND 'c'; - - - SELECT * FROM t1 WHERE +x BETWEEN 'a' COLLATE nocase AND 'c' COLLATE nocase; - - - SELECT * FROM t1 - WHERE +x COLLATE nocase BETWEEN 'a' COLLATE nocase AND 'c' COLLATE nocase; - diff --git a/libsql-wal/tests/assets/fixtures/collate3.test b/libsql-wal/tests/assets/fixtures/collate3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collate4.test b/libsql-wal/tests/assets/fixtures/collate4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collate5.test b/libsql-wal/tests/assets/fixtures/collate5.test deleted file mode 100644 index 08065ca38b..0000000000 --- a/libsql-wal/tests/assets/fixtures/collate5.test +++ /dev/null @@ -1,24 +0,0 @@ - - CREATE TABLE t1(a, b COLLATE nocase); - CREATE TABLE t2(c, d); - INSERT INTO t2 VALUES(1, 'bbb'); - - - SELECT * FROM ( - SELECT a, b FROM t1 UNION ALL SELECT c, d FROM t2 - ) WHERE b='BbB'; - - - CREATE TABLE t1(a,b,c COLLATE NOCASE); - INSERT INTO t1 VALUES(NULL,'C','c'); - CREATE VIEW v2 AS - SELECT a,b,c FROM t1 INTERSECT SELECT a,b,b FROM t1 - WHERE 'eT"3qRkL+oJMJjQ9z0'>=b - ORDER BY a,b,c; - - - SELECT * FROM v2; - - - SELECT * FROM v2 WHERE c='c'; - diff --git a/libsql-wal/tests/assets/fixtures/collate6.test b/libsql-wal/tests/assets/fixtures/collate6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collate7.test b/libsql-wal/tests/assets/fixtures/collate7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collate8.test b/libsql-wal/tests/assets/fixtures/collate8.test deleted file mode 100644 index 909adc2923..0000000000 --- a/libsql-wal/tests/assets/fixtures/collate8.test +++ /dev/null @@ -1,22 +0,0 @@ - - SELECT 'abc'==('ABC'||'') COLLATE nocase; - SELECT 'abc'==('ABC'||'' COLLATE nocase); - SELECT 'abc'==('ABC'||('' COLLATE nocase)); - SELECT 'abc'==('ABC'||upper('' COLLATE nocase)); - - - SELECT 'abc'==('ABC'||max('' COLLATE nocase,'' COLLATE binary)); - - - SELECT 'abc'==('ABC'||max('' COLLATE binary,'' COLLATE nocase)); - - - SELECT 'abc'==('ABC'||CASE WHEN 1-1=2 THEN '' COLLATE nocase - ELSE '' COLLATE binary END); - SELECT 'abc'==('ABC'||CASE WHEN 1+1=2 THEN '' COLLATE nocase - ELSE '' COLLATE binary END); - - - SELECT 'abc'==('ABC'||CASE WHEN 1=2 THEN '' COLLATE binary - ELSE '' COLLATE nocase END); - diff --git a/libsql-wal/tests/assets/fixtures/collate9.test b/libsql-wal/tests/assets/fixtures/collate9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collateA.test b/libsql-wal/tests/assets/fixtures/collateA.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/collateB.test b/libsql-wal/tests/assets/fixtures/collateB.test deleted file mode 100644 index b02efa98dd..0000000000 --- a/libsql-wal/tests/assets/fixtures/collateB.test +++ /dev/null @@ -1,51 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY); - CREATE TABLE t2(b INTEGER PRIMARY KEY, x1 INT COLLATE NOCASE); - CREATE TABLE t3(x2 INT); - SELECT * FROM t3, t2, t1 WHERE x2=b AND x1=a AND a=1; - - - INSERT INTO t1(a) VALUES(1),(2),(3); - INSERT INTO t2(b,x1) VALUES(11,1),(22,2),(33,3); - INSERT INTO t3(x2) VALUES(11),(22),(33); - SELECT *,'|' FROM t3, t2, t1 WHERE x2=b AND x1=a AND a=1; - - - SELECT *,'|' FROM t3, t1, t2 WHERE x2=b AND x1=a AND a=1; - - - SELECT *,'|' FROM t2, t3, t1 WHERE x2=b AND x1=a AND a=1; - - - SELECT *,'|' FROM t2, t1, t3 WHERE x2=b AND x1=a AND a=1; - - - SELECT *,'|' FROM t1, t2, t3 WHERE x2=b AND x1=a AND a=1; - - - SELECT *,'|' FROM t1, t2, t3 WHERE x2=b AND x1=a AND a=1; - - - SELECT *,'|' FROM t3, t2, t1 WHERE b=x2 AND a=x1 AND 1=a; - - - SELECT *,'|' FROM t3, t1, t2 WHERE b=x2 AND a=x1 AND 1=a; - - - SELECT *,'|' FROM t2, t3, t1 WHERE b=x2 AND a=x1 AND 1=a; - - - SELECT *,'|' FROM t2, t1, t3 WHERE b=x2 AND a=x1 AND 1=a; - - - SELECT *,'|' FROM t1, t2, t3 WHERE b=x2 AND a=x1 AND 1=a; - - - SELECT *,'|' FROM t1, t2, t3 WHERE b=x2 AND a=x1 AND 1=a; - - - CREATE TABLE t4(a COLLATE binary); - CREATE INDEX i4 ON t4(a); - INSERT INTO t4 VALUES('one'), ('two'), ('three'); - VACUUM; - diff --git a/libsql-wal/tests/assets/fixtures/colmeta.test b/libsql-wal/tests/assets/fixtures/colmeta.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/colname.test b/libsql-wal/tests/assets/fixtures/colname.test deleted file mode 100644 index 26817a9281..0000000000 --- a/libsql-wal/tests/assets/fixtures/colname.test +++ /dev/null @@ -1,28 +0,0 @@ - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(aaa INT); - INSERT INTO t1(aaa) VALUES(123); - - - CREATE TABLE t2 AS SELECT BBb FROM (SELECT aaa AS Bbb FROM t1); - SELECT name FROM pragma_table_info('t2'); - - -- added 2019-08-10 to invalidate - DROP TABLE IF EXISTS t1; -- a couple assert()s that were - CREATE TABLE t1(a); -- added by ticket 3b44500725 - INSERT INTO t1 VALUES(17),(2),(99),(-3),(7); - SELECT (SELECT avg(a) UNION SELECT min(a) OVER()) FROM t1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1("with space" TEXT); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2 AS SELECT "with space" FROM t1; - PRAGMA table_info(t2); - - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3 AS SELECT "with space" FROM t1 GROUP BY 1; - PRAGMA table_info(t3); - diff --git a/libsql-wal/tests/assets/fixtures/columncount.test b/libsql-wal/tests/assets/fixtures/columncount.test deleted file mode 100644 index 0269edcbfd..0000000000 --- a/libsql-wal/tests/assets/fixtures/columncount.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(x, y, z); - INSERT INTO t1 VALUES('a', 'b', 'c'); - diff --git a/libsql-wal/tests/assets/fixtures/conflict.test b/libsql-wal/tests/assets/fixtures/conflict.test deleted file mode 100644 index 1643284190..0000000000 --- a/libsql-wal/tests/assets/fixtures/conflict.test +++ /dev/null @@ -1,23 +0,0 @@ - - CREATE TABLE t1( - x PRIMARY KEY, - UNIQUE(x,x), - UNIQUE(x,x) ON CONFLICT REPLACE - ); - INSERT INTO t1(x) VALUES(1); - SELECT * FROM t1; - - - SELECT * FROM t1; - - - -- ON CONFLICT is allowed on table CHECK constraints - CREATE TABLE t1(a INT, CHECK( a!=5 ) ON CONFLICT ignore); - - - SELECT a FROM t1 ORDER BY a; - - - INSERT OR IGNORE INTO t1(a) VALUES(4),(5),(6); - SELECT a FROM t1 ORDER BY a; - diff --git a/libsql-wal/tests/assets/fixtures/conflict2.test b/libsql-wal/tests/assets/fixtures/conflict2.test deleted file mode 100644 index 85a956d97d..0000000000 --- a/libsql-wal/tests/assets/fixtures/conflict2.test +++ /dev/null @@ -1,28 +0,0 @@ - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1( - x TEXT PRIMARY KEY NOT NULL, - y TEXT NOT NULL, - z INTEGER - ); - INSERT INTO t1 VALUES('alpha','beta',1); - CREATE UNIQUE INDEX t1xy ON t1(x,y); - REPLACE INTO t1(x,y,z) VALUES('alpha','gamma',1); - PRAGMA integrity_check; - SELECT x,y FROM t1 INDEXED BY t1xy; - SELECT x,y,z FROM t1 NOT INDEXED; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1( - x TEXT PRIMARY KEY NOT NULL, - y TEXT NOT NULL, - z INTEGER - ) WITHOUT ROWID; - INSERT INTO t1 VALUES('alpha','beta',1); - CREATE UNIQUE INDEX t1xy ON t1(x,y); - REPLACE INTO t1(x,y,z) VALUES('alpha','gamma',1); - PRAGMA integrity_check; - SELECT x,y FROM t1 INDEXED BY t1xy; - SELECT x,y,z FROM t1 NOT INDEXED; - diff --git a/libsql-wal/tests/assets/fixtures/conflict3.test b/libsql-wal/tests/assets/fixtures/conflict3.test deleted file mode 100644 index edb3a6d6cb..0000000000 --- a/libsql-wal/tests/assets/fixtures/conflict3.test +++ /dev/null @@ -1,242 +0,0 @@ - - CREATE TABLE t1( - a INTEGER PRIMARY KEY ON CONFLICT REPLACE, - b UNIQUE ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a INT PRIMARY KEY ON CONFLICT REPLACE, - b UNIQUE ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a INT PRIMARY KEY ON CONFLICT REPLACE, - b UNIQUE ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - b UNIQUE ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL, - a INT PRIMARY KEY ON CONFLICT REPLACE - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - b UNIQUE ON CONFLICT IGNORE, - a INT PRIMARY KEY ON CONFLICT REPLACE, - c UNIQUE ON CONFLICT FAIL - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - c UNIQUE ON CONFLICT FAIL, - a INT PRIMARY KEY ON CONFLICT REPLACE, - b UNIQUE ON CONFLICT IGNORE - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a UNIQUE ON CONFLICT REPLACE, - b INTEGER PRIMARY KEY ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a UNIQUE ON CONFLICT REPLACE, - b INT PRIMARY KEY ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a UNIQUE ON CONFLICT REPLACE, - b INT PRIMARY KEY ON CONFLICT IGNORE, - c UNIQUE ON CONFLICT FAIL - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a UNIQUE ON CONFLICT REPLACE, - b UNIQUE ON CONFLICT IGNORE, - c INTEGER PRIMARY KEY ON CONFLICT FAIL - ); - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1( - a UNIQUE ON CONFLICT REPLACE, - b UNIQUE ON CONFLICT IGNORE, - c PRIMARY KEY ON CONFLICT FAIL - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,2,3), (2,3,4); - SELECT a,b,c FROM t1 ORDER BY a; - - - INSERT INTO t1(a,b,c) VALUES(3,2,5); - SELECT a,b,c FROM t1 ORDER BY a; - - - SELECT a,b,c FROM t1 ORDER BY a; - - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t2 VALUES(111, '111'); - - - REPLACE INTO t2 VALUES(NULL, '112'), (111, '111B'); - - - SELECT * FROM t2; - - - PRAGMA recursive_triggers = true; - CREATE TABLE t0 (c0 UNIQUE, c1 UNIQUE); - CREATE TRIGGER tr0 AFTER DELETE ON t0 BEGIN - DELETE FROM t0; - END; - - INSERT INTO t0 VALUES(1, NULL); - INSERT INTO t0 VALUES(0, NULL); - - - SELECT * FROM t0 - - - CREATE TABLE t2 (a PRIMARY KEY, b UNIQUE, c UNIQUE) WITHOUT ROWID; - CREATE TRIGGER tr3 AFTER DELETE ON t2 BEGIN - DELETE FROM t2; - END; - - INSERT INTO t2 VALUES(1, 1, 1); - INSERT INTO t2 VALUES(2, 2, 2); - - - SELECT * FROM t2 - - - CREATE TABLE t1(a, b); - CREATE TABLE log(x); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES(1, 2); - - CREATE TRIGGER tb BEFORE UPDATE ON t1 BEGIN - DELETE FROM t1; - END; - CREATE TRIGGER ta AFTER UPDATE ON t1 BEGIN - INSERT INTO log VALUES('fired!'); - END; - - UPDATE t1 SET b=3; - - - SELECT * FROM t1; - - - SELECT * FROM log; - diff --git a/libsql-wal/tests/assets/fixtures/contrib01.test b/libsql-wal/tests/assets/fixtures/contrib01.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt.test b/libsql-wal/tests/assets/fixtures/corrupt.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt2.test b/libsql-wal/tests/assets/fixtures/corrupt2.test deleted file mode 100644 index 6868ac2c27..0000000000 --- a/libsql-wal/tests/assets/fixtures/corrupt2.test +++ /dev/null @@ -1,20 +0,0 @@ - - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(3500)); - DELETE FROM t1; - - - PRAGMA integrity_check; - PRAGMA freelist_count; - - - PRAGMA integrity_check; - - - INSERT INTO t1 VALUES(randomblob(2500)); - PRAGMA freelist_count; - - - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/corrupt3.test b/libsql-wal/tests/assets/fixtures/corrupt3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt4.test b/libsql-wal/tests/assets/fixtures/corrupt4.test deleted file mode 100644 index 1d0cee4ef3..0000000000 --- a/libsql-wal/tests/assets/fixtures/corrupt4.test +++ /dev/null @@ -1,4 +0,0 @@ - - PRAGMA page_size = 512; - CREATE TABLE t1(a, b, c); - diff --git a/libsql-wal/tests/assets/fixtures/corrupt5.test b/libsql-wal/tests/assets/fixtures/corrupt5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt6.test b/libsql-wal/tests/assets/fixtures/corrupt6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt7.test b/libsql-wal/tests/assets/fixtures/corrupt7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt8.test b/libsql-wal/tests/assets/fixtures/corrupt8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corrupt9.test b/libsql-wal/tests/assets/fixtures/corrupt9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corruptA.test b/libsql-wal/tests/assets/fixtures/corruptA.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corruptB.test b/libsql-wal/tests/assets/fixtures/corruptB.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corruptC.test b/libsql-wal/tests/assets/fixtures/corruptC.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corruptD.test b/libsql-wal/tests/assets/fixtures/corruptD.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corruptE.test b/libsql-wal/tests/assets/fixtures/corruptE.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/corruptF.test b/libsql-wal/tests/assets/fixtures/corruptF.test deleted file mode 100644 index 1780d4865a..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptF.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t4(x); - SELECT * FROM sqlite_master; - - - CREATE TABLE t4(x); - SELECT * FROM sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/corruptG.test b/libsql-wal/tests/assets/fixtures/corruptG.test deleted file mode 100644 index b9a5bfa15c..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptG.test +++ /dev/null @@ -1,6 +0,0 @@ - - PRAGMA page_size=512; - CREATE TABLE t1(a,b,c); - INSERT INTO t1(rowid,a,b,c) VALUES(52,'abc','xyz','123'); - CREATE INDEX t1abc ON t1(a,b,c); - diff --git a/libsql-wal/tests/assets/fixtures/corruptH.test b/libsql-wal/tests/assets/fixtures/corruptH.test deleted file mode 100644 index 2b8a7513fe..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptH.test +++ /dev/null @@ -1,41 +0,0 @@ - - PRAGMA page_size=1024; - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - - CREATE TABLE t2(x); - INSERT INTO t2 VALUES(randomblob(200)); - INSERT INTO t2 SELECT randomblob(200) FROM t2; - INSERT INTO t2 SELECT randomblob(200) FROM t2; - INSERT INTO t2 SELECT randomblob(200) FROM t2; - INSERT INTO t2 SELECT randomblob(200) FROM t2; - INSERT INTO t2 SELECT randomblob(200) FROM t2; - INSERT INTO t2 SELECT randomblob(200) FROM t2; - - - PRAGMA auto_vacuum=0; - PRAGMA page_size=1024; - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - - CREATE TABLE t3(x); - - CREATE TABLE t2(x PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t2 VALUES(randomblob(100)); - - DROP TABLE t3; - - - PRAGMA page_size=1024; - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - - CREATE TABLE t2(c INTEGER PRAGMA KEY, d); - INSERT INTO t2 VALUES(1, randomblob(1100)); - diff --git a/libsql-wal/tests/assets/fixtures/corruptI.test b/libsql-wal/tests/assets/fixtures/corruptI.test deleted file mode 100644 index af29a9daa1..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptI.test +++ /dev/null @@ -1,55 +0,0 @@ - - PRAGMA page_size=1024; - PRAGMA auto_vacuum=0; - CREATE TABLE t1(a); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES('abcdefghijklmnop'); - - - PRAGMA auto_vacuum=0; - PRAGMA page_size = 512; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - WITH s(a, b) AS ( - SELECT 2, 'abcdefghij' - UNION ALL - SELECT a+2, b FROM s WHERe a < 40 - ) - INSERT INTO t1 SELECT * FROM s; - - - PRAGMA page_size = 65536; - PRAGMA autovacuum = 0; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(-1, 'abcdefghij'); - INSERT INTO t1 VALUES(0, 'abcdefghij'); - - - PRAGMA page_count - - - PRAGMA page_size = 512; - PRAGMA auto_vacuum=0; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(zeroblob(300)); - INSERT INTO t1 VALUES(zeroblob(600)); - - - PRAGMA auto_vacuum=0; - CREATE TABLE t1(x PRIMARY KEY, y); - INSERT INTO t1 VALUES('a', 'A'); - INSERT INTO t1 VALUES('b', 'A'); - INSERT INTO t1 VALUES('c', 'A'); - SELECT name FROM sqlite_master; - - - PRAGMA writable_schema = 1; - DELETE FROM sqlite_master WHERE name = 'sqlite_autoindex_t1_1'; - - - PRAGMA auto_vacuum=0; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(zeroblob(300)); - INSERT INTO t1 VALUES(zeroblob(300)); - INSERT INTO t1 VALUES(zeroblob(300)); - INSERT INTO t1 VALUES(zeroblob(300)); - diff --git a/libsql-wal/tests/assets/fixtures/corruptJ.test b/libsql-wal/tests/assets/fixtures/corruptJ.test deleted file mode 100644 index 6c5e29a489..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptJ.test +++ /dev/null @@ -1,7 +0,0 @@ - - PRAGMA page_size=1024; - PRAGMA auto_vacuum=0; - CREATE TABLE t1(a,b); - WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<10) - INSERT INTO t1(a,b) SELECT i, zeroblob(700) FROM c; - diff --git a/libsql-wal/tests/assets/fixtures/corruptK.test b/libsql-wal/tests/assets/fixtures/corruptK.test deleted file mode 100644 index a3fff6cd86..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptK.test +++ /dev/null @@ -1,106 +0,0 @@ - - PRAGMA page_size=1024; - PRAGMA auto_vacuum=0; - CREATE TABLE t1(x); - - INSERT INTO t1 VALUES(randomblob(20)); - INSERT INTO t1 VALUES(randomblob(100)); -- make this into a free slot - INSERT INTO t1 VALUES(randomblob(27)); -- this one will be corrupt - INSERT INTO t1 VALUES(randomblob(800)); - - DELETE FROM t1 WHERE rowid=2; -- free the 100 byte slot - PRAGMA page_count - - - INSERT INTO t1 VALUES(randomblob(20)); - - - PRAGMA page_size=1024; - PRAGMA auto_vacuum=0; - CREATE TABLE t1(x); - - INSERT INTO t1 VALUES(randomblob(20)); - INSERT INTO t1 VALUES(randomblob(20)); -- free this one - INSERT INTO t1 VALUES(randomblob(20)); - INSERT INTO t1 VALUES(randomblob(20)); -- and this one - INSERT INTO t1 VALUES(randomblob(20)); -- corrupt this one. - - DELETE FROM t1 WHERE rowid IN(2, 4); - PRAGMA page_count - - - PRAGMA page_size=1024; - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(a, b, c); - CREATE TABLE t3(a, b, c); - CREATE TABLE t4(a, b, c); - CREATE TABLE t5(a, b, c); - - - UPDATE sqlite_dbpage SET data = hex2blob(' - 000: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. - 010: 04 00 01 01 20 40 20 20 00 00 3e d9 00 00 00 06 .... @ ..>..... - 020: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ - 030: 0f 00 00 00 00 00 00 00 00 00 00 01 00 00 83 00 ................ - 040: 00 00 00 00 00 00 00 00 00 00 00 00 00 38 00 00 .............8.. - 050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3e d9 ..............>. - 060: 00 2d e6 07 0d 00 00 00 01 03 a0 00 03 e0 00 00 .-.............. - 070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 0a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 0b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 0c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 0d0: 00 00 00 00 00 c1 00 00 00 00 00 00 00 00 00 00 ................ - 0e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 0f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 160: 00 83 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 180: 00 00 00 00 00 00 00 00 00 00 07 00 30 00 00 00 ............0... - 190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 1a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 1b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 1c0: 02 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 ................ - 1d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 1e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 1f0: 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 220: 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 230: 0c 00 00 00 00 00 00 60 00 00 00 06 00 00 c3 00 .......`........ - 240: 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 270: 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 290: 04 00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 2a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 2b0: 00 00 00 00 83 00 8c 00 00 00 00 00 00 00 00 00 ................ - 2c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 2d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 2e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 2f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 310: 00 78 00 00 00 00 00 00 00 00 00 00 00 00 70 00 .x............p. - 320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 340: 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 350: 00 00 00 00 00 68 00 00 00 00 00 00 00 00 00 00 .....h.......... - 360: 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 ................ - 370: 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 ................ - 380: 00 00 00 00 70 00 00 00 00 00 00 00 00 00 00 00 ....p........... - 390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 3a0: 5e 01 07 17 1b 1b 01 81 13 74 61 62 6c 65 73 65 ^........tablese - 3b0: 6e 73 6f 32 73 73 65 6e 73 6f 72 73 02 43 52 45 nso2ssensors.CRE - 3c0: 41 54 45 20 54 41 42 4c 45 20 73 65 6e 73 6f 72 ATE TABLE sensor - 3d0: 73 20 0a 20 20 24 20 20 20 20 20 20 20 20 20 20 s . $ - 3e0: b8 6e 61 6d 65 21 74 65 78 74 2c 20 79 61 6c 20 .name!text, yal - 3f0: 72 65 61 6c 2c 20 74 69 6d 65 20 74 65 78 74 29 real, time text) - ') WHERE pgno=1 - diff --git a/libsql-wal/tests/assets/fixtures/corruptL.test b/libsql-wal/tests/assets/fixtures/corruptL.test deleted file mode 100644 index d1085d3000..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptL.test +++ /dev/null @@ -1,68 +0,0 @@ - - PRAGMA writable_schema=ON; -- bypass improved sqlite_master consistency checking - INSERT INTO t1(b) VALUES(X'a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6ac8ae0d0e7c3175946e62ba2b'); - - - CREATE TABLE t1(a, b, c, d INTEGER PRIMARY KEY); - CREATE TABLE t2(a, b, c, d INTEGER PRIMARY KEY); - - INSERT INTO t1(a, b, c, d) VALUES (1, 2, 3, 100), (4, 5, 6, 101); - INSERT INTO t2(a, b, c, d) VALUES (1, 100, 3, 1000), (4, 101, 6, 1001); - - CREATE INDEX t1a ON t1(a); - CREATE INDEX t2a ON t2(a, b, c); - - PRAGMA writable_schema = 1; - UPDATE sqlite_master SET sql = 'CREATE INDEX t2a ON t2(a)' WHERE name='t2a'; - - - SAVEPOINT one; - - - ROLLBACK TO one; - - - PRAGMA integrity_check; - - - CREATE TABLE t1(w, x, y, z, UNIQUE(w, x), UNIQUE(y, z)); - INSERT INTO t1 VALUES(1, 1, 1, 1); - - CREATE TABLE t1idx(x, y, i INTEGER, PRIMARY KEY(x)) WITHOUT ROWID; - INSERT INTO t1idx VALUES(10, NULL, 5); - - PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage = ( - SELECT rootpage FROM sqlite_master WHERE name='t1idx' - ) WHERE type = 'index'; - - - CREATE TABLE t1(o INTEGER PRIMARY KEY, t UNIQUE); - INSERT INTO t1(t) VALUES(randomblob(123)); - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - INSERT INTO t1(t) SELECT randomblob(123) FROM t1; - - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES(-1, 'b'); - - - PRAGMA writable_schema=ON; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c INTEGER, d TEXT); - CREATE INDEX i1 ON t1((NULL)); - INSERT INTO t1 VALUES(1, NULL, 1, 'text value'); - PRAGMA writable_schema = on; - UPDATE sqlite_schema SET - sql = 'CREATE INDEX i1 ON t1(b, c, d)', - tbl_name = 't1', - type='index' - WHERE name='i1'; - diff --git a/libsql-wal/tests/assets/fixtures/corruptM.test b/libsql-wal/tests/assets/fixtures/corruptM.test deleted file mode 100644 index 468cca98d2..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptM.test +++ /dev/null @@ -1,64 +0,0 @@ - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(111,222,333); - CREATE INDEX i1 ON t1(b); - CREATE VIEW v2 AS SELECT 15,22; - CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - PRAGMA writable_schema=on; - UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='view' WHERE name='t1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1'; - UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1'; - UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3'; - UPDATE sqlite_master SET type='view' WHERE name='r1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - - - UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1'; - SELECT type, name, tbl_name, '|' FROM sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/corruptN.test b/libsql-wal/tests/assets/fixtures/corruptN.test deleted file mode 100644 index edbb7ecab1..0000000000 --- a/libsql-wal/tests/assets/fixtures/corruptN.test +++ /dev/null @@ -1,67 +0,0 @@ - - CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); - PRAGMA writable_schema = 1; - UPDATE sqlite_schema - SET sql = 'CREATE TABLE sqlite_sequence(name-seq)' - WHERE name = 'sqlite_sequence'; - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b UNIQUE, c UNIQUE); - INSERT INTO x1 VALUES(1, 1, 2); - INSERT INTO x1 VALUES(2, 2, 3); - INSERT INTO x1 VALUES(3, 3, 4); - INSERT INTO x1 VALUES(4, 5, 6); - PRAGMA writable_schema = 1; - - UPDATE sqlite_schema SET rootpage = ( - SELECT rootpage FROM sqlite_schema WHERE name = 'sqlite_autoindex_x1_2' - ) WHERE name = 'sqlite_autoindex_x1_1'; - - - CREATE TABLE t1(a, b); - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1b ON t1(b); - - PRAGMA writable_schema = 1; - UPDATE sqlite_schema - SET sql = strreplace(sql, 't1', 'json_each') - WHERE type='index'; - - - PRAGMA writable_schema = 1; - SELECT * FROM t1 - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size=1024; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1(b) VALUES(zeroblob(300)),(zeroblob(300)),(zeroblob(300)),(zeroblob(300)); - CREATE TABLE t2(a); - CREATE TRIGGER t1tr BEFORE UPDATE ON t1 BEGIN DELETE FROM t2; END; - PRAGMA writable_schema=ON; - UPDATE sqlite_schema SET rootpage=3 WHERE rowid=2; - PRAGMA writable_schema=RESET; - INSERT INTO t2 VALUES('active'),('boomer'),('atom'),('atomic'), - ('alpha channel backup abandon test aback boomer atom alpha active'); - - - -- Make "t1" a large table. Large enough that the children of the root - -- node are interior nodes. - PRAGMA page_size = 1024; - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(x); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<500 - ) - INSERT INTO t1 SELECT zeroblob(300) FROM s; - - CREATE TABLE t2(y); - CREATE TRIGGER tr BEFORE UPDATE ON t1 BEGIN - DELETE FROM t2; - END; - - -- Set the root of table t2 to 137 - the leftmost child of the root of t1. - PRAGMA writable_schema = ON; - UPDATE sqlite_schema SET rootpage = 137 WHERE name='t2'; - PRAGMA writable_schema = RESET; - diff --git a/libsql-wal/tests/assets/fixtures/cost.test b/libsql-wal/tests/assets/fixtures/cost.test deleted file mode 100644 index 4f3c85187f..0000000000 --- a/libsql-wal/tests/assets/fixtures/cost.test +++ /dev/null @@ -1,72 +0,0 @@ - - CREATE TABLE t3(id INTEGER PRIMARY KEY, b NOT NULL); - CREATE TABLE t4(c, d, e); - CREATE UNIQUE INDEX i3 ON t3(b); - CREATE UNIQUE INDEX i4 ON t4(c, d); - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a); - - - CREATE TABLE t5(a INTEGER PRIMARY KEY,b,c,d,e,f,g); - CREATE INDEX t5b ON t5(b); - CREATE INDEX t5c ON t5(c); - CREATE INDEX t5d ON t5(d); - CREATE INDEX t5e ON t5(e); - CREATE INDEX t5f ON t5(f); - CREATE INDEX t5g ON t5(g); - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a); - CREATE INDEX i2 ON t1(b); - - - CREATE TABLE t2(x, y); - CREATE INDEX t2i1 ON t2(x); - - - CREATE TABLE t3(a INTEGER PRIMARY KEY, b, c); - CREATE INDEX t3i1 ON t3(b); - CREATE INDEX t3i2 ON t3(c); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d,e,f,g); - CREATE INDEX t1b ON t1(b); - CREATE INDEX t1c ON t1(c); - CREATE INDEX t1d ON t1(d); - CREATE INDEX t1e ON t1(e); - CREATE INDEX t1f ON t1(f); - CREATE INDEX t1g ON t1(g); - - - CREATE TABLE composer( - cid INTEGER PRIMARY KEY, - cname TEXT - ); - CREATE TABLE album( - aid INTEGER PRIMARY KEY, - aname TEXT - ); - CREATE TABLE track( - tid INTEGER PRIMARY KEY, - cid INTEGER REFERENCES composer, - aid INTEGER REFERENCES album, - title TEXT - ); - CREATE INDEX track_i1 ON track(cid); - CREATE INDEX track_i2 ON track(aid); - - - CREATE TABLE t1( - a,b,c,d,e, f,g,h,i,j, - k,l,m,n,o, p,q,r,s,t - ); - CREATE INDEX i1 ON t1(k,l,m,n,o,p,q,r,s,t); - - - CREATE TABLE t6(a, b, c); - CREATE INDEX t6i1 ON t6(a, b); - CREATE INDEX t6i2 ON t6(c); - diff --git a/libsql-wal/tests/assets/fixtures/count.test b/libsql-wal/tests/assets/fixtures/count.test deleted file mode 100644 index 920a07edaa..0000000000 --- a/libsql-wal/tests/assets/fixtures/count.test +++ /dev/null @@ -1,24 +0,0 @@ - - SELECT count(*) FROM t2 HAVING count(*)>1; - - - SELECT count(*) FROM t2 HAVING count(*)<10; - - - CREATE TABLE t5(a TEXT PRIMARY KEY, b VARCHAR(50)) WITHOUT ROWID; - INSERT INTO t5 VALUES('bison','jazz'); - SELECT count(*) FROM t5; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c VARCHAR(1000)); - CREATE INDEX t1b ON t1(b); - INSERT INTO t1(a,b,c) values(1,2,'count.test cases for NOT INDEXED'); - ANALYZE; - UPDATE sqlite_stat1 SET stat='1000000 10' WHERE idx='t1b'; - ANALYZE sqlite_master; - - - CREATE TABLE t7(a INT,b TEXT,c BLOB,d REAL); - CREATE TABLE t8(a INT,b TEXT,c BLOB,d REAL); - CREATE INDEX t8a ON t8(a); - diff --git a/libsql-wal/tests/assets/fixtures/countofview.test b/libsql-wal/tests/assets/fixtures/countofview.test deleted file mode 100644 index 31dea910f3..0000000000 --- a/libsql-wal/tests/assets/fixtures/countofview.test +++ /dev/null @@ -1,61 +0,0 @@ - - CREATE TABLE t2(c); - CREATE TABLE t3(f); - - INSERT INTO t2 VALUES(1), (2); - INSERT INTO t3 VALUES(3); - - - select c from t2 union all select f from t3 limit 1 offset 1 - - - select count(*) from ( - select c from t2 union all select f from t3 limit 1 offset 1 - ) - - - select count(*) from ( - select c from t2 union all select f from t3 - ) - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1),(99),('abc'); - CREATE VIEW v1(x,y) AS SELECT x,1 FROM t1 UNION ALL SELECT x,2 FROM t1; - SELECT count(*) FROM v1 WHERE x<>1; - - - SELECT count(*) FROM v1 GROUP BY y; - - - DROP TABLE t1; - DROP TABLE t2; - DROP TABLE t3; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1 VALUES(4,'four'); - CREATE TABLE t2(c INTEGER PRIMARY KEY, d TEXT); - CREATE VIEW t3 AS SELECT a, b FROM t1 UNION ALL SELECT c, d FROM t2; - SELECT count(*) FROM t3 ORDER BY sum(a); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1 VALUES(1,'one'),(4,'four'); - CREATE TABLE t2(c INTEGER PRIMARY KEY, d TEXT); - INSERT INTO t2 VALUES(2,'two'),(5,'five'); - CREATE VIEW t3 AS SELECT a, b FROM t1 UNION ALL SELECT c, d FROM t2; - SELECT count(*) FROM t3 HAVING count(*)>0; - - - SELECT count(*) FROM t3 HAVING count(*)>5; - - - SELECT count(*) FROM t3 HAVING max(b)>'mmm'; - - - SELECT count(*) FROM t3 HAVING min(b)>'mmm'; - - - SELECT count(*) FROM ( - SELECT a, max(b) FROM t1 HAVING a<100 UNION ALL SELECT c, d FROM t2 - ) - diff --git a/libsql-wal/tests/assets/fixtures/coveridxscan.test b/libsql-wal/tests/assets/fixtures/coveridxscan.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash.test b/libsql-wal/tests/assets/fixtures/crash.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash2.test b/libsql-wal/tests/assets/fixtures/crash2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash3.test b/libsql-wal/tests/assets/fixtures/crash3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash4.test b/libsql-wal/tests/assets/fixtures/crash4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash5.test b/libsql-wal/tests/assets/fixtures/crash5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash6.test b/libsql-wal/tests/assets/fixtures/crash6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crash7.test b/libsql-wal/tests/assets/fixtures/crash7.test deleted file mode 100644 index 68fa74e664..0000000000 --- a/libsql-wal/tests/assets/fixtures/crash7.test +++ /dev/null @@ -1,19 +0,0 @@ - - CREATE TABLE t1(a, b, UNIQUE(a, b)); - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM t1; - DELETE FROM t1 WHERE rowid%2; - diff --git a/libsql-wal/tests/assets/fixtures/crash8.test b/libsql-wal/tests/assets/fixtures/crash8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/crashM.test b/libsql-wal/tests/assets/fixtures/crashM.test deleted file mode 100644 index 505b8fda34..0000000000 --- a/libsql-wal/tests/assets/fixtures/crashM.test +++ /dev/null @@ -1,21 +0,0 @@ - - ATTACH 'file:test2.db?8_3_names=1' AS aux; - - CREATE TABLE t1(x, y); - CREATE INDEX t1x ON t1(x); - CREATE INDEX t1y ON t1(y); - - CREATE TABLE aux.t2(x, y); - CREATE INDEX aux.t2x ON t2(x); - CREATE INDEX aux.t2y ON t2(y); - - WITH s(a) AS ( - SELECT 1 UNION ALL SELECT a+1 FROM s WHERE a<1000 - ) - INSERT INTO t1 SELECT a, randomblob(500) FROM s; - - WITH s(a) AS ( - SELECT 1 UNION ALL SELECT a+1 FROM s WHERE a<1000 - ) - INSERT INTO t2 SELECT a, randomblob(500) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/createtab.test b/libsql-wal/tests/assets/fixtures/createtab.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/cse.test b/libsql-wal/tests/assets/fixtures/cse.test deleted file mode 100644 index 8588d1a844..0000000000 --- a/libsql-wal/tests/assets/fixtures/cse.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE t1(a TEXT, b); - INSERT INTO t1 VALUES('hello', 0); - INSERT INTO t1 VALUES('world', 0); - - CREATE TABLE t2(x TEXT); - INSERT INTO t2 VALUES('hello'); - INSERT INTO t2 VALUES('world'); - - CREATE TABLE t3(y); - INSERT INTO t3 VALUES(1000); - - - SELECT 1000 = y FROM t3 - - - SELECT 1000 IN (SELECT x FROM t2), 1000 = y FROM t3 - - - SELECT 0 IN (SELECT a), (SELECT a LIMIT 0) FROM t1 - - - SELECT 0 IN (SELECT a) FROM t1 WHERE a = 'hello' OR (SELECT a LIMIT 0); - - - CREATE TABLE v0(v1 VARCHAR0); - INSERT INTO v0 VALUES(2), (3); - SELECT 0 IN(SELECT v1) FROM v0 WHERE v1 = 2 OR(SELECT v1 LIMIT 0); - diff --git a/libsql-wal/tests/assets/fixtures/csv01.test b/libsql-wal/tests/assets/fixtures/csv01.test deleted file mode 100644 index b048a82f27..0000000000 --- a/libsql-wal/tests/assets/fixtures/csv01.test +++ /dev/null @@ -1,138 +0,0 @@ - - CREATE VIRTUAL TABLE temp.t1 USING csv( - data= -'1,2,3,4 -5,6,7,8 -9,10,11,12 -13,14,15,16 -', - columns=4 - ); - SELECT * FROM t1 WHERE c1=10; - - - SELECT * FROM t1 WHERE c1='10'; - - - SELECT rowid FROM t1; - - - DROP TABLE temp.t1; - CREATE VIRTUAL TABLE temp.t1 USING csv( - data= -'a,b,"mix-bloom-eel","soft opinion" -1,2,3,4 -5,6,7,8 -9,10,11,12 -13,14,15,16 -', - header=1 - ); - SELECT * FROM t1 WHERE "soft opinion"=12; - - - SELECT name FROM pragma_table_xinfo('t1'); - - - DROP TABLE temp.t1; - CREATE VIRTUAL TABLE temp.t1 USING csv( - data= -'a,b,"mix-bloom-eel","soft opinion" -1,2,3,4 -5,6,7,8 -9,10,11,12 -13,14,15,16 -', - header=false - ); - SELECT * FROM t1 WHERE c1='b'; - - - SELECT name FROM pragma_table_xinfo('t1'); - - - DROP TABLE temp.t1; - CREATE VIRTUAL TABLE temp.t1 USING csv( - data= -'a,b,"mix-bloom-eel","soft opinion" -1,2,3,4 -5,6,7,8 -9,10,11,12 -13,14,15,16 -', - header, - schema='CREATE TABLE x(x0,x1,x2,x3,x4)', - columns=5 - ); - SELECT * FROM t1 WHERE x1='6'; - - - SELECT name FROM pragma_table_xinfo('t1'); - - - DROP TABLE t1; - CREATE VIRTUAL TABLE temp.t2 USING csv( - data= -'1,2,3,4 -5,6,7,8 -9,10,11,12 -13,14,15,16 -', - columns=4, - schema='CREATE TABLE t2(a INT, b TEXT, c REAL, d BLOB)' - ); - SELECT * FROM t2 WHERE a=9; - - - SELECT * FROM t2 WHERE b=10; - - - SELECT * FROM t2 WHERE c=11; - - - SELECT * FROM t2 WHERE d=12; - - - SELECT * FROM t2 WHERE d='12'; - - - SELECT * FROM t2 WHERE a='9'; - - - DROP TABLE t2; - CREATE VIRTUAL TABLE temp.t3 USING csv( - data= -'1,2,3,4 -5,6,7,8 -9,10,11,12 -13,14,15,16 -', - columns=4, - schema= - 'CREATE TABLE t3(a PRIMARY KEY,b TEXT,c TEXT,d TEXT) WITHOUT ROWID', - testflags=1 - ); - SELECT a FROM t3 WHERE b=6 OR c=7 OR d=12 ORDER BY +a; - - - SELECT a FROM t3 WHERE +b=6 OR c=7 OR d=12 ORDER BY +a; - - - CREATE VIRTUAL TABLE temp.trent USING csv(data='1'); - SELECT * FROM trent; - - - CREATE VIRTUAL TABLE t5_1 USING csv(filename='csv01.csv'); - SELECT name FROM temp.pragma_table_info('t5_1'); - - - SELECT *, '|' FROM t5_1; - - - DROP TABLE t5_1; - CREATE VIRTUAL TABLE t5_1 USING csv(filename='csv01.csv', header); - SELECT name FROM temp.pragma_table_info('t5_1'); - - - SELECT *, '|' FROM t5_1; - diff --git a/libsql-wal/tests/assets/fixtures/ctime.test b/libsql-wal/tests/assets/fixtures/ctime.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/cursorhint.test b/libsql-wal/tests/assets/fixtures/cursorhint.test deleted file mode 100644 index 7a1083c9a9..0000000000 --- a/libsql-wal/tests/assets/fixtures/cursorhint.test +++ /dev/null @@ -1,43 +0,0 @@ - - CREATE TABLE t1(a,b,c,d); - CREATE TABLE t2(x,y,z); - INSERT INTO t1(a,b) VALUES(10, 15); - INSERT INTO t1(a,b) VALUES(20, 25); - INSERT INTO t2(x,y) VALUES('ten', 'fifteen'); - INSERT INTO t2(x,y) VALUES('twenty', 'twentyfive'); - CREATE TABLE t3(id TEXT PRIMARY KEY, a, b, c, d) WITHOUT ROWID; - INSERT INTO t3(id,a,b,c,d) SELECT rowid, a, b, c, d FROM t1; - PRAGMA automatic_index = 0; - - - CREATE TABLE t1(x TEXT PRIMARY KEY) WITHOUT ROWID; - CREATE VIEW t2 AS SELECT 0 FROM t1 WHERE x>='a' OR x='1'; - SELECT * FROM t2 RIGHT JOIN t1 ON true; - - - CREATE TABLE v1 (c1, PRIMARY KEY( c1 )) WITHOUT ROWID; - CREATE VIEW v2 AS SELECT 0 FROM v1 WHERE c1 IS '' OR c1 > ''; - CREATE VIEW v3 AS SELECT 0 FROM v2 JOIN (v2 RIGHT JOIN v1); - CREATE VIEW v4 AS SELECT 0 FROM v3, v3; - SELECT * FROM v3 JOIN v3 AS a0, v4 AS a1, v4 AS a2, v3 AS a3, - v3 AS a4, v4 AS a5 - ORDER BY 1; - - - CREATE TABLE t6(a TEXT UNIQUE, b TEXT); - INSERT INTO t6(a,b) VALUES('uvw','xyz'),('abc','def'); - WITH v1(a) AS (SELECT a COLLATE NOCASE FROM t6) - SELECT v1.a, count(*) FROM t6 LEFT JOIN v1 ON true - GROUP BY 1 - HAVING (SELECT true FROM t6 AS aa LEFT JOIN t6 AS bb ON length(v1.a)>5); - - - CREATE TABLE t1(a INT PRIMARY KEY) WITHOUT ROWID; - CREATE TABLE t2(b INT PRIMARY KEY) WITHOUT ROWID; - CREATE TABLE t3(c INT PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t1(a) VALUES(1),(2); - INSERT INTO t2(b) VALUES(4),(8); - INSERT INTO t3(c) VALUES(16),(32); - CREATE VIEW v4(d) AS SELECT c FROM t3; - SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN v4 ON (d IS NULL); - diff --git a/libsql-wal/tests/assets/fixtures/cursorhint2.test b/libsql-wal/tests/assets/fixtures/cursorhint2.test deleted file mode 100644 index 08e937e3db..0000000000 --- a/libsql-wal/tests/assets/fixtures/cursorhint2.test +++ /dev/null @@ -1,16 +0,0 @@ - - PRAGMA automatic_index = 0; - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - CREATE TABLE t3(e, f); - - - CREATE TABLE x1(x, y); - CREATE TABLE x2(a, b); - - - CREATE TABLE t1 (i1 TEXT); - CREATE TABLE t2 (i2 TEXT UNIQUE); - INSERT INTO t1 VALUES('0'); - INSERT INTO t2 VALUES('0'); - diff --git a/libsql-wal/tests/assets/fixtures/dataversion1.test b/libsql-wal/tests/assets/fixtures/dataversion1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/date.test b/libsql-wal/tests/assets/fixtures/date.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/date2.test b/libsql-wal/tests/assets/fixtures/date2.test deleted file mode 100644 index bf5f3a9e74..0000000000 --- a/libsql-wal/tests/assets/fixtures/date2.test +++ /dev/null @@ -1,69 +0,0 @@ - - CREATE TABLE t1(x, y, CHECK( date(x) BETWEEN '2017-07-01' AND '2017-07-31' )); - INSERT INTO t1(x,y) VALUES('2017-07-20','one'); - - - SELECT * FROM t1; - - - CREATE TABLE t2(x,y); - INSERT INTO t2(x,y) VALUES(1, '2017-07-20'), (2, 'xyzzy'); - CREATE INDEX t2y ON t2(date(y)); - - - SELECT x, y FROM t2 ORDER BY x; - - - CREATE TABLE t3(a INTEGER PRIMARY KEY,b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t3(a,b) SELECT x, julianday('2017-07-01')+x FROM c; - UPDATE t3 SET b='now' WHERE a=500; - - - EXPLAIN QUERY PLAN - SELECT a FROM t3 - WHERE typeof(b)='real' - AND datetime(b) BETWEEN '2017-07-04' AND '2017-07-08'; - - - SELECT a FROM t3 - WHERE typeof(b)='real' - AND datetime(b) BETWEEN '2017-07-04' AND '2017-07-08' - ORDER BY a; - - - CREATE TABLE t4(a INTEGER PRIMARY KEY,b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t4(a,b) SELECT x, julianday('2017-07-01')+x FROM c; - UPDATE t4 SET b='now' WHERE a=500; - - - DELETE FROM t4 WHERE a=500; - CREATE INDEX t4b1 ON t4(b) - WHERE date(b) BETWEEN '2017-06-01' AND '2017-08-31'; - - - CREATE TABLE mods(x); - INSERT INTO mods(x) VALUES - ('+10 days'), - ('-10 days'), - ('+10 hours'), - ('-10 hours'), - ('+10 minutes'), - ('-10 minutes'), - ('+10 seconds'), - ('-10 seconds'), - ('+10 months'), - ('-10 months'), - ('+10 years'), - ('-10 years'), - ('start of month'), - ('start of year'), - ('start of day'), - ('weekday 1'), - ('unixepoch'); - CREATE TABLE t5(y,m); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<5) - INSERT INTO t5(y,m) SELECT julianday('2017-07-01')+c.x, mods.x FROM c, mods; - CREATE INDEX t5x1 on t5(y) WHERE datetime(y,m) IS NOT NULL; - diff --git a/libsql-wal/tests/assets/fixtures/date3.test b/libsql-wal/tests/assets/fixtures/date3.test deleted file mode 100644 index 8eb51c1b44..0000000000 --- a/libsql-wal/tests/assets/fixtures/date3.test +++ /dev/null @@ -1,14 +0,0 @@ - - WITH tx(timeval,datetime) AS ( - VALUES('2022-01-27 13:15:44','2022-01-27 13:15:44'), - (2459607.05260275,'2022-01-27 13:15:44'), - (1643289344,'2022-01-27 13:15:44') - ) - SELECT datetime(timeval,'auto') == datetime FROM tx; - - - WITH inc(x) AS (VALUES(-10) UNION ALL SELECT x+1 FROM inc WHERE x<100) - SELECT count(*) FROM inc - WHERE datetime('1970-01-01',format('%+d days',x)) - <> datetime(unixepoch('1970-01-01',format('%+d days',x)),'auto'); - diff --git a/libsql-wal/tests/assets/fixtures/date4.test b/libsql-wal/tests/assets/fixtures/date4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/dbdata.test b/libsql-wal/tests/assets/fixtures/dbdata.test deleted file mode 100644 index 1307d65fb3..0000000000 --- a/libsql-wal/tests/assets/fixtures/dbdata.test +++ /dev/null @@ -1,36 +0,0 @@ - - CREATE TABLE T1(a, b); - INSERT INTO t1(rowid, a ,b) VALUES(5, 'v', 'five'); - INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten'); - - - SELECT pgno, cell, field, quote(value) FROM sqlite_dbdata WHERE pgno=2; - - - SELECT pgno, cell, field, quote(value) FROM sqlite_dbdata; - - - INSERT INTO t1 VALUES(NULL, $big); - SELECT value FROM sqlite_dbdata WHERE pgno=2 AND cell=2 AND field=1; - - - DELETE FROM t1; - INSERT INTO t1 VALUES(NULL, randomblob(5050)); - - - CREATE TABLE t1(a); - CREATE INDEX i1 ON t1(a); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10 - ) - INSERT INTO t1 SELECT randomblob(900) FROM s; - - - SELECT * FROM sqlite_dbptr WHERE pgno=2; - - - SELECT * FROM sqlite_dbptr WHERE pgno=3; - - - SELECT * FROM sqlite_dbptr - diff --git a/libsql-wal/tests/assets/fixtures/dbfuzz001.test b/libsql-wal/tests/assets/fixtures/dbfuzz001.test deleted file mode 100644 index 11dbf81d0a..0000000000 --- a/libsql-wal/tests/assets/fixtures/dbfuzz001.test +++ /dev/null @@ -1,18 +0,0 @@ - - DELETE FROM t3 WHERE x IS NOT NULL AND +rowid=6; - - - CREATE TABLE t1(a INTEGER, b INT, c DEFAULT 0); - - - PRAGMA journal_mode = memory; - INSERT INTO t1 VALUES(1,2,3); - PRAGMA journal_mode=PERSIST; - - - INSERT INTO t1 VALUES(4, 5, 6); - - - PRAGMA journal_mode=MEMORY; - INSERT INTO t1 VALUES(7, 8, 9); - diff --git a/libsql-wal/tests/assets/fixtures/dbpage.test b/libsql-wal/tests/assets/fixtures/dbpage.test deleted file mode 100644 index 6efb3e8f31..0000000000 --- a/libsql-wal/tests/assets/fixtures/dbpage.test +++ /dev/null @@ -1,56 +0,0 @@ - - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage('main') ORDER BY pgno; - - - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage WHERE pgno=2; - - - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage WHERE pgno=4; - - - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage WHERE pgno=5; - - - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage WHERE pgno=0; - - - ATTACH ':memory:' AS aux1; - PRAGMA aux1.page_size=4096; - CREATE TABLE aux1.t2(a,b,c); - INSERT INTO t2 VALUES(11,12,13); - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage('aux1'); - - - CREATE TABLE aux1.x3(x,y,z); - INSERT INTO x3(x,y,z) VALUES(1,'main',1),(2,'aux1',1); - SELECT pgno, schema, substr(data,1,6) - FROM sqlite_dbpage, x3 - WHERE sqlite_dbpage.schema=x3.y AND sqlite_dbpage.pgno=x3.z - ORDER BY x3.x; - - - CREATE TEMP TABLE saved_content(x); - INSERT INTO saved_content(x) SELECT data FROM sqlite_dbpage WHERE pgno=4; - UPDATE sqlite_dbpage SET data=zeroblob(4096) WHERE pgno=4; - - - SELECT pgno, quote(substr(data,1,5)) FROM sqlite_dbpage('main') ORDER BY pgno; - - - UPDATE sqlite_dbpage SET data=(SELECT x FROM saved_content) WHERE pgno=4; - - - DELETE FROM saved_content; - INSERT INTO saved_content(x) - SELECT data FROM sqlite_dbpage WHERE schema='aux1' AND pgno=2; - - - UPDATE sqlite_dbpage SET data=zeroblob(4096) WHERE pgno=2 AND schema='aux1'; - - - UPDATE sqlite_dbpage SET data=(SELECT x FROM saved_content) - WHERE pgno=2 AND schema='aux1'; - - - SELECT * FROM sqlite_temp_schema, sqlite_dbpage; - diff --git a/libsql-wal/tests/assets/fixtures/dbpagefault.test b/libsql-wal/tests/assets/fixtures/dbpagefault.test deleted file mode 100644 index 6e1763c6fa..0000000000 --- a/libsql-wal/tests/assets/fixtures/dbpagefault.test +++ /dev/null @@ -1,10 +0,0 @@ - - CREATE TABLE x1(z, b); - CREATE TRIGGER BEFORE INSERT ON x1 BEGIN - DELETE FROM sqlite_dbpage WHERE pgno=100; - UPDATE sqlite_dbpage SET data=null WHERE pgno=100; - END; - - - PRAGMA trusted_schema = 1; - diff --git a/libsql-wal/tests/assets/fixtures/dbstatus.test b/libsql-wal/tests/assets/fixtures/dbstatus.test deleted file mode 100644 index 93a587034e..0000000000 --- a/libsql-wal/tests/assets/fixtures/dbstatus.test +++ /dev/null @@ -1,14 +0,0 @@ - - PRAGMA auto_vacuum=NONE; - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, 2, 3); - - - CREATE TEMP TABLE tt(a, b, c); - INSERT INTO tt VALUES(1, 2, 3); - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/dbstatus2.test b/libsql-wal/tests/assets/fixtures/dbstatus2.test deleted file mode 100644 index d5c550453b..0000000000 --- a/libsql-wal/tests/assets/fixtures/dbstatus2.test +++ /dev/null @@ -1,14 +0,0 @@ - - PRAGMA page_size = 1024; - PRAGMA auto_vacuum = 0; - - CREATE TABLE t1(a PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, randomblob(600)); - INSERT INTO t1 VALUES(2, randomblob(600)); - INSERT INTO t1 VALUES(3, randomblob(600)); - - - PRAGMA journal_mode=DELETE; - PRAGMA cache_size=3; - UPDATE t1 SET b=randomblob(1000); - diff --git a/libsql-wal/tests/assets/fixtures/decimal.test b/libsql-wal/tests/assets/fixtures/decimal.test deleted file mode 100644 index 4257df4751..0000000000 --- a/libsql-wal/tests/assets/fixtures/decimal.test +++ /dev/null @@ -1,152 +0,0 @@ - - SELECT decimal(1); - - - SELECT decimal('1.0'); - - - SELECT decimal('0001.0'); - - - SELECT decimal('+0001.0'); - - - SELECT decimal('-0001.0'); - - - SELECT decimal('1.0e72'); - - - SELECT decimal('1.0e-72'); - - - SELECT decimal('-123e-4'); - - - SELECT decimal('+123e+4'); - - - SELECT decimal_exp('+123e+4'); - - - CREATE TABLE t1(seq INTEGER PRIMARY KEY, val TEXT); - INSERT INTO t1 VALUES - (1, '-9999e99'), - (2, '-9998.000e+99'), - (3, '-9999.0'), - (4, '-1'), - (5, '-9999e-20'), - (6, '0'), - (7, '1e-30'), - (8, '1e-29'), - (9, '1'), - (10,'1.00000000000000001'), - (11,'+1.00001'), - (12,'99e+99'); - SELECT *, '|' - FROM t1 AS a, t1 AS b - WHERE a.seq=0; - - - SELECT *, '|' - FROM t1 AS a, t1 AS b - WHERE a.seq<>b.seq - AND decimal_cmp(a.val,b.val)==0; - - - SELECT *, '|' - FROM t1 AS a, t1 AS b - WHERE a.seq>b.seq - AND decimal_cmp(a.val,b.val)<=0; - - - SELECT seq FROM t1 ORDER BY val COLLATE decimal; - - - SELECT seq FROM t1 ORDER BY val COLLATE decimal DESC; - - - CREATE TABLE t3(seq INTEGER PRIMARY KEY, val TEXT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<10) - INSERT INTO t3(seq, val) SELECT x, x FROM c; - WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<5) - INSERT INTO t3(seq, val) SELECT x+10, x*1000 FROM c; - SELECT decimal(val) FROM t3 ORDER BY seq; - - - SELECT decimal_add(val,'0.5') FROM t3 WHERE seq>5 ORDER BY seq - - - SELECT decimal_add(val,'-10') FROM t3 ORDER BY seq; - - - SELECT decimal_sum(val) FROM t3; - - - SELECT decimal_sum(decimal_add(val,val||'e+10')) FROM t3; - - - SELECT decimal_sum(decimal_add(val||'e+20',decimal_add(val,val||'e-20'))) - FROM t3; - - - WITH RECURSIVE c(x,y,z) AS ( - VALUES(0,'1','1') - UNION ALL - SELECT x+1, decimal_mul(y,'2'), decimal_mul(z,'0.5') - FROM c WHERE x<32 - ) - SELECT count(*) FROM c WHERE decimal_mul(y,z)='1'; - - - SELECT decimal_mul('1234.00','2.00'); - - - SELECT decimal_mul('1234.00','2.0000'); - - - SELECT decimal_mul('1234.0000','2.000'); - - - SELECT decimal_mul('1234.0000','2'); - - - CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT); - WITH RECURSIVE c(x,v) AS ( - VALUES(0,'1') - UNION ALL - SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971 - ) INSERT INTO pow2(x,v) SELECT x, v FROM c; - WITH RECURSIVE c(x,v) AS ( - VALUES(-1,'0.5') - UNION ALL - SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075 - ) INSERT INTO pow2(x,v) SELECT x, v FROM c; - - - WITH c(n) AS (SELECT ieee754_from_blob(x'0000000000000001')) -SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) - FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); - - - WITH c(n) AS (SELECT ieee754_from_blob(x'0000000000000001')) -SELECT decimal(c.n) FROM c; - - - WITH c(n) AS (SELECT ieee754_from_blob(x'7fefffffffffffff')) -SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) - FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); - - - SELECT ieee754(ieee754_from_blob(x'0000000000000001')); - - - SELECT ieee754(ieee754_from_blob(x'7fefffffffffffff')); - - - SELECT printf('%.8e',ieee754_from_blob(x'0000000000000001')); - - - SELECT printf('%.8e',ieee754_from_blob(x'ffefffffffffffff')); - diff --git a/libsql-wal/tests/assets/fixtures/default.test b/libsql-wal/tests/assets/fixtures/default.test deleted file mode 100644 index 9ba0c90b20..0000000000 --- a/libsql-wal/tests/assets/fixtures/default.test +++ /dev/null @@ -1,43 +0,0 @@ - - CREATE TABLE t3( - a INTEGER PRIMARY KEY AUTOINCREMENT, - b INT DEFAULT 12345 UNIQUE NOT NULL CHECK( b>=0 AND b<99999 ), - c VARCHAR(123,456) DEFAULT 'hello' NOT NULL ON CONFLICT REPLACE, - d REAL, - e FLOATING POINT(5,10) DEFAULT 4.36, - f NATIONAL CHARACTER(15) COLLATE RTRIM, - g LONG INTEGER DEFAULT( 3600*12 ) - ); - INSERT INTO t3 VALUES(null, 5, 'row1', '5.25', 'xyz', 321, '432'); - SELECT a, typeof(a), b, typeof(b), c, typeof(c), - d, typeof(d), e, typeof(e), f, typeof(f), - g, typeof(g) FROM t3; - - - DELETE FROM t3; - INSERT INTO t3 DEFAULT VALUES; - SELECT * FROM t3; - - - CREATE TABLE t300( - a INT DEFAULT 2147483647, - b INT DEFAULT 2147483648, - c INT DEFAULT +9223372036854775807, - d INT DEFAULT -2147483647, - e INT DEFAULT -2147483648, - f INT DEFAULT -9223372036854775808, - g INT DEFAULT (-(-9223372036854775808)), - h INT DEFAULT (-(-9223372036854775807)) - ); - INSERT INTO t300 DEFAULT VALUES; - SELECT * FROM t300; - - - CREATE TABLE t1(a TEXT, b TEXT DEFAULT(99)); - PRAGMA writable_schema=ON; - UPDATE sqlite_master SET sql='CREATE TABLE t1(a TEXT, b TEXT DEFAULT(:xyz))'; - - - INSERT INTO t1(a) VALUES('xyzzy'); - SELECT a, quote(b) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/delete.test b/libsql-wal/tests/assets/fixtures/delete.test deleted file mode 100644 index 5a5a9102ad..0000000000 --- a/libsql-wal/tests/assets/fixtures/delete.test +++ /dev/null @@ -1,31 +0,0 @@ - - CREATE TABLE t1(a INT UNIQUE, b INT); - INSERT INTO t1(a,b) VALUES('1','2'); - SELECT * FROM t1 WHERE a='1' AND b='2'; - - - DELETE FROM t1 WHERE a='1' AND b='2'; - - - SELECT * FROM t1 WHERE a='1' AND b='2'; - - - CREATE TABLE t11(a INTEGER PRIMARY KEY, b INT); - WITH RECURSIVE cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<20) - INSERT INTO t11(a,b) SELECT x, (x*17)%100 FROM cnt; - SELECT * FROM t11; - - - DELETE FROM t11 AS xyz - WHERE EXISTS(SELECT 1 FROM t11 WHERE t11.a>xyz.a AND t11.b<=xyz.b); - SELECT * FROM t11; - - - CREATE TABLE t0(vkey INTEGER, pkey INTEGER,c1 INTEGER); - INSERT INTO t0 VALUES(2,1,-20),(2,2,NULL),(2,3,0),(8,4,95); - DELETE FROM t0 WHERE NOT ( - (t0.vkey <= t0.c1) AND - (t0.vkey <> (SELECT vkey FROM t0 ORDER BY vkey LIMIT 1 OFFSET 2)) - ); - SELECT * FROM t0; - diff --git a/libsql-wal/tests/assets/fixtures/delete2.test b/libsql-wal/tests/assets/fixtures/delete2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/delete3.test b/libsql-wal/tests/assets/fixtures/delete3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/delete4.test b/libsql-wal/tests/assets/fixtures/delete4.test deleted file mode 100644 index 0933979387..0000000000 --- a/libsql-wal/tests/assets/fixtures/delete4.test +++ /dev/null @@ -1,195 +0,0 @@ - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y); - INSERT INTO t1 VALUES(1, 0); - INSERT INTO t1 VALUES(2, 1); - INSERT INTO t1 VALUES(3, 0); - INSERT INTO t1 VALUES(4, 1); - INSERT INTO t1 VALUES(5, 0); - INSERT INTO t1 VALUES(6, 1); - INSERT INTO t1 VALUES(7, 0); - INSERT INTO t1 VALUES(8, 1); - - - DELETE FROM t1 WHERE y=1; - - - SELECT x FROM t1; - - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z); - INSERT INTO t1 VALUES(1, 0, randomblob(200)); - INSERT INTO t1 VALUES(2, 1, randomblob(200)); - INSERT INTO t1 VALUES(3, 0, randomblob(200)); - INSERT INTO t1 VALUES(4, 1, randomblob(200)); - INSERT INTO t1 VALUES(5, 0, randomblob(200)); - INSERT INTO t1 VALUES(6, 1, randomblob(200)); - INSERT INTO t1 VALUES(7, 0, randomblob(200)); - INSERT INTO t1 VALUES(8, 1, randomblob(200)); - - - DELETE FROM t1 WHERE y=1; - - - SELECT x FROM t1; - - - CREATE TABLE t1(a, b, PRIMARY KEY(a, b)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(2, 4); - INSERT INTO t1 VALUES(1, 5); - DELETE FROM t1 WHERE a=1; - SELECT printf('(%d)',changes()); - SELECT * FROM t1; - - - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b) SELECT x, x+1 FROM c; - SELECT printf('(%d)',changes()); - DELETE FROM t1; - SELECT printf('(%d)',changes()); - - - CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b); - CREATE INDEX i1a ON t1(a); - CREATE INDEX i1b ON t1(b); - INSERT INTO t1 VALUES(1, 'one', 'i'); - INSERT INTO t1 VALUES(2, 'two', 'ii'); - INSERT INTO t1 VALUES(3, 'three', 'iii'); - INSERT INTO t1 VALUES(4, 'four', 'iv'); - INSERT INTO t1 VALUES(5, 'one', 'i'); - INSERT INTO t1 VALUES(6, 'two', 'ii'); - INSERT INTO t1 VALUES(7, 'three', 'iii'); - INSERT INTO t1 VALUES(8, 'four', 'iv'); - - - DELETE FROM t1 WHERE a='two' OR b='iv'; - - - SELECT i FROM t1 ORDER BY i; - - - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(col0, col1); - INSERT INTO "t4" VALUES(14, 'abcde'); - CREATE INDEX idx_t4_0 ON t4 (col1, col0); - CREATE INDEX idx_t4_3 ON t4 (col0); - DELETE FROM t4 WHERE col0=69 OR col0>7; - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(col0, col1); - INSERT INTO "t4" VALUES(14, 'abcde'); - CREATE INDEX idx_t4_3 ON t4 (col0); - CREATE INDEX idx_t4_0 ON t4 (col1, col0); - DELETE FROM t4 WHERE col0=69 OR col0>7; - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(col0, col1, pk PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t4 VALUES(14, 'abcde','xyzzy'); - CREATE INDEX idx_t4_0 ON t4 (col1, col0); - CREATE INDEX idx_t4_3 ON t4 (col0); - DELETE FROM t4 WHERE col0=69 OR col0>7; - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(col0, col1, pk PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t4 VALUES(14, 'abcde','xyzzy'); - CREATE INDEX idx_t4_3 ON t4 (col0); - CREATE INDEX idx_t4_0 ON t4 (col1, col0); - DELETE FROM t4 WHERE col0=69 OR col0>7; - PRAGMA integrity_check; - - - PRAGMA page_size=1024; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - CREATE INDEX x1 ON t1(b, c); - INSERT INTO t1(a,b,c) VALUES(1, 1, zeroblob(80)); - INSERT INTO t1(a,b,c) SELECT a+1, 1, c FROM t1; - INSERT INTO t1(a,b,c) SELECT a+2, 1, c FROM t1; - INSERT INTO t1(a,b,c) SELECT a+10, 2, c FROM t1 WHERE b=1; - INSERT INTO t1(a,b,c) SELECT a+20, 3, c FROM t1 WHERE b=1; - PRAGMA reverse_unordered_selects = ON; - DELETE FROM t1 WHERE b=2; - SELECT a FROM t1 WHERE b=2; - - - CREATE TABLE t2(x INT); - INSERT INTO t2(x) VALUES(1),(2),(3),(4),(5); - DELETE FROM t2 WHERE EXISTS(SELECT 1 FROM t2 AS v WHERE v.x=t2.x-1); - SELECT x FROM t2; - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x INT); - INSERT INTO t2(x) VALUES(1),(2),(3),(4),(5); - DELETE FROM t2 WHERE EXISTS(SELECT 1 FROM t2 AS v WHERE v.x=t2.x+1); - SELECT x FROM t2; - - - CREATE TABLE t3(id INT PRIMARY KEY, a, b) WITHOUT ROWID; - CREATE INDEX t3a ON t3(a); - CREATE INDEX t3b ON t3(b); - - INSERT INTO t3 VALUES(1, 1, 1); - INSERT INTO t3 VALUES(2, 2, 2); - INSERT INTO t3 VALUES(3, 3, 3); - INSERT INTO t3 VALUES(4, 4, 1); - - - DELETE FROM t3 WHERE a=4 OR b=1; - - - SELECT * FROM t3; - - - CREATE TABLE t4(a PRIMARY KEY, b) WITHOUT ROWID; - CREATE INDEX t4i ON t4(b); - INSERT INTO t4 VALUES(1, 'hello'); - INSERT INTO t4 VALUES(2, 'world'); - - CREATE TABLE t5(a PRIMARY KEY, b) WITHOUT ROWID; - CREATE INDEX t5i ON t5(b); - INSERT INTO t5 VALUES(1, 'hello'); - INSERT INTO t5 VALUES(3, 'world'); - - PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage = ( - SELECT rootpage FROM sqlite_master WHERE name = 't5' - ) WHERE name = 't4'; - - - DELETE FROM t4 WHERE b='world' - - - CREATE TABLE t3(id INT PRIMARY KEY, a, b) WITHOUT ROWID; - INSERT INTO t3 VALUES(1, 2, 3); - INSERT INTO t3 VALUES(4, 5, 6); - INSERT INTO t3 VALUES(7, 8, 9); - CREATE TRIGGER t3t BEFORE DELETE ON t3 BEGIN - DELETE FROM t3 WHERE id=old.id+3; - END; - - - DELETE FROM t3 WHERE a IN(2, 5, 8); - SELECT * FROM t3; - - - DROP TRIGGER t3t; - INSERT INTO t3 VALUES(1, 2, 3); - INSERT INTO t3 VALUES(4, 5, 6); - INSERT INTO t3 VALUES(7, 8, 9); - CREATE TRIGGER t3t BEFORE DELETE ON t3 BEGIN - DELETE FROM t3 WHERE id=old.id; - END; - - - DELETE FROM t3 WHERE a IN(2, 5, 8); - SELECT * FROM t3; - diff --git a/libsql-wal/tests/assets/fixtures/delete_db.test b/libsql-wal/tests/assets/fixtures/delete_db.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/descidx1.test b/libsql-wal/tests/assets/fixtures/descidx1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/descidx2.test b/libsql-wal/tests/assets/fixtures/descidx2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/descidx3.test b/libsql-wal/tests/assets/fixtures/descidx3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/diskfull.test b/libsql-wal/tests/assets/fixtures/diskfull.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/distinct.test b/libsql-wal/tests/assets/fixtures/distinct.test deleted file mode 100644 index 6a888b1cbe..0000000000 --- a/libsql-wal/tests/assets/fixtures/distinct.test +++ /dev/null @@ -1,173 +0,0 @@ - - CREATE TABLE t1(a, b, c, d); - CREATE UNIQUE INDEX i1 ON t1(b, c); - CREATE UNIQUE INDEX i2 ON t1(d COLLATE nocase); - - CREATE TABLE t2(x INTEGER PRIMARY KEY, y); - - CREATE TABLE t3(c1 PRIMARY KEY NOT NULL, c2 NOT NULL); - CREATE INDEX i3 ON t3(c2); - - CREATE TABLE t4(a, b NOT NULL, c NOT NULL, d NOT NULL); - CREATE UNIQUE INDEX t4i1 ON t4(b, c); - CREATE UNIQUE INDEX t4i2 ON t4(d COLLATE nocase); - - - CREATE TABLE t1(a, b, c); - - CREATE INDEX i1 ON t1(a, b); - CREATE INDEX i2 ON t1(b COLLATE nocase, c COLLATE nocase); - - INSERT INTO t1 VALUES('a', 'b', 'c'); - INSERT INTO t1 VALUES('A', 'B', 'C'); - INSERT INTO t1 VALUES('a', 'b', 'c'); - INSERT INTO t1 VALUES('A', 'B', 'C'); - - - SELECT (SELECT DISTINCT o.a FROM t1 AS i) FROM t1 AS o ORDER BY rowid; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a INTEGER); - INSERT INTO t1 VALUES(3); - INSERT INTO t1 VALUES(2); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - INSERT INTO t1 VALUES(3); - INSERT INTO t1 VALUES(1); - CREATE TABLE t2(x); - INSERT INTO t2 - SELECT DISTINCT - CASE a WHEN 1 THEN x'0000000000' - WHEN 2 THEN zeroblob(5) - ELSE 'xyzzy' END - FROM t1; - SELECT quote(x) FROM t2 ORDER BY 1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES(3),(1),(5),(2),(6),(4),(5),(1),(3); - CREATE INDEX t1x ON t1(x DESC); - SELECT DISTINCT x FROM t1 ORDER BY x ASC; - - - SELECT DISTINCT x FROM t1 ORDER BY x DESC; - - - SELECT DISTINCT x FROM t1 ORDER BY x; - - - DROP INDEX t1x; - CREATE INDEX t1x ON t1(x ASC); - SELECT DISTINCT x FROM t1 ORDER BY x ASC; - - - SELECT DISTINCT x FROM t1 ORDER BY x DESC; - - - SELECT DISTINCT x FROM t1 ORDER BY x; - - - CREATE TABLE jjj(x); - SELECT (SELECT 'mmm' UNION SELECT DISTINCT max(name) ORDER BY 1) - FROM sqlite_master; - - - CREATE TABLE nnn(x); - SELECT (SELECT 'mmm' UNION SELECT DISTINCT max(name) ORDER BY 1) - FROM sqlite_master; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY); - CREATE TABLE t3(a INTEGER PRIMARY KEY); - - CREATE TABLE t4(x); - CREATE TABLE t5(y); - - INSERT INTO t5 VALUES(1), (2), (2); - INSERT INTO t1 VALUES(2); - INSERT INTO t3 VALUES(2); - INSERT INTO t4 VALUES(2); - - - WITH t2(b) AS ( - SELECT DISTINCT y FROM t5 ORDER BY y - ) - SELECT * FROM - t4 CROSS JOIN t3 CROSS JOIN t1 - WHERE (t1.a=t3.a) AND (SELECT count(*) FROM t2 AS y WHERE t4.x!='abc')=t1.a - - - CREATE TABLE person ( pid INT) ; - CREATE UNIQUE INDEX idx ON person ( pid ) WHERE pid == 1; - INSERT INTO person VALUES (1), (10), (10); - SELECT DISTINCT pid FROM person where pid = 10; - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES('a', 'a'); - INSERT INTO t1 VALUES('a', 'b'); - INSERT INTO t1 VALUES('a', 'c'); - - INSERT INTO t1 VALUES('b', 'a'); - INSERT INTO t1 VALUES('b', 'b'); - INSERT INTO t1 VALUES('b', 'c'); - - INSERT INTO t1 VALUES('a', 'a'); - INSERT INTO t1 VALUES('b', 'b'); - - INSERT INTO t1 VALUES('A', 'A'); - INSERT INTO t1 VALUES('B', 'B'); - - - SELECT DISTINCT - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - ORDER BY - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x'; - - - EXPLAIN - SELECT DISTINCT - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - ORDER BY - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x','x','x','x','x','x','x', - 'x','x','x','x'; - - - EXPLAIN CREATE TABLE t2 AS SELECT DISTINCT ':memory:', 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 ORDER BY '%J%j%w%s', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', '%J%j%w%s', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 42e-300, 'unixepoch', 'unixepoch', 'unixepoch' LIMIT 0xda; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0 AS SELECT DISTINCT 0xda, 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 0xda-0xda-42e-300, 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0', 'lit0' ORDER BY '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%Y-%m-%d', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', 'lit0', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', 'auto', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', ':memory:', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', '%%', ''; - SELECT count(*) FROM t0; - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2 AS SELECT DISTINCT ':memory:', 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0.0*7/0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 ORDER BY '%J%j%w%s', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', '%J%j%w%s', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 'unixepoch', 42e-300, 'unixepoch', 'unixepoch', 'unixepoch' LIMIT 0xda; - SELECT count(*) FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/distinct2.test b/libsql-wal/tests/assets/fixtures/distinct2.test deleted file mode 100644 index 24c08fe362..0000000000 --- a/libsql-wal/tests/assets/fixtures/distinct2.test +++ /dev/null @@ -1,212 +0,0 @@ - - CREATE TABLE t1(x INTEGER PRIMARY KEY); - INSERT INTO t1 VALUES(0),(1),(2); - CREATE TABLE t2 AS - SELECT DISTINCT a.x AS aa, b.x AS bb - FROM t1 a, t1 b; - SELECT *, '|' FROM t2 ORDER BY aa, bb; - - - DROP TABLE t2; - CREATE TABLE t2 AS - SELECT DISTINCT a.x AS aa, b.x AS bb - FROM t1 a, t1 b - WHERE a.x IN t1 AND b.x IN t1; - SELECT *, '|' FROM t2 ORDER BY aa, bb; - - - CREATE TABLE t102 (i0 TEXT UNIQUE NOT NULL); - INSERT INTO t102 VALUES ('0'),('1'),('2'); - DROP TABLE t2; - CREATE TABLE t2 AS - SELECT DISTINCT * - FROM t102 AS t0 - JOIN t102 AS t4 ON (t2.i0 IN t102) - NATURAL JOIN t102 AS t3 - JOIN t102 AS t1 ON (t0.i0 IN t102) - JOIN t102 AS t2 ON (t2.i0=+t0.i0 OR (t0.i0<>500 AND t2.i0=t1.i0)); - SELECT *, '|' FROM t2 ORDER BY 1, 2, 3, 4, 5; - - - CREATE TABLE t4(a,b,c,d,e,f,g,h,i,j); - INSERT INTO t4 VALUES(0,1,2,3,4,5,6,7,8,9); - INSERT INTO t4 SELECT * FROM t4; - INSERT INTO t4 SELECT * FROM t4; - CREATE INDEX t4x ON t4(c,d,e); - SELECT DISTINCT a,b,c FROM t4 WHERE a=0 AND b=1; - - - SELECT DISTINCT a,b,c,d FROM t4 WHERE a=0 AND b=1; - - - SELECT DISTINCT d,a,b,c FROM t4 WHERE a=0 AND b=1; - - - SELECT DISTINCT a,b,c,d,e FROM t4 WHERE a=0 AND b=1; - - - SELECT DISTINCT a,b,c,d,e,f FROM t4 WHERE a=0 AND b=1; - - - CREATE TABLE t5(a INT, b INT); - CREATE UNIQUE INDEX t5x ON t5(a+b); - INSERT INTO t5(a,b) VALUES(0,0),(1,0),(1,1),(0,3); - CREATE TEMP TABLE out AS SELECT DISTINCT a+b FROM t5; - SELECT * FROM out ORDER BY 1; - - - CREATE TABLE t6a(x INTEGER PRIMARY KEY); - INSERT INTO t6a VALUES(1); - CREATE TABLE t6b(y INTEGER PRIMARY KEY); - INSERT INTO t6b VALUES(2),(3); - SELECT DISTINCT x, x FROM t6a, t6b; - - - CREATE TABLE t7(a, b, c); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE (i+1)<200 - ) - INSERT INTO t7 SELECT i/100, i/50, i FROM s; - - - SELECT DISTINCT a, b FROM t7; - - - SELECT DISTINCT a, b+1 FROM t7; - - - CREATE INDEX i7 ON t7(a, b+1); - ANALYZE; - SELECT DISTINCT a, b+1 FROM t7; - - - CREATE TABLE t8(a, b, c); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE (i+1)<100 - ) - INSERT INTO t8 SELECT i/40, i/20, i/40 FROM s; - - - SELECT DISTINCT a, b, c FROM t8; - - - SELECT DISTINCT a, b, c FROM t8 WHERE b=3; - - - CREATE INDEX i8 ON t8(a, c); - ANALYZE; - SELECT DISTINCT a, b, c FROM t8 WHERE b=3; - - - CREATE TABLE t9(v); - INSERT INTO t9 VALUES - ('abcd'), ('Abcd'), ('aBcd'), ('ABcd'), ('abCd'), ('AbCd'), ('aBCd'), - ('ABCd'), ('abcD'), ('AbcD'), ('aBcD'), ('ABcD'), ('abCD'), ('AbCD'), - ('aBCD'), ('ABCD'), - ('wxyz'), ('Wxyz'), ('wXyz'), ('WXyz'), ('wxYz'), ('WxYz'), ('wXYz'), - ('WXYz'), ('wxyZ'), ('WxyZ'), ('wXyZ'), ('WXyZ'), ('wxYZ'), ('WxYZ'), - ('wXYZ'), ('WXYZ'); - - - SELECT DISTINCT v COLLATE NOCASE, v FROM t9 ORDER BY +v; - - - CREATE INDEX i9 ON t9(v COLLATE NOCASE, v); - ANALYZE; - - SELECT DISTINCT v COLLATE NOCASE, v FROM t9 ORDER BY +v; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); - CREATE INDEX t1b ON t1(b); - CREATE TABLE t2(x INTEGER PRIMARY KEY, y INTEGER); - CREATE INDEX t2y ON t2(y); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<49) - INSERT INTO t1(b) SELECT x/10 - 1 FROM c; - WITH RECURSIVE c(x) AS (VALUES(-1) UNION ALL SELECT x+1 FROM c WHERE x<19) - INSERT INTO t2(x,y) SELECT x, 1 FROM c; - SELECT DISTINCT y FROM t1, t2 WHERE b=x AND b<>-1; - ANALYZE; - SELECT DISTINCT y FROM t1, t2 WHERE b=x AND b<>-1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); - CREATE INDEX t1b ON t1(b); - CREATE TABLE t2(x INTEGER PRIMARY KEY, y INTEGER); - CREATE INDEX t2y ON t2(y); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<49) - INSERT INTO t1(b) SELECT -(x/10 - 1) FROM c; - WITH RECURSIVE c(x) AS (VALUES(-1) UNION ALL SELECT x+1 FROM c WHERE x<19) - INSERT INTO t2(x,y) SELECT -x, 1 FROM c; - SELECT DISTINCT y FROM t1, t2 WHERE b=x AND b<>1 ORDER BY y DESC; - ANALYZE; - SELECT DISTINCT y FROM t1, t2 WHERE b=x AND b<>1 ORDER BY y DESC; - - - CREATE TABLE t1(a, b); - CREATE INDEX t1a ON t1(a, b); - -- Lots of rows of (1, 'no'), followed by a single (1, 'yes'). - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a, b) SELECT 1, 'no' FROM c; - INSERT INTO t1(a, b) VALUES(1, 'yes'); - CREATE TABLE t2(x PRIMARY KEY); - INSERT INTO t2 VALUES('yes'); - SELECT DISTINCT a FROM t1, t2 WHERE x=b; - ANALYZE; - SELECT DISTINCT a FROM t1, t2 WHERE x=b; - - - CREATE TABLE t0 (c0, c1, c2, PRIMARY KEY (c0, c1)); - CREATE TABLE t1 (c2); - INSERT INTO t0(c2) VALUES (0),(1),(3),(4),(5),(6),(7),(8),(9),(10),(11); - INSERT INTO t0(c1) VALUES ('a'); - INSERT INTO t1(c2) VALUES (0); - - - SELECT DISTINCT t0.c0, t1._rowid_, t0.c1 FROM t1 CROSS JOIN t0 ORDER BY t0.c0; - - - ANALYZE; - - - SELECT DISTINCT t0.c0, t1._rowid_, t0.c1 FROM t1 CROSS JOIN t0 ORDER BY t0.c0; - - - CREATE TABLE t2(a, b, c); - CREATE INDEX t2ab ON t2(a, b); - - WITH c(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM c WHERE i<64) - INSERT INTO t2 SELECT 'one', i%2, 'one' FROM c; - - WITH c(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM c WHERE i<64) - INSERT INTO t2 SELECT 'two', i%2, 'two' FROM c; - - CREATE TABLE t3(x INTEGER PRIMARY KEY); - INSERT INTO t3 VALUES(1); - - ANALYZE; - - - SELECT DISTINCT a, b, x FROM t3 CROSS JOIN t2 ORDER BY a, +b; - - - CREATE TABLE t0 (c0, c1 NOT NULL DEFAULT 1, c2, PRIMARY KEY (c0, c1)); - INSERT INTO t0(c2) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); - INSERT INTO t0(c2) VALUES('a'); - - - SELECT DISTINCT * FROM t0 WHERE NULL IS t0.c0; - - - ANALYZE; - - - SELECT DISTINCT * FROM t0 WHERE NULL IS c0; - - - CREATE TABLE t1(a, b COLLATE RTRIM); - INSERT INTO t1 VALUES(1, ''), (2, ' '), (3, ' '); - - - SELECT b FROM t1 UNION SELECT 1; - diff --git a/libsql-wal/tests/assets/fixtures/distinctagg.test b/libsql-wal/tests/assets/fixtures/distinctagg.test deleted file mode 100644 index 31e26a9a99..0000000000 --- a/libsql-wal/tests/assets/fixtures/distinctagg.test +++ /dev/null @@ -1,73 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(d, e, f); - - INSERT INTO t1 VALUES (1, 1, 1); - INSERT INTO t1 VALUES (2, 2, 2); - INSERT INTO t1 VALUES (3, 3, 3); - INSERT INTO t1 VALUES (4, 1, 4); - INSERT INTO t1 VALUES (5, 2, 1); - INSERT INTO t1 VALUES (5, 3, 2); - INSERT INTO t1 VALUES (4, 1, 3); - INSERT INTO t1 VALUES (3, 2, 4); - INSERT INTO t1 VALUES (2, 3, 1); - INSERT INTO t1 VALUES (1, 1, 2); - - INSERT INTO t2 VALUES('a', 'a', 'a'); - INSERT INTO t2 VALUES('b', 'b', 'b'); - INSERT INTO t2 VALUES('c', 'c', 'c'); - - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1bc ON t1(b, c); - - - SELECT a, count(DISTINCT b) FROM t1 GROUP BY a; - - - CREATE TABLE t1(a, b, c); - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1bc ON t1(b, c); - - INSERT INTO t1 VALUES(1, 'A', 1); - INSERT INTO t1 VALUES(1, 'A', 1); - INSERT INTO t1 VALUES(2, 'A', 2); - INSERT INTO t1 VALUES(2, 'A', 2); - INSERT INTO t1 VALUES(1, 'B', 1); - INSERT INTO t1 VALUES(2, 'B', 2); - INSERT INTO t1 VALUES(3, 'B', 3); - INSERT INTO t1 VALUES(NULL, 'B', NULL); - INSERT INTO t1 VALUES(NULL, 'C', NULL); - INSERT INTO t1 VALUES('d', 'D', 'd'); - - CREATE TABLE t2(d, e, f); - CREATE INDEX t2def ON t2(d, e, f); - - INSERT INTO t2 VALUES(1, 1, 'a'); - INSERT INTO t2 VALUES(1, 1, 'a'); - INSERT INTO t2 VALUES(1, 2, 'a'); - INSERT INTO t2 VALUES(1, 2, 'a'); - INSERT INTO t2 VALUES(1, 2, 'b'); - INSERT INTO t2 VALUES(1, 3, 'b'); - INSERT INTO t2 VALUES(1, 3, 'a'); - INSERT INTO t2 VALUES(1, 3, 'b'); - INSERT INTO t2 VALUES(2, 3, 'x'); - INSERT INTO t2 VALUES(2, 3, 'y'); - INSERT INTO t2 VALUES(2, 3, 'z'); - - CREATE TABLE t3(x, y, z); - INSERT INTO t3 VALUES(1,1,1); - INSERT INTO t3 VALUES(2,2,2); - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - INSERT INTO t1 VALUES(123,456); - INSERT INTO t2 VALUES(123,456); - - - SELECT count(DISTINCT c) FROM t1 LEFT JOIN t2; - - - CREATE TABLE v1 ( v2 UNIQUE, v3 AS( TYPEOF ( NULL ) ) UNIQUE ); - SELECT COUNT ( DISTINCT TRUE ) FROM v1 GROUP BY likelihood ( v3 , 0.100000 ); - diff --git a/libsql-wal/tests/assets/fixtures/e_blobbytes.test b/libsql-wal/tests/assets/fixtures/e_blobbytes.test deleted file mode 100644 index 12b842f3d9..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_blobbytes.test +++ /dev/null @@ -1,9 +0,0 @@ - - CREATE TABLE q1(r INTEGER PRIMARY KEY, s TEXT); - WITH d(a, b) AS ( - SELECT 0, '' - UNION ALL - SELECT a+1, b||'.' FROM d WHERE a<10000 - ) - INSERT INTO q1 SELECT * FROM d; - diff --git a/libsql-wal/tests/assets/fixtures/e_blobopen.test b/libsql-wal/tests/assets/fixtures/e_blobopen.test deleted file mode 100644 index 12a4123f18..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_blobopen.test +++ /dev/null @@ -1,100 +0,0 @@ - - ATTACH 'test.db2' AS aux; - - CREATE TABLE main.t1(a INTEGER PRIMARY KEY, b TEXT, c BLOB); - CREATE TEMP TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c BLOB); - CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b TEXT, c BLOB); - - CREATE TABLE main.x1(a INTEGER PRIMARY KEY, b TEXT, c BLOB); - CREATE TEMP TABLE x2(a INTEGER PRIMARY KEY, b TEXT, c BLOB); - CREATE TABLE aux.x3(a INTEGER PRIMARY KEY, b TEXT, c BLOB); - - INSERT INTO main.t1 VALUES(1, 'main one', X'0101'); - INSERT INTO main.t1 VALUES(2, 'main two', X'0102'); - INSERT INTO main.t1 VALUES(3, 'main three', X'0103'); - INSERT INTO main.t1 VALUES(4, 'main four', X'0104'); - INSERT INTO main.t1 VALUES(5, 'main five', X'0105'); - - INSERT INTO main.x1 VALUES(1, 'x main one', X'000101'); - INSERT INTO main.x1 VALUES(2, 'x main two', X'000102'); - INSERT INTO main.x1 VALUES(3, 'x main three', X'000103'); - INSERT INTO main.x1 VALUES(4, 'x main four', X'000104'); - INSERT INTO main.x1 VALUES(5, 'x main five', X'000105'); - - INSERT INTO temp.t1 VALUES(1, 'temp one', X'0201'); - INSERT INTO temp.t1 VALUES(2, 'temp two', X'0202'); - INSERT INTO temp.t1 VALUES(3, 'temp three', X'0203'); - INSERT INTO temp.t1 VALUES(4, 'temp four', X'0204'); - INSERT INTO temp.t1 VALUES(5, 'temp five', X'0205'); - - INSERT INTO temp.x2 VALUES(1, 'x temp one', X'000201'); - INSERT INTO temp.x2 VALUES(2, 'x temp two', X'000202'); - INSERT INTO temp.x2 VALUES(3, 'x temp three', X'000203'); - INSERT INTO temp.x2 VALUES(4, 'x temp four', X'000204'); - INSERT INTO temp.x2 VALUES(5, 'x temp five', X'000205'); - - INSERT INTO aux.t1 VALUES(1, 'aux one', X'0301'); - INSERT INTO aux.t1 VALUES(2, 'aux two', X'0302'); - INSERT INTO aux.t1 VALUES(3, 'aux three', X'0303'); - INSERT INTO aux.t1 VALUES(4, 'aux four', X'0304'); - INSERT INTO aux.t1 VALUES(5, 'aux five', X'0305'); - - INSERT INTO aux.x3 VALUES(1, 'x aux one', X'000301'); - INSERT INTO aux.x3 VALUES(2, 'x aux two', X'000302'); - INSERT INTO aux.x3 VALUES(3, 'x aux three', X'000303'); - INSERT INTO aux.x3 VALUES(4, 'x aux four', X'000304'); - INSERT INTO aux.x3 VALUES(5, 'x aux five', X'000305'); - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES('abcd', 152); - INSERT INTO t1 VALUES(NULL, X'00010203'); - INSERT INTO t1 VALUES('', 154.2); - - CREATE TABLE t2(x PRIMARY KEY, y) WITHOUT ROWID; - INSERT INTO t2 VALUES(1, 'blob'); - - CREATE TABLE t3(a PRIMARY KEY, b, c, d, e, f, UNIQUE(e, f)); - INSERT INTO t3 VALUES('aaaa', 'bbbb', 'cccc', 'dddd', 'eeee', 'ffff'); - CREATE INDEX t3b ON t3(b); - - CREATE TABLE p1(x PRIMARY KEY); - INSERT INTO p1 VALUES('abc'); - - CREATE TABLE c1(a INTEGER PRIMARY KEY, b REFERENCES p1); - INSERT INTO c1 VALUES(45, 'abc'); - - - CREATE TABLE b1(a INTEGER PRIMARY KEY, b, c UNIQUE); - INSERT INTO b1 VALUES(1, '1234567890', 1); - INSERT INTO b1 VALUES(2, '1234567890', 2); - INSERT INTO b1 VALUES(3, '1234567890', 3); - INSERT INTO b1 VALUES(4, '1234567890', 4); - INSERT INTO b1 VALUES(5, '1234567890', 5); - INSERT INTO b1 VALUES(6, '1234567890', 6); - - CREATE TABLE b2(a INTEGER PRIMARY KEY, b, c UNIQUE); - INSERT INTO b2 VALUES(1, '1234567890', 1); - INSERT INTO b2 VALUES(2, '1234567890', 2); - INSERT INTO b2 VALUES(3, '1234567890', 3); - INSERT INTO b2 VALUES(4, '1234567890', 4); - INSERT INTO b2 VALUES(5, '1234567890', 5); - INSERT INTO b2 VALUES(6, '1234567890', 6); - - - CREATE TABLE b3(x INTEGER PRIMARY KEY, y TEXT, z INTEGER); - INSERT INTO b3 VALUES(22, '..........', NULL); - - - UPDATE b3 SET z = 'not null'; - - - SELECT * FROM b3; - - - SELECT * FROM b3; - - - CREATE TABLE c2(i INTEGER PRIMARY KEY, j); - INSERT INTO c2 VALUES(10, zeroblob(24)); - diff --git a/libsql-wal/tests/assets/fixtures/e_blobwrite.test b/libsql-wal/tests/assets/fixtures/e_blobwrite.test deleted file mode 100644 index 8d9c83c767..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_blobwrite.test +++ /dev/null @@ -1,35 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, t TEXT); - INSERT INTO t1 VALUES(-1, randomblob(30)); - INSERT INTO t1 VALUES(-2, randomblob(30)); - INSERT INTO t1 VALUES(-3, randomblob(30)); - INSERT INTO t1 VALUES(-4, randomblob(30)); - INSERT INTO t1 VALUES(-5, randomblob(30)); - INSERT INTO t1 VALUES(-6, randomblob(30)); - - - CREATE TABLE t2(a TEXT, b INTEGER PRIMARY KEY); - INSERT INTO t2 VALUES(randomblob(30), 43); - INSERT INTO t2 VALUES(randomblob(30), 44); - INSERT INTO t2 VALUES(randomblob(30), 45); - - - CREATE TABLE t3(i INTEGER PRIMARY KEY, j TEXT, k TEXT); - INSERT INTO t3 VALUES(1, randomblob(30), randomblob(30)); - INSERT INTO t3 VALUES(2, randomblob(30), randomblob(30)); - SELECT * FROM t3 WHERE i=1; - - - UPDATE t3 SET k = 'xyz' WHERE i=1; - SELECT * FROM t3 WHERE i=1; - - - SELECT * FROM t3 WHERE i=1; - - - UPDATE t3 SET j = 'xyz' WHERE i=2; - SELECT * FROM t3 WHERE i=2; - - - SELECT * FROM t3 WHERE i=2; - diff --git a/libsql-wal/tests/assets/fixtures/e_changes.test b/libsql-wal/tests/assets/fixtures/e_changes.test deleted file mode 100644 index 409bd18fab..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_changes.test +++ /dev/null @@ -1,190 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(x, y, PRIMARY KEY(x, y)) WITHOUT ROWID; - CREATE INDEX i1 ON t1(a); - CREATE INDEX i2 ON t2(y); - - - CREATE TABLE log(x); - CREATE TABLE p1(one PRIMARY KEY, two); - - CREATE TRIGGER tr_ai AFTER INSERT ON p1 BEGIN - INSERT INTO log VALUES('insert'); - END; - CREATE TRIGGER tr_bd BEFORE DELETE ON p1 BEGIN - INSERT INTO log VALUES('delete'); - END; - CREATE TRIGGER tr_au AFTER UPDATE ON p1 BEGIN - INSERT INTO log VALUES('update'); - END; - - - - -- None of the inserts on table log were counted. - SELECT count(*) FROM log - - - DELETE FROM p1; - INSERT INTO p1 VALUES('a', 'A'), ('b', 'B'), ('c', 'C'); - - CREATE TABLE c1(a, b, FOREIGN KEY(a) REFERENCES p1 ON DELETE SET NULL); - CREATE TABLE c2(a, b, FOREIGN KEY(a) REFERENCES p1 ON DELETE SET DEFAULT); - CREATE TABLE c3(a, b, FOREIGN KEY(a) REFERENCES p1 ON DELETE CASCADE); - INSERT INTO c1 VALUES('a', 'aaa'); - INSERT INTO c2 VALUES('b', 'bbb'); - INSERT INTO c3 VALUES('c', 'ccc'); - - INSERT INTO p1 VALUES('d', 'D'), ('e', 'E'), ('f', 'F'); - CREATE TABLE c4(a, b, FOREIGN KEY(a) REFERENCES p1 ON UPDATE SET NULL); - CREATE TABLE c5(a, b, FOREIGN KEY(a) REFERENCES p1 ON UPDATE SET DEFAULT); - CREATE TABLE c6(a, b, FOREIGN KEY(a) REFERENCES p1 ON UPDATE CASCADE); - INSERT INTO c4 VALUES('d', 'aaa'); - INSERT INTO c5 VALUES('e', 'bbb'); - INSERT INTO c6 VALUES('f', 'ccc'); - - PRAGMA foreign_keys = ON; - - - SELECT * FROM c1; - SELECT * FROM c2; - SELECT * FROM c3; - - - SELECT * FROM c4; - SELECT * FROM c5; - SELECT * FROM c6; - - - CREATE TABLE r1(a UNIQUE, b UNIQUE); - INSERT INTO r1 VALUES('i', 'i'); - INSERT INTO r1 VALUES('ii', 'ii'); - INSERT INTO r1 VALUES('iii', 'iii'); - INSERT INTO r1 VALUES('iv', 'iv'); - INSERT INTO r1 VALUES('v', 'v'); - INSERT INTO r1 VALUES('vi', 'vi'); - INSERT INTO r1 VALUES('vii', 'vii'); - - - SELECT * FROM r1 ORDER BY a; - - - CREATE TABLE log(log); - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE TRIGGER v1_i INSTEAD OF INSERT ON v1 BEGIN - INSERT INTO log VALUES('insert'); - END; - CREATE TRIGGER v1_u INSTEAD OF UPDATE ON v1 BEGIN - INSERT INTO log VALUES('update'), ('update'); - END; - CREATE TRIGGER v1_d INSTEAD OF DELETE ON v1 BEGIN - INSERT INTO log VALUES('delete'), ('delete'), ('delete'); - END; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - CREATE TABLE t2(x); - INSERT INTO t1 VALUES(1, NULL); - INSERT INTO t1 VALUES(2, NULL); - INSERT INTO t1 VALUES(3, NULL); - CREATE TRIGGER AFTER UPDATE ON t1 BEGIN - INSERT INTO t2 VALUES('a'), ('b'), ('c'); - SELECT my_changes('trigger'); - END; - - - INSERT INTO t2 VALUES('a'), ('b'); - UPDATE t1 SET b = my_changes('update'); - SELECT * FROM t1; - - - CREATE TABLE t1(a, b); - CREATE TABLE log(x); - INSERT INTO t1 VALUES(1, 0); - INSERT INTO t1 VALUES(2, 0); - INSERT INTO t1 VALUES(3, 0); - CREATE TRIGGER t1_a_u AFTER UPDATE ON t1 BEGIN - INSERT INTO log VALUES(old.b || ' -> ' || new.b || ' c = ' || changes() ); - END; - CREATE TABLE t2(a); - INSERT INTO t2 VALUES(1), (2), (3); - UPDATE t1 SET b = changes(); - - - SELECT * FROM t1; - - - SELECT * FROM log; - - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - CREATE TABLE t3(a, b); - CREATE TABLE log(x); - - CREATE TRIGGER t1_i BEFORE INSERT ON t1 BEGIN - INSERT INTO t2 VALUES(new.a, new.b), (new.a, new.b); - INSERT INTO log VALUES('t2->' || changes()); - END; - - CREATE TRIGGER t2_i AFTER INSERT ON t2 BEGIN - INSERT INTO t3 VALUES(new.a, new.b), (new.a, new.b), (new.a, new.b); - INSERT INTO log VALUES('t3->' || changes()); - END; - - CREATE TRIGGER t1_u AFTER UPDATE ON t1 BEGIN - UPDATE t2 SET b=new.b WHERE a=old.a; - INSERT INTO log VALUES('t2->' || changes()); - END; - - CREATE TRIGGER t2_u BEFORE UPDATE ON t2 BEGIN - UPDATE t3 SET b=new.b WHERE a=old.a; - INSERT INTO log VALUES('t3->' || changes()); - END; - - CREATE TRIGGER t1_d AFTER DELETE ON t1 BEGIN - DELETE FROM t2 WHERE a=old.a AND b=old.b; - INSERT INTO log VALUES('t2->' || changes()); - END; - - CREATE TRIGGER t2_d BEFORE DELETE ON t2 BEGIN - DELETE FROM t3 WHERE a=old.a AND b=old.b; - INSERT INTO log VALUES('t3->' || changes()); - END; - - - CREATE TABLE q1(t); - CREATE TABLE q2(u, v); - CREATE TABLE q3(w); - - CREATE TRIGGER q2_insert BEFORE INSERT ON q2 BEGIN - - /* changes() returns value from previous I/U/D in callers context */ - INSERT INTO q1 VALUES('1:' || changes()); - - /* changes() returns value of previous I/U/D in this context */ - INSERT INTO q3 VALUES(changes()), (2), (3); - INSERT INTO q1 VALUES('2:' || changes()); - INSERT INTO q3 VALUES(changes() + 3), (changes()+4); - SELECT 'this does not affect things!'; - INSERT INTO q1 VALUES('3:' || changes()); - UPDATE q3 SET w = w+10 WHERE w%2; - INSERT INTO q1 VALUES('4:' || changes()); - DELETE FROM q3; - INSERT INTO q1 VALUES('5:' || changes()); - END; - - - INSERT INTO q2 VALUES('x', 'y'); - SELECT * FROM q1; - - - DELETE FROM q1; - INSERT INTO q2 VALUES('x', 'y'); - SELECT * FROM q1; - diff --git a/libsql-wal/tests/assets/fixtures/e_createtable.test b/libsql-wal/tests/assets/fixtures/e_createtable.test deleted file mode 100644 index a41ca54cac..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_createtable.test +++ /dev/null @@ -1,318 +0,0 @@ - - ATTACH 'test.db2' AS auxa; - ATTACH 'test.db3' AS auxb; - - - CREATE TABLE t1(x, y); - CREATE INDEX i1 ON t1(x); - CREATE VIEW v1 AS SELECT * FROM t1; - - CREATE TABLE auxa.tbl1(x, y); - CREATE INDEX auxa.idx1 ON tbl1(x); - CREATE VIEW auxa.view1 AS SELECT * FROM tbl1; - - - CREATE TABLE t1(x, y); - CREATE INDEX i1 ON t1(x); - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE TABLE auxa.tbl1(x, y); - CREATE INDEX auxa.idx1 ON tbl1(x); - CREATE VIEW auxa.view1 AS SELECT * FROM tbl1; - - - CREATE TABLE t1(x, y); - CREATE TABLE auxb.t2(x, y); - - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - SELECT 1; - END; - CREATE TRIGGER auxb.tr2 AFTER INSERT ON t2 BEGIN - SELECT 1; - END; - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - CREATE TABLE auxa.t3(a, b); - CREATE TABLE auxa.t4(a, b); - - - SELECT * FROM t1; - SELECT * FROM t2; - SELECT * FROM t3; - SELECT * FROM t4; - - - SELECT name FROM sqlite_master; - SELECT name FROM auxa.sqlite_master; - - - SELECT name FROM sqlite_master; - SELECT name FROM auxa.sqlite_master; - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(d, e, f); - CREATE TABLE t3(g BIGINT, h VARCHAR(10)); - CREATE TABLE t4(i BLOB, j ANYOLDATA); - CREATE TABLE t5(k FLOAT, l INTEGER); - CREATE TABLE t6(m DEFAULT 10, n DEFAULT 5, PRIMARY KEY(m, n)); - CREATE TABLE t7(x INTEGER PRIMARY KEY); - CREATE TABLE t8(o COLLATE nocase DEFAULT 'abc'); - CREATE TABLE t9(p NOT NULL, q DOUBLE CHECK (q!=0), r STRING UNIQUE); - - - INSERT INTO x1 DEFAULT VALUES; - INSERT INTO x2 DEFAULT VALUES; - INSERT INTO x3 DEFAULT VALUES; - INSERT INTO x4 DEFAULT VALUES; - - SELECT * FROM x1 - SELECT * FROM x2 - SELECT * FROM x3 - SELECT * FROM x4 - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES('i', 'one'); - INSERT INTO t1 VALUES('ii', 'two'); - INSERT INTO t1 VALUES('iii', 'three'); - - - CREATE TABLE t1(x VARCHAR(10), y INTEGER, z DOUBLE); - CREATE TABLE t2(a DATETIME, b STRING, c REAL); - CREATE TABLE t3(o, t); - - - INSERT INTO t1 VALUES(14, 'quite a lengthy string', X'555655'); - SELECT * FROM t1; - - - INSERT INTO t2 VALUES('not a datetime', 13, '12:41:59'); - SELECT * FROM t2; - - DELETE FROM t1; DELETE FROM t2; - - CREATE TABLE t4( - a DEFAULT NULL, - b DEFAULT 'string constant', - c DEFAULT X'424C4F42', - d DEFAULT 1, - e DEFAULT -1, - f DEFAULT 3.14, - g DEFAULT -3.14, - h DEFAULT ( substr('abcd', 0, 2) || 'cd' ), - i DEFAULT CURRENT_TIME, - j DEFAULT CURRENT_DATE, - k DEFAULT CURRENT_TIMESTAMP - ); - - - CREATE TABLE t5( - a DEFAULT NULL, - b DEFAULT 'text value', - c DEFAULT X'424C4F42', - d DEFAULT -45678.6, - e DEFAULT 394507 - ); - - - INSERT INTO t5 DEFAULT VALUES; - SELECT quote(a), quote(b), quote(c), quote(d), quote(e) FROM t5; - - - CREATE TABLE t6(a DEFAULT ( nextint() ), b DEFAULT ( nextint() )); - - - INSERT INTO t6 DEFAULT VALUES; - SELECT quote(a), quote(b) FROM t6; - - - INSERT INTO t6(a) VALUES('X'); - SELECT quote(a), quote(b) FROM t6; - - - INSERT INTO t6(a) SELECT a FROM t6; - SELECT quote(a), quote(b) FROM t6; - - - CREATE TABLE t7( - a DEFAULT CURRENT_TIME, - b DEFAULT CURRENT_DATE, - c DEFAULT CURRENT_TIMESTAMP - ); - - - INSERT INTO t7 DEFAULT VALUES; - SELECT quote(a), quote(b), quote(c) FROM t7; - - - CREATE TABLE t8(a COLLATE nocase, b COLLATE rtrim, c COLLATE binary, d); - INSERT INTO t8 VALUES('abc', 'abc', 'abc', 'abc'); - INSERT INTO t8 VALUES('abc ', 'abc ', 'abc ', 'abc '); - INSERT INTO t8 VALUES('ABC ', 'ABC ', 'ABC ', 'ABC '); - INSERT INTO t8 VALUES('ABC', 'ABC', 'ABC', 'ABC'); - - - CREATE TABLE t12(a, b, c); - INSERT INTO t12 VALUES(randomblob(30000),randomblob(30000),randomblob(30000)); - - - CREATE TABLE t1(x PRIMARY KEY, y); - INSERT INTO t1 VALUES(0, 'zero'); - INSERT INTO t1 VALUES(45.5, 'one'); - INSERT INTO t1 VALUES('brambles', 'two'); - INSERT INTO t1 VALUES(X'ABCDEF', 'three'); - - CREATE TABLE t2(x, y, PRIMARY KEY(x, y)); - INSERT INTO t2 VALUES(0, 'zero'); - INSERT INTO t2 VALUES(45.5, 'one'); - INSERT INTO t2 VALUES('brambles', 'two'); - INSERT INTO t2 VALUES(X'ABCDEF', 'three'); - - - CREATE TABLE t3(s, u INTEGER PRIMARY KEY, v); - INSERT INTO t3 VALUES(1, NULL, 2); - INSERT INTO t3 VALUES('x', NULL, 'y'); - SELECT u FROM t3; - - - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(4.3, 5.5); - INSERT INTO t1 VALUES('reveal', 'variableness'); - INSERT INTO t1 VALUES(X'123456', X'654321'); - - INSERT INTO t4 VALUES('xyx', 1, 1); - INSERT INTO t4 VALUES('xyx', 2, 1); - INSERT INTO t4 VALUES('uvw', 1, 1); - - - CREATE TABLE t1(a, b PRIMARY KEY); - CREATE TABLE t2(a, b, c, UNIQUE(b, c)); - - - CREATE TABLE x1(a TEXT, b INTEGER CHECK( b>0 )); - CREATE TABLE t1(a TEXT, b INTEGER, CHECK( b>0 )); - INSERT INTO x1 VALUES('x', 'xx'); - INSERT INTO x1 VALUES('y', 'yy'); - INSERT INTO t1 SELECT * FROM x1; - - CREATE TABLE x2(a CHECK( a||b ), b); - CREATE TABLE t2(a, b, CHECK( a||b )); - INSERT INTO x2 VALUES(1, 'xx'); - INSERT INTO x2 VALUES(1, 'yy'); - INSERT INTO t2 SELECT * FROM x2; - - - INSERT INTO t1 VALUES('x', 'y'); - INSERT INTO t1 VALUES('z', NULL); - - INSERT INTO t2 VALUES('x', 'y'); - INSERT INTO t2 VALUES('z', NULL); - - INSERT INTO t3 VALUES('x', 'y', 'z'); - INSERT INTO t3 VALUES(1, 2, 3); - - - CREATE TABLE t1_ab(a PRIMARY KEY ON CONFLICT ABORT, b); - CREATE TABLE t1_ro(a PRIMARY KEY ON CONFLICT ROLLBACK, b); - CREATE TABLE t1_ig(a PRIMARY KEY ON CONFLICT IGNORE, b); - CREATE TABLE t1_fa(a PRIMARY KEY ON CONFLICT FAIL, b); - CREATE TABLE t1_re(a PRIMARY KEY ON CONFLICT REPLACE, b); - CREATE TABLE t1_xx(a PRIMARY KEY, b); - - INSERT INTO t1_ab VALUES(1, 'one'); - INSERT INTO t1_ab VALUES(2, 'two'); - INSERT INTO t1_ro SELECT * FROM t1_ab; - INSERT INTO t1_ig SELECT * FROM t1_ab; - INSERT INTO t1_fa SELECT * FROM t1_ab; - INSERT INTO t1_re SELECT * FROM t1_ab; - INSERT INTO t1_xx SELECT * FROM t1_ab; - - CREATE TABLE t2_ab(a, b NOT NULL ON CONFLICT ABORT); - CREATE TABLE t2_ro(a, b NOT NULL ON CONFLICT ROLLBACK); - CREATE TABLE t2_ig(a, b NOT NULL ON CONFLICT IGNORE); - CREATE TABLE t2_fa(a, b NOT NULL ON CONFLICT FAIL); - CREATE TABLE t2_re(a, b NOT NULL ON CONFLICT REPLACE); - CREATE TABLE t2_xx(a, b NOT NULL); - - INSERT INTO t2_ab VALUES(1, 'one'); - INSERT INTO t2_ab VALUES(2, 'two'); - INSERT INTO t2_ro SELECT * FROM t2_ab; - INSERT INTO t2_ig SELECT * FROM t2_ab; - INSERT INTO t2_fa SELECT * FROM t2_ab; - INSERT INTO t2_re SELECT * FROM t2_ab; - INSERT INTO t2_xx SELECT * FROM t2_ab; - - CREATE TABLE t3_ab(a, b, UNIQUE(a, b) ON CONFLICT ABORT); - CREATE TABLE t3_ro(a, b, UNIQUE(a, b) ON CONFLICT ROLLBACK); - CREATE TABLE t3_ig(a, b, UNIQUE(a, b) ON CONFLICT IGNORE); - CREATE TABLE t3_fa(a, b, UNIQUE(a, b) ON CONFLICT FAIL); - CREATE TABLE t3_re(a, b, UNIQUE(a, b) ON CONFLICT REPLACE); - CREATE TABLE t3_xx(a, b, UNIQUE(a, b)); - - INSERT INTO t3_ab VALUES(1, 'one'); - INSERT INTO t3_ab VALUES(2, 'two'); - INSERT INTO t3_ro SELECT * FROM t3_ab; - INSERT INTO t3_ig SELECT * FROM t3_ab; - INSERT INTO t3_fa SELECT * FROM t3_ab; - INSERT INTO t3_re SELECT * FROM t3_ab; - INSERT INTO t3_xx SELECT * FROM t3_ab; - - - CREATE TABLE t4(a, b CHECK (b!=10)); - INSERT INTO t4 VALUES(1, 2); - INSERT INTO t4 VALUES(3, 4); - - SELECT * FROM t4 - - CREATE TABLE t5(a NOT NULL ON CONFLICT IGNORE, b NOT NULL ON CONFLICT ABORT); - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES('one', 'first'); - INSERT INTO t1 VALUES('two', 'second'); - INSERT INTO t1 VALUES('three', 'third'); - - - CREATE TABLE t2(oid, b); - CREATE TABLE t3(a, _rowid_); - CREATE TABLE t4(a, b, rowid); - - INSERT INTO t2 VALUES('one', 'two'); - INSERT INTO t2 VALUES('three', 'four'); - - INSERT INTO t3 VALUES('five', 'six'); - INSERT INTO t3 VALUES('seven', 'eight'); - - INSERT INTO t4 VALUES('nine', 'ten', 'eleven'); - INSERT INTO t4 VALUES('twelve', 'thirteen', 'fourteen'); - - - CREATE TABLE t6(pk INT primary key); - CREATE TABLE t7(pk BIGINT primary key); - CREATE TABLE t8(pk SHORT INTEGER primary key); - CREATE TABLE t9(pk UNSIGNED INTEGER primary key); - - - INSERT INTO t6 VALUES('2.0'); - INSERT INTO t7 VALUES('2.0'); - INSERT INTO t8 VALUES('2.0'); - INSERT INTO t9 VALUES('2.0'); - SELECT typeof(pk), pk FROM t6; - SELECT typeof(pk), pk FROM t7; - SELECT typeof(pk), pk FROM t8; - SELECT typeof(pk), pk FROM t9; - - - CREATE TABLE t10(a, b); - INSERT INTO t10 VALUES('ten', 10); - - CREATE TABLE t11(a, b INTEGER PRIMARY KEY); - INSERT INTO t11 VALUES('ten', 10); - - - CREATE TABLE t12(x INTEGER PRIMARY KEY, y); - INSERT INTO t12 VALUES(5, 'five'); - - DELETE FROM t12 - DELETE FROM t12 diff --git a/libsql-wal/tests/assets/fixtures/e_delete.test b/libsql-wal/tests/assets/fixtures/e_delete.test deleted file mode 100644 index 624d8daa00..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_delete.test +++ /dev/null @@ -1,68 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a); - - - ATTACH 'test.db2' AS aux; - ATTACH 'test.db3' AS aux2; - - CREATE TABLE temp.t7(a, b); INSERT INTO temp.t7 VALUES(1, 2); - CREATE TABLE main.t7(a, b); INSERT INTO main.t7 VALUES(3, 4); - CREATE TABLE aux.t7(a, b); INSERT INTO aux.t7 VALUES(5, 6); - CREATE TABLE aux2.t7(a, b); INSERT INTO aux2.t7 VALUES(7, 8); - - CREATE TABLE main.t8(a, b); INSERT INTO main.t8 VALUES(1, 2); - CREATE TABLE aux.t8(a, b); INSERT INTO aux.t8 VALUES(3, 4); - CREATE TABLE aux2.t8(a, b); INSERT INTO aux2.t8 VALUES(5, 6); - - CREATE TABLE aux.t9(a, b); INSERT INTO aux.t9 VALUES(1, 2); - CREATE TABLE aux2.t9(a, b); INSERT INTO aux2.t9 VALUES(3, 4); - - CREATE TABLE aux2.t10(a, b); INSERT INTO aux2.t10 VALUES(1, 2); - - - DROP TRIGGER main.tr1; - DROP TRIGGER aux.tr2; - - - DROP TRIGGER aux.tr1; - DROP TRIGGER main.tr1; - DELETE FROM main.t8 WHERE oid>1; - DELETE FROM aux.t8 WHERE oid>1; - INSERT INTO aux.t9 VALUES(1, 2); - INSERT INTO main.t7 VALUES(3, 4); - - - SELECT count(*) FROM temp.t7 UNION ALL SELECT count(*) FROM main.t7 UNION ALL - SELECT count(*) FROM aux.t7 UNION ALL SELECT count(*) FROM aux2.t7; - - SELECT count(*) FROM main.t8 UNION ALL SELECT count(*) FROM aux.t8 - UNION ALL SELECT count(*) FROM aux2.t8; - - SELECT count(*) FROM aux.t9 UNION ALL SELECT count(*) FROM aux2.t9; - - SELECT count(*) FROM aux2.t10; - - - CREATE TRIGGER temp.tr1 AFTER INSERT ON t7 BEGIN - DELETE FROM t7; - DELETE FROM t8; - DELETE FROM t9; - DELETE FROM t10; - END; - INSERT INTO temp.t7 VALUES('hello', 'world'); - - - SELECT count(*) FROM temp.t7 UNION ALL SELECT count(*) FROM main.t7 UNION ALL - SELECT count(*) FROM aux.t7 UNION ALL SELECT count(*) FROM aux2.t7; - - SELECT count(*) FROM main.t8 UNION ALL SELECT count(*) FROM aux.t8 - UNION ALL SELECT count(*) FROM aux2.t8; - - SELECT count(*) FROM aux.t9 UNION ALL SELECT count(*) FROM aux2.t9; - - SELECT count(*) FROM aux2.t10; - - - CREATE INDEX i8 ON t8(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/e_droptrigger.test b/libsql-wal/tests/assets/fixtures/e_droptrigger.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/e_dropview.test b/libsql-wal/tests/assets/fixtures/e_dropview.test deleted file mode 100644 index 11142aa9a6..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_dropview.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE VIEW "new view" AS SELECT * FROM t1 AS x, t1 AS y; - SELECT * FROM "new view"; - -; - SELECT * FROM sqlite_master WHERE name = 'new view'; - - - DROP VIEW "new view"; - SELECT * FROM sqlite_master WHERE name = 'new view'; - diff --git a/libsql-wal/tests/assets/fixtures/e_expr.test b/libsql-wal/tests/assets/fixtures/e_expr.test deleted file mode 100644 index 201bf67f54..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_expr.test +++ /dev/null @@ -1,399 +0,0 @@ - - SELECT 0 < 2 LIKE 1, (0 < 2) LIKE 1, 0 < (2 LIKE 1) - - - SELECT 0 LIKE 0 < 2, (0 LIKE 0) < 2, 0 LIKE (0 < 2) - - - SELECT 2 LIKE 2 == 1, (2 LIKE 2) == 1, 2 LIKE (2 == 1) - - - SELECT 2 == 2 LIKE 1, (2 == 2) LIKE 1, 2 == (2 LIKE 1) - - - SELECT 0 < 2 == 1, (0 < 2) == 1, 0 < (2 == 1) - - - SELECT 0 == 0 < 2, (0 == 0) < 2, 0 == (0 < 2) - - SELECT - 10 - SELECT + 10 - SELECT ~ 10 - SELECT NOT 10 -SELECT 72%5 -SELECT 72%-5 -SELECT -72%-5 -SELECT -72%5 -SELECT 72.35%5 - SELECT 'ab' IS NOT NULL - SELECT NULL IS NOT 'ab' - SELECT 'ab' IS NOT 'ab' - SELECT NULL != NULL - SELECT 'ab' != NULL - SELECT NULL != 'ab' - SELECT 'ab' != 'ab' - SELECT 'abcd' < 'bbbb' COLLATE reverse - SELECT ('abcd' < 'bbbb') COLLATE reverse - SELECT 'abcd' <= 'bbbb' COLLATE reverse - SELECT ('abcd' <= 'bbbb') COLLATE reverse - SELECT 'abcd' > 'bbbb' COLLATE reverse - SELECT ('abcd' > 'bbbb') COLLATE reverse - SELECT 'abcd' >= 'bbbb' COLLATE reverse - SELECT ('abcd' >= 'bbbb') COLLATE reverse - SELECT 'abcd' = 'ABCD' COLLATE nocase - SELECT ('abcd' = 'ABCD') COLLATE nocase - SELECT 'abcd' == 'ABCD' COLLATE nocase - SELECT ('abcd' == 'ABCD') COLLATE nocase - SELECT 'abcd' IS 'ABCD' COLLATE nocase - SELECT ('abcd' IS 'ABCD') COLLATE nocase - SELECT 'abcd' != 'ABCD' COLLATE nocase - SELECT ('abcd' != 'ABCD') COLLATE nocase - SELECT 'abcd' <> 'ABCD' COLLATE nocase - SELECT ('abcd' <> 'ABCD') COLLATE nocase - SELECT 'abcd' IS NOT 'ABCD' COLLATE nocase - SELECT ('abcd' IS NOT 'ABCD') COLLATE nocase - - SELECT 'bbb' BETWEEN 'AAA' AND 'CCC' COLLATE nocase - - - SELECT ('bbb' BETWEEN 'AAA' AND 'CCC') COLLATE nocase - - - CREATE TABLE t24(a COLLATE NOCASE, b); - INSERT INTO t24 VALUES('aaa', 1); - INSERT INTO t24 VALUES('bbb', 2); - INSERT INTO t24 VALUES('ccc', 3); - - SELECT 'BBB' = a FROM t24 - SELECT a = 'BBB' FROM t24 - SELECT 'BBB' = a COLLATE binary FROM t24 - SELECT a COLLATE binary = 'BBB' FROM t24 - SELECT typeof(5) - SELECT typeof(5.1) - SELECT typeof('5.1') - SELECT typeof(X'ABCD') - SELECT typeof(NULL) - SELECT typeof(3.4e-02) - SELECT typeof(3e+5) - SELECT 3.4e-02 - SELECT 3e+4 - SELECT 'is not' - SELECT typeof('is not') - SELECT 'isn''t' - SELECT typeof('isn''t') - SELECT typeof(X'0123456789ABCDEF') - SELECT typeof(x'0123456789ABCDEF') - SELECT typeof(X'0123456789abcdef') - SELECT typeof(x'0123456789abcdef') - SELECT typeof(X'53514C697465') - SELECT NULL - SELECT typeof(NULL) - SELECT 0, +0, -0 - SELECT 1, +1, -1 - SELECT 2, +2, -2 - - SELECT 1.4, +1.4, -1.4 - - - SELECT 1.5e+5, +1.5e+5, -1.5e+5 - - - SELECT 0.0001, +0.0001, -0.0001 - -SELECT 123 -SELECT 123.4e05 -SELECT 'abcde' -SELECT X'414243' -SELECT NULL -SELECT CURRENT_TIME -SELECT CURRENT_DATE -SELECT CURRENT_TIMESTAMP - SELECT 1 != 0 BETWEEN 0 AND 2 - SELECT (1 != 0) BETWEEN 0 AND 2 - SELECT 1 != (0 BETWEEN 0 AND 2) - SELECT 1 LIKE 10 BETWEEN 0 AND 2 - SELECT (1 LIKE 10) BETWEEN 0 AND 2 - SELECT 1 LIKE (10 BETWEEN 0 AND 2) - SELECT 6 BETWEEN 4 AND 8 LIKE 1 - SELECT (6 BETWEEN 4 AND 8) LIKE 1 - SELECT 6 BETWEEN 4 AND (8 LIKE 1) - SELECT 0 AND 0 BETWEEN 0 AND 1 - SELECT 0 AND (0 BETWEEN 0 AND 1) - SELECT (0 AND 0) BETWEEN 0 AND 1 - SELECT 0 BETWEEN -1 AND 1 AND 0 - SELECT (0 BETWEEN -1 AND 1) AND 0 - SELECT 0 BETWEEN -1 AND (1 AND 0) - SELECT 2 < 3 BETWEEN 0 AND 1 - SELECT (2 < 3) BETWEEN 0 AND 1 - SELECT 2 < (3 BETWEEN 0 AND 1) - SELECT 2 BETWEEN 1 AND 2 < 3 - SELECT 2 BETWEEN 1 AND (2 < 3) - SELECT (2 BETWEEN 1 AND 2) < 3 - SELECT 'abc%' LIKE 'abcde' - SELECT 'abcde' LIKE 'abc%' - SELECT 'abde' LIKE 'ab%de' - SELECT 'abXde' LIKE 'ab%de' - SELECT 'abABCde' LIKE 'ab%de' - SELECT 'abde' LIKE 'ab_de' - SELECT 'abXde' LIKE 'ab_de' - SELECT 'abABCde' LIKE 'ab_de' - SELECT 'abc' LIKE 'aBc' - SELECT 'aBc' LIKE 'aBc' - SELECT 'ac' LIKE 'aBc' - SELECT 'A' LIKE 'a' - SELECT 'abc__' LIKE 'abcX_' ESCAPE 'X' - SELECT 'abcX' LIKE 'abcXX' ESCAPE 'X' - SELECT 'abc5' LIKE 'abcXX' ESCAPE 'X' - SELECT 'abc' LIKE 'abcXX' ESCAPE 'X' - SELECT 'abcXX' LIKE 'abcXX' ESCAPE 'X' - SELECT 'abc' LIKE 'def' - SELECT 'abc' LIKE 'def' ESCAPE 'X' - SELECT 'abc%xyz' LIKE 'ABC\%x%' ESCAPE '\' - SELECT 'abc%xyz' LIKE 'ABC\%X%' ESCAPE '\' - SELECT 'ABC%xyz' LIKE 'ABC\%x%' ESCAPE '\' - SELECT 'abc%xyz' LIKE 'ABC\%X%' ESCAPE '\' - SELECT 'ABC%xyz' LIKE 'ABC\%X%' ESCAPE '\' - SELECT 'abcxyz' GLOB 'abc%' - SELECT 'abcxyz' GLOB 'abc*' - SELECT 'abcxyz' GLOB 'abc___' - SELECT 'abcxyz' GLOB 'abc???' - SELECT 'abcxyz' GLOB 'abc*' - SELECT 'ABCxyz' GLOB 'abc*' - SELECT 'abcxyz' GLOB 'ABC*' - SELECT 'abcxyz' NOT GLOB 'ABC*' - SELECT 'abcxyz' NOT GLOB 'abc*' - SELECT 'abcxyz' NOT LIKE 'ABC%' - SELECT 'abcxyz' NOT LIKE 'abc%' - SELECT 'abdxyz' NOT LIKE 'abc%' - SELECT 'abcxyz' NOT GLOB NULL - SELECT 'abcxyz' NOT LIKE NULL - SELECT NULL NOT GLOB 'abc*' - SELECT NULL NOT LIKE 'ABC%' - SELECT 'abc' GLOB 'def' - SELECT 'X' NOT GLOB 'Y' - SELECT 'abc' REGEXP 'def' - SELECT 'X' NOT REGEXP 'Y' - SELECT 'abc' MATCH 'def' - SELECT 'X' NOT MATCH 'Y' - - SELECT CASE WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END; - - - SELECT CASE 0 WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END; - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' END - - - SELECT CASE WHEN var('c') THEN 'C' - WHEN var('b') THEN 'B' - WHEN var('a') THEN 'A' - ELSE 'no result' - END - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - ELSE 'no result' - END - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - ELSE 'no result' - END - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - ELSE 'no result' - END - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - ELSE 'no result' - END - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - END - - - SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END, iif(NULL,8,99); - - - SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END, iif(0,8,99); - - - SELECT CASE var('a') WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' END - - - SELECT CASE 23 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END - - - SELECT CASE 1 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END - - - SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' ELSE 'D' END - - - SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END - - - SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END - - - CREATE TABLE t1( - a TEXT COLLATE NOCASE, - b COLLATE REVERSE, - c INTEGER, - d BLOB - ); - INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5); - - - SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1 - - - SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1 - - - SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1 - - - SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1 - - - SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END - - - SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1 - - - SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1 - - - SELECT CASE NULL WHEN NULL THEN 'A' ELSE 'B' END - - - SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' END; - - - SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' ELSE 'C' END; - - - SELECT CASE WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - END - - - SELECT CASE '0' WHEN var('a') THEN 'A' - WHEN var('b') THEN 'B' - WHEN var('c') THEN 'C' - END - - - CREATE TABLE t2(x, w1, r1, w2, r2, r3); - INSERT INTO t2 VALUES(1, 1, 'R1', 2, 'R2', 'R3'); - INSERT INTO t2 VALUES(2, 1, 'R1', 2, 'R2', 'R3'); - INSERT INTO t2 VALUES(3, 1, 'R1', 2, 'R2', 'R3'); - - - SELECT CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2 - - - SELECT CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END FROM t2 - - - SELECT CASE ceval(x) WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2 - - - SELECT CASE - WHEN ceval(x)=w1 THEN r1 - WHEN ceval(x)=w2 THEN r2 - ELSE r3 END - FROM t2 - - - CREATE TABLE t3(a TEXT, b REAL, c INTEGER); - INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5); - SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3; - - - SELECT - typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT), - typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL), - typeof(CAST(4.5 as INTEGER)), CAST(4.5 as INTEGER) - - - WITH t1(x) AS (VALUES - ('9000000000000000001'), - ('9000000000000000001x'), - ('9000000000000000001 '), - (' 9000000000000000001 '), - (' 9000000000000000001'), - (' 9000000000000000001.'), - ('9223372036854775807'), - ('9223372036854775807 '), - (' 9223372036854775807 '), - ('9223372036854775808'), - (' 9223372036854775808 '), - ('9223372036854775807.0'), - ('9223372036854775807e+0'), - ('-5.0'), - ('-5e+0')) - SELECT typeof(CAST(x AS NUMERIC)), CAST(x AS NUMERIC)||'' FROM t1; - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(NULL, 2); - INSERT INTO t1 VALUES(1, NULL); - INSERT INTO t1 VALUES(NULL, NULL); - - - CREATE TABLE t4(x, y); - INSERT INTO t4 VALUES(1, 'one'); - INSERT INTO t4 VALUES(2, 'two'); - INSERT INTO t4 VALUES(3, 'three'); - - - SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END, iif(NULL,'true','false'); - - - SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END, iif(0.0,'true','false'); - - - SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END, iif(0,'true','false'); - - - SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END, iif('engligh','true','false'); - - - SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END, iif('0','true','false'); - - - SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END, iif(1,'true','false'); - - - SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END, iif(1.0,'true','false'); - - - SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END, iif(0.1,'true','false'); - - - SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END, iif(-0.1,'true','false'); - - - SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END, iif('1engl','true','false'); - diff --git a/libsql-wal/tests/assets/fixtures/e_fkey.test b/libsql-wal/tests/assets/fixtures/e_fkey.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/e_fts3.test b/libsql-wal/tests/assets/fixtures/e_fts3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/e_insert.test b/libsql-wal/tests/assets/fixtures/e_insert.test deleted file mode 100644 index e81b387fe7..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_insert.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE TABLE a1(a, b); - CREATE TABLE a2(a, b, c DEFAULT 'xyz'); - CREATE TABLE a3(x DEFAULT 1.0, y DEFAULT 'string', z); - CREATE TABLE a4(c UNIQUE, d); - - - INSERT INTO a1 VALUES('x', 'y'); - - - INSERT INTO a4 VALUES(1, 'a'); - INSERT INTO a4 VALUES(2, 'a'); - INSERT INTO a4 VALUES(3, 'a'); - diff --git a/libsql-wal/tests/assets/fixtures/e_reindex.test b/libsql-wal/tests/assets/fixtures/e_reindex.test deleted file mode 100644 index 35e85428a2..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_reindex.test +++ /dev/null @@ -1,63 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - CREATE INDEX i2 ON t1(b, a); - - - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - - CREATE TABLE saved(a,b,c,d,e); - INSERT INTO saved SELECT * FROM sqlite_master WHERE type = 'index'; - PRAGMA writable_schema = 1; - DELETE FROM sqlite_master WHERE type = 'index'; - - - DELETE FROM t1 WHERE a = 3; - INSERT INTO t1 VALUES(7, 8); - INSERT INTO t1 VALUES(9, 10); - PRAGMA writable_schema = 1; - INSERT INTO sqlite_master SELECT * FROM saved; - DROP TABLE saved; - - - PRAGMA integrity_check; - - - REINDEX; - PRAGMA integrity_check; - - - ATTACH 'test.db2' AS aux; - - CREATE TABLE t1(x); - CREATE INDEX i1_a ON t1(x COLLATE collA); - CREATE INDEX i1_b ON t1(x COLLATE collB); - INSERT INTO t1 VALUES('one'); - INSERT INTO t1 VALUES('two'); - INSERT INTO t1 VALUES('three'); - INSERT INTO t1 VALUES('four'); - INSERT INTO t1 VALUES('five'); - INSERT INTO t1 VALUES('six'); - INSERT INTO t1 VALUES('seven'); - INSERT INTO t1 VALUES('eight'); - - CREATE TABLE t2(x); - CREATE INDEX i2_a ON t2(x COLLATE collA); - CREATE INDEX i2_b ON t2(x COLLATE collB); - INSERT INTO t2 SELECT x FROM t1; - - CREATE TABLE aux.t1(x); - CREATE INDEX aux.i1_a ON t1(x COLLATE collA); - CREATE INDEX aux.i1_b ON t1(x COLLATE collB); - INSERT INTO aux.t1 SELECT x FROM main.t1; - - - - CREATE TABLE collA(x); - CREATE INDEX icolla_a ON collA(x COLLATE collA); - CREATE INDEX icolla_b ON collA(x COLLATE collB); - - INSERT INTO collA SELECT x FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/e_resolve.test b/libsql-wal/tests/assets/fixtures/e_resolve.test deleted file mode 100644 index f89c11f9d0..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_resolve.test +++ /dev/null @@ -1,20 +0,0 @@ - SELECT * FROM n1 - SELECT * FROM n2 - SELECT * FROM n3 - SELECT * FROM n4 - SELECT * FROM main.n1 - SELECT * FROM temp.n1 - SELECT * FROM at1.n1 - SELECT * FROM at2.n1 - SELECT * FROM MAIN.n1 - SELECT * FROM tEmP.n1 - SELECT * FROM aT1.n1 - SELECT * FROM At2.n1 - SELECT * FROM n3 - SELECT * FROM n4 - - ATTACH 'file.db' AS aux; - CREATE TABLE t1(x, y); - CREATE TEMP TABLE t1(x, y); - CREATE TABLE aux.t1(x, y); - diff --git a/libsql-wal/tests/assets/fixtures/e_select.test b/libsql-wal/tests/assets/fixtures/e_select.test deleted file mode 100644 index fe94948ed4..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_select.test +++ /dev/null @@ -1,379 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES('a', 'one'); - INSERT INTO t1 VALUES('b', 'two'); - INSERT INTO t1 VALUES('c', 'three'); - - CREATE TABLE t2(a, b); - INSERT INTO t2 VALUES('a', 'I'); - INSERT INTO t2 VALUES('b', 'II'); - INSERT INTO t2 VALUES('c', 'III'); - - CREATE TABLE t3(a, c); - INSERT INTO t3 VALUES('a', 1); - INSERT INTO t3 VALUES('b', 2); - - CREATE TABLE t4(a, c); - INSERT INTO t4 VALUES('a', NULL); - INSERT INTO t4 VALUES('b', 2); - - - CREATE TABLE xx(x, y); - INSERT INTO xx VALUES('IiJlsIPepMuAhU', X'10B00B897A15BAA02E3F98DCE8F2'); - INSERT INTO xx VALUES(NULL, -16.87); - INSERT INTO xx VALUES(-17.89, 'linguistically'); - - - CREATE TABLE x1(a, b); - CREATE TABLE x2(c, d, e); - CREATE TABLE x3(f, g, h, i); - - -- x1: 3 rows, 2 columns - INSERT INTO x1 VALUES(24, 'converging'); - INSERT INTO x1 VALUES(NULL, X'CB71'); - INSERT INTO x1 VALUES('blonds', 'proprietary'); - - -- x2: 2 rows, 3 columns - INSERT INTO x2 VALUES(-60.06, NULL, NULL); - INSERT INTO x2 VALUES(-58, NULL, 1.21); - - -- x3: 5 rows, 4 columns - INSERT INTO x3 VALUES(-39.24, NULL, 'encompass', -1); - INSERT INTO x3 VALUES('presenting', 51, 'reformation', 'dignified'); - INSERT INTO x3 VALUES('conducting', -87.24, 37.56, NULL); - INSERT INTO x3 VALUES('coldest', -96, 'dramatists', 82.3); - INSERT INTO x3 VALUES('alerting', NULL, -93.79, NULL); - - SELECT * FROM t1, t2 - SELECT * FROM t1 AS x, t1 AS y - - CREATE TABLE t5(a COLLATE nocase, b COLLATE binary); - INSERT INTO t5 VALUES('AA', 'cc'); - INSERT INTO t5 VALUES('BB', 'dd'); - INSERT INTO t5 VALUES(NULL, NULL); - CREATE TABLE t6(a COLLATE binary, b COLLATE nocase); - INSERT INTO t6 VALUES('aa', 'cc'); - INSERT INTO t6 VALUES('bb', 'DD'); - INSERT INTO t6 VALUES(NULL, NULL); - - - CREATE TABLE t7(a, b, c); - CREATE TABLE t8(a, d, e); - - INSERT INTO t7 VALUES('x', 'ex', 24); - INSERT INTO t7 VALUES('y', 'why', 25); - - INSERT INTO t8 VALUES('x', 'abc', 24); - INSERT INTO t8 VALUES('z', 'ghi', 26); - - - CREATE TABLE t10(x, y); - INSERT INTO t10 VALUES(1, 'true'); - INSERT INTO t10 VALUES(0, 'false'); - - - CREATE TABLE x1(k, x, y, z); - INSERT INTO x1 VALUES(1, 'relinquished', 'aphasia', 78.43); - INSERT INTO x1 VALUES(2, X'A8E8D66F', X'07CF', -81); - INSERT INTO x1 VALUES(3, -22, -27.57, NULL); - INSERT INTO x1 VALUES(4, NULL, 'bygone', 'picky'); - INSERT INTO x1 VALUES(5, NULL, 96.28, NULL); - INSERT INTO x1 VALUES(6, 0, 1, 2); - - CREATE TABLE x2(k, x, y2); - INSERT INTO x2 VALUES(1, 50, X'B82838'); - INSERT INTO x2 VALUES(5, 84.79, 65.88); - INSERT INTO x2 VALUES(3, -22, X'0E1BE452A393'); - INSERT INTO x2 VALUES(7, 'mistrusted', 'standardized'); - - SELECT k FROM x1 WHERE x - SELECT k FROM x1 WHERE y - SELECT k FROM x1 WHERE z - SELECT k FROM x1 WHERE '1'||z - SELECT k FROM x1 WHERE x IS NULL - SELECT k FROM x1 WHERE z - 78.43 - - SELECT k FROM x1 LEFT JOIN x2 USING(k) - - - SELECT k FROM x1 LEFT JOIN x2 USING(k) WHERE x2.k ORDER BY +k - - - SELECT k FROM x1 LEFT JOIN x2 USING(k) WHERE x2.k IS NULL - - - SELECT k FROM x1 NATURAL JOIN x2 WHERE x2.k - - - SELECT k FROM x1 NATURAL JOIN x2 WHERE x2.k-3 - - - CREATE TABLE z1(a, b, c); - CREATE TABLE z2(d, e); - CREATE TABLE z3(a, b); - - INSERT INTO z1 VALUES(51.65, -59.58, 'belfries'); - INSERT INTO z1 VALUES(-5, NULL, 75); - INSERT INTO z1 VALUES(-2.2, -23.18, 'suiters'); - INSERT INTO z1 VALUES(NULL, 67, 'quartets'); - INSERT INTO z1 VALUES(-1.04, -32.3, 'aspen'); - INSERT INTO z1 VALUES(63, 'born', -26); - - INSERT INTO z2 VALUES(NULL, 21); - INSERT INTO z2 VALUES(36, 6); - - INSERT INTO z3 VALUES('subsistence', 'gauze'); - INSERT INTO z3 VALUES(49.17, -67); - - - CREATE TABLE a1(one PRIMARY KEY, two); - INSERT INTO a1 VALUES(1, 1); - INSERT INTO a1 VALUES(2, 3); - INSERT INTO a1 VALUES(3, 6); - INSERT INTO a1 VALUES(4, 10); - - CREATE TABLE a2(one PRIMARY KEY, three); - INSERT INTO a2 VALUES(1, 1); - INSERT INTO a2 VALUES(3, 2); - INSERT INTO a2 VALUES(6, 3); - INSERT INTO a2 VALUES(10, 4); - - - CREATE TABLE b1(one PRIMARY KEY, two); - INSERT INTO b1 VALUES(1, 'o'); - INSERT INTO b1 VALUES(4, 'f'); - INSERT INTO b1 VALUES(3, 't'); - INSERT INTO b1 VALUES(2, 't'); - INSERT INTO b1 VALUES(5, 'f'); - INSERT INTO b1 VALUES(7, 's'); - INSERT INTO b1 VALUES(6, 's'); - - CREATE TABLE b2(x, y); - INSERT INTO b2 VALUES(NULL, 0); - INSERT INTO b2 VALUES(NULL, 1); - INSERT INTO b2 VALUES('xyz', 2); - INSERT INTO b2 VALUES('abc', 3); - INSERT INTO b2 VALUES('xyz', 4); - - CREATE TABLE b3(a COLLATE nocase, b COLLATE binary); - INSERT INTO b3 VALUES('abc', 'abc'); - INSERT INTO b3 VALUES('aBC', 'aBC'); - INSERT INTO b3 VALUES('Def', 'Def'); - INSERT INTO b3 VALUES('dEF', 'dEF'); - - - CREATE TABLE c1(up, down); - INSERT INTO c1 VALUES('x', 1); - INSERT INTO c1 VALUES('x', 2); - INSERT INTO c1 VALUES('x', 4); - INSERT INTO c1 VALUES('x', 8); - INSERT INTO c1 VALUES('y', 16); - INSERT INTO c1 VALUES('y', 32); - - CREATE TABLE c2(i, j); - INSERT INTO c2 VALUES(1, 0); - INSERT INTO c2 VALUES(2, 1); - INSERT INTO c2 VALUES(3, 3); - INSERT INTO c2 VALUES(4, 6); - INSERT INTO c2 VALUES(5, 10); - INSERT INTO c2 VALUES(6, 15); - INSERT INTO c2 VALUES(7, 21); - INSERT INTO c2 VALUES(8, 28); - INSERT INTO c2 VALUES(9, 36); - - CREATE TABLE c3(i PRIMARY KEY, k TEXT); - INSERT INTO c3 VALUES(1, 'hydrogen'); - INSERT INTO c3 VALUES(2, 'helium'); - INSERT INTO c3 VALUES(3, 'lithium'); - INSERT INTO c3 VALUES(4, 'beryllium'); - INSERT INTO c3 VALUES(5, 'boron'); - INSERT INTO c3 VALUES(94, 'plutonium'); - - - CREATE TABLE h1(a, b); - INSERT INTO h1 VALUES(1, 'one'); - INSERT INTO h1 VALUES(1, 'I'); - INSERT INTO h1 VALUES(1, 'i'); - INSERT INTO h1 VALUES(4, 'four'); - INSERT INTO h1 VALUES(4, 'IV'); - INSERT INTO h1 VALUES(4, 'iv'); - - CREATE TABLE h2(x COLLATE nocase); - INSERT INTO h2 VALUES('One'); - INSERT INTO h2 VALUES('Two'); - INSERT INTO h2 VALUES('Three'); - INSERT INTO h2 VALUES('Four'); - INSERT INTO h2 VALUES('one'); - INSERT INTO h2 VALUES('two'); - INSERT INTO h2 VALUES('three'); - INSERT INTO h2 VALUES('four'); - - CREATE TABLE h3(c, d); - INSERT INTO h3 VALUES(1, NULL); - INSERT INTO h3 VALUES(2, NULL); - INSERT INTO h3 VALUES(3, NULL); - INSERT INTO h3 VALUES(4, '2'); - INSERT INTO h3 VALUES(5, NULL); - INSERT INTO h3 VALUES(6, '2,3'); - INSERT INTO h3 VALUES(7, NULL); - INSERT INTO h3 VALUES(8, '2,4'); - INSERT INTO h3 VALUES(9, '3'); - - - CREATE TABLE j1(a, b, c); - CREATE TABLE j2(e, f); - CREATE TABLE j3(g); - - - CREATE TABLE q1(a TEXT, b INTEGER, c); - CREATE TABLE q2(d NUMBER, e BLOB); - CREATE TABLE q3(f REAL, g); - - INSERT INTO q1 VALUES(16, -87.66, NULL); - INSERT INTO q1 VALUES('legible', 94, -42.47); - INSERT INTO q1 VALUES('beauty', 36, NULL); - - INSERT INTO q2 VALUES('legible', 1); - INSERT INTO q2 VALUES('beauty', 2); - INSERT INTO q2 VALUES(-65.91, 4); - INSERT INTO q2 VALUES('emanating', -16.56); - - INSERT INTO q3 VALUES('beauty', 2); - INSERT INTO q3 VALUES('beauty', 2); - - - CREATE TABLE y1(a COLLATE nocase, b COLLATE binary, c); - INSERT INTO y1 VALUES('Abc', 'abc', 'aBC'); - - - CREATE TABLE w1(a TEXT, b NUMBER); - CREATE TABLE w2(a, b TEXT); - - INSERT INTO w1 VALUES('1', 4.1); - INSERT INTO w2 VALUES(1, 4.1); - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - INSERT INTO t1 VALUES(3); - - - CREATE TABLE d1(x, y, z); - - INSERT INTO d1 VALUES(1, 2, 3); - INSERT INTO d1 VALUES(2, 5, -1); - INSERT INTO d1 VALUES(1, 2, 8); - INSERT INTO d1 VALUES(1, 2, 7); - INSERT INTO d1 VALUES(2, 4, 93); - INSERT INTO d1 VALUES(1, 2, -20); - INSERT INTO d1 VALUES(1, 4, 93); - INSERT INTO d1 VALUES(1, 5, -1); - - CREATE TABLE d2(a, b); - INSERT INTO d2 VALUES('gently', 'failings'); - INSERT INTO d2 VALUES('commercials', 'bathrobe'); - INSERT INTO d2 VALUES('iterate', 'sexton'); - INSERT INTO d2 VALUES('babied', 'charitableness'); - INSERT INTO d2 VALUES('solemnness', 'annexed'); - INSERT INTO d2 VALUES('rejoicing', 'liabilities'); - INSERT INTO d2 VALUES('pragmatist', 'guarded'); - INSERT INTO d2 VALUES('barked', 'interrupted'); - INSERT INTO d2 VALUES('reemphasizes', 'reply'); - INSERT INTO d2 VALUES('lad', 'relenting'); - - - CREATE TABLE d3(a); - INSERT INTO d3 VALUES('text'); - INSERT INTO d3 VALUES(14.1); - INSERT INTO d3 VALUES(13); - INSERT INTO d3 VALUES(X'78787878'); - INSERT INTO d3 VALUES(15); - INSERT INTO d3 VALUES(12.9); - INSERT INTO d3 VALUES(null); - - CREATE TABLE d4(x COLLATE nocase); - INSERT INTO d4 VALUES('abc'); - INSERT INTO d4 VALUES('ghi'); - INSERT INTO d4 VALUES('DEF'); - INSERT INTO d4 VALUES('JKL'); - - - SELECT a FROM d3 ORDER BY a - - - SELECT a FROM d3 ORDER BY a DESC - - - SELECT x FROM d4 ORDER BY 1 COLLATE binary - - - SELECT x COLLATE binary FROM d4 ORDER BY 1 COLLATE nocase - - - SELECT x COLLATE binary FROM d4 ORDER BY 1 - - - SELECT x COLLATE binary FROM d4 ORDER BY x - - - SELECT x COLLATE binary AS x FROM d4 ORDER BY x - - - SELECT x AS y FROM d4 ORDER BY y - - - SELECT x||'' FROM d4 ORDER BY x - - - SELECT x FROM d4 ORDER BY x||'' - - - CREATE TABLE d5(a, b); - CREATE TABLE d6(c, d); - CREATE TABLE d7(e, f); - - INSERT INTO d5 VALUES(1, 'f'); - INSERT INTO d6 VALUES(2, 'e'); - INSERT INTO d7 VALUES(3, 'd'); - INSERT INTO d5 VALUES(4, 'c'); - INSERT INTO d6 VALUES(5, 'b'); - INSERT INTO d7 VALUES(6, 'a'); - - CREATE TABLE d8(x COLLATE nocase); - CREATE TABLE d9(y COLLATE nocase); - - INSERT INTO d8 VALUES('a'); - INSERT INTO d9 VALUES('B'); - INSERT INTO d8 VALUES('c'); - INSERT INTO d9 VALUES('D'); - - - CREATE TABLE f1(a, b); - INSERT INTO f1 VALUES(26, 'z'); - INSERT INTO f1 VALUES(25, 'y'); - INSERT INTO f1 VALUES(24, 'x'); - INSERT INTO f1 VALUES(23, 'w'); - INSERT INTO f1 VALUES(22, 'v'); - INSERT INTO f1 VALUES(21, 'u'); - INSERT INTO f1 VALUES(20, 't'); - INSERT INTO f1 VALUES(19, 's'); - INSERT INTO f1 VALUES(18, 'r'); - INSERT INTO f1 VALUES(17, 'q'); - INSERT INTO f1 VALUES(16, 'p'); - INSERT INTO f1 VALUES(15, 'o'); - INSERT INTO f1 VALUES(14, 'n'); - INSERT INTO f1 VALUES(13, 'm'); - INSERT INTO f1 VALUES(12, 'l'); - INSERT INTO f1 VALUES(11, 'k'); - INSERT INTO f1 VALUES(10, 'j'); - INSERT INTO f1 VALUES(9, 'i'); - INSERT INTO f1 VALUES(8, 'h'); - INSERT INTO f1 VALUES(7, 'g'); - INSERT INTO f1 VALUES(6, 'f'); - INSERT INTO f1 VALUES(5, 'e'); - INSERT INTO f1 VALUES(4, 'd'); - INSERT INTO f1 VALUES(3, 'c'); - INSERT INTO f1 VALUES(2, 'b'); - INSERT INTO f1 VALUES(1, 'a'); - diff --git a/libsql-wal/tests/assets/fixtures/e_select2.test b/libsql-wal/tests/assets/fixtures/e_select2.test deleted file mode 100644 index 84ce96fd8f..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_select2.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - CREATE TABLE t3(b COLLATE nocase); - - INSERT INTO t1 VALUES(2, 'B'); - INSERT INTO t1 VALUES(1, 'A'); - INSERT INTO t1 VALUES(4, 'D'); - INSERT INTO t1 VALUES(NULL, NULL); - INSERT INTO t1 VALUES(3, NULL); - - INSERT INTO t2 VALUES(1, 'A'); - INSERT INTO t2 VALUES(2, NULL); - INSERT INTO t2 VALUES(5, 'E'); - INSERT INTO t2 VALUES(NULL, NULL); - INSERT INTO t2 VALUES(3, 'C'); - - INSERT INTO t3 VALUES('a'); - INSERT INTO t3 VALUES('c'); - INSERT INTO t3 VALUES('b'); - - - CREATE TABLE t4(x TEXT COLLATE nocase); - CREATE TABLE t5(y INTEGER, z TEXT COLLATE binary); - - INSERT INTO t4 VALUES('2.0'); - INSERT INTO t4 VALUES('TWO'); - INSERT INTO t5 VALUES(2, 'two'); - diff --git a/libsql-wal/tests/assets/fixtures/e_totalchanges.test b/libsql-wal/tests/assets/fixtures/e_totalchanges.test deleted file mode 100644 index ac6a6f0074..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_totalchanges.test +++ /dev/null @@ -1,10 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX t1_b ON t1(b); - CREATE TABLE t2(x, y, PRIMARY KEY(x, y)) WITHOUT ROWID; - CREATE INDEX t2_y ON t2(y); - - - DELETE FROM t1; - DELETE FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/e_update.test b/libsql-wal/tests/assets/fixtures/e_update.test deleted file mode 100644 index f56a702fe7..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_update.test +++ /dev/null @@ -1,129 +0,0 @@ - - ATTACH 'test.db2' AS aux; - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b, c); - CREATE TABLE t3(a, b UNIQUE); - CREATE TABLE t6(x, y); - CREATE INDEX i1 ON t1(a); - - CREATE TEMP TABLE t4(x, y); - CREATE TEMP TABLE t6(x, y); - - CREATE TABLE aux.t1(a, b); - CREATE TABLE aux.t5(a, b); - - - INSERT INTO main.t1 VALUES(1, 'i'); - INSERT INTO main.t1 VALUES(2, 'ii'); - INSERT INTO main.t1 VALUES(3, 'iii'); - - INSERT INTO aux.t1 VALUES(1, 'I'); - INSERT INTO aux.t1 VALUES(2, 'II'); - INSERT INTO aux.t1 VALUES(3, 'III'); - - - DELETE FROM main.t1; - INSERT INTO main.t1 VALUES(1, 'i'); - INSERT INTO main.t1 VALUES(2, 'ii'); - INSERT INTO main.t1 VALUES(3, 'iii'); - - - DELETE FROM main.t1; - INSERT INTO main.t1 VALUES(NULL, ''); - INSERT INTO main.t1 VALUES(1, 'i'); - INSERT INTO main.t1 VALUES(2, 'ii'); - INSERT INTO main.t1 VALUES(3, 'iii'); - - - DELETE FROM main.t1; - INSERT INTO main.t1 VALUES(NULL, ''); - INSERT INTO main.t1 VALUES(1, 'i'); - INSERT INTO main.t1 VALUES(2, 'ii'); - INSERT INTO main.t1 VALUES(3, 'iii'); - - - INSERT INTO t2(rowid, a, b, c) VALUES(1, 3, 1, 4); - INSERT INTO t2(rowid, a, b, c) VALUES(2, 1, 5, 9); - INSERT INTO t2(rowid, a, b, c) VALUES(3, 2, 6, 5); - - - DELETE FROM t2; - INSERT INTO t2(rowid, a, b, c) VALUES(1, 3, 1, 4); - INSERT INTO t2(rowid, a, b, c) VALUES(2, 1, 5, 9); - INSERT INTO t2(rowid, a, b, c) VALUES(3, 2, 6, 5); - - - DELETE FROM t3; - INSERT INTO t3 VALUES(1, 'one'); - INSERT INTO t3 VALUES(2, 'two'); - INSERT INTO t3 VALUES(3, 'three'); - INSERT INTO t3 VALUES(4, 'four'); - - - DROP TRIGGER tr1; - DROP TRIGGER aux.tr1; - - - SELECT 'main', tbl_name FROM main.sqlite_master WHERE type = 'table'; - SELECT 'temp', tbl_name FROM sqlite_temp_master WHERE type = 'table'; - SELECT 'aux', tbl_name FROM aux.sqlite_master WHERE type = 'table'; - - - DELETE FROM main.t6; - DELETE FROM temp.t6; - INSERT INTO main.t6 VALUES(1, 2); - INSERT INTO temp.t6 VALUES(1, 2); - - CREATE TRIGGER temp.tr1 AFTER INSERT ON t4 BEGIN - UPDATE t6 SET x=x+1; - END; - - INSERT INTO t4 VALUES(1, 2); - SELECT * FROM main.t6; - SELECT * FROM temp.t6; - - - DELETE FROM main.t1; - DELETE FROM aux.t1; - INSERT INTO main.t1 VALUES(1, 2); - INSERT INTO aux.t1 VALUES(1, 2); - - CREATE TRIGGER temp.tr2 AFTER DELETE ON t4 BEGIN - UPDATE t1 SET a=a+1; - END; - - DELETE FROM t4; - SELECT * FROM main.t1; - SELECT * FROM aux.t1; - - - DELETE FROM aux.t5; - INSERT INTO aux.t5 VALUES(1, 2); - - INSERT INTO t4 VALUES('x', 'y'); - CREATE TRIGGER temp.tr3 AFTER UPDATE ON t4 BEGIN - UPDATE t5 SET a=a+1; - END; - - UPDATE t4 SET x=10; - SELECT * FROM aux.t5; - - - CREATE TABLE t7(q, r, s); - INSERT INTO t7 VALUES(1, 'one', 'X'); - INSERT INTO t7 VALUES(2, 'two', 'X'); - INSERT INTO t7 VALUES(3, 'three', 'X'); - INSERT INTO t7 VALUES(4, 'four', 'X'); - INSERT INTO t7 VALUES(5, 'five', 'X'); - INSERT INTO t7 VALUES(6, 'six', 'X'); - INSERT INTO t7 VALUES(7, 'seven', 'X'); - INSERT INTO t7 VALUES(8, 'eight', 'X'); - INSERT INTO t7 VALUES(9, 'nine', 'X'); - INSERT INTO t7 VALUES(10, 'ten', 'X'); - - - CREATE TABLE t8(x); - CREATE TRIGGER tr7 BEFORE UPDATE ON t7 BEGIN - INSERT INTO t8 VALUES(old.q); - END; - diff --git a/libsql-wal/tests/assets/fixtures/e_uri.test b/libsql-wal/tests/assets/fixtures/e_uri.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/e_vacuum.test b/libsql-wal/tests/assets/fixtures/e_vacuum.test deleted file mode 100644 index 0459938a6e..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_vacuum.test +++ /dev/null @@ -1,71 +0,0 @@ - VACUUM - - DELETE FROM t1 WHERE a%2; - INSERT INTO t1 SELECT b, a FROM t2 WHERE a%2; - UPDATE t1 SET b=randomblob(600) WHERE (a%2)==0; - - VACUUM - - ATTACH 'test.db2' AS aux; - PRAGMA aux.page_size = 1024; - CREATE TABLE aux.t3 AS SELECT * FROM t1; - DELETE FROM t3; - - VACUUM - VACUUM aux; - - CREATE TABLE t4(x); - INSERT INTO t4(x) VALUES('x'); - INSERT INTO t4(x) VALUES('y'); - INSERT INTO t4(x) VALUES('z'); - DELETE FROM t4 WHERE x = 'y'; - SELECT rowid, x FROM t4; - - - VACUUM; - SELECT rowid, x FROM t4; - - - CREATE TABLE t5(x, y INTEGER PRIMARY KEY); - INSERT INTO t5(x) VALUES('x'); - INSERT INTO t5(x) VALUES('y'); - INSERT INTO t5(x) VALUES('z'); - DELETE FROM t5 WHERE x = 'y'; - SELECT rowid, x FROM t5; - - - VACUUM; - SELECT rowid, x FROM t5; - - - DROP TABLE t5; - CREATE TABLE t5(x); - INSERT INTO t5(x) VALUES('x'); - INSERT INTO t5(x) VALUES('y'); - INSERT INTO t5(x) VALUES('z'); - DELETE FROM t5 WHERE x = 'y'; - SELECT rowid, x FROM t5; - - - VACUUM INTO 'test2.db'; - ATTACH 'test2.db' AS aux1; - SELECT rowid, x FROM aux1.t5; - DETACH aux1; - - - DROP TABLE t5; - CREATE TABLE t5(x,y,z); - INSERT INTO t5(x) VALUES('x'); - INSERT INTO t5(x) VALUES('y'); - INSERT INTO t5(x) VALUES('z'); - UPDATE t5 SET y=x, z=random(); - DELETE FROM t5 WHERE x = 'y'; - CREATE INDEX t5x ON t5(x); - CREATE UNIQUE INDEX t5y ON t5(y); - CREATE INDEX t5zxy ON t5(z,x,y); - SELECT rowid, x FROM t5; - - - VACUUM; - SELECT rowid, x FROM t5; - diff --git a/libsql-wal/tests/assets/fixtures/e_wal.test b/libsql-wal/tests/assets/fixtures/e_wal.test deleted file mode 100644 index dfc4b2d149..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_wal.test +++ /dev/null @@ -1,33 +0,0 @@ - - PRAGMA journal_mode = WAL; - - - PRAGMA journal_mode = WAL; - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - - - SELECT * FROM t1; - - - SELECT * FROM t1; - - - PRAGMA journal_mode = DELETE; - SELECT * FROM t1; - - - SELECT * FROM t1; - - - INSERT INTO t1 VALUES(5, 6); - - - SELECT * FROM t1; - - CREATE TABLE t1(x, y) - PRAGMA journal_mode = wAL - INSERT INTO t1 VALUES(1, 1); - PRAGMA journal_mode = delete diff --git a/libsql-wal/tests/assets/fixtures/e_walauto.test b/libsql-wal/tests/assets/fixtures/e_walauto.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/e_walckpt.test b/libsql-wal/tests/assets/fixtures/e_walckpt.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/e_walhook.test b/libsql-wal/tests/assets/fixtures/e_walhook.test deleted file mode 100644 index 745c858475..0000000000 --- a/libsql-wal/tests/assets/fixtures/e_walhook.test +++ /dev/null @@ -1,3 +0,0 @@ - - SELECT * FROM t1 - diff --git a/libsql-wal/tests/assets/fixtures/emptytable.test b/libsql-wal/tests/assets/fixtures/emptytable.test deleted file mode 100644 index 9be2c74b43..0000000000 --- a/libsql-wal/tests/assets/fixtures/emptytable.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE t1(a); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a) SELECT x FROM c; - CREATE TABLE empty(x); - SELECT count(*) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/enc.test b/libsql-wal/tests/assets/fixtures/enc.test deleted file mode 100644 index d6a3323a95..0000000000 --- a/libsql-wal/tests/assets/fixtures/enc.test +++ /dev/null @@ -1,31 +0,0 @@ - - PRAGMA encoding = 'utf-8'; - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('a', 'b', 'c'); - ATTACH 'test.db3' AS aux; - CREATE TABLE aux.t3(x, y, z); - INSERT INTO t3 VALUES('xxx', 'yyy', 'zzz'); - PRAGMA encoding; - - - SELECT * FROM t3; - PRAGMA encoding = 'UTF-16le'; - SELECT * FROM t3; - - - PRAGMA encoding = 'UTF-16le'; - PRAGMA encoding; - - - PRAGMA encoding = 'UTF-8'; - CREATE TEMP TABLE t1(a, b, c); - INSERT INTO t1 VALUES('xxx', 'yyy', 'zzz'); - - - CREATE TEMP TABLE t1(a, b, c); - INSERT INTO t1 VALUES('xxx', 'yyy', 'zzz'); - - - SELECT * FROM t2; - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/enc2.test b/libsql-wal/tests/assets/fixtures/enc2.test deleted file mode 100644 index 3a201fa7e3..0000000000 --- a/libsql-wal/tests/assets/fixtures/enc2.test +++ /dev/null @@ -1,7 +0,0 @@ - - PRAGMA encoding=UTF8; - CREATE TEMP TABLE t1(x); - INSERT INTO t1 VALUES('this is a test'); - PRAGMA encoding=UTF16; - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/enc3.test b/libsql-wal/tests/assets/fixtures/enc3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/enc4.test b/libsql-wal/tests/assets/fixtures/enc4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/eqp.test b/libsql-wal/tests/assets/fixtures/eqp.test deleted file mode 100644 index 026f45f8f9..0000000000 --- a/libsql-wal/tests/assets/fixtures/eqp.test +++ /dev/null @@ -1,73 +0,0 @@ - - CREATE TABLE t1(a INT, b INT, ex TEXT); - CREATE INDEX i1 ON t1(a); - CREATE INDEX i2 ON t1(b); - CREATE TABLE t2(a INT, b INT, ex TEXT); - CREATE TABLE t3(a INT, b INT, ex TEXT); - - - CREATE TABLE t1(x INT, y INT, ex TEXT); - - CREATE TABLE t2(x INT, y INT, ex TEXT); - CREATE INDEX t2i1 ON t2(x); - - CREATE TABLE t1(a INT, b INT, ex TEXT) - CREATE INDEX i1 ON t1(a) - CREATE INDEX i2 ON t1(a, b) -CREATE TABLE t2(c INT, d INT, ex TEXT) -CREATE INDEX i3 ON t1(b) -CREATE INDEX i4 ON t2(c) - - CREATE TABLE t1(a INT, b INT, ex CHAR(100)); - CREATE TABLE t2(a INT, b INT, ex CHAR(100)); - CREATE INDEX i1 ON t2(a); - - - INSERT INTO t1(a,b) VALUES(1, 2); - INSERT INTO t1(a,b) VALUES(3, 4); - - INSERT INTO t2(a,b) VALUES(1, 2); - INSERT INTO t2(a,b) VALUES(3, 4); - INSERT INTO t2(a,b) VALUES(5, 6); - - ANALYZE; - - - CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; - CREATE TABLE t2(a, b, c); - - - -- Schema from Fossil 2018-08-16 - CREATE TABLE forumpost( - fpid INTEGER PRIMARY KEY, - froot INT, - fprev INT, - firt INT, - fmtime REAL - ); - CREATE INDEX forumthread ON forumpost(froot,fmtime); - CREATE TABLE blob( - rid INTEGER PRIMARY KEY, - rcvid INTEGER, - size INTEGER, - uuid TEXT UNIQUE NOT NULL, - content BLOB, - CHECK( length(uuid)>=40 AND rid>0 ) - ); - CREATE TABLE event( - type TEXT, - mtime DATETIME, - objid INTEGER PRIMARY KEY, - tagid INTEGER, - uid INTEGER REFERENCES user, - bgcolor TEXT, - euser TEXT, - user TEXT, - ecomment TEXT, - comment TEXT, - brief TEXT, - omtime DATETIME - ); - CREATE INDEX event_i1 ON event(mtime); - CREATE TABLE private(rid INTEGER PRIMARY KEY); - diff --git a/libsql-wal/tests/assets/fixtures/errmsg.test b/libsql-wal/tests/assets/fixtures/errmsg.test deleted file mode 100644 index 344efdba81..0000000000 --- a/libsql-wal/tests/assets/fixtures/errmsg.test +++ /dev/null @@ -1,12 +0,0 @@ - - CREATE TABLE t1(a PRIMARY KEY, b UNIQUE); - INSERT INTO t1 VALUES('abc', 'def'); - - - CREATE TABLE t2(a PRIMARY KEY, b UNIQUE); - INSERT INTO t2 VALUES('abc', 'def'); - - - CREATE TABLE t2(a PRIMARY KEY, b UNIQUE); - INSERT INTO t2 VALUES('abc', 'def'); - diff --git a/libsql-wal/tests/assets/fixtures/eval.test b/libsql-wal/tests/assets/fixtures/eval.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/exclusive.test b/libsql-wal/tests/assets/fixtures/exclusive.test deleted file mode 100644 index a89ab69348..0000000000 --- a/libsql-wal/tests/assets/fixtures/exclusive.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE TABLE t4(a, b); - INSERT INTO t4 VALUES('Eden', 1955); - BEGIN; - INSERT INTO t4 VALUES('Macmillan', 1957); - INSERT INTO t4 VALUES('Douglas-Home', 1963); - INSERT INTO t4 VALUES('Wilson', 1964); - - - SELECT * FROM t4; - - - SELECT * FROM sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/exclusive2.test b/libsql-wal/tests/assets/fixtures/exclusive2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/exec.test b/libsql-wal/tests/assets/fixtures/exec.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/exists.test b/libsql-wal/tests/assets/fixtures/exists.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/expr.test b/libsql-wal/tests/assets/fixtures/expr.test deleted file mode 100644 index eb4172d67a..0000000000 --- a/libsql-wal/tests/assets/fixtures/expr.test +++ /dev/null @@ -1,42 +0,0 @@ - - SELECT "" <= ''; - - - SELECT '' <= ""; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(0),(1),(NULL),(0.5),('1x'),('0x'); - SELECT count(*) FROM t1 - WHERE (x OR (8==9)) != (CASE WHEN x THEN 1 ELSE 0 END); - - - SELECT count(*) FROM t1 - WHERE (x OR (8==9)) != (NOT NOT x); - - - SELECT sum(NOT x) FROM t1 - WHERE x - - - SELECT sum(CASE WHEN x THEN 0 ELSE 1 END) FROM t1 - WHERE x - - - CREATE TABLE t1(a,b,c); - CREATE TABLE dual(dummy); - INSERT INTO dual VALUES('X'); - - - SELECT implies_nonnull_row( (b=1 AND 0)>(b=3 AND 0),a) - FROM dual LEFT JOIN t1; - - - SELECT implies_nonnull_row( (b=1 AND 0)>(b=3 AND a=4),a) - FROM dual LEFT JOIN t1; - - - SELECT implies_nonnull_row( (b=1 AND a=2)>(b=3 AND a=4),a) - FROM dual LEFT JOIN t1; - diff --git a/libsql-wal/tests/assets/fixtures/expr2.test b/libsql-wal/tests/assets/fixtures/expr2.test deleted file mode 100644 index 1db005f236..0000000000 --- a/libsql-wal/tests/assets/fixtures/expr2.test +++ /dev/null @@ -1,28 +0,0 @@ - - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES ('val'); - - - SELECT * FROM t0 WHERE ( - ( (0 IS NOT FALSE) OR NOT (0 IS FALSE OR (t0.c0 = 1)) ) IS 0 - ) - - - SELECT - ( (0 IS NOT FALSE) OR NOT (0 IS FALSE OR (t0.c0 = 1)) ) IS 0 - FROM t0 - - - SELECT - ( (0 IS NOT FALSE) OR NOT (0 IS 0 OR (t0.c0 = 1)) ) IS 0 - FROM t0 - - - SELECT ( (0 IS NOT FALSE) OR NOT (0 IS FALSE OR (t0.c0 = 1)) ) FROM t0 - - - SELECT (0 IS NOT FALSE) FROM t0 - - - SELECT NOT (0 IS FALSE OR (t0.c0 = 1)) FROM t0 - diff --git a/libsql-wal/tests/assets/fixtures/exprfault.test b/libsql-wal/tests/assets/fixtures/exprfault.test deleted file mode 100644 index a06e6ca239..0000000000 --- a/libsql-wal/tests/assets/fixtures/exprfault.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(a); - CREATE TABLE t2(d); - diff --git a/libsql-wal/tests/assets/fixtures/extension01.test b/libsql-wal/tests/assets/fixtures/extension01.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/external_reader.test b/libsql-wal/tests/assets/fixtures/external_reader.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/extraquick.test b/libsql-wal/tests/assets/fixtures/extraquick.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fallocate.test b/libsql-wal/tests/assets/fixtures/fallocate.test deleted file mode 100644 index 22dcb52539..0000000000 --- a/libsql-wal/tests/assets/fixtures/fallocate.test +++ /dev/null @@ -1,3 +0,0 @@ - - PRAGMA max_page_count = 100; - diff --git a/libsql-wal/tests/assets/fixtures/filectrl.test b/libsql-wal/tests/assets/fixtures/filectrl.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/filefmt.test b/libsql-wal/tests/assets/fixtures/filefmt.test deleted file mode 100644 index d33676ca6c..0000000000 --- a/libsql-wal/tests/assets/fixtures/filefmt.test +++ /dev/null @@ -1,53 +0,0 @@ - - PRAGMA page_size = 1024; - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(a); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES(a_string(3000)); - CREATE TABLE t2(a); - INSERT INTO t2 VALUES(1); - - INSERT INTO t2 VALUES(2) - - PRAGMA page_size = 1024; - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(a); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES(a_string(3000)); - CREATE TABLE t2(a); - INSERT INTO t2 VALUES(1); - - - PRAGMA integrity_check; - BEGIN; - INSERT INTO t2 VALUES(2); - SAVEPOINT a; - INSERT INTO t2 VALUES(3); - ROLLBACK TO a; - - COMMIT - - PRAGMA auto_vacuum = 1; - CREATE TABLE t1(a, b); - - - SELECT * FROM sqlite_master; - PRAGMA integrity_check; - - - PRAGMA auto_vacuum = 1; - CREATE TABLE t1(x, y); - CREATE TABLE t2(x, y); - - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); - - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/filter1.test b/libsql-wal/tests/assets/fixtures/filter1.test deleted file mode 100644 index 07e9060993..0000000000 --- a/libsql-wal/tests/assets/fixtures/filter1.test +++ /dev/null @@ -1,154 +0,0 @@ - - CREATE TABLE t1(a); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9); - - SELECT sum(a) FROM t1; - SELECT sum(a) FILTER( WHERE a<5 ) FROM t1; - - SELECT sum(a) FILTER( WHERE a>9 ), - sum(a) FILTER( WHERE a>8 ), - sum(a) FILTER( WHERE a>7 ), - sum(a) FILTER( WHERE a>6 ), - sum(a) FILTER( WHERE a>5 ), - sum(a) FILTER( WHERE a>4 ), - sum(a) FILTER( WHERE a>3 ), - sum(a) FILTER( WHERE a>2 ), - sum(a) FILTER( WHERE a>1 ), - sum(a) FILTER( WHERE a>0 ) - FROM t1; - - - SELECT max(a) FILTER (WHERE (a % 2)==0) FROM t1 - - - SELECT min(a) FILTER (WHERE a>4) FROM t1 - - - SELECT count(*) FILTER (WHERE a!=5) FROM t1 - - - SELECT min(a) FILTER (WHERE a>3) FROM t1 GROUP BY (a%2) ORDER BY 1; - - - CREATE VIEW vv AS - SELECT sum(a) FILTER( WHERE a>9 ), - sum(a) FILTER( WHERE a>8 ), - sum(a) FILTER( WHERE a>7 ), - sum(a) FILTER( WHERE a>6 ), - sum(a) FILTER( WHERE a>5 ), - sum(a) FILTER( WHERE a>4 ), - sum(a) FILTER( WHERE a>3 ), - sum(a) FILTER( WHERE a>2 ), - sum(a) FILTER( WHERE a>1 ), - sum(a) FILTER( WHERE a>0 ) - FROM t1; - SELECT * FROM vv; - - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9); - - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1, 1); - - - SELECT b, max(a) FILTER (WHERE b='x') FROM t1; - - - CREATE TABLE t2(a, b, c); - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(1, 3, 4); - INSERT INTO t2 VALUES(2, 5, 6); - INSERT INTO t2 VALUES(2, 7, 8); - - - SELECT a, c, max(b) FILTER (WHERE c='x') FROM t2 GROUP BY a; - - - DELETE FROM t2; - INSERT INTO t2 VALUES(1, 5, 'x'); - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(1, 4, 'x'); - INSERT INTO t2 VALUES(2, 5, 6); - INSERT INTO t2 VALUES(2, 7, 8); - - - SELECT a, c, max(b) FILTER (WHERE c='x') FROM t2 GROUP BY a; - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('a', 0, 5); - INSERT INTO t1 VALUES('a', 1, 10); - INSERT INTO t1 VALUES('a', 0, 15); - - INSERT INTO t1 VALUES('b', 0, 5); - INSERT INTO t1 VALUES('b', 1, 1000); - INSERT INTO t1 VALUES('b', 0, 5); - - INSERT INTO t1 VALUES('c', 0, 1); - INSERT INTO t1 VALUES('c', 1, 2); - INSERT INTO t1 VALUES('c', 0, 3); - - - SELECT avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY h; - - - SELECT avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY (h+1.0); - - - SELECT a, avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY avg(c); - - - SELECT a, avg(c) FILTER (WHERE b!=1) FROM t1 GROUP BY a ORDER BY 2 - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(1, 3); - - - SELECT count(*) FILTER (WHERE b>2) FROM (SELECT * FROM t1) - - - SELECT count(*) FILTER (WHERE b>2) OVER () FROM (SELECT * FROM t1) - - - SELECT count(*) FILTER (WHERE b>2) OVER (ORDER BY b) FROM (SELECT * FROM t1) - - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,1); - INSERT INTO t1 VALUES(2,2); - CREATE TABLE t2(x,y); - INSERT INTO t2 VALUES(1,1); - - - SELECT (SELECT COUNT(a) FILTER(WHERE x) FROM t2) FROM t1; - - - SELECT (SELECT COUNT(a+x) FROM t2) FROM t1; - - - SELECT (SELECT COUNT(a) FROM t2) FROM t1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(321, 100000); - INSERT INTO t1 VALUES(111, 110000); - INSERT INTO t1 VALUES(444, 120000); - INSERT INTO t1 VALUES(222, 130000); - - - SELECT max(a), max(a) FILTER (WHERE b<12345), b FROM t1; - - - CREATE TABLE t0(c0 INT); - CREATE TABLE t1a(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1a VALUES(1,'one'),(2,NULL),(3,'three'); - CREATE TABLE t1b(c INTEGER PRIMARY KEY, d TEXT); - INSERT INTO t1b VALUES(4,'four'),(5,NULL),(6,'six'); - CREATE VIEW t1 AS SELECT a, b FROM t1a UNION ALL SELECT c, d FROM t1b; - SELECT count()FILTER(WHERE b IS NULL) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/filter2.test b/libsql-wal/tests/assets/fixtures/filter2.test deleted file mode 100644 index 1d99ec8479..0000000000 --- a/libsql-wal/tests/assets/fixtures/filter2.test +++ /dev/null @@ -1,94 +0,0 @@ - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); - INSERT INTO t1 VALUES - (1, 7), (2, 3), (3, 5), (4, 30), (5, 26), (6, 23), (7, 27), - (8, 3), (9, 17), (10, 26), (11, 33), (12, 25), (13, NULL), (14, 47), - (15, 36), (16, 13), (17, 45), (18, 31), (19, 11), (20, 36), (21, 37), - (22, 21), (23, 22), (24, 14), (25, 16), (26, 3), (27, 7), (28, 29), - (29, 50), (30, 38), (31, 3), (32, 36), (33, 12), (34, 4), (35, 46), - (36, 3), (37, 48), (38, 23), (39, NULL), (40, 24), (41, 5), (42, 46), - (43, 11), (44, NULL), (45, 18), (46, 25), (47, 15), (48, 18), (49, 23); - - - SELECT sum(b) FROM t1 - - - SELECT sum(b) FILTER (WHERE a<10) FROM t1 - - - SELECT count(DISTINCT b) FROM t1 - - - SELECT count(DISTINCT b) FILTER (WHERE a!=19) FROM t1 - - - SELECT min(b) FILTER (WHERE a>19), - min(b) FILTER (WHERE a>0), - max(a+b) FILTER (WHERE a>19), - max(b+a) FILTER (WHERE a BETWEEN 10 AND 40) - FROM t1; - - - SELECT min(b), - min(b), - max(a+b), - max(b+a) - FROM t1 - GROUP BY (a%10) - ORDER BY 1, 2, 3, 4; - - - SELECT min(b) FILTER (WHERE a>19), - min(b) FILTER (WHERE a>0), - max(a+b) FILTER (WHERE a>19), - max(b+a) FILTER (WHERE a BETWEEN 10 AND 40) - FROM t1 - GROUP BY (a%10) - ORDER BY 1, 2, 3, 4; - - - SELECT sum(a+b) FILTER (WHERE a=NULL) FROM t1 - - - SELECT (a%5) FROM t1 GROUP BY (a%5) - HAVING sum(b) FILTER (WHERE b<20) > 34 - ORDER BY 1 - - - SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb - FROM t1 - GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34 - ORDER BY 1 - - - SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb - FROM t1 - GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34 - ORDER BY 2 - - - SELECT (a%5), - sum(b) FILTER (WHERE b<20) AS bbb, - count(distinct b) FILTER (WHERE b<20 OR a=13) AS ccc - FROM t1 GROUP BY (a%5) - ORDER BY 2 - - - SELECT - string_agg(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=0), - group_concat(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=1), - count(*) FILTER (WHERE b%2!=0), - count(*) FILTER (WHERE b%2!=1) - FROM t1; - - - SELECT - a/5, - sum(b) FILTER (WHERE a%5=0), - sum(b) FILTER (WHERE a%5=1), - sum(b) FILTER (WHERE a%5=2), - sum(b) FILTER (WHERE a%5=3), - sum(b) FILTER (WHERE a%5=4) - FROM t1 GROUP BY (a/5) ORDER BY 1; - diff --git a/libsql-wal/tests/assets/fixtures/filterfault.test b/libsql-wal/tests/assets/fixtures/filterfault.test deleted file mode 100644 index 4bcae43cd8..0000000000 --- a/libsql-wal/tests/assets/fixtures/filterfault.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1(a, b, c, d); - INSERT INTO t1 VALUES(1, 2, 3, 4); - INSERT INTO t1 VALUES(5, 6, 7, 8); - INSERT INTO t1 VALUES(9, 10, 11, 12); - diff --git a/libsql-wal/tests/assets/fixtures/fkey1.test b/libsql-wal/tests/assets/fixtures/fkey1.test deleted file mode 100644 index 115c59d20b..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey1.test +++ /dev/null @@ -1,86 +0,0 @@ - - PRAGMA foreign_keys=ON; - CREATE TABLE "xx1"("xx2" TEXT PRIMARY KEY, "xx3" TEXT); - INSERT INTO "xx1"("xx2","xx3") VALUES('abc','def'); - CREATE TABLE "xx4"("xx5" TEXT REFERENCES "xx1" ON DELETE CASCADE); - INSERT INTO "xx4"("xx5") VALUES('abc'); - INSERT INTO "xx1"("xx2","xx3") VALUES('uvw','xyz'); - SELECT 1, "xx5" FROM "xx4"; - DELETE FROM "xx1"; - SELECT 2, "xx5" FROM "xx4"; - - - PRAGMA foreign_keys=ON; - CREATE TABLE """1"("""2" TEXT PRIMARY KEY, """3" TEXT); - INSERT INTO """1"("""2","""3") VALUES('abc','def'); - CREATE TABLE """4"("""5" TEXT REFERENCES """1" ON DELETE CASCADE); - INSERT INTO """4"("""5") VALUES('abc'); - INSERT INTO """1"("""2","""3") VALUES('uvw','xyz'); - SELECT 1, """5" FROM """4"; - DELETE FROM """1"; - SELECT 2, """5" FROM """4"; - - - PRAGMA table_info="""1"; - - - CREATE TABLE t11( - x INTEGER PRIMARY KEY, - parent REFERENCES t11 ON DELETE CASCADE - ); - INSERT INTO t11 VALUES (1, NULL), (2, 1), (3, 2); - - - CREATE TABLE Foo ( - Id INTEGER PRIMARY KEY, - ParentId INTEGER REFERENCES Foo(Id) ON DELETE CASCADE, C1 - ); - INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (1, null, 'A'); - INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (2, 1, 'A-2-1'); - INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (3, 2, 'A-3-2'); - INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (4, 3, 'A-4-3'); - - - CREATE TABLE p1(x, y); - CREATE UNIQUE INDEX p1x ON p1(x) WHERE y<2; - INSERT INTO p1 VALUES(1, 1); - CREATE TABLE c1(a REFERENCES p1(x)); - - - CREATE UNIQUE INDEX p1x2 ON p1(x); - INSERT INTO c1 VALUES(1); - - - PRAGMA foreign_keys=OFF; - CREATE TABLE t1(a,b,c,FOREIGN KEY(a,a,a,a,a,a,a,a,a,a,a,a,a,a) REFERENCES t0); - INSERT INTO t1 VALUES(1,2,3); - PRAGMA foreign_key_check; - - - DROP TABLE t1; - CREATE TABLE t1(a,b,c AS(1),d, FOREIGN KEY(c,d,b,a,b,d,b,c) REFERENCES t0); - PRAGMA foreign_key_check; - - - PRAGMA writable_schema=ON; - PRAGMA foreign_keys = ON; - CREATE TABLE sqlite_stat1 (tbl INTEGER PRIMARY KEY DESC, idx UNIQUE DEFAULT NULL) WITHOUT ROWID; - PRAGMA writable_schema=OFF; - CREATE TABLE sqlsim4(stat PRIMARY KEY);; - CREATE TABLE t1(sqlsim7 REFERENCES sqlite_stat1 ON DELETE CASCADE); - DROP table "sqlsim4"; - - - CREATE TABLE t1(a REFERENCES sqlite_stat1 ON DELETE CASCADE); - CREATE TABLE t2(a TEXT PRIMARY KEY); - PRAGMA writable_schema=ON; - CREATE TABLE sqlite_stat1(tbl INTEGER PRIMARY KEY DESC, idx UNIQUE DEFAULT NULL) WITHOUT ROWID; - UPDATE sqlite_schema SET name='sqlite_autoindex_sqlite_stat1_1' WHERE name='sqlite_autoindex_sqlite_stat1_2'; - PRAGMA writable_schema=RESET; - - - PRAGMA foreign_keys = ON; - CREATE TABLE """1"("""2", """3" PRIMARY KEY); - CREATE TABLE """4"("""5" REFERENCES """1" ON DELETE RESTRICT); - DELETE FROM """1"; - diff --git a/libsql-wal/tests/assets/fixtures/fkey2.test b/libsql-wal/tests/assets/fixtures/fkey2.test deleted file mode 100644 index ff7cfffb1d..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey2.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE TABLE t3(x PRIMARY KEY REFERENCES t3 ON DELETE SET NULL); - INSERT INTO t3(x) VALUES(12345); - DROP TABLE t3; - diff --git a/libsql-wal/tests/assets/fixtures/fkey3.test b/libsql-wal/tests/assets/fixtures/fkey3.test deleted file mode 100644 index c39a146837..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey3.test +++ /dev/null @@ -1,43 +0,0 @@ - - CREATE TABLE t3(a, b, c, d, - UNIQUE(a, b), - FOREIGN KEY(c, d) REFERENCES t3(a, b) - ); - INSERT INTO t3 VALUES(1, 2, 1, 2); - - - CREATE TABLE t4(a UNIQUE, b REFERENCES t4(a)); - - - CREATE TABLE t5(a INTEGER PRIMARY KEY, b REFERENCES t5(a)); - INSERT INTO t5 VALUES(NULL, 1); - - - CREATE TABLE t6(a INTEGER PRIMARY KEY, b, c, d, - FOREIGN KEY(c, d) REFERENCES t6(a, b) - ); - CREATE UNIQUE INDEX t6i ON t6(b, a); - - - INSERT INTO t6 VALUES(100, 'one', 100, 'one'); - DELETE FROM t6 WHERE a = 100; - - - INSERT INTO t6 VALUES(100, 'one', 100, 'one'); - UPDATE t6 SET c = 1, d = 'a' WHERE a = 100; - DELETE FROM t6 WHERE a = 100; - - - CREATE TABLE t7(a, b, c, d INTEGER PRIMARY KEY, - FOREIGN KEY(c, d) REFERENCES t7(a, b) - ); - CREATE UNIQUE INDEX t7i ON t7(a, b); - - - CREATE TABLE t8(a, b, c, d, e, FOREIGN KEY(c, d) REFERENCES t8(a, b)); - CREATE UNIQUE INDEX t8i1 ON t8(a, b); - CREATE UNIQUE INDEX t8i2 ON t8(c); - INSERT INTO t8 VALUES(1, 1, 1, 1, 1); - - UPDATE t8 SET d = 1; - UPDATE t8 SET e = 2; diff --git a/libsql-wal/tests/assets/fixtures/fkey4.test b/libsql-wal/tests/assets/fixtures/fkey4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fkey5.test b/libsql-wal/tests/assets/fixtures/fkey5.test deleted file mode 100644 index d78bb1fa17..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey5.test +++ /dev/null @@ -1,92 +0,0 @@ - - PRAGMA foreign_key_list(c5); - - - CREATE TABLE k1(x REFERENCES s1); - PRAGMA foreign_key_check(k1); - - - INSERT INTO k1 VALUES(NULL); - PRAGMA foreign_key_check(k1); - - - INSERT INTO k1 VALUES(1); - PRAGMA foreign_key_check(k1); - - - CREATE TABLE k2(x, y, FOREIGN KEY(x, y) REFERENCES s1(a, b)); - PRAGMA foreign_key_check(k2); - - - INSERT INTO k2 VALUES(NULL, 'five'); - PRAGMA foreign_key_check(k2); - - - INSERT INTO k2 VALUES('one', NULL); - PRAGMA foreign_key_check(k2); - - - INSERT INTO k2 VALUES('six', 'seven'); - PRAGMA foreign_key_check(k2); - - - CREATE TABLE p30 (id INTEGER PRIMARY KEY); - CREATE TABLE IF NOT EXISTS c30 ( - line INTEGER, - master REFERENCES p30(id), - PRIMARY KEY(master) - ) WITHOUT ROWID; - - INSERT INTO p30 (id) VALUES (1); - INSERT INTO c30 (master, line) VALUES (1, 999); - - - PRAGMA foreign_key_check; - - - INSERT INTO c30 VALUES(45, 45); - PRAGMA foreign_key_check; - - - CREATE TABLE tt(y); - CREATE TABLE c11(x REFERENCES tt(y)); - - - ATTACH ':memory:' as aux; - CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2); - CREATE TABLE main.t2(x TEXT PRIMARY KEY, y INT); - INSERT INTO main.t2 VALUES('abc',11),('def',22),('xyz',99); - INSERT INTO aux.t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops'); - PRAGMA foreign_key_check=t1; - - - CREATE TABLE aux.t2(x TEXT PRIMARY KEY, y INT); - INSERT INTO aux.t2 VALUES('abc',11),('def',22),('xyz',99); - PRAGMA foreign_key_check=t1; - - - SELECT *, 'x' FROM pragma_foreign_key_check('t1'); - - - SELECT *, 'x' FROM pragma_foreign_key_check('t1','aux'); - - - PRAGMA foreign_keys=OFF; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2); - CREATE TABLE t2(x TEXT PRIMARY KEY, y INT); - CREATE TABLE t3(w TEXT, z INT REFERENCES t1); - INSERT INTO t2 VALUES('abc',11),('def',22),('xyz',99); - INSERT INTO t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops'); - INSERT INTO t3 VALUES(11,7),(22,19); - - - SELECT x.*, '|' - FROM sqlite_schema, pragma_foreign_key_check(name) AS x - WHERE type='table' - ORDER BY x."table"; - - - SELECT *, '|' - FROM pragma_foreign_key_check AS x - ORDER BY x."table"; - diff --git a/libsql-wal/tests/assets/fixtures/fkey6.test b/libsql-wal/tests/assets/fixtures/fkey6.test deleted file mode 100644 index 55da3f7409..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey6.test +++ /dev/null @@ -1,103 +0,0 @@ - - PRAGMA defer_foreign_keys; - - - PRAGMA foreign_keys=ON; - CREATE TABLE t1(x INTEGER PRIMARY KEY); - CREATE TABLE t2(y INTEGER PRIMARY KEY, - z INTEGER REFERENCES t1(x) DEFERRABLE INITIALLY DEFERRED); - CREATE INDEX t2z ON t2(z); - CREATE TABLE t3(u INTEGER PRIMARY KEY, v INTEGER REFERENCES t1(x)); - CREATE INDEX t3v ON t3(v); - INSERT INTO t1 VALUES(1),(2),(3),(4),(5); - INSERT INTO t2 VALUES(1,1),(2,2); - INSERT INTO t3 VALUES(3,3),(4,4); - - - PRAGMA defer_foreign_keys; - ROLLBACK; - PRAGMA defer_foreign_keys; - BEGIN; - PRAGMA defer_foreign_keys=ON; - PRAGMA defer_foreign_keys; - COMMIT; - PRAGMA defer_foreign_keys; - BEGIN; - - - CREATE TABLE p1(a PRIMARY KEY); - INSERT INTO p1 VALUES('one'), ('two'); - CREATE TABLE c1(x REFERENCES p1); - INSERT INTO c1 VALUES('two'), ('one'); - - - BEGIN; - PRAGMA defer_foreign_keys = 1; - DELETE FROM p1; - ROLLBACK; - PRAGMA defer_foreign_keys; - - - BEGIN; - PRAGMA defer_foreign_keys = 1; - DROP TABLE p1; - PRAGMA vdbe_trace = 0; - ROLLBACK; - PRAGMA defer_foreign_keys; - - - BEGIN; - PRAGMA defer_foreign_keys = 1; - DELETE FROM p1; - DROP TABLE c1; - COMMIT; - PRAGMA defer_foreign_keys; - - - DROP TABLE p1; - CREATE TABLE p1(a PRIMARY KEY); - INSERT INTO p1 VALUES('one'), ('two'); - CREATE TABLE c1(x REFERENCES p1); - INSERT INTO c1 VALUES('two'), ('one'); - - - BEGIN; - PRAGMA defer_foreign_keys = 1; - INSERT INTO c1 VALUES('three'); - DROP TABLE c1; - COMMIT; - PRAGMA defer_foreign_keys; - - - CREATE TABLE p2(a PRIMARY KEY, b); - CREATE TABLE c2(x, y REFERENCES p2 ON DELETE RESTRICT ON UPDATE RESTRICT); - INSERT INTO p2 VALUES(1, 'one'); - INSERT INTO p2 VALUES(2, 'two'); - INSERT INTO c2 VALUES('i', 1); - - COMMIT - - BEGIN; - PRAGMA defer_foreign_keys = 1; - UPDATE p2 SET a=a-1; - COMMIT; - - - BEGIN; - PRAGMA defer_foreign_keys = 1; - UPDATE p2 SET a=a-1; - - ROLLBACK - - CREATE TRIGGER p2t AFTER DELETE ON p2 BEGIN - INSERT INTO p2 VALUES(old.a, 'deleted!'); - END; - - COMMIT - - BEGIN; - PRAGMA defer_foreign_keys = 1; - DELETE FROM p2 WHERE a=1; - COMMIT; - SELECT * FROM p2; - diff --git a/libsql-wal/tests/assets/fixtures/fkey7.test b/libsql-wal/tests/assets/fixtures/fkey7.test deleted file mode 100644 index e606b115b2..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey7.test +++ /dev/null @@ -1,46 +0,0 @@ - - PRAGMA foreign_keys = 1; - - CREATE TABLE s1(a PRIMARY KEY, b); - CREATE TABLE par(a, b REFERENCES s1, c UNIQUE, PRIMARY KEY(a)); - - CREATE TABLE c1(a, b REFERENCES par); - CREATE TABLE c2(a, b REFERENCES par); - CREATE TABLE c3(a, b REFERENCES par(c)); - - - CREATE TABLE pX(x PRIMARY KEY); - CREATE TABLE cX(a INTEGER PRIMARY KEY, b REFERENCES pX); - - - CREATE TABLE p4 (id INTEGER NOT NULL PRIMARY KEY); - INSERT INTO p4 VALUES(1), (2), (3); - - CREATE TABLE c4(x INTEGER REFERENCES p4(id) DEFERRABLE INITIALLY DEFERRED); - CREATE INDEX c4_x ON c4(x); - INSERT INTO c4 VALUES(1), (2), (3); - - ANALYZE; - INSERT INTO p4(id) VALUES(4); - - - PRAGMA foreign_keys = true; - CREATE TABLE parent( - p PRIMARY KEY - ); - CREATE TABLE child( - c UNIQUE REFERENCES parent(p) - ); - - - SELECT * FROM child; - - - PRAGMA foreign_key_check; - - - SELECT * FROM child; - - - PRAGMA foreign_key_check; - diff --git a/libsql-wal/tests/assets/fixtures/fkey8.test b/libsql-wal/tests/assets/fixtures/fkey8.test deleted file mode 100644 index e822810d26..0000000000 --- a/libsql-wal/tests/assets/fixtures/fkey8.test +++ /dev/null @@ -1,98 +0,0 @@ - PRAGMA foreign_keys = 1; - - PRAGMA foreign_keys = on; - CREATE TABLE p1(a PRIMARY KEY, b) WITHOUT ROWID; - CREATE TABLE c1(x REFERENCES p1 DEFERRABLE INITIALLY DEFERRED); - - INSERT INTO p1 VALUES(1, 'one'); - INSERT INTO p1 VALUES(2, 'two'); - INSERT INTO c1 VALUES(1); - INSERT INTO c1 VALUES(2); - - - PRAGMA foreign_keys = on; - CREATE TABLE p2(a PRIMARY KEY, b); - CREATE TABLE c2( - x PRIMARY KEY, - y REFERENCES p2 DEFERRABLE INITIALLY DEFERRED - ) WITHOUT ROWID; - - - PRAGMA foreign_keys = on; - CREATE TABLE p3(a PRIMARY KEY, b) WITHOUT ROWID; - CREATE TABLE c3(x REFERENCES p3); - - INSERT INTO p3 VALUES(1, 'one'); - INSERT INTO p3 VALUES(2, 'two'); - INSERT INTO c3 VALUES(1); - INSERT INTO c3 VALUES(2); - - CREATE TRIGGER p3d AFTER DELETE ON p3 WHEN old.a=1 BEGIN - INSERT OR REPLACE INTO p3 VALUES(2, 'three'); - END; - - - PRAGMA foreign_keys=ON; - CREATE TABLE t2( - a PRIMARY KEY, b, c, d, e, - FOREIGN KEY(b, c) REFERENCES t2(d, e) - ) WITHOUT ROWID; - CREATE UNIQUE INDEX idx ON t2(d, e); - - INSERT INTO t2 VALUES(1, 'one', 'one', 'one', 'one'); -- row is parent of self - INSERT INTO t2 VALUES(2, 'one', 'one', 'one', NULL); -- parent is row 1 - - - CREATE TABLE t1 ( - c1 PRIMARY KEY, - c2 NUMERIC, - FOREIGN KEY(c1) REFERENCES t1(c2) - ) WITHOUT ROWID ; - CREATE INDEX t1c1 ON t1(c1); - CREATE UNIQUE INDEX t1c1unique ON t1(c2); - - - INSERT OR REPLACE INTO t1 VALUES(20000, 20000); - - - PRAGMA foreign_keys = true; - CREATE TABLE parent( - p TEXT PRIMARY KEY - ); - CREATE TABLE child( - c INTEGER UNIQUE, - FOREIGN KEY(c) REFERENCES parent(p) DEFERRABLE INITIALLY DEFERRED - ); - BEGIN; - INSERT INTO child VALUES(123); - INSERT INTO parent VALUES('123'); - COMMIT; - - - PRAGMA integrity_check; - - - INSERT INTO parent VALUES(1200); - BEGIN; - INSERT INTO child VALUES(456); - UPDATE parent SET p = '456' WHERE p=1200; - COMMIT; - - - PRAGMA integrity_check; - - - PRAGMA foreign_keys = on; - CREATE TABLE c1(b); - INSERT INTO c1 VALUES(123); - - - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.p1(a INTEGER PRIMARY KEY); - CREATE TABLE aux.c1(b REFERENCES p1(a) ON DELETE RESTRICT); - - INSERT INTO aux.p1 VALUES(123); - - - DELETE FROM aux.p1 WHERE a=123; - diff --git a/libsql-wal/tests/assets/fixtures/fkey_malloc.test b/libsql-wal/tests/assets/fixtures/fkey_malloc.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fordelete.test b/libsql-wal/tests/assets/fixtures/fordelete.test deleted file mode 100644 index 80661cf0c2..0000000000 --- a/libsql-wal/tests/assets/fixtures/fordelete.test +++ /dev/null @@ -1,51 +0,0 @@ - - CREATE TABLE t1(a PRIMARY KEY, b); - - - CREATE TABLE t2(a, b, c); - CREATE INDEX t2a ON t2(a); - CREATE INDEX t2b ON t2(b); - CREATE INDEX t2c ON t2(c); - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c, d); - CREATE TABLE x2(a INTEGER PRIMARY KEY, b, c, d); - - - CREATE TABLE log(x); - CREATE TABLE p1(one PRIMARY KEY, two); - - CREATE TRIGGER tr_bd BEFORE DELETE ON p1 BEGIN - INSERT INTO log VALUES('delete'); - END; - INSERT INTO p1 VALUES('a', 'A'), ('b', 'B'), ('c', 'C'); - DELETE FROM p1 WHERE one = 'a'; - - - BEGIN TRANSACTION; - CREATE TABLE tbl(a PRIMARY KEY, b, c); - CREATE TABLE log(a, b, c); - INSERT INTO "tbl" VALUES(1,2,3); - CREATE TRIGGER the_trigger BEFORE DELETE ON tbl BEGIN - INSERT INTO log VALUES(1, 2,3); - END; - COMMIT; - DELETE FROM tbl WHERE a=1; - - - PRAGMA foreign_keys = 1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - CREATE TABLE t2( - c INTEGER PRIMARY KEY, - d INTEGER DEFAULT 1 REFERENCES t1 ON DELETE SET DEFAULT - ); - - - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t2 VALUES(1, 2); - SELECT * FROM t2; - - - DELETE FROM t1 WHERE a = 2; - diff --git a/libsql-wal/tests/assets/fixtures/format4.test b/libsql-wal/tests/assets/fixtures/format4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fpconv1.test b/libsql-wal/tests/assets/fixtures/fpconv1.test deleted file mode 100644 index d2c9c5ba99..0000000000 --- a/libsql-wal/tests/assets/fixtures/fpconv1.test +++ /dev/null @@ -1,15 +0,0 @@ - - WITH RECURSIVE - /* Number of random floating-point values to try. - ** On a circa 2016 x64 linux box, this test runs at - ** about 80000 cases per second -------------------vvvvvv */ - c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100000), - fp(y) AS MATERIALIZED ( - SELECT CAST( format('%+d.%019d0e%+03d', - random()%10,abs(random()),random()%200) AS real) - FROM c - ) - SELECT y FROM fp - WHERE -log10(abs(decimal_sub(dtostr(y,24),format('%!.24e',y))/y))<15.0; - /* Number of digits of accuracy required -------^^^^ */ - diff --git a/libsql-wal/tests/assets/fixtures/fts-9fd058691.test b/libsql-wal/tests/assets/fixtures/fts-9fd058691.test deleted file mode 100644 index afa9e7f396..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts-9fd058691.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE VIRTUAL TABLE fts USING fts3( tags TEXT); - INSERT INTO fts (tags) VALUES ('tag1'); - SELECT * FROM fts WHERE tags MATCH 'tag1'; - - - CREATE VIRTUAL TABLE fts USING fts3(tags TEXT); - INSERT INTO fts (docid, tags) VALUES (1, 'tag1'); - INSERT INTO fts (docid, tags) VALUES (2, NULL); - INSERT INTO fts (docid, tags) VALUES (3, 'three'); - diff --git a/libsql-wal/tests/assets/fixtures/fts3.test b/libsql-wal/tests/assets/fixtures/fts3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3aa.test b/libsql-wal/tests/assets/fixtures/fts3aa.test deleted file mode 100644 index c2cc0765a0..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3aa.test +++ /dev/null @@ -1,41 +0,0 @@ - - CREATE VIRTUAL TABLE t2 USING fts3(xyz=abc); - SELECT xyz FROM t2; - - - CREATE VIRTUAL TABLE t3 USING fts3(tokenize=simple, tokenize=simple); - SELECT tokenize FROM t3; - - - CREATE VIRTUAL TABLE t0 USING fts4(order=desc); - BEGIN; - INSERT INTO t0(rowid, content) VALUES(1, 'abc'); - UPDATE t0 SET docid=5 WHERE docid=1; - INSERT INTO t0(rowid, content) VALUES(6, 'abc'); - - - SELECT docid FROM t0 WHERE t0 MATCH 'abc'; - - - SELECT docid FROM t0 WHERE t0 MATCH '"abc abc"'; - - COMMIT - - SELECT docid FROM t0 WHERE t0 MATCH 'abc'; - - - SELECT docid FROM t0 WHERE t0 MATCH '"abc abc"'; - - - CREATE VIRTUAL TABLE t9 USING fts4(a, "", '---'); - - - CREATE VIRTUAL TABLE t10 USING fts3(<, b, c); - - - CREATE VIRTUAL TABLE z1 USING fts3; - INSERT INTO z1 VALUES('one two three'),('four one five'),('six two five'); - CREATE TRIGGER z1r1 AFTER DELETE ON z1_content BEGIN - DELETE FROM z1; - END; - diff --git a/libsql-wal/tests/assets/fixtures/fts3ab.test b/libsql-wal/tests/assets/fixtures/fts3ab.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ac.test b/libsql-wal/tests/assets/fixtures/fts3ac.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ad.test b/libsql-wal/tests/assets/fixtures/fts3ad.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ae.test b/libsql-wal/tests/assets/fixtures/fts3ae.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3af.test b/libsql-wal/tests/assets/fixtures/fts3af.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ag.test b/libsql-wal/tests/assets/fixtures/fts3ag.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ah.test b/libsql-wal/tests/assets/fixtures/fts3ah.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ai.test b/libsql-wal/tests/assets/fixtures/fts3ai.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3aj.test b/libsql-wal/tests/assets/fixtures/fts3aj.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ak.test b/libsql-wal/tests/assets/fixtures/fts3ak.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3al.test b/libsql-wal/tests/assets/fixtures/fts3al.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3am.test b/libsql-wal/tests/assets/fixtures/fts3am.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3an.test b/libsql-wal/tests/assets/fixtures/fts3an.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3ao.test b/libsql-wal/tests/assets/fixtures/fts3ao.test deleted file mode 100644 index 38ac7c5614..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3ao.test +++ /dev/null @@ -1,14 +0,0 @@ - - SELECT snippet(t5, '[', ']') FROM t5 WHERE t5 MATCH 'the' - - - CREATE VIRTUAL TABLE t7 USING FTS4; - INSERT INTO t7 VALUES('coined by a German clinician'); - SELECT count(*) FROM sqlite_master WHERE name LIKE 't7%'; - SELECT count(*) FROM sqlite_master WHERE name LIKE 't8%'; - - - ALTER TABLE t7 RENAME TO t8; - SELECT count(*) FROM sqlite_master WHERE name LIKE 't7%'; - SELECT count(*) FROM sqlite_master WHERE name LIKE 't8%'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3atoken.test b/libsql-wal/tests/assets/fixtures/fts3atoken.test deleted file mode 100644 index d394367327..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3atoken.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING fts3(name,TOKENIZE icu en_US); - insert into x1 (name) values (NULL); - insert into x1 (name) values (NULL); - delete from x1; - diff --git a/libsql-wal/tests/assets/fixtures/fts3auto.test b/libsql-wal/tests/assets/fixtures/fts3auto.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3aux1.test b/libsql-wal/tests/assets/fixtures/fts3aux1.test deleted file mode 100644 index 8e79d7fedb..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3aux1.test +++ /dev/null @@ -1,182 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4; - INSERT INTO t1 VALUES('one two three four'); - INSERT INTO t1 VALUES('three four five six'); - INSERT INTO t1 VALUES('one three five seven'); - - CREATE VIRTUAL TABLE terms USING fts4aux(t1); - SELECT term, documents, occurrences FROM terms WHERE col = '*'; - - - INSERT INTO t1 VALUES('one one one three three three'); - SELECT term, documents, occurrences FROM terms WHERE col = '*'; - - DELETE FROM t1; - - SELECT term, documents, occurrences FROM terms WHERE col = '*'; - - - INSERT INTO t1 VALUES('a b a b a b a'); - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - SELECT term, documents, occurrences FROM terms WHERE col = '*'; - - - DROP TABLE t1; - DROP TABLE terms; - - CREATE VIRTUAL TABLE x1 USING fts4(x); - INSERT INTO x1(x1) VALUES('nodesize=24'); - CREATE VIRTUAL TABLE terms USING fts4aux(x1); - - CREATE VIEW terms_v AS - SELECT term, documents, occurrences FROM terms WHERE col = '*'; - - INSERT INTO x1 VALUES('braes brag bragged bragger bragging'); - INSERT INTO x1 VALUES('brags braid braided braiding braids'); - INSERT INTO x1 VALUES('brain brainchild brained braining brains'); - INSERT INTO x1 VALUES('brainstem brainstems brainstorm brainstorms'); - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term='braid' - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term='braid' - - SELECT * FROM terms_v WHERE term='braid' - SELECT * FROM terms_v WHERE +term='braid' - SELECT * FROM terms_v WHERE term='breakfast' - SELECT * FROM terms_v WHERE +term='breakfast' - SELECT * FROM terms_v WHERE term='cba' - SELECT * FROM terms_v WHERE +term='cba' - SELECT * FROM terms_v WHERE term='abc' - SELECT * FROM terms_v WHERE +term='abc' - SELECT * FROM terms WHERE term=NULL - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term>'brain' - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term>'brain' - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term<'brain' - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term<'brain' - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term BETWEEN 'brags' AND 'brain' - - - EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term BETWEEN 'brags' AND 'brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE term>'brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE +term>'brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE term>='brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE +term>='brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE term>='abc' - - - SELECT term, documents, occurrences FROM terms_v WHERE +term>='abc' - - - SELECT term, documents, occurrences FROM terms_v WHERE term>='brainstorms' - - - SELECT term, documents, occurrences FROM terms_v WHERE term>='brainstorms' - - SELECT * FROM terms_v WHERE term>'brainstorms' - SELECT * FROM terms_v WHERE term>'brainstorms' - SELECT * FROM terms_v WHERE term>'cba' - SELECT * FROM terms_v WHERE term>'cba' - - SELECT term, documents, occurrences FROM terms_v WHERE term<'brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE +term<'brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE term<='brain' - - - SELECT term, documents, occurrences FROM terms_v WHERE +term<='brain' - - - SELECT term, documents, occurrences FROM terms_v - WHERE rec('cnt', term) AND term BETWEEN 'brags' AND 'brain' - - - SELECT term, documents, occurrences FROM terms_v - WHERE rec('cnt', term) AND +term BETWEEN 'brags' AND 'brain' - - - SELECT term, documents, occurrences FROM terms_v - WHERE rec('cnt', term) AND term > 'brags' AND term < 'brain' - - - SELECT term, documents, occurrences FROM terms_v - WHERE rec('cnt', term) AND +term > 'brags' AND +term < 'brain' - - - CREATE VIRTUAL TABLE t2 USING fts4; - - - CREATE VIRTUAL TABLE terms3 USING fts4aux(does_not_exist) - - - CREATE VIRTUAL TABLE x1 USING fts4(x); - CREATE VIRTUAL TABLE terms USING fts4aux(x1); - CREATE TABLE x2(y); - CREATE TABLE x3(y); - CREATE INDEX i1 ON x3(y); - - INSERT INTO x1 VALUES('a b c d e'); - INSERT INTO x1 VALUES('f g h i j'); - INSERT INTO x1 VALUES('k k l l a'); - - INSERT INTO x2 SELECT term FROM terms WHERE col = '*'; - INSERT INTO x3 SELECT term FROM terms WHERE col = '*'; - - - CREATE VIRTUAL TABLE "abc '!' def" USING fts4(x, y); - INSERT INTO "abc '!' def" VALUES('XX', 'YY'); - - CREATE VIRTUAL TABLE terms3 USING fts4aux("abc '!' def"); - SELECT * FROM terms3; - - - CREATE VIRTUAL TABLE "%%^^%%" USING fts4aux('abc ''!'' def'); - SELECT * FROM "%%^^%%"; - - - CREATE VIRTUAL TABLE ft1 USING fts4(x, y); - INSERT INTO ft1 VALUES('a b', 'c d'); - INSERT INTO ft1 VALUES('e e', 'c d'); - INSERT INTO ft1 VALUES('a a', 'b b'); - CREATE VIRTUAL TABLE temp.aux1 USING fts4aux(main, ft1); - SELECT * FROM aux1; - - - ATTACH 'test.db2' AS att; - CREATE VIRTUAL TABLE att.ft1 USING fts4(x, y); - INSERT INTO att.ft1 VALUES('v w', 'x y'); - INSERT INTO att.ft1 VALUES('z z', 'x y'); - INSERT INTO att.ft1 VALUES('v v', 'w w'); - CREATE VIRTUAL TABLE temp.aux2 USING fts4aux(att, ft1); - SELECT * FROM aux2; - diff --git a/libsql-wal/tests/assets/fixtures/fts3aux2.test b/libsql-wal/tests/assets/fixtures/fts3aux2.test deleted file mode 100644 index 6493773892..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3aux2.test +++ /dev/null @@ -1,90 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(a, b, languageid=l); - INSERT INTO t1(a, b, l) VALUES - ('zero zero', 'zero zero', 0), - ('one two', 'three four', 1), - ('five six', 'seven eight', 2) - ; - CREATE VIRTUAL TABLE terms USING fts4aux(t1); - - - SELECT term, documents, occurrences, languageid FROM terms WHERE col = '*'; - - - SELECT * FROM terms; - - - SELECT * FROM terms WHERE languageid=''; - - - SELECT * FROM terms WHERE languageid=-1; - - - SELECT * FROM terms WHERE languageid=9223372036854775807; - - - SELECT * FROM terms WHERE languageid=-9223372036854775808; - - - SELECT * FROM terms WHERE languageid=NULL; - - - SELECT term, documents, occurrences, languageid - FROM terms WHERE col = '*' AND languageid=1; - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE languageid=1; - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE languageid=1 AND term='zero' - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE languageid='1' AND term='two' - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE languageid='+1' AND term>'four' - - - SELECT term, documents, occurrences, languageid - FROM terms WHERE col = '*' AND languageid=2; - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE languageid=2; - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE languageid=2 AND term='five'; - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE term='five' AND languageid=2 - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE term>='seven' AND languageid=2 - - - SELECT term, col, documents, occurrences, languageid - FROM terms WHERE term>='e' AND term<'seven' AND languageid=2 - - - CREATE VIRTUAL TABLE ft USING fts3(); - INSERT INTO ft VALUES('a_234567890123456789'); - INSERT INTO ft VALUES('b_234567890123456789'); - INSERT INTO ft VALUES('c_234567890123456789'); - CREATE VIRTUAL TABLE t2 USING fts4aux(ft); - - - SELECT term FROM t2 WHERE term=X'625f323334353637383930313233343536373839'; - - - SELECT term FROM t2 WHERE term10000; - UPDATE t1_segments - SET block = zeroblob(length(block)) - WHERE length(block)>10000; - - DROP TABLE t1 - - SELECT count(*) FROM t1_segments WHERE length(block)>10000 - - - CREATE VIRTUAL TABLE x1 USING fts4(a, b); - INSERT INTO x1 VALUES('a b c', 'd e f'); - INSERT INTO x1 SELECT * FROM x1; - INSERT INTO x1 SELECT * FROM x1; - INSERT INTO x1 SELECT * FROM x1; - INSERT INTO x1 SELECT * FROM x1; - - - SELECT count(*) FROM x1 WHERE x1 MATCH '"d e f"' - - - CREATE VIRTUAL TABLE x2 USING FTS4(x); - BEGIN; - INSERT INTO x2 VALUES('m m m m m m m m m m m m m m m m m m m m m m m m m m'); - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 SELECT * FROM x2; - INSERT INTO x2 VALUES('a b c d e f g h i j k l m n o p q r s t u v w x y m'); - COMMIT; - - - SELECT * FROM x2 WHERE x2 MATCH 'a b c d e f g h i j k l m n o p q r s'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3defer2.test b/libsql-wal/tests/assets/fixtures/fts3defer2.test deleted file mode 100644 index 5f4983b341..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3defer2.test +++ /dev/null @@ -1,73 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4; - - - INSERT INTO t1 VALUES('a b c d e f a x y'); - INSERT INTO t1 VALUES(''); - INSERT INTO t1 VALUES(''); - INSERT INTO t1 VALUES(''); - INSERT INTO t1 VALUES(''); - INSERT INTO t1 VALUES(''); - INSERT INTO t1(t1) VALUES('optimize'); - - - SELECT count(*) FROM t1_segments WHERE length(block)>10000; - UPDATE t1_segments SET block = zeroblob(length(block)) WHERE length(block)>10000; - - - SELECT content FROM t1 WHERE t1 MATCH 'f (e a)'; - - - SELECT content FROM t1 WHERE t1 MATCH 'f (e NEAR/2 a)'; - - - SELECT snippet(t1, '[', ']'), offsets(t1), mit(matchinfo(t1, 'pcxnal')) - FROM t1 WHERE t1 MATCH 'f (e NEAR/2 a)'; - - - SELECT snippet(t1, '[', ']'), offsets(t1), mit(matchinfo(t1, 'pcxnal')) - FROM t1 WHERE t1 MATCH 'f (e NEAR/3 a)'; - - DROP TABLE t1 - - INSERT INTO t2 VALUES('a b c d e f g z'); - INSERT INTO t2 VALUES('a b c d e f g'); - - - CREATE VIRTUAL TABLE t3 USING fts4; - INSERT INTO t3 VALUES('a b c d e f'); - INSERT INTO t3 VALUES('x b c d e f'); - INSERT INTO t3 VALUES('d e f a b c'); - INSERT INTO t3 VALUES('b c d e f'); - INSERT INTO t3 VALUES(''); - INSERT INTO t3 VALUES(''); - INSERT INTO t3 VALUES(''); - INSERT INTO t3 VALUES(''); - INSERT INTO t3 VALUES(''); - INSERT INTO t3 VALUES(''); - - - INSERT INTO t3(t3) VALUES('rebuild'); - - - SELECT rowid, length(offsets(t3)) FROM t3 WHERE t3 MATCH '(a NEAR a)'; - - - SELECT rowid, length(offsets(t3)) FROM t3 WHERE t3 MATCH '(a NEAR b NEAR a)'; - - - SELECT rowid, length(offsets(t3)) FROM t3 WHERE t3 MATCH '(a NEAR b)'; - - - SELECT rowid, length(matchinfo(t3)) FROM t3 WHERE t3 MATCH '(a NEAR a)'; - - - SELECT rowid, length(matchinfo(t3)) FROM t3 WHERE t3 MATCH '(a NEAR b NEAR a)' - - - SELECT rowid, length(matchinfo(t3)) FROM t3 WHERE t3 MATCH '(a NEAR b)'; - - - SELECT rowid, length(matchinfo(t3)) FROM t3 - WHERE t3 MATCH '(a NEAR b NEAR a NEAR b NEAR a)' - diff --git a/libsql-wal/tests/assets/fixtures/fts3defer3.test b/libsql-wal/tests/assets/fixtures/fts3defer3.test deleted file mode 100644 index ed89bdd533..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3defer3.test +++ /dev/null @@ -1,12 +0,0 @@ - - SELECT blockid, length(block) FROM t1_segments; - - - SELECT docid, content FROM t1 WHERE t1 MATCH 'a b'; - - - SELECT docid, content FROM t1 WHERE t1 MATCH 'a b'; - - - SELECT count(*) FROM t1 WHERE t1 MATCH 'a b'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3drop.test b/libsql-wal/tests/assets/fixtures/fts3drop.test deleted file mode 100644 index 7870a97dbe..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3drop.test +++ /dev/null @@ -1,28 +0,0 @@ - - CREATE VIRTUAL TABLE f1 USING fts3; - INSERT INTO f1 VALUES('a b c'); - - - BEGIN; - INSERT INTO f1 VALUES('d e f'); - SAVEPOINT one; - INSERT INTO f1 VALUES('g h i'); - DROP TABLE f1; - ROLLBACK TO one; - COMMIT; - - - SELECT * FROM f1; - - - BEGIN; - INSERT INTO f1 VALUES('g h i'); - SAVEPOINT one; - INSERT INTO f1 VALUES('j k l'); - DROP TABLE f1; - RELEASE one; - ROLLBACK; - - - SELECT * FROM f1; - diff --git a/libsql-wal/tests/assets/fixtures/fts3dropmod.test b/libsql-wal/tests/assets/fixtures/fts3dropmod.test deleted file mode 100644 index f56f1f62e0..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3dropmod.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3(x); - - - CREATE VIRTUAL TABLE t1 USING fts4(x); - diff --git a/libsql-wal/tests/assets/fixtures/fts3e.test b/libsql-wal/tests/assets/fixtures/fts3e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3expr.test b/libsql-wal/tests/assets/fixtures/fts3expr.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3expr2.test b/libsql-wal/tests/assets/fixtures/fts3expr2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3expr3.test b/libsql-wal/tests/assets/fixtures/fts3expr3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3expr4.test b/libsql-wal/tests/assets/fixtures/fts3expr4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3expr5.test b/libsql-wal/tests/assets/fixtures/fts3expr5.test deleted file mode 100644 index 77157a1475..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3expr5.test +++ /dev/null @@ -1,19 +0,0 @@ - - CREATE VIRTUAL TABLE t0 USING fts3(x); - SELECT rowid FROM t0 WHERE x MATCH ''; - - - SELECT rowid FROM t0 WHERE x MATCH '""'; - - - SELECT rowid FROM t0 WHERE x MATCH '"" ""'; - - - SELECT rowid FROM t0 WHERE x MATCH '"" OR ""'; - - - SELECT rowid FROM t0 WHERE x MATCH '"" NOT ""'; - - - SELECT rowid FROM t0 WHERE x MATCH '""""'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3f.test b/libsql-wal/tests/assets/fixtures/fts3f.test deleted file mode 100644 index 8a12d92d44..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3f.test +++ /dev/null @@ -1,12 +0,0 @@ - - CREATE VIRTUAL TABLE ft USING fts3(x); - BEGIN; - INSERT INTO ft VALUES('a one'), ('b one'), ('c one'); - - - BEGIN; - INSERT INTO ft VALUES('a one'), ('b one'), ('c one'); - - - SELECT docid, optimize(ft) FROM ft WHERE ft MATCH 'one' - diff --git a/libsql-wal/tests/assets/fixtures/fts3fault.test b/libsql-wal/tests/assets/fixtures/fts3fault.test deleted file mode 100644 index 51b10120b0..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3fault.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3; - INSERT INTO t1 VALUES('test renaming the table'); - INSERT INTO t1 VALUES(' after it has been written'); - - - CREATE VIRTUAL TABLE t1 USING fts3(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/fts3fault2.test b/libsql-wal/tests/assets/fixtures/fts3fault2.test deleted file mode 100644 index 909da9ebdc..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3fault2.test +++ /dev/null @@ -1,22 +0,0 @@ - - CREATE VIRTUAL TABLE t7 USING fts4(x,prefix=2); - INSERT INTO t7 VALUES('the quick brown fox'); - INSERT INTO t7 VALUES('jumped over the'); - INSERT INTO t7 VALUES('lazy dog'); - - - CREATE VIRTUAL TABLE t8 USING fts3; - INSERT INTO t8 VALUES('the quick brown fox'); - INSERT INTO t8 VALUES('jumped over the'); - INSERT INTO t8 VALUES('lazy dog'); - INSERT INTO t8(t8) VALUES('automerge=8'); - SELECT name FROM sqlite_master WHERE name LIKE 't8%'; - - - PRAGMA page_size = 512; - CREATE VIRTUAL TABLE t9 USING fts3; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50 - ) - INSERT INTO t9 SELECT 'one two three' FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/fts3fault3.test b/libsql-wal/tests/assets/fixtures/fts3fault3.test deleted file mode 100644 index d89f683be6..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3fault3.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3(a); - INSERT INTO t1 VALUES('test renaming the table'); - INSERT INTO t1 VALUES(' after it has been written'); - INSERT INTO t1 VALUES(' actually other stuff instead'); - diff --git a/libsql-wal/tests/assets/fixtures/fts3first.test b/libsql-wal/tests/assets/fixtures/fts3first.test deleted file mode 100644 index 64a694beae..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3first.test +++ /dev/null @@ -1,41 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING FTS4(a, b, c); - INSERT INTO x1(docid,a,b,c) VALUES(0, 'K H D S T', 'V M N Y K', 'S Z N Q S'); - INSERT INTO x1(docid,a,b,c) VALUES(1, 'K N J L W', 'S Z W J Q', 'D U W S E'); - INSERT INTO x1(docid,a,b,c) VALUES(2, 'B P M O I', 'R P H W S', 'R J L L E'); - INSERT INTO x1(docid,a,b,c) VALUES(3, 'U R Q M L', 'M J K A V', 'Q W J T J'); - INSERT INTO x1(docid,a,b,c) VALUES(4, 'N J C Y N', 'R U D X V', 'B O U A Q'); - INSERT INTO x1(docid,a,b,c) VALUES(5, 'Q L X L U', 'I F N X S', 'U Q A N Y'); - INSERT INTO x1(docid,a,b,c) VALUES(6, 'M R G U T', 'U V I Q P', 'X Y D L S'); - INSERT INTO x1(docid,a,b,c) VALUES(7, 'D Y P O I', 'X J P K R', 'V O T H V'); - INSERT INTO x1(docid,a,b,c) VALUES(8, 'R Y D L R', 'U U E S J', 'N W L M R'); - INSERT INTO x1(docid,a,b,c) VALUES(9, 'Z P F N P', 'W A X D U', 'V A E Q A'); - INSERT INTO x1(docid,a,b,c) VALUES(10, 'Q I A Q M', 'N D K H C', 'A H T Q Z'); - INSERT INTO x1(docid,a,b,c) VALUES(11, 'T E R Q B', 'C I B C B', 'F Z U W R'); - INSERT INTO x1(docid,a,b,c) VALUES(12, 'E S V U W', 'T P F W H', 'A M D J Q'); - INSERT INTO x1(docid,a,b,c) VALUES(13, 'X S B X Y', 'U D N D P', 'X Z Y G F'); - INSERT INTO x1(docid,a,b,c) VALUES(14, 'K H A B L', 'S R C C Z', 'D W E H J'); - INSERT INTO x1(docid,a,b,c) VALUES(15, 'C E U C C', 'W F M N M', 'T Z U X T'); - INSERT INTO x1(docid,a,b,c) VALUES(16, 'Q G C G H', 'H N N B H', 'B Q I H Y'); - INSERT INTO x1(docid,a,b,c) VALUES(17, 'Q T S K B', 'W B D Y N', 'V J P E C'); - INSERT INTO x1(docid,a,b,c) VALUES(18, 'A J M O Q', 'L G Y Y A', 'G N M R N'); - INSERT INTO x1(docid,a,b,c) VALUES(19, 'T R Y P Y', 'N V Y B X', 'L Z T N T'); - - CREATE VIRTUAL TABLE x2 USING FTS4(a, b, c, order=DESC); - INSERT INTO x2(docid, a, b, c) SELECT docid, a, b, c FROM x1; - - - CREATE VIRTUAL TABLE x3 USING fts3; - INSERT INTO x3 VALUES('A B C'); - INSERT INTO x3 VALUES('B A C'); - - CREATE VIRTUAL TABLE x4 USING fts4; - INSERT INTO x4 VALUES('A B C'); - INSERT INTO x4 VALUES('B A C'); - - - SELECT * FROM x3 WHERE x3 MATCH '^A'; - - - SELECT * FROM x4 WHERE x4 MATCH '^A'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3fuzz001.test b/libsql-wal/tests/assets/fixtures/fts3fuzz001.test deleted file mode 100644 index 1c995f9f02..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3fuzz001.test +++ /dev/null @@ -1,18 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING fts3(x); - - INSERT INTO x1 VALUES('braes brag bragged bragger bragging'); - INSERT INTO x1 VALUES('brags braid braided braiding braids'); - INSERT INTO x1 VALUES('brain brainchild brained braining brains'); - INSERT INTO x1 VALUES('brainstem brainstems brainstorm brainstorms'); - INSERT INTO x1(x1) VALUES('nodesize=24'); - - - PRAGMA integrity_check; - - - INSERT INTO x1(x1) VALUES('merge=10,2') - - - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/fts3join.test b/libsql-wal/tests/assets/fixtures/fts3join.test deleted file mode 100644 index 0685a3c9f3..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3join.test +++ /dev/null @@ -1,51 +0,0 @@ - - CREATE VIRTUAL TABLE ft1 USING fts4(x); - INSERT INTO ft1 VALUES('aaa aaa'); - INSERT INTO ft1 VALUES('aaa bbb'); - INSERT INTO ft1 VALUES('bbb aaa'); - INSERT INTO ft1 VALUES('bbb bbb'); - - CREATE TABLE t1(id, y); - INSERT INTO t1 VALUES(1, 'aaa'); - INSERT INTO t1 VALUES(2, 'bbb'); - - - SELECT docid FROM ft1, t1 WHERE ft1 MATCH y AND id=1; - - - SELECT docid FROM ft1, t1 WHERE ft1 MATCH y AND id=1 ORDER BY docid; - - - CREATE VIRTUAL TABLE ft2 USING fts4(x); - CREATE VIRTUAL TABLE ft3 USING fts4(y); - - INSERT INTO ft2 VALUES('abc'); - INSERT INTO ft2 VALUES('def'); - INSERT INTO ft3 VALUES('ghi'); - INSERT INTO ft3 VALUES('abc'); - - SELECT * FROM ft2, ft3 WHERE x MATCH y; - SELECT * FROM ft2, ft3 WHERE y MATCH x; - SELECT * FROM ft3, ft2 WHERE x MATCH y; - SELECT * FROM ft3, ft2 WHERE y MATCH x; - - CREATE VIRTUAL TABLE vt USING fts3(x); - INSERT INTO vt VALUES('abc'); - INSERT INTO vt VALUES('xyz'); - - CREATE TABLE tt(a INTEGER PRIMARY KEY); - INSERT INTO tt VALUES(1), (2); - - - SELECT * FROM tt LEFT JOIN ( - SELECT rowid AS rrr, * FROM vt WHERE vt MATCH 'abc' - ) ON tt.a = rrr - - - SELECT * FROM tt LEFT JOIN vt ON (vt MATCH 'abc') - - - CREATE VIRTUAL TABLE ft4 USING fts3(x); - CREATE TABLE t4(y, z); - CREATE INDEX t4y ON t1(y); - diff --git a/libsql-wal/tests/assets/fixtures/fts3malloc.test b/libsql-wal/tests/assets/fixtures/fts3malloc.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3matchinfo.test b/libsql-wal/tests/assets/fixtures/fts3matchinfo.test deleted file mode 100644 index 97414d08ce..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3matchinfo.test +++ /dev/null @@ -1,140 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(matchinfo=fts3); - SELECT name FROM sqlite_master WHERE type = 'table'; - - - INSERT INTO t1(content) VALUES('I wandered lonely as a cloud'); - INSERT INTO t1(content) VALUES('That floats on high o''er vales and hills,'); - INSERT INTO t1(content) VALUES('When all at once I saw a crowd,'); - INSERT INTO t1(content) VALUES('A host, of golden daffodils,'); - SELECT mit(matchinfo(t1)) FROM t1 WHERE t1 MATCH 'I'; - - - CREATE VIRTUAL TABLE t2 USING fts4; - INSERT INTO t2 SELECT * FROM t1; - SELECT mit(matchinfo(t2)) FROM t2 WHERE t2 MATCH 'I'; - - - CREATE VIRTUAL TABLE t3 USING fts3(mtchinfo=fts3); - INSERT INTO t3(mtchinfo) VALUES('Beside the lake, beneath the trees'); - SELECT mtchinfo FROM t3; - - - CREATE VIRTUAL TABLE xx USING FTS4; - - - SELECT * FROM xx WHERE xx MATCH 'abc'; - - - SELECT * FROM xx WHERE xx MATCH 'a b c'; - - - CREATE VIRTUAL TABLE t4 USING fts4(x, y); - INSERT INTO t4 VALUES('a b c d e', 'f g h i j'); - INSERT INTO t4 VALUES('f g h i j', 'a b c d e'); - - - CREATE VIRTUAL TABLE t5 USING fts4; - INSERT INTO t5 VALUES('a a a a a'); - INSERT INTO t5 VALUES('a b a b a'); - INSERT INTO t5 VALUES('c b c b c'); - INSERT INTO t5 VALUES('x x x x x'); - - INSERT INTO t5(t5) VALUES('optimize') - - UPDATE t5_segments - SET block = zeroblob(length(block)) - WHERE length(block)>10000; - - - CREATE VIRTUAL TABLE t6 USING fts4(a, b, c); - INSERT INTO t6 VALUES('a', 'b', 'c'); - - - CREATE VIRTUAL TABLE t7 USING fts3(a, b); - INSERT INTO t7 VALUES('u v w', 'x y z'); - - CREATE VIRTUAL TABLE t8 USING fts4(a, b, matchinfo=fts3); - INSERT INTO t8 VALUES('u v w', 'x y z'); - - - CREATE VIRTUAL TABLE t9 USING fts4; - INSERT INTO t9 VALUES( - 'this record is used to try to dectect corruption' - ); - SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to'; - - - CREATE VIRTUAL TABLE t10 USING fts4; - INSERT INTO t10 VALUES('first record'); - INSERT INTO t10 VALUES('second record'); - - - SELECT typeof(matchinfo(t10)), length(matchinfo(t10)) FROM t10; - - - SELECT typeof(matchinfo(t10)), length(matchinfo(t10)) FROM t10 WHERE docid=1; - - - SELECT typeof(matchinfo(t10)), length(matchinfo(t10)) - FROM t10 WHERE t10 MATCH 'record' - - - CREATE VIRTUAL TABLE t11 USING fts4; - INSERT INTO t11(t11) VALUES('nodesize=24'); - INSERT INTO t11 VALUES('quitealongstringoftext'); - INSERT INTO t11 VALUES('anotherquitealongstringoftext'); - INSERT INTO t11 VALUES('athirdlongstringoftext'); - INSERT INTO t11 VALUES('andonemoreforgoodluck'); - - - SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' - - - CREATE VIRTUAL TABLE t12 USING fts4; - INSERT INTO t12 VALUES('a b c d'); - SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; - - - INSERT INTO t12 VALUES('a d c d'); - SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; - - - INSERT INTO t12 VALUES('a d d a'); - SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; - - - CREATE VIRTUAL TABLE ft2 USING fts4; - INSERT INTO ft2 VALUES('a b c d e'); - INSERT INTO ft2 VALUES('f a b c d'); - SELECT snippet(ft2, '[', ']', '', -1, 1) FROM ft2 WHERE ft2 MATCH 'c'; - - - DROP TABLE t10; - CREATE VIRTUAL TABLE t10 USING fts4(idx, value); - INSERT INTO t10 values (1, 'one'),(2, 'two'),(3, 'three'); - SELECT docId, t10.* - FROM t10 - JOIN (SELECT 1 AS idx UNION SELECT 2 UNION SELECT 3) AS x - WHERE t10 MATCH x.idx - AND matchinfo(t10) not null - GROUP BY docId - ORDER BY 1; - - - CREATE VIRTUAL TABLE tt USING fts3(x, y); - INSERT INTO tt VALUES('c d a c d d', 'e a g b d a'); -- 1 - INSERT INTO tt VALUES('c c g a e b', 'c g d g e c'); -- 2 - INSERT INTO tt VALUES('b e f d e g', 'b a c b c g'); -- 3 - INSERT INTO tt VALUES('a c f f g d', 'd b f d e g'); -- 4 - INSERT INTO tt VALUES('g a c f c f', 'd g g b c c'); -- 5 - INSERT INTO tt VALUES('g a c e b b', 'd b f b g g'); -- 6 - INSERT INTO tt VALUES('f d a a f c', 'e e a d c f'); -- 7 - INSERT INTO tt VALUES('a c b b g f', 'a b a e d f'); -- 8 - INSERT INTO tt VALUES('b a f e c c', 'f d b b a b'); -- 9 - INSERT INTO tt VALUES('f d c e a c', 'f a f a a f'); -- 10 - - - INSERT INTO tt (rowid, c4, c45) VALUES(1, 'abc', 'abc'); - SELECT mit(matchinfo(tt, 'b')) FROM tt WHERE tt MATCH 'abc'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3matchinfo2.test b/libsql-wal/tests/assets/fixtures/fts3matchinfo2.test deleted file mode 100644 index 7f0a932806..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3matchinfo2.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t_content(col0 INTEGER); - CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); - INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb'); - SELECT hex(matchinfo(t0,'yxy')) FROM t0 WHERE t0 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3misc.test b/libsql-wal/tests/assets/fixtures/fts3misc.test deleted file mode 100644 index efbafcbfd2..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3misc.test +++ /dev/null @@ -1,179 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3(a, b); - INSERT INTO t1 VALUES('one', 'i'); - INSERT INTO t1 VALUES('one', 'ii'); - INSERT INTO t1 VALUES('two', 'i'); - INSERT INTO t1 VALUES('two', 'ii'); - - - SELECT a.a, b.b FROM t1 a, t1 b WHERE a.t1 MATCH 'two' AND b.t1 MATCH 'i' - - - SELECT rowid FROM t2 WHERE t2 MATCH '"a b c"' - - - SELECT rowid FROM t2 WHERE t2 MATCH '"g h i"' - - - SELECT rowid FROM t2 WHERE t2 MATCH '"i h"' - - - SELECT rowid FROM t2 WHERE t2 MATCH '"f e"' - - - SELECT rowid FROM t2 WHERE t2 MATCH '"e f"' - - - SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN NULL AND 45; - - - SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN 11.5 AND 48.2; - - - SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN '11.5' AND '48.2'; - - - CREATE VIRTUAL TABLE t3 USING fts3; - INSERT INTO t3 VALUES('a b c'); - INSERT INTO t3 VALUES('d e f'); - INSERT INTO t3 VALUES('a b d'); - INSERT INTO t3 VALUES('1 2 3 4 5 6 7 8 9 10 11'); - - - SELECT * FROM t3 WHERE t3 MATCH '"a b x y"' ORDER BY docid DESC - - - SELECT * FROM t3 WHERE t3 MATCH '"a b c" OR "a b x y"' ORDER BY docid DESC - - - SELECT * FROM t3 WHERE t3 MATCH '"a* b* x* a*"' - - - SELECT rowid FROM t3 WHERE t3 MATCH '"2 3 4 5 6 7 8 9"' - - - PRAGMA page_size = 512; - CREATE VIRTUAL TABLE t4 USING fts4; - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<8000 ) - INSERT INTO t4 SELECT 'a b c a b c a b c' FROM s; - - - SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"' - - - SELECT quote(value) from t4_stat where id=0 - - - UPDATE t4_stat SET value = X'C03EC0B204C0A60800' WHERE id=0; - - - UPDATE t4_stat SET value = X'00C03EC0B204C0A608' WHERE id=0; - - - CREATE VIRTUAL TABLE t5 USING fts4; - INSERT INTO t5 VALUES('a x x x x b x x x x c'); - INSERT INTO t5 VALUES('a x x x x b x x x x c'); - INSERT INTO t5 VALUES('a x x x x b x x x x c'); - - - SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/4 c' - - - SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/3 b NEAR/4 c' - - - SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/3 c' - - - SELECT rowid FROM t5 WHERE t5 MATCH 'y NEAR/4 b NEAR/4 c' - - - SELECT rowid FROM t5 WHERE t5 MATCH 'x OR a NEAR/3 b NEAR/3 c' - - - SELECT rowid FROM t5 WHERE t5 MATCH 'x OR y NEAR/3 b NEAR/3 c' - - - CREATE VIRTUAL TABLE t6 USING fts4; - - BEGIN; - WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000) - INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s; - - INSERT INTO t6 VALUES('x x x x x x x x x x x A'); - INSERT INTO t6 VALUES('x x x x x x x x x x x B'); - INSERT INTO t6 VALUES('x x x x x x x x x x x A'); - INSERT INTO t6 VALUES('x x x x x x x x x x x B'); - - WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000) - INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s; - COMMIT; - - - SELECT rowid FROM t6 WHERE t6 MATCH 'b OR "x a"' - - - CREATE VIRTUAL TABLE vt0 USING fts3(c0); - INSERT INTO vt0 VALUES (x'00'); - - - INSERT INTO vt0(vt0) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=DESC); - INSERT INTO vt0(c0) VALUES (0), (0); - - - INSERT INTO vt0(vt0) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=ASC); - INSERT INTO vt0(c0) VALUES (0), (0); - - - INSERT INTO vt0(vt0) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE ft USING fts4(c0, c1, order=DESC, prefix=1); - INSERT INTO ft VALUES('a b c d', 'hello world'); - INSERT INTO ft VALUES('negative', 'positive'); - INSERT INTO ft VALUES('hello world', 'a b c d'); - - - INSERT INTO vt0(vt0) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE vt0 USING fts4(c0, prefix=1); - - - BEGIN; - INSERT INTO vt0 VALUES (0); - INSERT INTO vt0(vt0) VALUES('optimize'); - COMMIT; - - - INSERT INTO vt0(vt0) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE t1 using fts4(mailcontent); - insert into t1(rowid, mailcontent) values - (-4764623217061966105, 'we are going to upgrade'), - (8324454597464624651, 'we are going to upgrade'); - - - INSERT INTO t1(t1) VALUES('integrity-check'); - - - SELECT rowid FROM t1 WHERE t1 MATCH 'upgrade'; - - - CREATE VIRTUAL TABLE f USING fts3(a,b); - CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB); - INSERT INTO f_stat VALUES (1,x'3b3b3b3b3b3b3b28ffffffffffffffffff1807f9073481f1d43bc93b3b3b3b3b3b3b3b3b3b18073b3b3b3b3b3b3b9b003b'); - - - CREATE VIRTUAL TABLE xyz USING fts3(); - - - SELECT * FROM xyz WHERE xyz MATCH 'a NEAR/4294836224 a'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3near.test b/libsql-wal/tests/assets/fixtures/fts3near.test deleted file mode 100644 index 6c0ab1815d..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3near.test +++ /dev/null @@ -1,10 +0,0 @@ - - CREATE VIRTUAL TABLE x USING fts4(y,z); - INSERT INTO x VALUES('aaa bbb ccc ddd', 'bbb ddd aaa ccc'); - SELECT * FROM x where y MATCH 'bbb NEAR/6 aaa'; - - - CREATE VIRTUAL TABLE t2 USING fts4(a, b); - INSERT INTO t2 VALUES('A B C', 'A D E'); - SELECT * FROM t2 where t2 MATCH 'a:A NEAR E' - diff --git a/libsql-wal/tests/assets/fixtures/fts3offsets.test b/libsql-wal/tests/assets/fixtures/fts3offsets.test deleted file mode 100644 index 7d9bcd1b05..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3offsets.test +++ /dev/null @@ -1,53 +0,0 @@ - - CREATE VIRTUAL TABLE xx USING fts3(x); - INSERT INTO xx VALUES('A x x x B C x x'); - INSERT INTO xx VALUES('A B C x B x x C'); - INSERT INTO xx VALUES('A x x B C x x x'); - - - SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)'; - - - DELETE FROM xx; - INSERT INTO xx VALUES('A x x x B C x x'); - INSERT INTO xx VALUES('A x x C x x x C'); - INSERT INTO xx VALUES('A x x B C x x x'); - - - SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)'; - - - DELETE FROM xx; - INSERT INTO xx(rowid, x) VALUES(1, 'A B C'); - INSERT INTO xx(rowid, x) VALUES(2, 'A x'); - INSERT INTO xx(rowid, x) VALUES(3, 'A B C'); - INSERT INTO xx(rowid, x) VALUES(4, 'A B C x x x x x x x B'); - INSERT INTO xx(rowid, x) VALUES(5, 'A x x x x x x x x x C'); - INSERT INTO xx(rowid, x) VALUES(6, 'A x x x x x x x x x x x B'); - INSERT INTO xx(rowid, x) VALUES(7, 'A B C'); - - - SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)'; - - - DELETE FROM xx; - INSERT INTO xx(rowid, x) VALUES(7, 'A B C'); - INSERT INTO xx(rowid, x) VALUES(6, 'A x'); - INSERT INTO xx(rowid, x) VALUES(5, 'A B C'); - INSERT INTO xx(rowid, x) VALUES(4, 'A B C x x x x x x x B'); - INSERT INTO xx(rowid, x) VALUES(3, 'A x x x x x x x x x C'); - INSERT INTO xx(rowid, x) VALUES(2, 'A x x x x x x x x x x x B'); - INSERT INTO xx(rowid, x) VALUES(1, 'A B C'); - - - SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)' - ORDER BY docid DESC; - - - CREATE VIRTUAL TABLE x1 USING fts3(x); - INSERT INTO x1 VALUES('A A A'); - INSERT INTO x1 VALUES('A A A'); - - - SELECT offsets(x1) FROM x1 WHERE x1 MATCH 'a OR b AND c NEAR d' - diff --git a/libsql-wal/tests/assets/fixtures/fts3prefix.test b/libsql-wal/tests/assets/fixtures/fts3prefix.test deleted file mode 100644 index 0bc3ac25bc..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3prefix.test +++ /dev/null @@ -1,144 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(prefix='1,3,6'); - - CREATE VIRTUAL TABLE p1 USING fts4term(t1, 1); - CREATE VIRTUAL TABLE p2 USING fts4term(t1, 2); - CREATE VIRTUAL TABLE p3 USING fts4term(t1, 3); - CREATE VIRTUAL TABLE terms USING fts4term(t1); - - - INSERT INTO t1 VALUES('sqlite mysql firebird'); - - SELECT term FROM p1 - SELECT term FROM p2 - SELECT term FROM p3 - - SELECT term FROM terms; - - - INSERT INTO t1 VALUES('FTS3 and FTS4 are an SQLite virtual table modules'); - INSERT INTO t1 VALUES('that allows users to perform full-text searches on'); - INSERT INTO t1 VALUES('a set of documents. The most common (and'); - INSERT INTO t1 VALUES('effective) way to describe full-text searches is'); - INSERT INTO t1 VALUES('"what Google, Yahoo and Altavista do with'); - INSERT INTO t1 VALUES('documents placed on the World Wide Web". Users'); - INSERT INTO t1 VALUES('input a term, or series of terms, perhaps'); - INSERT INTO t1 VALUES('connected by a binary operator or grouped together'); - INSERT INTO t1 VALUES('into a phrase, and the full-text query system'); - INSERT INTO t1 VALUES('finds the set of documents that best matches those'); - INSERT INTO t1 VALUES('terms considering the operators and groupings the'); - INSERT INTO t1 VALUES('user has specified. This article describes the'); - INSERT INTO t1 VALUES('deployment and usage of FTS3 and FTS4.'); - INSERT INTO t1 VALUES('FTS1 and FTS2 are obsolete full-text search'); - INSERT INTO t1 VALUES('modules for SQLite. There are known issues with'); - INSERT INTO t1 VALUES('these older modules and their use should be'); - INSERT INTO t1 VALUES('avoided. Portions of the original FTS3 code were'); - INSERT INTO t1 VALUES('contributed to the SQLite project by Scott Hess of'); - INSERT INTO t1 VALUES('Google. It is now developed and maintained as part'); - INSERT INTO t1 VALUES('of SQLite. '); - - DELETE FROM t1 WHERE docid%2; - INSERT INTO t1(t1) VALUES('optimize') - - CREATE VIRTUAL TABLE t2 USING fts4(prefix='1,2,3'); - INSERT INTO t2 VALUES('On 12 September the wind direction turned and'); - INSERT INTO t2 VALUES('William''s fleet sailed. A storm blew up and the'); - INSERT INTO t2 VALUES('fleet was forced to take shelter at'); - INSERT INTO t2 VALUES('Saint-Valery-sur-Somme and again wait for the wind'); - INSERT INTO t2 VALUES('to change. On 27 September the Norman fleet'); - INSERT INTO t2 VALUES('finally set sail, landing in England at Pevensey'); - INSERT INTO t2 VALUES('Bay (Sussex) on 28 September. William then moved'); - INSERT INTO t2 VALUES('to Hastings, a few miles to the east, where he'); - INSERT INTO t2 VALUES('built a prefabricated wooden castle for a base of'); - INSERT INTO t2 VALUES('operations. From there, he ravaged the hinterland'); - INSERT INTO t2 VALUES('and waited for Harold''s return from the north.'); - INSERT INTO t2 VALUES('On 12 September the wind direction turned and'); - INSERT INTO t2 VALUES('William''s fleet sailed. A storm blew up and the'); - INSERT INTO t2 VALUES('fleet was forced to take shelter at'); - INSERT INTO t2 VALUES('Saint-Valery-sur-Somme and again wait for the wind'); - INSERT INTO t2 VALUES('to change. On 27 September the Norman fleet'); - INSERT INTO t2 VALUES('finally set sail, landing in England at Pevensey'); - INSERT INTO t2 VALUES('Bay (Sussex) on 28 September. William then moved'); - INSERT INTO t2 VALUES('to Hastings, a few miles to the east, where he'); - INSERT INTO t2 VALUES('built a prefabricated wooden castle for a base of'); - INSERT INTO t2 VALUES('operations. From there, he ravaged the hinterland'); - INSERT INTO t2 VALUES('and waited for Harold''s return from the north.'); - - SELECT optimize(t2) FROM t2 LIMIT 1 - - CREATE VIRTUAL TABLE t3 USING fts4(prefix="1,4"); - INSERT INTO t3 VALUES('one two three'); - INSERT INTO t3 VALUES('four five six'); - INSERT INTO t3 VALUES('seven eight nine'); - - - SELECT * FROM t3 WHERE t3 MATCH 'f*' - - - SELECT * FROM t3 WHERE t3 MATCH 'four*' - - - SELECT * FROM t3 WHERE t3 MATCH 's*' - - - SELECT * FROM t3 WHERE t3 MATCH 'sev*' - - - SELECT * FROM t3 WHERE t3 MATCH 'one*' - - - CREATE VIRTUAL TABLE t1 USING fts4(prefix=0); - CREATE VIRTUAL TABLE t2 USING fts4; - INSERT INTO t1 VALUES('Twas Mulga Bill, from Eaglehawk, '); - INSERT INTO t2 VALUES('Twas Mulga Bill, from Eaglehawk, '); - - - SELECT md5sum(quote(root)) FROM t1_segdir; - - - CREATE VIRTUAL TABLE t1 USING fts4(prefix="1,0,2"); - CREATE VIRTUAL TABLE t2 USING fts4(prefix="1,2"); - INSERT INTO t1 VALUES('that caught the cycling craze;'); - INSERT INTO t2 VALUES('that caught the cycling craze;'); - - - SELECT md5sum(quote(root)) FROM t1_segdir; - - - CREATE VIRTUAL TABLE t1 USING fts4(prefix="1,3,2"); - CREATE VIRTUAL TABLE t2 USING fts4(prefix="1,2"); - INSERT INTO t1 VALUES('He turned away the good old horse'); - INSERT INTO t2 VALUES('He turned away the good old horse'); - - - CREATE VIRTUAL TABLE t1 USING fts4(prefix="1,600,2"); - CREATE VIRTUAL TABLE t2 USING fts4(prefix="1,2"); - INSERT INTO t1 VALUES('that served him many days;'); - INSERT INTO t2 VALUES('that served him many days;'); - - - SELECT md5sum(quote(root)) FROM t1_segdir; - - - CREATE VIRTUAL TABLE t1 USING fts4(prefix="2147483647,2147483648,2147483649"); - CREATE VIRTUAL TABLE t2 USING fts4(prefix=); - INSERT INTO t1 VALUES('He dressed himself in cycling clothes'); - INSERT INTO t2 VALUES('He dressed himself in cycling clothes'); - - - SELECT md5sum(quote(root)) FROM t1_segdir; - - - CREATE VIRTUAL TABLE t6 USING fts4(x,order=DESC); - INSERT INTO t6(docid, x) VALUES(-1,'a b'); - INSERT INTO t6(docid, x) VALUES(1, 'b'); - - - SELECT docid FROM t6 WHERE t6 MATCH '"a* b"'; - - - SELECT docid FROM t6 WHERE t6 MATCH 'a*'; - - - SELECT docid FROM t6 WHERE t6 MATCH 'a* b'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3prefix2.test b/libsql-wal/tests/assets/fixtures/fts3prefix2.test deleted file mode 100644 index 847c52a08a..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3prefix2.test +++ /dev/null @@ -1,28 +0,0 @@ - PRAGMA page_size = 512 - - CREATE VIRTUAL TABLE t1 USING fts4(x, prefix="2,3"); - - BEGIN; - INSERT INTO t1 VALUES('T TX T TX T TX T TX T TX'); - INSERT INTO t1 SELECT * FROM t1; -- 2 - INSERT INTO t1 SELECT * FROM t1; -- 4 - INSERT INTO t1 SELECT * FROM t1; -- 8 - INSERT INTO t1 SELECT * FROM t1; -- 16 - INSERT INTO t1 SELECT * FROM t1; -- 32 - INSERT INTO t1 SELECT * FROM t1; -- 64 - INSERT INTO t1 SELECT * FROM t1; -- 128 - INSERT INTO t1 SELECT * FROM t1; -- 256 - INSERT INTO t1 SELECT * FROM t1; -- 512 - INSERT INTO t1 SELECT * FROM t1; -- 1024 - INSERT INTO t1 SELECT * FROM t1; -- 2048 - COMMIT; - - - INSERT INTO t1 SELECT * FROM t1 LIMIT 10; - INSERT INTO t1 SELECT * FROM t1 LIMIT 10; - INSERT INTO t1 SELECT * FROM t1 LIMIT 10; - DELETE FROM t1 WHERE docid > 5; - - - SELECT * FROM t1 WHERE t1 MATCH 'T*'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3query.test b/libsql-wal/tests/assets/fixtures/fts3query.test deleted file mode 100644 index 30455326db..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3query.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE VIRTUAL TABLE t2 USING FTS4; - INSERT INTO t2 VALUES('it was the first time in history'); - - UPDATE t2_content SET c0content = X'1234' - DROP TABLE t2 - - CREATE VIRTUAL TABLE t3 USING FTS4(a, b); - INSERT INTO t3 VALUES('no gestures', 'another intriguing discovery by observing the hand gestures (called beats) people make while speaking. Research has shown that such gestures do more than add visual emphasis to our words (many people gesture while they''re on the telephone, for example); it seems they actually help our brains find words'); - - - CREATE VIRTUAL TABLE ft4 USING fts4(x); - CREATE TABLE t4(x); - diff --git a/libsql-wal/tests/assets/fixtures/fts3rank.test b/libsql-wal/tests/assets/fixtures/fts3rank.test deleted file mode 100644 index 3fc25931db..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3rank.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3(a, b); - INSERT INTO t1 VALUES('one two', 'one'); - INSERT INTO t1 VALUES('one two', 'three'); - INSERT INTO t1 VALUES('one two', 'two'); - - - SELECT * FROM t1 WHERE t1 MATCH 'one' - ORDER BY rank(matchinfo(t1), 1.0, 1.0) DESC, rowid - - - SELECT * FROM t1 WHERE t1 MATCH 'two' - ORDER BY rank(matchinfo(t1), 1.0, 1.0) DESC, rowid - diff --git a/libsql-wal/tests/assets/fixtures/fts3rnd.test b/libsql-wal/tests/assets/fixtures/fts3rnd.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3shared.test b/libsql-wal/tests/assets/fixtures/fts3shared.test deleted file mode 100644 index dea1693762..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3shared.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3(x); - BEGIN; - INSERT INTO t1 VALUES('We listened and looked sideways up!'); - INSERT INTO t1 VALUES('Fear at my heart, as at a cup,'); - INSERT INTO t1 VALUES('My life-blood seemed to sip!'); - INSERT INTO t1 VALUES('The stars were dim, and thick the night'); - COMMIT; - - - BEGIN; - INSERT INTO t1 VALUES('The steersman''s face by his lamp gleamed white;'); - - COMMIT diff --git a/libsql-wal/tests/assets/fixtures/fts3snippet.test b/libsql-wal/tests/assets/fixtures/fts3snippet.test deleted file mode 100644 index 8c6f5c2ece..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3snippet.test +++ /dev/null @@ -1,65 +0,0 @@ - - CREATE VIRTUAL TABLE t2 USING fts4; - INSERT INTO t2 VALUES('one two three four five'); - INSERT INTO t2 VALUES('two three four five one'); - INSERT INTO t2 VALUES('three four five one two'); - INSERT INTO t2 VALUES('four five one two three'); - INSERT INTO t2 VALUES('five one two three four'); - - - SELECT snippet(t2, '[', ']') FROM t2 WHERE t2 MATCH 'one OR (four AND six)' - - - SELECT snippet(t2, '[', ']') FROM t2 - WHERE t2 MATCH 'one OR (four AND six)' - ORDER BY docid DESC - - - INSERT INTO t2 VALUES('six'); - - - SELECT snippet(t2, '[', ']') FROM t2 WHERE t2 MATCH 'one OR (four AND six)' - - - SELECT snippet(t2, '[', ']') FROM t2 - WHERE t2 MATCH 'one OR (four AND six)' - ORDER BY docid DESC - - - CREATE VIRTUAL TABLE t3 USING fts4; - INSERT INTO t3 VALUES('[one two three]'); - - - SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'one'; - - - SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'two'; - - - SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'three'; - - - SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'one OR two OR three'; - - - CREATE VIRTUAL TABLE t4 USING fts4; - INSERT INTO t4 VALUES('a b c d'); - SELECT snippet(t4, '[', ']', '...', 0, 0) FROM t4 WHERE t4 MATCH 'b'; - - - CREATE VIRTUAL TABLE t5 USING fts3(x); - INSERT INTO t5 VALUES('a1 a2 a3'); - INSERT INTO t5 VALUES('a4 a5 a6'); - INSERT INTO t5 VALUES('a70 a71 a72'); - - - SELECT snippet(t5, '[', ']') FROM t5 WHERE t5 MATCH - 'a1 OR a2 OR a3 OR a4 OR a5 OR a6 OR a7 OR a8 OR a9 OR a10 OR ' || - 'a11 OR a12 OR a13 OR a14 OR a15 OR a16 OR a17 OR a18 OR a19 OR a10 OR ' || - 'a21 OR a22 OR a23 OR a24 OR a25 OR a26 OR a27 OR a28 OR a29 OR a20 OR ' || - 'a31 OR a32 OR a33 OR a34 OR a35 OR a36 OR a37 OR a38 OR a39 OR a30 OR ' || - 'a41 OR a42 OR a43 OR a44 OR a45 OR a46 OR a47 OR a48 OR a49 OR a40 OR ' || - 'a51 OR a52 OR a53 OR a54 OR a55 OR a56 OR a57 OR a58 OR a59 OR a50 OR ' || - 'a61 OR a62 OR a63 OR a64 OR a65 OR a66 OR a67 OR a68 OR a69 OR a60 OR ' || - 'a71 OR a72 OR a73 OR a74 OR a75 OR a76 OR a77 OR a78 OR a79 OR a70' - diff --git a/libsql-wal/tests/assets/fixtures/fts3snippet2.test b/libsql-wal/tests/assets/fixtures/fts3snippet2.test deleted file mode 100644 index 073cd3da57..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3snippet2.test +++ /dev/null @@ -1,22 +0,0 @@ - - CREATE VIRTUAL TABLE f USING fts3(b); - INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218'); - - - SELECT length(snippet(f))>0 FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42'; - - - CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); - INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb'); - SELECT snippet(t0) FROM t0 WHERE t0 MATCH x'0a4d4d4d4d320a4f52d70a310a310a4e4541520a0a31f6ce0a4f520a0a310a310a310a4f520a75fc2a242424' ; - - - CREATE VIRTUAL TABLE t0 USING fts3( - col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY - ); - INSERT INTO t0 VALUES ('one', '1234','aaaa','bbbb'); - - - SELECT snippet(t0) FROM t0 WHERE t0 MATCH - '(def AND (one NEAR abc)) OR one' - diff --git a/libsql-wal/tests/assets/fixtures/fts3sort.test b/libsql-wal/tests/assets/fixtures/fts3sort.test deleted file mode 100644 index ff20f9e840..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3sort.test +++ /dev/null @@ -1,27 +0,0 @@ - - BEGIN; - CREATE VIRTUAL TABLE t2 USING fts4(order=desc); - INSERT INTO t2 VALUES('aa bb'); - INSERT INTO t2 VALUES('bb cc'); - INSERT INTO t2 VALUES('cc aa'); - SELECT docid FROM t2 WHERE t2 MATCH 'aa'; - END; - - - SELECT docid FROM t2 WHERE t2 MATCH 'aa'; - - - SELECT docid FROM t2 WHERE t2 MATCH 'aa' ORDER BY content; - - - CREATE VIRTUAL TABLE t3 USING fts4(x, order=DESC); - INSERT INTO t3(docid, x) VALUES(113382409004785664, 'aa'); - INSERT INTO t3(docid, x) VALUES(1, 'ab'); - SELECT rowid FROM t3 WHERE x MATCH 'a*' ORDER BY docid DESC; - - - CREATE VIRTUAL TABLE t4 USING fts4(x); - INSERT INTO t4(docid, x) VALUES(-113382409004785664, 'aa'); - INSERT INTO t4(docid, x) VALUES(1, 'ab'); - SELECT rowid FROM t4 WHERE x MATCH 'a*'; - diff --git a/libsql-wal/tests/assets/fixtures/fts3tok1.test b/libsql-wal/tests/assets/fixtures/fts3tok1.test deleted file mode 100644 index bf10edfd40..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts3tok1.test +++ /dev/null @@ -1,40 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts3tokenize(simple); - CREATE VIRTUAL TABLE t2 USING fts3tokenize(); - CREATE VIRTUAL TABLE t3 USING fts3tokenize(simple, '', 'xyz '); - - - SELECT token FROM t3 WHERE input = '1x2x3x' - - - SELECT token FROM t1 WHERE input = '1x2x3x' - - - SELECT token FROM t3 WHERE input = '1''2x3x' - - - SELECT token FROM t3 WHERE input = '' - - - SELECT token FROM t3 WHERE input = NULL - - - SELECT * FROM t3 WHERE input = 123 - - - SELECT * FROM t1 WHERE input = 'a b c' AND token = 'b'; - - - SELECT * FROM t1 WHERE token = 'b' AND input = 'a b c'; - - - SELECT * FROM t1 WHERE input < 'b' AND input = 'a b c'; - - - CREATE TABLE c1(x); - INSERT INTO c1(x) VALUES('a b c'); - INSERT INTO c1(x) VALUES('d e f'); - - - SELECT * FROM c1, t1 WHERE input = x AND c1.rowid=t1.rowid; - diff --git a/libsql-wal/tests/assets/fixtures/fts3tok_err.test b/libsql-wal/tests/assets/fixtures/fts3tok_err.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts3varint.test b/libsql-wal/tests/assets/fixtures/fts3varint.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts4aa.test b/libsql-wal/tests/assets/fixtures/fts4aa.test deleted file mode 100644 index 037cb01640..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4aa.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(a, b, c, d, e,f,g,h,i,j,k,l,m,n,o,p,q,r); - INSERT INTO t1 VALUES('X Y', '2', '3', '4', '5', '6', '7', '8', '9', '0', - 'a','b','c','d','e','f','g','h'); - UPDATE t1_docsize SET size=x'88' WHERE docid=1; - - - DROP TABLE t1; - CREATE VIRTUAL TABLE t1 USING fts4(a,b,c,d); - INSERT INTO t1 VALUES('one two','three four','five six','seven eight'); - diff --git a/libsql-wal/tests/assets/fixtures/fts4check.test b/libsql-wal/tests/assets/fixtures/fts4check.test deleted file mode 100644 index 47475e5e22..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4check.test +++ /dev/null @@ -1,26 +0,0 @@ - - CREATE VIRTUAL TABLE t4 USING fts4(a, b, c, notindexed=b); - INSERT INTO t4 VALUES('text one', 'text two', 'text three'); - INSERT INTO t4(t4) VALUES('integrity-check'); - - - PRAGMA writable_schema = 1; - UPDATE sqlite_master - SET sql = 'CREATE VIRTUAL TABLE t4 USING fts4(a, b, c)' - WHERE name = 't4'; - - - BEGIN; - CREATE VIRTUAL TABLE t5 USING fts4(a, prefix="1,2,3"); - INSERT INTO t5 VALUES('And down by Kosiosko, where the reed-banks sweep'); - INSERT INTO t5 VALUES('and sway, and the rolling plains are wide, the'); - INSERT INTO t5 VALUES('man from snowy river is a household name today,'); - INSERT INTO t5 VALUES('and the stockmen tell the story of his ride'); - - - INSERT INTO t5(t5) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE t5 USING fts4(a, prefix="1,2,3"); - INSERT INTO t5(t5) VALUES('integrity-check'); - diff --git a/libsql-wal/tests/assets/fixtures/fts4content.test b/libsql-wal/tests/assets/fixtures/fts4content.test deleted file mode 100644 index 1d22418cc7..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4content.test +++ /dev/null @@ -1,313 +0,0 @@ - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('w x', 'x y', 'y z'); - CREATE VIRTUAL TABLE ft1 USING fts4(content=t1); - - - PRAGMA table_info(ft1); - - SELECT *, rowid FROM ft1 - SELECT a, c FROM ft1 WHERE rowid=1 - INSERT INTO ft1(ft1) VALUES('rebuild') - SELECT rowid FROM ft1 WHERE ft1 MATCH 'x' - SELECT rowid FROM ft1 WHERE ft1 MATCH 'a' - - DROP TABLE ft1; - CREATE VIRTUAL TABLE ft1 USING fts4(content=t1, b); - PRAGMA table_info(ft1); - - - SELECT *, rowid FROM ft1 - - - CREATE TABLE t2(x); - INSERT INTO t2 VALUES('O S W W F U C R Q I C N P Z Y Y E Y Y E'); -- 1 - INSERT INTO t2 VALUES('Y X U V L B E H Y J C Y A I A P V F V K'); -- 2 - INSERT INTO t2 VALUES('P W I N J H I I N I F B K D U Q B Z S F'); -- 3 - INSERT INTO t2 VALUES('N R O R H J R H G M D I U U B O M P A U'); -- 4 - INSERT INTO t2 VALUES('Y O V O G T P N G T N F I V B U M J M G'); -- 5 - INSERT INTO t2 VALUES('J O B N K N E C H Z R K J O U G M K L S'); -- 6 - INSERT INTO t2 VALUES('S Z S R I Q U A P W R X H K C Z U L S P'); -- 7 - INSERT INTO t2 VALUES('J C H N R C K R V N M O F Z M Z A I H W'); -- 8 - INSERT INTO t2 VALUES('O Y G I S J U U W O D Z F J K N R P R L'); -- 9 - INSERT INTO t2 VALUES('B G L K U R U P V X Z I H V R W C Q A S'); -- 10 - INSERT INTO t2 VALUES('T F T J F F Y V F W N X K Q A Y L X W G'); -- 11 - INSERT INTO t2 VALUES('C J U H B Q X L C M M Y E G V F W V Z C'); -- 12 - INSERT INTO t2 VALUES('B W L T F S G X D P H N G M R I O A X I'); -- 13 - INSERT INTO t2 VALUES('N G Y O K Q K Z N M H U J E D H U W R K'); -- 14 - INSERT INTO t2 VALUES('U D T R U Y F J D S J X E H Q G V A S Z'); -- 15 - INSERT INTO t2 VALUES('M I W P J S H R J D Q I C G P C T P H R'); -- 16 - INSERT INTO t2 VALUES('J M N I S L X Q C A B F C B Y D H V R J'); -- 17 - INSERT INTO t2 VALUES('F V Z W J Q L P X Y E W B U Q N H X K T'); -- 18 - INSERT INTO t2 VALUES('R F S R Y O F Q E I E G H C B H R X Y N'); -- 19 - INSERT INTO t2 VALUES('U Q Q Q T E P D M F X P J G H X C Q D L'); -- 20 - - - CREATE VIRTUAL TABLE ft2 USING fts4(content=t2); - INSERT INTO ft2(ft2) VALUES('rebuild'); - - -- Modify the backing table a bit: Row 17 is missing and the contents - -- of row 20 do not match the FTS index contents. - DELETE FROM t2 WHERE rowid = 17; - UPDATE t2 SET x = 'a b c d e f g h i j' WHERE rowid = 20; - - - CREATE TABLE t3(x, y); - CREATE VIRTUAL TABLE ft3 USING fts4(content=t3); - - - INSERT INTO ft3(docid, x, y) VALUES(21, 'a b c', 'd e f'); - SELECT rowid FROM ft3 WHERE ft3 MATCH '"a b c"'; - - SELECT * FROM t3 - - DELETE FROM ft3; - SELECT rowid FROM ft3 WHERE ft3 MATCH '"a b c"'; - - - INSERT INTO t3(rowid, x, y) VALUES(21, 'a b c', 'd e f'); - DELETE FROM ft3; - SELECT rowid FROM ft3 WHERE ft3 MATCH '"a b c"'; - - SELECT rowid FROM t3 - - INSERT INTO ft3(rowid, x, y) VALUES(0, 'R T M S M', 'A F O K H'); - INSERT INTO ft3(rowid, x, y) VALUES(1, 'C Z J O X', 'U S Q D K'); - INSERT INTO ft3(rowid, x, y) VALUES(2, 'N G H P O', 'N O P O C'); - INSERT INTO ft3(rowid, x, y) VALUES(3, 'V H S D R', 'K N G E C'); - INSERT INTO ft3(rowid, x, y) VALUES(4, 'J T R V U', 'U X S L C'); - INSERT INTO ft3(rowid, x, y) VALUES(5, 'N A Y N G', 'X D G P Y'); - INSERT INTO ft3(rowid, x, y) VALUES(6, 'I Q I S P', 'D R O Q B'); - INSERT INTO ft3(rowid, x, y) VALUES(7, 'T K T Z J', 'B W D G O'); - INSERT INTO ft3(rowid, x, y) VALUES(8, 'Y K F X T', 'D F G V G'); - INSERT INTO ft3(rowid, x, y) VALUES(9, 'E L E T L', 'P W N F Z'); - INSERT INTO ft3(rowid, x, y) VALUES(10, 'O G J G X', 'G J F E P'); - INSERT INTO ft3(rowid, x, y) VALUES(11, 'O L N N Z', 'K E Z F D'); - INSERT INTO ft3(rowid, x, y) VALUES(12, 'R Z M R J', 'X G I M Z'); - INSERT INTO ft3(rowid, x, y) VALUES(13, 'L X N N X', 'R R N S T'); - INSERT INTO ft3(rowid, x, y) VALUES(14, 'F L B J H', 'K W F L C'); - INSERT INTO ft3(rowid, x, y) VALUES(15, 'P E B M V', 'E A A B U'); - INSERT INTO ft3(rowid, x, y) VALUES(16, 'V E C F P', 'L U T V K'); - INSERT INTO ft3(rowid, x, y) VALUES(17, 'T N O Z N', 'T P Q X N'); - INSERT INTO ft3(rowid, x, y) VALUES(18, 'V W U W R', 'H O A A V'); - INSERT INTO ft3(rowid, x, y) VALUES(19, 'A H N L F', 'I G H B O'); - - - INSERT INTO t3(rowid, x, y) VALUES(0, 'R T M S M', 'A F O K H'); - INSERT INTO t3(rowid, x, y) VALUES(1, 'C Z J O X', 'U S Q D K'); - INSERT INTO t3(rowid, x, y) VALUES(2, 'N G H P O', 'N O P O C'); - INSERT INTO t3(rowid, x, y) VALUES(3, 'V H S D R', 'K N G E C'); - INSERT INTO t3(rowid, x, y) VALUES(4, 'J T R V U', 'U X S L C'); - INSERT INTO t3(rowid, x, y) VALUES(5, 'N A Y N G', 'X D G P Y'); - UPDATE ft3 SET x = y, y = x; - DELETE FROM t3; - - - INSERT INTO t3(rowid, x, y) VALUES(15, 'P E B M V', 'E A A B U'); - INSERT INTO t3(rowid, x, y) VALUES(16, 'V E C F P', 'L U T V K'); - INSERT INTO t3(rowid, x, y) VALUES(17, 'T N O Z N', 'T P Q X N'); - INSERT INTO t3(rowid, x, y) VALUES(18, 'V W U W R', 'H O A A V'); - INSERT INTO t3(rowid, x, y) VALUES(19, 'A H N L F', 'I G H B O'); - DELETE FROM ft3; - - - CREATE TABLE t4(x); - CREATE VIRTUAL TABLE ft4 USING fts4(content=t4); - CREATE VIRTUAL TABLE ft4x USING fts4(x); - - - INSERT INTO ft4x(ft4x) VALUES('rebuild'); - INSERT INTO ft4(ft4) VALUES('rebuild'); - - - SELECT id, quote(value) FROM ft4_stat - - - SELECT id, quote(value) FROM ft4x_stat - - - INSERT INTO ft4x VALUES('M G M F T'); - INSERT INTO ft4x VALUES('Z Q C A U'); - INSERT INTO ft4x VALUES('N L L V'); - INSERT INTO ft4x VALUES('T F D X D'); - INSERT INTO ft4x VALUES('Z H I S D'); - - SELECT id, quote(value) FROM ft4x_stat - - - INSERT INTO ft4(rowid, x) SELECT rowid, * FROM ft4x; - SELECT id, quote(value) FROM ft4_stat - - - SELECT docid, quote(size) FROM ft4_docsize - - - INSERT INTO ft4x(ft4x) VALUES('rebuild'); - SELECT id, quote(value) FROM ft4x_stat; - SELECT docid, quote(size) FROM ft4x_docsize - - - INSERT INTO ft4(ft4) VALUES('rebuild'); - SELECT id, quote(value) FROM ft4_stat; - SELECT docid, quote(size) FROM ft4_docsize - - - INSERT INTO t4(rowid, x) SELECT rowid, x FROM ft4x; - INSERT INTO ft4(ft4) VALUES('rebuild'); - SELECT id, quote(value) FROM ft4_stat; - SELECT docid, quote(size) FROM ft4_docsize - - - CREATE TABLE t5(a, b, c, d); - CREATE VIRTUAL TABLE ft5 USING fts4(content=t5); - SELECT name FROM sqlite_master WHERE name LIKE '%t5%'; - - - ALTER TABLE ft5 RENAME TO ft6; - SELECT name FROM sqlite_master WHERE name LIKE '%t5%'; - - - SELECT name FROM sqlite_master WHERE name LIKE '%t6%'; - - - INSERT INTO t5 VALUES('a', 'b', 'c', 'd'); - INSERT INTO ft6(ft6) VALUES('rebuild'); - SELECT rowid FROM ft6 WHERE ft6 MATCH 'b'; - - - DROP TABLE ft6; - SELECT * FROM t5; - - - SELECT name FROM sqlite_master WHERE name LIKE '%t6%'; - - - CREATE VIRTUAL TABLE ft5 USING fts4(content=t5); - CREATE TABLE t5_content(a, b); - DROP TABLE ft5; - SELECT name FROM sqlite_master WHERE name LIKE '%t5%'; - - - CREATE TABLE t7(one, two); - CREATE VIRTUAL TABLE ft7 USING fts4(content=t7); - INSERT INTO t7 VALUES('A B', 'B A'); - INSERT INTO t7 VALUES('C D', 'A A'); - SELECT * FROM ft7; - - - SELECT name FROM sqlite_master WHERE name LIKE '%t7%' - - - CREATE TABLE t7(x, y); - INSERT INTO t7 VALUES('A B', 'B A'); - INSERT INTO t7 VALUES('C D', 'A A'); - SELECT * FROM ft7; - - - INSERT INTO ft7(ft7) VALUES('rebuild'); - SELECT rowid FROM ft7 WHERE ft7 MATCH '"A A"'; - - - DROP TABLE t7; - CREATE TABLE t7(x); - - - CREATE VIRTUAL TABLE ft8 USING fts4(content=nosuchtable, x); - INSERT INTO ft8(docid, x) VALUES(13, 'U O N X G'); - INSERT INTO ft8(docid, x) VALUES(14, 'C J J U B'); - INSERT INTO ft8(docid, x) VALUES(15, 'N J Y G X'); - INSERT INTO ft8(docid, x) VALUES(16, 'R Y D O R'); - INSERT INTO ft8(docid, x) VALUES(17, 'I Y T Q O'); - - - SELECT docid FROM ft8 WHERE ft8 MATCH 'N'; - - - CREATE VIRTUAL TABLE ft9 USING fts4(content=, x); - INSERT INTO ft9(docid, x) VALUES(13, 'U O N X G'); - INSERT INTO ft9(docid, x) VALUES(14, 'C J J U B'); - INSERT INTO ft9(docid, x) VALUES(15, 'N J Y G X'); - INSERT INTO ft9(docid, x) VALUES(16, 'R Y D O R'); - INSERT INTO ft9(docid, x) VALUES(17, 'I Y T Q O'); - - - SELECT docid FROM ft9 WHERE ft9 MATCH 'N'; - - - SELECT name FROM sqlite_master WHERE name LIKE 'ft9_%'; - - - CREATE TABLE t10(a, b); - INSERT INTO t10 VALUES( - 'abasia abasic abask', 'Abassin abastardize abatable'); - INSERT INTO t10 VALUES( - 'abate abatement abater', 'abatis abatised abaton'); - INSERT INTO t10 VALUES( - 'abator abattoir Abatua', 'abature abave abaxial'); - - CREATE VIRTUAL TABLE ft10 USING fts4(content=t10, prefix="2,4", a, b); - - SELECT * FROM ft10 WHERE a MATCH 'ab*'; - INSERT INTO ft10(ft10) VALUES('rebuild'); - SELECT rowid FROM ft10 WHERE a MATCH 'ab*'; - SELECT rowid FROM ft10 WHERE b MATCH 'abav*'; - SELECT rowid FROM ft10 WHERE ft10 MATCH 'abas*'; - - CREATE TABLE tbl1(a, b); - INSERT INTO tbl1 VALUES('a b', 'c d'); - INSERT INTO tbl1 VALUES('e f', 'a b'); - CREATE VIRTUAL TABLE e1 USING echo(tbl1); - CREATE VIRTUAL TABLE ft1 USING fts4(content=e1); - INSERT INTO ft1(ft1) VALUES('rebuild'); - - - SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'e' - - - SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'a' - - - DELETE FROM ft1 WHERE docid=1; - - - SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'a' - - - INSERT INTO ft1(ft1) VALUES('rebuild'); - SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'a' - - - CREATE TABLE idx(id INTEGER PRIMARY KEY, path TEXT); - INSERT INTO idx VALUES (1, 't1.txt'); - INSERT INTO idx VALUES (2, 't2.txt'); - INSERT INTO idx VALUES (3, 't3.txt'); - - CREATE VIRTUAL TABLE vt USING fs(idx); - SELECT path, data FROM vt; - - - SELECT path, data FROM vt WHERE rowid = 2; - - - CREATE VIRTUAL TABLE ft USING fts4(content=vt); - INSERT INTO ft(ft) VALUES('rebuild'); - - - SELECT snippet(ft, '[', ']', '...', -1, 5) FROM ft WHERE ft MATCH 'e' - - - SELECT snippet(ft, '[', ']', '...', -1, 5) FROM ft WHERE ft MATCH 't' - - DELETE FROM ft WHERE docid=2 - - SELECT snippet(ft, '[', ']', '...', -1, 5) FROM ft WHERE ft MATCH 'e' - - - CREATE VIRTUAL TABLE t1 USING fts4(a, content=t1 ); - INSERT INTO t1(rowid, a) VALUES(1, 'abc'); - - - CREATE VIRTUAL TABLE t1 USING fts4(a, content=t2 ); - CREATE VIRTUAL TABLE t2 USING fts4(a, content=t1 ); - INSERT INTO t1(rowid, a) VALUES(1, 'abc'); - diff --git a/libsql-wal/tests/assets/fixtures/fts4docid.test b/libsql-wal/tests/assets/fixtures/fts4docid.test deleted file mode 100644 index d0671bfdf5..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4docid.test +++ /dev/null @@ -1,13 +0,0 @@ - CREATE VIRTUAL TABLE t1 USING fts4; - SELECT docid FROM t1 WHERE docid = 5 - SELECT docid FROM t1 WHERE docid = '5' - SELECT docid FROM t1 WHERE docid = +5 - SELECT docid FROM t1 WHERE docid = +'5' - SELECT docid FROM t1 WHERE docid < 5 - SELECT docid FROM t1 WHERE docid < '5' - SELECT rowid FROM t1 WHERE rowid = 5 - SELECT rowid FROM t1 WHERE rowid = '5' - SELECT rowid FROM t1 WHERE rowid = +5 - SELECT rowid FROM t1 WHERE rowid = +'5' - SELECT rowid FROM t1 WHERE rowid < 5 - SELECT rowid FROM t1 WHERE rowid < '5' diff --git a/libsql-wal/tests/assets/fixtures/fts4growth.test b/libsql-wal/tests/assets/fixtures/fts4growth.test deleted file mode 100644 index 6d2c1f4f54..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4growth.test +++ /dev/null @@ -1,143 +0,0 @@ - CREATE VIRTUAL TABLE x1 USING fts3; - - INSERT INTO x1(x1) VALUES('optimize'); - SELECT level, end_block, length(root) FROM x1_segdir; - - - SELECT length(block) FROM x1_segments; - - - SELECT sum(length(block)) FROM x1_segments WHERE blockid IN (224,225,226) - - - CREATE TABLE t1(docid, words); - CREATE VIRTUAL TABLE x2 USING fts4; - - - SELECT count(*) FROM x2_segdir WHERE level=2; - SELECT count(*) FROM x2_segdir WHERE level=3; - - - INSERT INTO x2(x2) VALUES('merge=4,4'); - SELECT count(*) FROM x2_segdir WHERE level=2; - SELECT count(*) FROM x2_segdir WHERE level=3; - - - SELECT end_block FROM x2_segdir WHERE level=3; - INSERT INTO x2(x2) VALUES('merge=4,4'); - SELECT end_block FROM x2_segdir WHERE level=3; - INSERT INTO x2(x2) VALUES('merge=4,4'); - SELECT end_block FROM x2_segdir WHERE level=3; - - - SELECT sum(length(block)) FROM x2_segdir, x2_segments WHERE - blockid BETWEEN start_block AND leaves_end_block - AND level=3 - - - INSERT INTO x2(x2) VALUES('merge=1000,4'); - SELECT end_block FROM x2_segdir WHERE level=3; - - - SELECT sum(length(block)) FROM x2_segdir, x2_segments WHERE - blockid BETWEEN start_block AND leaves_end_block - AND level=3 - - CREATE VIRTUAL TABLE x3 USING fts4 - - DROP TABLE IF EXISTS x4; - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(docid, words); - CREATE VIRTUAL TABLE x4 USING fts4(words); - - - SELECT level, idx, second(end_block) FROM x4_segdir - - - INSERT INTO x4(x4) VALUES('merge=10,2'); - SELECT count(*) FROM x4_segdir; - - - INSERT INTO x4(x4) VALUES('merge=10,2'); - SELECT count(*) FROM x4_segdir; - - - INSERT INTO x4(x4) VALUES('merge=1000,2'); - SELECT count(*) FROM x4_segdir; - - - DROP TABLE IF EXISTS x2; - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(docid, words); - CREATE VIRTUAL TABLE x2 USING fts4; - - - UPDATE x2_segdir SET end_block = CAST( first(end_block) AS INTEGER ); - SELECT end_block, typeof(end_block) FROM x2_segdir; - - - INSERT INTO x2 SELECT words FROM t1 LIMIT 50; - SELECT level, idx, end_block FROM x2_segdir - - - UPDATE x2_segdir SET end_block = end_block || ' 1926' WHERE level=2; - INSERT INTO x2 SELECT words FROM t1 LIMIT 40; - SELECT level, idx, end_block FROM x2_segdir - - - CREATE VIRTUAL TABLE x5 USING fts4; - INSERT INTO x5 SELECT words FROM t1 LIMIT 100 OFFSET 0; - INSERT INTO x5 SELECT words FROM t1 LIMIT 100 OFFSET 25; - INSERT INTO x5 SELECT words FROM t1 LIMIT 100 OFFSET 50; - INSERT INTO x5 SELECT words FROM t1 LIMIT 100 OFFSET 75; - SELECT count(*) FROM x5_segdir - - - INSERT INTO x5(x5) VALUES('merge=2,4'); - SELECT level, idx, end_block FROM x5_segdir; - - - INSERT INTO x5 SELECT words FROM t1 LIMIT 100 OFFSET 100; - SELECT level, idx, end_block FROM x5_segdir; - - - INSERT INTO x5(x5) VALUES('merge=200,4'); - SELECT level, idx, end_block FROM x5_segdir; - - - INSERT INTO x5 SELECT words FROM t1; - SELECT level, idx, end_block FROM x5_segdir; - - - CREATE VIRTUAL TABLE x6 USING fts4; - INSERT INTO x6 SELECT words FROM t1; - INSERT INTO x6 SELECT words FROM t1; - INSERT INTO x6 SELECT words FROM t1; - INSERT INTO x6 SELECT words FROM t1; - INSERT INTO x6 SELECT words FROM t1; - INSERT INTO x6 SELECT words FROM t1; - SELECT level, idx, end_block FROM x6_segdir; - - - INSERT INTO x6(x6) VALUES('merge=25,4'); - SELECT level, idx, end_block FROM x6_segdir; - - - UPDATE x6_segdir SET end_block = first(end_block) WHERE level=1; - SELECT level, idx, end_block FROM x6_segdir; - - - INSERT INTO x6(x6) VALUES('merge=25,4'); - SELECT level, idx, end_block FROM x6_segdir; - - - INSERT INTO x6(x6) VALUES('merge=2500,4'); - SELECT level, idx, start_block, leaves_end_block, end_block FROM x6_segdir; - - - INSERT INTO x6(x6) VALUES('merge=2500,2'); - SELECT level, idx, start_block, leaves_end_block, end_block FROM x6_segdir; - - - SELECT sum(length(block)) FROM x6_segments - diff --git a/libsql-wal/tests/assets/fixtures/fts4growth2.test b/libsql-wal/tests/assets/fixtures/fts4growth2.test deleted file mode 100644 index e18e6c2490..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4growth2.test +++ /dev/null @@ -1,10 +0,0 @@ - CREATE TABLE t1(docid, words); - - CREATE VIRTUAL TABLE x1 USING fts4; - INSERT INTO x1(x1) VALUES('automerge=2'); - - - DELETE FROM t1 WHERE rowid>16; - DROP TABLE IF EXISTS x1; - CREATE VIRTUAL TABLE x1 USING fts4; - diff --git a/libsql-wal/tests/assets/fixtures/fts4incr.test b/libsql-wal/tests/assets/fixtures/fts4incr.test deleted file mode 100644 index 1f96cc30c4..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4incr.test +++ /dev/null @@ -1,9 +0,0 @@ - - SELECT min(docid), max(docid) FROM t1; - - - SELECT count(*) FROM t2 WHERE t2 MATCH '"never zero"' - - - SELECT count(*) FROM t2 WHERE t2 MATCH '"two zero"' - diff --git a/libsql-wal/tests/assets/fixtures/fts4intck1.test b/libsql-wal/tests/assets/fixtures/fts4intck1.test deleted file mode 100644 index 931d2243cc..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4intck1.test +++ /dev/null @@ -1,22 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT AS (slang(b))); - INSERT INTO t1(b) VALUES('the quick fox jumps over the lazy brown dog'); - SELECT c FROM t1; - - - CREATE VIRTUAL TABLE t2 USING fts4(content="t1", c); - INSERT INTO t2(t2) VALUES('rebuild'); - SELECT docid FROM t2 WHERE t2 MATCH 'deh'; - - - PRAGMA integrity_check(t2); - - - PRAGMA integrity_check(t2); - - - PRAGMA integrity_check(t2); - - - PRAGMA integrity_check(t2); - diff --git a/libsql-wal/tests/assets/fixtures/fts4langid.test b/libsql-wal/tests/assets/fixtures/fts4langid.test deleted file mode 100644 index 1e836a2d2b..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4langid.test +++ /dev/null @@ -1,117 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(a, b, languageid=lang_id); - - - SELECT sql FROM sqlite_master WHERE name = 't1_content'; - -SELECT docid FROM t1 -SELECT lang_id FROM t1 -INSERT INTO t1(a, b) VALUES('aaa', 'bbb') -SELECT lang_id FROM t1 -INSERT INTO t1(a, b, lang_id) VALUES('aaa', 'bbb', 4) -SELECT lang_id FROM t1 -SELECT lang_id FROM t1 - - CREATE VIRTUAL TABLE t2 USING fts4; - INSERT INTO t2 VALUES('abc'); - - SELECT rowid FROM t2 WHERE content MATCH 'abc' - - DROP TABLE t1; - CREATE VIRTUAL TABLE t1 USING fts4(languageid=lang_id); - INSERT INTO t1(content) VALUES('a b c'); - INSERT INTO t1(content, lang_id) VALUES('a b c', 1); - - - SELECT rowid FROM t1 WHERE t1 MATCH 'b'; - - - SELECT rowid FROM t1 WHERE t1 MATCH 'b' AND lang_id = 0; - - - SELECT rowid FROM t1 WHERE t1 MATCH 'b' AND lang_id = 1; - - - DROP TABLE t1; - CREATE VIRTUAL TABLE t1 USING fts4(languageid=lang_id); - INSERT INTO t1(content, lang_id) VALUES('A', 13); - INSERT INTO t1(content, lang_id) VALUES('B', 13); - INSERT INTO t1(content, lang_id) VALUES('C', 13); - INSERT INTO t1(content, lang_id) VALUES('D', 13); - INSERT INTO t1(content, lang_id) VALUES('E', 13); - INSERT INTO t1(content, lang_id) VALUES('F', 13); - INSERT INTO t1(content, lang_id) VALUES('G', 13); - INSERT INTO t1(content, lang_id) VALUES('H', 13); - INSERT INTO t1(content, lang_id) VALUES('I', 13); - INSERT INTO t1(content, lang_id) VALUES('J', 13); - INSERT INTO t1(content, lang_id) VALUES('K', 13); - INSERT INTO t1(content, lang_id) VALUES('L', 13); - INSERT INTO t1(content, lang_id) VALUES('M', 13); - INSERT INTO t1(content, lang_id) VALUES('N', 13); - INSERT INTO t1(content, lang_id) VALUES('O', 13); - INSERT INTO t1(content, lang_id) VALUES('P', 13); - INSERT INTO t1(content, lang_id) VALUES('Q', 13); - INSERT INTO t1(content, lang_id) VALUES('R', 13); - INSERT INTO t1(content, lang_id) VALUES('S', 13); - SELECT rowid FROM t1 WHERE t1 MATCH 'A'; - - - INSERT INTO t2(t2) VALUES('optimize'); - SELECT count(*) FROM t2_segdir; - - - CREATE VIRTUAL TABLE t2 USING fts4(content=t3_data, languageid=l); - INSERT INTO t2(t2) VALUES('rebuild'); - - - DROP TABLE t2; - CREATE VIRTUAL TABLE t2 USING fts4(x, y, languageid=l, content=nosuchtable); - - - INSERT INTO t2(docid, x, y, l) SELECT rowid, x, y, l FROM t3_data; - - - DROP TABLE t3_data; - - - CREATE TABLE t8c(a, b); - CREATE VIRTUAL TABLE t8 USING fts4(content=t8c, languageid=langid); - INSERT INTO t8(docid, a, b) VALUES(-1, 'one two three', 'x y z'); - SELECT docid FROM t8 WHERE t8 MATCH 'one x' AND langid=0 - - - SELECT docid FROM t4 WHERE t4 MATCH 'quick'; - - - SELECT docid FROM t4 WHERE t4 MATCH 'quick' AND lid=1; - - - SELECT docid FROM t4 WHERE t4 MATCH 'Quick' AND lid=1; - - - SELECT level FROM t5_segdir; - -SELECT docid FROM t5 WHERE t5 MATCH 'language' - - CREATE VIRTUAL TABLE t6 USING fts4(languageid=lid); - INSERT INTO t6 VALUES('I belong to language 0!'); - - INSERT INTO t6(t6) VALUES('optimize') - SELECT docid FROM t6 WHERE t6 MATCH 'belong' - - SELECT docid FROM t6 WHERE t6 MATCH 'belong' AND lid=$lid - - - CREATE VIRTUAL TABLE vt0 USING fts4(c0, languageid="lid"); - INSERT INTO vt0 VALUES ('a'), ('b'); - BEGIN; - UPDATE vt0 SET lid = 1 WHERE lid=0; - - - INSERT INTO vt0(vt0) VALUES('integrity-check'); - PRAGMA integrity_check; - - - COMMIT; - INSERT INTO vt0(vt0) VALUES('integrity-check'); - diff --git a/libsql-wal/tests/assets/fixtures/fts4lastrowid.test b/libsql-wal/tests/assets/fixtures/fts4lastrowid.test deleted file mode 100644 index 4337380efd..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4lastrowid.test +++ /dev/null @@ -1,40 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(str); - - - INSERT INTO t1 VALUES('one string'); - INSERT INTO t1 VALUES('two string'); - INSERT INTO t1 VALUES('three string'); - SELECT last_insert_rowid(); - - - BEGIN; - INSERT INTO t1 VALUES('one string'); - INSERT INTO t1 VALUES('two string'); - INSERT INTO t1 VALUES('three string'); - COMMIT; - SELECT last_insert_rowid(); - - - INSERT INTO t1(rowid, str) VALUES(-22, 'some more text'); - SELECT last_insert_rowid(); - - - BEGIN; - INSERT INTO t1(rowid, str) VALUES(45, 'some more text'); - INSERT INTO t1(rowid, str) VALUES(46, 'some more text'); - INSERT INTO t1(rowid, str) VALUES(222, 'some more text'); - SELECT last_insert_rowid(); - COMMIT; - SELECT last_insert_rowid(); - - - CREATE TABLE x1(x); - INSERT INTO x1 VALUES('john'), ('paul'), ('george'), ('ringo'); - INSERT INTO t1 SELECT x FROM x1; - SELECT last_insert_rowid(); - - - INSERT INTO t1(rowid, str) SELECT rowid+10, x FROM x1; - SELECT last_insert_rowid(); - diff --git a/libsql-wal/tests/assets/fixtures/fts4merge.test b/libsql-wal/tests/assets/fixtures/fts4merge.test deleted file mode 100644 index d1c7966400..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4merge.test +++ /dev/null @@ -1,65 +0,0 @@ - - SELECT level, string_agg(idx, ' ') FROM t1_segdir GROUP BY level - - - SELECT level, group_concat(idx, ' ') FROM t1_segdir GROUP BY level - - - SELECT level, string_agg(idx, ' ') FROM t1_segdir GROUP BY level - - - SELECT level, string_agg(idx, ' ') FROM t2_segdir GROUP BY level - - - INSERT INTO t2(t2) VALUES('merge=1000000,2'); - SELECT level, group_concat(idx, ' ') FROM t2_segdir GROUP BY level - - - SELECT quote(value) FROM t4_stat WHERE rowid=1 - - - DELETE FROM t4_stat WHERE rowid=1; - INSERT INTO t4(t4) VALUES('merge=1,12'); - SELECT level, string_agg(idx, ' ') FROM t4_segdir GROUP BY level; - - - SELECT level, group_concat(idx, ' ') FROM t1_segdir GROUP BY level; - - - INSERT INTO t1(t1) VALUES('merge=1,5'); - INSERT INTO t1(t1) VALUES('merge=1,5'); - SELECT level, string_agg(idx, ' ') FROM t1_segdir GROUP BY level; - -SELECT quote(value) from t1_stat WHERE rowid=1 -SELECT quote(value) from t1_stat WHERE rowid=1 - - SELECT level, group_concat(idx, ' ') FROM t1_segdir GROUP BY level; - SELECT quote(value) from t1_stat WHERE rowid=1; - - - INSERT INTO t1(t1) VALUES('merge=1,6'); - INSERT INTO t1(t1) VALUES('merge=1,6'); - SELECT level, group_concat(idx, ' ') FROM t1_segdir GROUP BY level; - SELECT quote(value) from t1_stat WHERE rowid=1; - - - SELECT level, group_concat(idx, ' ') FROM t1_segdir GROUP BY level; - SELECT quote(value) from t1_stat WHERE rowid=1; - - - INSERT INTO t1(t1) VALUES('merge=1,6'); - SELECT level, string_agg(idx, ' ') FROM t1_segdir GROUP BY level; - SELECT quote(value) from t1_stat WHERE rowid=1; - - - SELECT level, group_concat(idx, ' ') FROM t1_segdir GROUP BY level - - - CREATE VIRTUAL TABLE t1 USING fts4(a, order=DESC); - INSERT INTO t1(a) VALUES (0); - INSERT INTO t1(a) VALUES (0); - UPDATE t1 SET a = NULL; - - - INSERT INTO t1(t1) VALUES('merge=1,4'); - diff --git a/libsql-wal/tests/assets/fixtures/fts4merge2.test b/libsql-wal/tests/assets/fixtures/fts4merge2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts4merge3.test b/libsql-wal/tests/assets/fixtures/fts4merge3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fts4merge4.test b/libsql-wal/tests/assets/fixtures/fts4merge4.test deleted file mode 100644 index 9251e01d17..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4merge4.test +++ /dev/null @@ -1,6 +0,0 @@ - CREATE VIRTUAL TABLE t1 USING fts4 - CREATE VIRTUAL TABLE t1 USING fts4 - SELECT count(*) FROM t1_segdir; - INSERT INTO t1(t1) VALUES('optimize') - SELECT count(*) FROM t1_segdir; - CREATE VIRTUAL TABLE t2 USING fts4; diff --git a/libsql-wal/tests/assets/fixtures/fts4merge5.test b/libsql-wal/tests/assets/fixtures/fts4merge5.test deleted file mode 100644 index 033acafa0c..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4merge5.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE TABLE t1(docid, words); - - - CREATE VIRTUAL TABLE x1 USING fts3; - INSERT INTO x1(x1) VALUES('nodesize=64'); - INSERT INTO x1(x1) VALUES('maxpending=64'); - - - INSERT INTO x1(docid, content) SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/fts4min.test b/libsql-wal/tests/assets/fixtures/fts4min.test deleted file mode 100644 index 27e1b3854e..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4min.test +++ /dev/null @@ -1,16 +0,0 @@ - - CREATE TABLE t1(a NOT NULL, b); - CREATE INDEX i1 ON t1(a); - - - CREATE VIRTUAL TABLE ft USING fts3(c); - INSERT INTO ft(docid, c) VALUES(22, 'hello world'); - INSERT INTO ft(docid, c) VALUES(44, 'hello world'); - INSERT INTO ft(docid, c) VALUES(11, 'hello world'); - - - SELECT max(rowid) FROM ft - - - SELECT min(rowid) FROM ft - diff --git a/libsql-wal/tests/assets/fixtures/fts4noti.test b/libsql-wal/tests/assets/fixtures/fts4noti.test deleted file mode 100644 index 8cdab5f4b9..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4noti.test +++ /dev/null @@ -1,92 +0,0 @@ - - CREATE TABLE cc(a, b, c); - - SELECT name FROM sqlite_master - DROP TABLE t1 - - CREATE VIRTUAL TABLE t2 USING fts4(x, y, notindexed=x); - - SELECT x FROM t2 WHERE t2 MATCH '2' - SELECT x FROM t2 WHERE t2 MATCH '1' - SELECT x FROM t2 WHERE t2 MATCH 'x' - SELECT x FROM t2 WHERE t2 MATCH 'x 1' - DROP TABLE t2 - - CREATE VIRTUAL TABLE t2 USING fts4(poi, addr, notindexed=poi); - INSERT INTO t2 VALUES(114, 'x x x'); - INSERT INTO t2 VALUES(X'1234', 'y y y'); - INSERT INTO t2 VALUES(NULL, 'z z z'); - INSERT INTO t2 VALUES(113.2, 'w w w'); - INSERT INTO t2 VALUES('poi', 'v v v'); - - SELECT typeof(poi) FROM t2 WHERE t2 MATCH 'x' - SELECT typeof(poi) FROM t2 WHERE t2 MATCH 'y' - SELECT typeof(poi) FROM t2 WHERE t2 MATCH 'z' - SELECT typeof(poi) FROM t2 WHERE t2 MATCH 'w' - SELECT typeof(poi) FROM t2 WHERE t2 MATCH 'v' - DROP TABLE t2 - - CREATE VIRTUAL TABLE t2 USING fts4( - notindexed="three", one, two, three, notindexed="one", - ); - INSERT INTO t2 VALUES('a', 'b', 'c'); - INSERT INTO t2 VALUES('c', 'a', 'b'); - INSERT INTO t2 VALUES('b', 'c', 'a'); - - SELECT docid FROM t2 WHERE t2 MATCH 'a' - SELECT docid FROM t2 WHERE t2 MATCH 'b' - SELECT docid FROM t2 WHERE t2 MATCH 'c' - DROP TABLE t2 - - CREATE VIRTUAL TABLE t1 USING fts4( - poiCategory, poiCategoryId, notindexed=poiCategoryId - ); - INSERT INTO t1(poiCategory, poiCategoryId) values ('Restaurant', 6021); - - - SELECT * FROM t1 WHERE t1 MATCH 'restaurant'; - - - SELECT * FROM t1 WHERE t1 MATCH 're*'; - - - SELECT * FROM t1 WHERE t1 MATCH '6021'; - - - SELECT * FROM t1 WHERE t1 MATCH '60*'; - - - DROP TABLE t1; - CREATE VIRTUAL TABLE t1 USING fts4( - poiCategory, poiCategoryId, notindexed=poiCategory - ); - INSERT INTO t1(poiCategory, poiCategoryId) values ('Restaurant', 6021); - - - SELECT * FROM t1 WHERE t1 MATCH 'restaurant'; - - - SELECT * FROM t1 WHERE t1 MATCH 're*'; - - - SELECT * FROM t1 WHERE t1 MATCH '6021'; - - - SELECT * FROM t1 WHERE t1 MATCH '60*'; - - - DROP TABLE t1; - CREATE VIRTUAL TABLE t1 USING fts4(abc, ab, a, notindexed=abc); - CREATE VIRTUAL TABLE t2 USING fts4(a, ab, abc, notindexed=abc); - - INSERT INTO t1 VALUES('no', 'yes', 'yep'); - INSERT INTO t2 VALUES('yep', 'yes', 'no'); - - SELECT count(*) FROM t1 WHERE t1 MATCH 'no'; - SELECT count(*) FROM t1 WHERE t1 MATCH 'yes'; - SELECT count(*) FROM t1 WHERE t1 MATCH 'yep'; - - SELECT count(*) FROM t2 WHERE t2 MATCH 'no'; - SELECT count(*) FROM t2 WHERE t2 MATCH 'yes'; - SELECT count(*) FROM t2 WHERE t2 MATCH 'yep'; - diff --git a/libsql-wal/tests/assets/fixtures/fts4onepass.test b/libsql-wal/tests/assets/fixtures/fts4onepass.test deleted file mode 100644 index 8961609565..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4onepass.test +++ /dev/null @@ -1,33 +0,0 @@ - - CREATE VIRTUAL TABLE ft USING fts3; - INSERT INTO ft(rowid, content) VALUES(1, '1 2 3'); - INSERT INTO ft(rowid, content) VALUES(2, '4 5 6'); - INSERT INTO ft(rowid, content) VALUES(3, '7 8 9'); - - - CREATE TABLE t1(x); - - CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN - DELETE FROM ft WHERE rowid=new.x; - END; - - CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN - UPDATE ft SET content = 'a b c' WHERE rowid=old.x; - END; - - CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN - DELETE FROM ft WHERE rowid=old.x; - END; - - - CREATE VIRTUAL TABLE zt USING fts4(a, b); - INSERT INTO zt(rowid, a, b) VALUES(1, 'unus duo', NULL); - INSERT INTO zt(rowid, a, b) VALUES(2, NULL, NULL); - - BEGIN; - UPDATE zt SET b='septum' WHERE rowid = 1; - UPDATE zt SET b='octo' WHERE rowid = 1; - COMMIT; - - SELECT count(*) FROM zt_segdir; - diff --git a/libsql-wal/tests/assets/fixtures/fts4opt.test b/libsql-wal/tests/assets/fixtures/fts4opt.test deleted file mode 100644 index a8acb225fb..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4opt.test +++ /dev/null @@ -1,53 +0,0 @@ - CREATE TABLE t1(docid, words) - - SELECT level, count(*) FROM t2_segdir GROUP BY level - - INSERT INTO t2(t2) VALUES('integrity-check') - INSERT INTO t2(t2) VALUES('integrity-check') - - SELECT level, count(*) FROM t2_segdir GROUP BY level - - INSERT INTO t2(t2) VALUES('integrity-check') - - INSERT INTO t2(words) SELECT words FROM t1; - SELECT level, count(*) FROM t2_segdir GROUP BY level; - - - DELETE FROM t2; - - - SELECT level, count(*) FROM t2_segdir GROUP BY level - - INSERT INTO t2(t2) VALUES('integrity-check') - INSERT INTO t2(t2) VALUES('integrity-check') - - SELECT level, count(*) FROM t2_segdir GROUP BY level - - INSERT INTO t2(t2) VALUES('integrity-check') - - INSERT INTO t2(words) SELECT words FROM t1; - SELECT level, count(*) FROM t2_segdir GROUP BY level; - - - CREATE VIRTUAL TABLE fts USING fts4 (t); - INSERT INTO fts (fts) VALUES ('optimize'); - - - INSERT INTO fts(fts) VALUES('integrity-check'); - SELECT count(*) FROM fts_segdir; - - - BEGIN; - INSERT INTO fts (rowid, t) VALUES (2, 'test'); - INSERT INTO fts (fts) VALUES ('optimize'); - COMMIT; - SELECT level, idx FROM fts_segdir; - - - INSERT INTO fts(fts) VALUES('integrity-check'); - SELECT rowid FROM fts WHERE fts MATCH 'test'; - - - INSERT INTO fts (fts) VALUES ('optimize'); - INSERT INTO fts(fts) VALUES('integrity-check'); - diff --git a/libsql-wal/tests/assets/fixtures/fts4record.test b/libsql-wal/tests/assets/fixtures/fts4record.test deleted file mode 100644 index 457b02b230..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4record.test +++ /dev/null @@ -1,50 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(x); - INSERT INTO t1 VALUES('terma terma terma termb'); - - - SELECT quote(root) FROM t1_segdir - - - select quote( - record(0, 5, 'terma', 5, 1, 2, 3, 3, 0, - 4, 1, 'b' , 3, 1, 5, 0 - ) ); - - - UPDATE t1_segdir SET root = - record(0, 5, 'terma', 5, 1, 2, 3, 3, 0, - 4, 1, 'b' , 3, 1, 5, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 - ); - - - UPDATE t1_segdir SET root = - record(0, 5, 'terma', 5, 1, 2, 3, 3, 0, - 4, 1, 'b' , 4, 1, 5, - 256, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 - ); - - - SELECT quote(root) FROM t1_segdir - - - UPDATE t1_segdir SET root = - record(0, 5, 'terma', 5, 1, 2, 3, 3, 0, - 4, 1, 'b' , 4, 1, 5, - 256, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 - ); - - - SELECT quote(root) FROM t1_segdir - - - UPDATE t1_segdir SET root = - X'00057465726D61050102030300040162040105FF00010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100' - diff --git a/libsql-wal/tests/assets/fixtures/fts4rename.test b/libsql-wal/tests/assets/fixtures/fts4rename.test deleted file mode 100644 index adae0ad175..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4rename.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE VIRTUAL TABLE temp.t1 USING fts3(a); - BEGIN; - CREATE TABLE t2(x); - diff --git a/libsql-wal/tests/assets/fixtures/fts4umlaut.test b/libsql-wal/tests/assets/fixtures/fts4umlaut.test deleted file mode 100644 index 780f48226a..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4umlaut.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(x, tokenize=unicode61); - CREATE VIRTUAL TABLE t2 USING fts4( - x, - tokenize=unicode61 "remove_diacritics=2" - ); - diff --git a/libsql-wal/tests/assets/fixtures/fts4unicode.test b/libsql-wal/tests/assets/fixtures/fts4unicode.test deleted file mode 100644 index 41d00923b9..0000000000 --- a/libsql-wal/tests/assets/fixtures/fts4unicode.test +++ /dev/null @@ -1,91 +0,0 @@ - - CREATE VIRTUAL TABLE t1 USING fts4(tokenize=unicode61, x, y); - INSERT INTO t1 VALUES(NULL, 'a b c'); - - - SELECT snippet(t1, '[', ']') FROM t1 WHERE t1 MATCH 'b' - - - BEGIN; - DELETE FROM t1; - INSERT INTO t1 VALUES('b b b b b b b b b b b', 'b b b b b b b b b b b b b'); - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 VALUES('a b c', NULL); - INSERT INTO t1 VALUES('a x c', NULL); - COMMIT; - - - SELECT * FROM t1 WHERE t1 MATCH 'a b'; - - - SELECT rowid FROM t3 WHERE t3 MATCH 'o'; - - - SELECT rowid FROM t3 WHERE t3 MATCH 'a'; - - - CREATE VIRTUAL TABLE t4 USING fts4(tokenize=unicode61 "remove_diacritics=0"); - INSERT INTO t4 SELECT * FROM t3; - - - SELECT rowid FROM t4 WHERE t4 MATCH 'o'; - - - SELECT rowid FROM t4 WHERE t4 MATCH 'a'; - - - DROP TABLE IF EXISTS t1; - CREATE VIRTUAL TABLE t1 USING fts4(tokenize=unicode61 - "tokenchars=xyz" "tokenchars=.=" "separators=.=" "separators=xy" - "separators=a" "separators=a" "tokenchars=a" "tokenchars=a" - ); - - INSERT INTO t1 VALUES('oneatwoxthreeyfour'); - INSERT INTO t1 VALUES('a.single=word'); - CREATE VIRTUAL TABLE t1aux USING fts4aux(t1); - SELECT * FROM t1aux; - - - DROP TABLE IF EXISTS t2; - CREATE VIRTUAL TABLE t2 USING fts4(tokenize=unicode61 "separators=aB"); - INSERT INTO t2 VALUES('oneatwoBthree'); - INSERT INTO t2 VALUES('onebtwoAthree'); - CREATE VIRTUAL TABLE t2aux USING fts4aux(t2); - SELECT * FROM t2aux; - - - CREATE VIRTUAL TABLE ft1 USING fts3tokenize( - "unicode61", "tokenchars=@.", "separators=1234567890" - ); - SELECT token FROM ft1 WHERE input = 'berlin@street123sydney.road'; - - - CREATE VIRTUAL TABLE t12 USING fts4(tokenize=unicode61); - INSERT INTO t12 VALUES('abc' || char(0) || 'def'); - SELECT hex(CAST(content AS blob)) FROM t12; - - - INSERT INTO t12(t12) VALUES('integrity-check'); - - - CREATE VIRTUAL TABLE t12aux USING fts4aux(t12); - SELECT * FROM t12aux; - - - SELECT hex(CAST(content AS blob)) FROM t12 WHERE t12 MATCH 'abc' - diff --git a/libsql-wal/tests/assets/fixtures/fts4upfrom.test b/libsql-wal/tests/assets/fixtures/fts4upfrom.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/full.test b/libsql-wal/tests/assets/fixtures/full.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/func.test b/libsql-wal/tests/assets/fixtures/func.test deleted file mode 100644 index 55914ee67e..0000000000 --- a/libsql-wal/tests/assets/fixtures/func.test +++ /dev/null @@ -1,141 +0,0 @@ - - SELECT octet_length(t1) FROM tbl1 ORDER BY t1; - - - SELECT octet_length(12345); - - - SELECT octet_length(NULL); - - - SELECT octet_length(7.5); - - - SELECT octet_length(x'30313233'); - - - WITH c(x) AS (VALUES(char(350,351,352,353,354))) - SELECT length(x), octet_length(x) FROM c; - - - WITH RECURSIVE c(x) AS ( - VALUES(1) - UNION ALL - SELECT x+1 FROM c WHERE x<1040 - ) - SELECT - count(*), - sum(length(replace(printf('abc%.*cxyz',x,'m'),'m','nnnn'))-(6+x*4)) - FROM c; - - - SELECT test_auxdata('constant') FROM t4; - - - SELECT test_auxdata('constant') FROM t4; - - - SELECT test_auxdata('constant') FROM t4; - - - SELECT test_auxdata($V), $V FROM t4; - - - SELECT test_auxdata($V), $V FROM t4; - - - SELECT test_auxdata($V), $V FROM t4; - - - SELECT trim('xyzzy',x'c0808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080'); - - - CREATE TABLE t29b(a,b,c,d,e,f,g,h,i); - INSERT INTO t29b - VALUES(1, hex(randomblob(2000)), null, 0, 1, '', zeroblob(0),'x',x'01'); - SELECT typeof(c), typeof(d), typeof(e), typeof(f), - typeof(g), typeof(h), typeof(i) FROM t29b; - - - SELECT length(f), length(g), length(h), length(i) FROM t29b; - - - SELECT quote(f), quote(g), quote(h), quote(i) FROM t29b; - -SELECT unicode('$'); -SELECT char(36,162,8364); - - SELECT char(), length(char()), typeof(char()) - - - SELECT test_frombind(1,2,3,4); - - - SELECT test_frombind(1,2,?,4); - - - SELECT test_frombind(1,(?),4,?+7); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a,b,c,e,f); - INSERT INTO t1 VALUES(1,2.5,'xyz',x'e0c1b2a3',null); - SELECT test_frombind(a,b,c,e,f,$xyz) FROM t1; - - - SELECT test_frombind(a,b,c,e,f,$xyz+f) FROM t1; - - - SELECT test_frombind(x.a,y.b,x.c,:123,y.e,x.f,$xyz+y.f) FROM t1 x, t1 y; - - - SELECT * FROM (SELECT testdirectonly(15)) AS v33; - - - WITH c(x) AS (SELECT testdirectonly(15)) - SELECT * FROM c; - - - CREATE TABLE t33a(a,b); - CREATE TABLE t33b(x,y); - CREATE TRIGGER r1 AFTER INSERT ON t33a BEGIN - INSERT INTO t33b(x,y) VALUES(testdirectonly(new.a),new.b); - END; - - - ALTER TABLE t33a RENAME COLUMN a TO aaa; - SELECT sql FROM sqlite_master WHERE name='r1'; - - - CREATE TABLE t1(a INT CHECK( - datetime( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13,14,15,16,17,18,19, - 20,21,22,23,24,25,26,27,28,29, - 30,31,32,33,34,35,36,37,38,39, - 40,41,42,43,44,45,46,47,48,a) - ) - ); - INSERT INTO t1(a) VALUES(1),(2); - SELECT * FROM t1; - - - CREATE TABLE t1(x); - SELECT coalesce(x, abs(-9223372036854775808)) FROM t1; - - - SELECT coalesce(x, 'xyz' LIKE printf('%.1000000c','y')) FROM t1; - - - CREATE TABLE t0(c0 CHECK(ABS(-9223372036854775808))); - PRAGMA integrity_check; - - - SELECT 123 -> 456 - - - SELECT 123 ->> 456 - - - WITH t1(x) AS (VALUES(9e+999)) SELECT sum(x), avg(x), total(x) FROM t1; - WITH t1(x) AS (VALUES(-9e+999)) SELECT sum(x), avg(x), total(x) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/func2.test b/libsql-wal/tests/assets/fixtures/func2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/func3.test b/libsql-wal/tests/assets/fixtures/func3.test deleted file mode 100644 index 651cc687e0..0000000000 --- a/libsql-wal/tests/assets/fixtures/func3.test +++ /dev/null @@ -1,66 +0,0 @@ - - SELECT likelihood(9223372036854775807, 0.5); - - - SELECT likelihood(-9223372036854775808, 0.5); - - - SELECT likelihood(14.125, 0.5); - - - SELECT likelihood(NULL, 0.5); - - - SELECT likelihood('test-string', 0.5); - - - SELECT quote(likelihood(x'010203000405', 0.5)); - - - SELECT likelihood(123, 1.0), likelihood(456, 0.0); - - - SELECT unlikely(9223372036854775807); - - - SELECT unlikely(-9223372036854775808); - - - SELECT unlikely(14.125); - - - SELECT unlikely(NULL); - - - SELECT unlikely('test-string'); - - - SELECT quote(unlikely(x'010203000405')); - - - SELECT likely(CAST(1 AS INT))=='1'; - - - SELECT unlikely(CAST(1 AS INT))=='1'; - - - SELECT likelihood(CAST(1 AS INT),0.5)=='1'; - - - SELECT likely(9223372036854775807); - - - SELECT likely(-9223372036854775808); - - - SELECT likely(14.125); - - - SELECT likely(NULL); - - - SELECT likely('test-string'); - - - SELECT quote(likely(x'010203000405')); - diff --git a/libsql-wal/tests/assets/fixtures/func4.test b/libsql-wal/tests/assets/fixtures/func4.test deleted file mode 100644 index aa9d2d9ded..0000000000 --- a/libsql-wal/tests/assets/fixtures/func4.test +++ /dev/null @@ -1,511 +0,0 @@ - - SELECT tointeger(NULL); - - - SELECT tointeger(''); - - - SELECT tointeger(' '); - - - SELECT tointeger('1234'); - - - SELECT tointeger(' 1234'); - - - SELECT tointeger('bad'); - - - SELECT tointeger('0xBAD'); - - - SELECT tointeger('123BAD'); - - - SELECT tointeger('0x123BAD'); - - - SELECT tointeger('123NO'); - - - SELECT tointeger('0x123NO'); - - - SELECT tointeger('-0x1'); - - - SELECT tointeger('-0x0'); - - - SELECT tointeger('0x0'); - - - SELECT tointeger('0x1'); - - - SELECT tointeger(-1); - - - SELECT tointeger(-0); - - - SELECT tointeger(0); - - - SELECT tointeger(1); - - - SELECT tointeger(-1.79769313486232e308 - 1); - - - SELECT tointeger(-1.79769313486232e308); - - - SELECT tointeger(-1.79769313486232e308 + 1); - - - SELECT tointeger(-9223372036854775808 - 1); - - - SELECT tointeger(-9223372036854775808); - - - SELECT tointeger(-9223372036854775808 + 1); - - - SELECT tointeger(-9223372036854775807 - 1); - - - SELECT tointeger(-9223372036854775807); - - - SELECT tointeger(-9223372036854775807 + 1); - - - SELECT tointeger(-2147483648 - 1); - - - SELECT tointeger(-2147483648); - - - SELECT tointeger(-2147483648 + 1); - - - SELECT tointeger(2147483647 - 1); - - - SELECT tointeger(2147483647); - - - SELECT tointeger(2147483647 + 1); - - - SELECT tointeger(9223372036854775807 - 1); - - - SELECT tointeger(9223372036854775807); - - - SELECT tointeger(9223372036854775807 + 1); - - - SELECT tointeger(1.79769313486232e308 - 1); - - - SELECT tointeger(1.79769313486232e308); - - - SELECT tointeger(1.79769313486232e308 + 1); - - - SELECT tointeger(4503599627370496 - 1); - - - SELECT tointeger(4503599627370496); - - - SELECT tointeger(4503599627370496 + 1); - - - SELECT tointeger(9007199254740992 - 1); - - - SELECT tointeger(9007199254740992); - - - SELECT tointeger(9007199254740992 + 1); - - - SELECT tointeger(9223372036854775807 - 1); - - - SELECT tointeger(9223372036854775807); - - - SELECT tointeger(9223372036854775807 + 1); - - - SELECT tointeger(9223372036854775808 - 1); - - - SELECT tointeger(9223372036854775808); - - - SELECT tointeger(9223372036854775808 + 1); - - - SELECT tointeger(18446744073709551616 - 1); - - - SELECT tointeger(18446744073709551616); - - - SELECT tointeger(18446744073709551616 + 1); - - - SELECT toreal(NULL); - - - SELECT toreal(''); - - - SELECT toreal(' '); - - - SELECT toreal('1234'); - - - SELECT toreal(' 1234'); - - - SELECT toreal('bad'); - - - SELECT toreal('0xBAD'); - - - SELECT toreal('123BAD'); - - - SELECT toreal('0x123BAD'); - - - SELECT toreal('123NO'); - - - SELECT toreal('0x123NO'); - - - SELECT toreal('-0x1'); - - - SELECT toreal('-0x0'); - - - SELECT toreal('0x0'); - - - SELECT toreal('0x1'); - - - SELECT toreal(-1); - - - SELECT toreal(-0); - - - SELECT toreal(0); - - - SELECT toreal(1); - - - SELECT toreal(-1.79769313486232e308 - 1); - - - SELECT toreal(-1.79769313486232e308); - - - SELECT toreal(-1.79769313486232e308 + 1); - - - SELECT toreal(-9223372036854775808 - 1); - - - SELECT toreal(-9223372036854775808); - - - SELECT toreal(-9223372036854775808 + 1); - - - SELECT toreal(-9223372036854775807 - 1); - - - SELECT toreal(-9223372036854775807); - - - SELECT toreal(-9223372036854775807 + 1); - - - SELECT toreal(-2147483648 - 1); - - - SELECT toreal(-2147483648); - - - SELECT toreal(-2147483648 + 1); - - - SELECT toreal(2147483647 - 1); - - - SELECT toreal(2147483647); - - - SELECT toreal(2147483647 + 1); - - - SELECT toreal(9223372036854775807 - 1); - - - SELECT toreal(9223372036854775807); - - - SELECT toreal(9223372036854775807 + 1); - - - SELECT toreal(1.79769313486232e308 - 1); - - - SELECT toreal(1.79769313486232e308); - - - SELECT toreal(1.79769313486232e308 + 1); - - - SELECT toreal(4503599627370496 - 1); - - - SELECT toreal(4503599627370496); - - - SELECT toreal(4503599627370496 + 1); - - - SELECT toreal(9007199254740992 - 1); - - - SELECT toreal(9007199254740992); - - - SELECT toreal(9007199254740992 + 1); - - - SELECT toreal(9007199254740992 + 2); - - - SELECT toreal(tointeger(9223372036854775808) - 1); - - - SELECT toreal(tointeger(9223372036854775808)); - - - SELECT toreal(tointeger(9223372036854775808) + 1); - - - SELECT toreal(tointeger(18446744073709551616) - 1); - - - SELECT toreal(tointeger(18446744073709551616)); - - - SELECT toreal(tointeger(18446744073709551616) + 1); - - - CREATE TABLE t1( - x INTEGER CHECK(tointeger(x) IS NOT NULL) - ); - - - SELECT x FROM t1 WHERE x>0 ORDER BY x; - - - CREATE TABLE t2( - x REAL CHECK(toreal(x) IS NOT NULL) - ); - - - SELECT x FROM t2 ORDER BY x; - - - SELECT tointeger(toreal('1234')); - - - SELECT tointeger(toreal(-1)); - - - SELECT tointeger(toreal(-0)); - - - SELECT tointeger(toreal(0)); - - - SELECT tointeger(toreal(1)); - - - SELECT tointeger(toreal(-9223372036854775808 - 1)); - - - SELECT tointeger(toreal(-9223372036854775808)); - - - SELECT tointeger(toreal(-9223372036854775808 + 1)); - - - SELECT tointeger(toreal(-2147483648 - 1)); - - - SELECT tointeger(toreal(-2147483648)); - - - SELECT tointeger(toreal(-2147483648 + 1)); - - - SELECT tointeger(toreal(2147483647 - 1)); - - - SELECT tointeger(toreal(2147483647)); - - - SELECT tointeger(toreal(2147483647 + 1)); - - - SELECT tointeger(toreal(9223372036854775807 - 1)); - - - SELECT tointeger(toreal(9223372036854775807)); - - - SELECT tointeger(toreal(9223372036854775807 + 1)); - - - SELECT tointeger(toreal(4503599627370496 - 1)); - - - SELECT tointeger(toreal(4503599627370496)); - - - SELECT tointeger(toreal(4503599627370496 + 1)); - - - SELECT tointeger(toreal(9007199254740992 - 1)); - - - SELECT tointeger(toreal(9007199254740992)); - - - SELECT tointeger(toreal(9007199254740992 + 1)); - - - SELECT tointeger(toreal(9007199254740992 + 2)); - - - SELECT tointeger(toreal(9223372036854775808 - 1)); - - - SELECT tointeger(toreal(9223372036854775808)); - - - SELECT tointeger(toreal(9223372036854775808 + 1)); - - - SELECT tointeger(toreal(18446744073709551616 - 1)); - - - SELECT tointeger(toreal(18446744073709551616)); - - - SELECT tointeger(toreal(18446744073709551616 + 1)); - - - SELECT tointeger(x'0102030405060708'); - - - SELECT tointeger(x'0807060504030201'); - - - SELECT toreal(x'ffefffffffffffff'); - - - SELECT toreal(x'8010000000000000'); - - - SELECT toreal(x'c000000000000000'); - - - SELECT toreal(x'bff0000000000000'); - - - SELECT toreal(x'8000000000000000'); - - - SELECT toreal(x'0000000000000000'); - - - SELECT toreal(x'3ff0000000000000'); - - - SELECT toreal(x'4000000000000000'); - - - SELECT toreal(x'0010000000000000'); - - - SELECT toreal(x'7fefffffffffffff'); - - - SELECT toreal(x'8000000000000001'); - - - SELECT toreal(x'800fffffffffffff'); - - - SELECT toreal(x'0000000000000001'); - - - SELECT toreal(x'000fffffffffffff'); - - - SELECT toreal(x'fff0000000000000'); - - - SELECT toreal(x'7ff0000000000000'); - - - SELECT toreal(x'fff8000000000000'); - - - SELECT toreal(x'fff0000000000001'); - - - SELECT toreal(x'fff7ffffffffffff'); - - - SELECT toreal(x'7ff0000000000001'); - - - SELECT toreal(x'7ff7ffffffffffff'); - - - SELECT toreal(x'fff8000000000001'); - - - SELECT toreal(x'ffffffffffffffff'); - - - SELECT toreal(x'7ff8000000000000'); - - - SELECT toreal(x'7fffffffffffffff'); - diff --git a/libsql-wal/tests/assets/fixtures/func5.test b/libsql-wal/tests/assets/fixtures/func5.test deleted file mode 100644 index aaf5ae4df0..0000000000 --- a/libsql-wal/tests/assets/fixtures/func5.test +++ /dev/null @@ -1,28 +0,0 @@ - - PRAGMA encoding=UTF16le; - CREATE TABLE t1(x,a,b,c); - INSERT INTO t1 VALUES(1,'ab','cd',1); - INSERT INTO t1 VALUES(2,'gh','ef',5); - INSERT INTO t1 VALUES(3,'pqr','fuzzy',99); - INSERT INTO t1 VALUES(4,'abcdefg','xy',22); - INSERT INTO t1 VALUES(5,'shoe','mayer',2953); - SELECT x FROM t1 WHERE c=instr('abcdefg',b) OR a='abcdefg' ORDER BY +x; - - - SELECT x FROM t1 WHERE a='abcdefg' OR c=instr('abcdefg',b) ORDER BY +x; - - - CREATE TABLE t2(x,y); - INSERT INTO t2 VALUES(1,2),(3,4),(5,6),(7,8); - SELECT x, y FROM t2 WHERE x+5=5+x ORDER BY +x; - - - SELECT x, y FROM t2 - WHERE x+counter1('hello')=counter1('hello')+x - ORDER BY +x; - - - SELECT x, y FROM t2 - WHERE x+counter2('hello')=$cvalue+x - ORDER BY +x; - diff --git a/libsql-wal/tests/assets/fixtures/func6.test b/libsql-wal/tests/assets/fixtures/func6.test deleted file mode 100644 index 560985eb37..0000000000 --- a/libsql-wal/tests/assets/fixtures/func6.test +++ /dev/null @@ -1,48 +0,0 @@ - - PRAGMA page_size=4096; - PRAGMA auto_vacuum=NONE; - CREATE TABLE t1(a,b,c,d); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c,d) SELECT printf('abc%03x',x), x, 1000-x, NULL FROM c; - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1bc ON t1(b,c); - CREATE TABLE t2(x TEXT PRIMARY KEY, y) WITHOUT ROWID; - INSERT INTO t2(x,y) SELECT a, b FROM t1; - - - SELECT sqlite_offset(d) FROM t1 ORDER BY rowid LIMIT 1; - - - SELECT offrec(sqlite_offset(d), a, b, c, d) FROM t1 ORDER BY rowid - - - SELECT a, typeof(sqlite_offset(+a)) FROM t1 - ORDER BY rowid LIMIT 2; - - - SELECT offrec(sqlite_offset(a), a, rowid) FROM t1 ORDER BY a - - - SELECT offrec(sqlite_offset(d), a, b, c, d) FROM t1 ORDER BY a - - - SELECT offrec(sqlite_offset(a), a, rowid), - offrec(sqlite_offset(d), a, b, c, d) - FROM t1 ORDER BY a - - - SELECT offrec(sqlite_offset(b), b, c, rowid), - offrec(sqlite_offset(c), b, c, rowid), - offrec(sqlite_offset(d), a, b, c, d) - FROM t1 - ORDER BY b - - - SELECT offrec( sqlite_offset(y), x, y ) FROM t2 ORDER BY x - - - CREATE TABLE t2(a INT, b INT PRIMARY KEY) WITHOUT ROWID; - CREATE INDEX x3 ON t2(b); - CREATE TABLE t1(a INT PRIMARY KEY, b TEXT); - SELECT * FROM t1 WHERE a IN (SELECT sqlite_offset(b) FROM t2); - diff --git a/libsql-wal/tests/assets/fixtures/func7.test b/libsql-wal/tests/assets/fixtures/func7.test deleted file mode 100644 index bef12ddf91..0000000000 --- a/libsql-wal/tests/assets/fixtures/func7.test +++ /dev/null @@ -1,219 +0,0 @@ - - SELECT ceil(99.9), ceiling(-99.01), floor(17), floor(-17.99); - - - SELECT quote(ceil(NULL)), ceil('-99.99'); - - - SELECT round(ln(5),2), log(100.0), log(100), log(2,'256'); - - - SELECT ln(-5), log(-5,100.0); - - - SELECT abs(-17.4) - - - SELECT ceil(42.2) - - - SELECT ceil(-42.2) - - - SELECT round(exp(1.0),7) - - - SELECT floor(42.8) - - - SELECT floor(-42.8) - - - SELECT round(ln(2.0),7) - - - SELECT log(100.0) - - - SELECT log10(1000.0) - - - SELECT format('%.30f', log10(100.0) ); - - - SELECT format('%.30f', ln(exp(2.0)) ); - - - SELECT log(2.0, 64.0) - - - SELECT mod(9,4); - - - SELECT round(pi(),7); - - - SELECT power(9,3); - - - SELECT round(radians(45.0),7); - - - SELECT round(42.4); - - - SELECT round(42.4382,2); - - - SELECT sign(-8.4); - - - SELECT round( sqrt(2), 7); - - - SELECT trunc(42.8), trunc(-42.8); - - - SELECT acos(1); - - - SELECT degrees(acos(0.5)); - - - SELECT round( asin(1), 7); - - - SELECT degrees( asin(0.5) ); - - - SELECT round( atan(1), 7); - - - SELECT degrees( atan(1) ); - - - SELECT round( atan2(1,0), 7); - - - SELECT degrees( atan2(1,0) ); - - - SELECT cos(0); - - - SELECT cos( radians(60.0) ); - - - SELECT cos(0); - - - SELECT round( sin(1), 7); - - - SELECT sin( radians(30) ); - - - SELECT round( tan(1), 7); - - - SELECT tan( radians(45) ); - - - SELECT round( sinh(1), 7); - - - SELECT round( cosh(0), 7); - - - SELECT round( tanh(1), 7); - - - SELECT round( asinh(1), 7); - - - SELECT round( acosh(1), 7); - - - SELECT round( atanh(0.5), 7); - - - SELECT acos(1); - - - SELECT acos(1.0001); - - - SELECT round( acos(0.0), 7); - - - SELECT round( asin(0.2), 7); - - - SELECT asin('foo'); - - - SELECT round( atan(2), 7), round( atan(-2), 7); - - - SELECT round( atan2(-2,2), 7), round( atan2(pi(),0), 7); - - - SELECT ceiling(1.23), ceiling(-1.23); - - - SELECT cos(pi()); - - - SELECT degrees(pi()), degrees(pi()/2); - - - SELECT round( exp(2), 7), round( exp(-2), 7), exp(0); - - - SELECT floor(1.23), floor(-1.23); - - - SELECT round(ln(2),7), quote(ln(-2)); - - -# SELECT round(log(2),7), log(-2); -# - - SELECT log(2,65536), log(10,100), quote(log(1,100)), quote(log(0,100)); - - - SELECT log2(65536), quote(log2(-100)), quote(log2(0)); - - - SELECT round(log10(2),7), log10(100), quote(log10(-100)); - - - SELECT mod(234,10), 253%7, mod(29,9), 29%9; - - - SELECT mod(34.5,3); - - - SELECT pow(2,2), pow(2,-2); - - - SELECT power(2,2), power(2,-2); - - - SELECT round(radians(90),7); - - - SELECT sign(-32), sign(0), sign(234); - - - SELECT sin(pi()) BETWEEN -1.0e-15 AND 1.0e-15; - - - SELECT sqrt(4), round(sqrt(20),7), quote(sqrt(-16)); - - - SELECT tan(pi()) BETWEEN -1.0e-15 AND 1.0e-15; - - - SELECT round(tan(pi()+1),7); - diff --git a/libsql-wal/tests/assets/fixtures/func8.test b/libsql-wal/tests/assets/fixtures/func8.test deleted file mode 100644 index 5e2e368431..0000000000 --- a/libsql-wal/tests/assets/fixtures/func8.test +++ /dev/null @@ -1,37 +0,0 @@ - - CREATE TABLE cross(cross,full,inner,left,natural,outer,right); - CREATE TABLE full(cross,full,inner,left,natural,outer,right); - CREATE TABLE inner(cross,full,inner,left,natural,outer,right); - CREATE TABLE left(cross,full,inner,left,natural,outer,right); - CREATE TABLE natural(cross,full,inner,left,natural,outer,right); - CREATE TABLE outer(cross,full,inner,left,natural,outer,right); - CREATE TABLE right(cross,full,inner,left,natural,outer,right); - INSERT INTO cross VALUES(1,2,3,4,5,6,7); - INSERT INTO full VALUES(1,2,3,4,5,6,7); - INSERT INTO inner VALUES(1,2,3,4,5,6,7); - INSERT INTO left VALUES(1,2,3,4,5,6,7); - INSERT INTO natural VALUES(1,2,3,4,5,6,7); - INSERT INTO outer VALUES(1,2,3,4,5,6,7); - INSERT INTO right VALUES(1,2,3,4,5,6,7); - - - SELECT cross(cross,full,inner,left,natural,outer,right) FROM cross; - - - SELECT full(cross,full,inner,left,natural,outer,right) FROM full; - - - SELECT inner(cross,full,inner,left,natural,outer,right) FROM inner; - - - SELECT left(cross,full,inner,left,natural,outer,right) FROM left; - - - SELECT natural(cross,full,inner,left,natural,outer,right) FROM natural; - - - SELECT outer(cross,full,inner,left,natural,outer,right) FROM outer; - - - SELECT right(cross,full,inner,left,natural,outer,right) FROM right; - diff --git a/libsql-wal/tests/assets/fixtures/func9.test b/libsql-wal/tests/assets/fixtures/func9.test deleted file mode 100644 index 9166c0fd29..0000000000 --- a/libsql-wal/tests/assets/fixtures/func9.test +++ /dev/null @@ -1,12 +0,0 @@ - - SELECT concat('abc',123,null,'xyz'); - - - SELECT typeof(concat(null)); - - - SELECT concat_ws(',',1,2,3,4,5,6,7,8,NULL,9,10,11,12); - - - SELECT concat_ws(NULL,1,2,3,4,5,6,7,8,NULL,9,10,11,12); - diff --git a/libsql-wal/tests/assets/fixtures/fuzz-oss1.test b/libsql-wal/tests/assets/fixtures/fuzz-oss1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fuzz.test b/libsql-wal/tests/assets/fixtures/fuzz.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fuzz2.test b/libsql-wal/tests/assets/fixtures/fuzz2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fuzz3.test b/libsql-wal/tests/assets/fixtures/fuzz3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fuzz4.test b/libsql-wal/tests/assets/fixtures/fuzz4.test deleted file mode 100644 index 48f9490265..0000000000 --- a/libsql-wal/tests/assets/fixtures/fuzz4.test +++ /dev/null @@ -1,54 +0,0 @@ - - CREATE TABLE Table0 (Col0 NOT NULL DEFAULT (CURRENT_TIME IS 1 > 1)); - INSERT OR REPLACE INTO Table0 DEFAULT VALUES ; - SELECT * FROM Table0; - - - CREATE TABLE Table1( - Col0 TEXT DEFAULT (CASE WHEN 1 IS 3530822107858468864 - THEN 1 ELSE quote(1) IS 3530822107858468864 END) - ); - INSERT INTO Table1 DEFAULT VALUES; - SELECT * FROM Table1; - - - CREATE TABLE Table2a( - Col0 NOT NULL DEFAULT (CURRENT_TIME IS 1 IS NOT 1 > 1) - ); - INSERT OR REPLACE INTO Table2a DEFAULT VALUES; - SELECT * FROM Table2a; - - - CREATE TABLE Table2b (Col0 NOT NULL DEFAULT (CURRENT_TIME IS NOT FALSE)) ; - INSERT OR REPLACE INTO Table2b DEFAULT VALUES ; - SELECT * FROM Table2b; - - - CREATE TABLE Table3 (Col0 DEFAULT (CURRENT_TIMESTAMP BETWEEN 1 AND 1)); - INSERT INTO Table3 DEFAULT VALUES; - SELECT * FROM Table3; - - - CREATE TABLE Table4 (Col0 DEFAULT (1 BETWEEN CURRENT_TIMESTAMP AND 1)); - INSERT INTO Table4 DEFAULT VALUES; - SELECT * FROM Table4; - - - CREATE TABLE Table5 (Col0 DEFAULT (1 BETWEEN 1 AND CURRENT_TIMESTAMP)); - INSERT INTO Table5 DEFAULT VALUES; - SELECT * FROM Table5; - - - CREATE TEMPORARY TABLE Table6( - Col0 DEFAULT (CASE x'5d' WHEN 1 THEN - CASE CURRENT_TIMESTAMP WHEN 1 THEN 1 ELSE 1 END - ELSE CASE WHEN 1 THEN FALSE END END ) - ); - INSERT INTO temp.Table6 DEFAULT VALUES ; - SELECT * FROM Table6; - - - WITH TableX AS (SELECT DISTINCT * ORDER BY 1 , 1 COLLATE RTRIM) - DELETE FROM Table6 WHERE Col0 || +8388608 ; - SELECT * FROM Table6; - diff --git a/libsql-wal/tests/assets/fixtures/fuzz_malloc.test b/libsql-wal/tests/assets/fixtures/fuzz_malloc.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/fuzzer1.test b/libsql-wal/tests/assets/fixtures/fuzzer1.test deleted file mode 100644 index ce3e5aef33..0000000000 --- a/libsql-wal/tests/assets/fixtures/fuzzer1.test +++ /dev/null @@ -1,211 +0,0 @@ - - CREATE TABLE f1_rules(ruleset DEFAULT 0, cfrom, cto, cost); - INSERT INTO f1_rules(cfrom, cto, cost) VALUES('e','a',1); - INSERT INTO f1_rules(cfrom, cto, cost) VALUES('a','e',10); - INSERT INTO f1_rules(cfrom, cto, cost) VALUES('e','o',100); - - CREATE VIRTUAL TABLE f1 USING fuzzer(f1_rules); - - - SELECT word, distance FROM f1 WHERE word MATCH 'abcde' - - - INSERT INTO f1_rules(ruleset, cfrom, cto, cost) VALUES(1,'b','x',1); - INSERT INTO f1_rules(ruleset, cfrom, cto, cost) VALUES(1,'d','y',10); - INSERT INTO f1_rules(ruleset, cfrom, cto, cost) VALUES(1,'y','z',100); - - DROP TABLE f1; - CREATE VIRTUAL TABLE f1 USING fuzzer(f1_rules); - - - SELECT word, distance FROM f1 WHERE word MATCH 'abcde' - - - SELECT word, distance FROM f1 WHERE word MATCH 'abcde' AND ruleset=0 - - - SELECT word, distance FROM f1 WHERE word MATCH 'abcde' AND ruleset=1 - - - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.f3_rules(ruleset, cfrom, cto, cost); - INSERT INTO f3_rules(ruleset, cfrom, cto, cost) VALUES(0, 'x','y', 10); - INSERT INTO f3_rules(ruleset, cfrom, cto, cost) VALUES(1, 'a','b', 10); - CREATE VIRTUAL TABLE aux.f3 USING fuzzer(f3_rules); - SELECT word FROM f3 WHERE word MATCH 'ax' - - - CREATE TABLE "fuzzer [x] rules table"(a, b, c, d); - INSERT INTO "fuzzer [x] rules table" VALUES(0, NULL, 'abc', 10); - CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table'); - SELECT word, distance FROM x WHERE word MATCH '123' LIMIT 4; - - - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES(0, 'x', NULL, 20); - INSERT INTO "fuzzer [x] rules table" VALUES(0, NULL, NULL, 10); - INSERT INTO "fuzzer [x] rules table" VALUES(0, 'x', 'x', 10); - - DROP TABLE x; - CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table'); - - SELECT word, distance FROM x WHERE word MATCH 'xx'; - - - DROP TABLE IF EXISTS x; - INSERT INTO "fuzzer [x] rules table" VALUES(0, 'c', 'd', 1001); - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES(0, 'd', 'c', 0); - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES(0, 'd', 'c', -20); - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES( - 0, 'x', '12345678901234567890123456789012345678901234567890', 2 - ); - CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table'); - SELECT word FROM x WHERE word MATCH 'x'; - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES( - 0, 'x', '123456789012345678901234567890123456789012345678901', 2 - ); - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES( - 0, '123456789012345678901234567890123456789012345678901', 'x', 2 - ); - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES(-1, 'x', 'y', 2); - - - DROP TABLE IF EXISTS x; - DELETE FROM "fuzzer [x] rules table"; - INSERT INTO "fuzzer [x] rules table" VALUES((1<<32)+100, 'x', 'y', 2); - - - CREATE TABLE [x2 "rules] (a, b, c, d); - INSERT INTO [x2 "rules] VALUES(0, 'a', 'b', 5); - - - CREATE TABLE x3_rules(rule_set, cFrom, cTo, cost); - INSERT INTO x3_rules VALUES(2, 'a', 'x', 10); - INSERT INTO x3_rules VALUES(2, 'a', 'y', 9); - INSERT INTO x3_rules VALUES(2, 'a', 'z', 8); - CREATE VIRTUAL TABLE x3 USING fuzzer(x3_rules); - - - SELECT cFrom, cTo, word - FROM x3_rules CROSS JOIN x3 - WHERE word MATCH 'a' AND cost=distance AND ruleset=2 - ORDER BY +cTo; - - - SELECT cFrom, cTo, word - FROM x3 CROSS JOIN x3_rules - WHERE word MATCH 'a' AND cost=distance AND ruleset=2 - ORDER BY +cTo DESC - - - SELECT cFrom, cTo, word - FROM x3_rules, x3 - WHERE word MATCH 'a' AND cost=distance AND ruleset=2 - ORDER BY +cTo DESC; - - - SELECT cFrom, cTo, word - FROM x3, x3_rules - WHERE word MATCH 'a' AND cost=distance AND ruleset=2 - ORDER BY +cTo DESC; - - - CREATE INDEX i1 ON x3_rules(cost); - SELECT cFrom, cTo, word - FROM x3_rules, x3 - WHERE word MATCH 'a' AND cost=distance AND ruleset=2 - ORDER BY +cTo DESC; - - - SELECT word FROM x3_rules, x3 WHERE word MATCH x3_rules.cFrom AND ruleset=2 - - - SELECT word FROM x3_rules, x3 - WHERE word MATCH x3_rules.cFrom - AND ruleset=2 - AND x3_rules.cost=8; - - - CREATE TABLE t1(a, b); - CREATE INDEX i2 ON t1(b); - SELECT word, distance FROM x3, t1 - WHERE x3.word MATCH t1.a AND ruleset=2 AND distance=t1.b; - - - INSERT INTO x3_rules VALUES(1, 'a', 't', 5); - INSERT INTO x3_rules VALUES(1, 'a', 'u', 4); - INSERT INTO x3_rules VALUES(1, 'a', 'v', 3); - DROP TABLE x3; - CREATE VIRTUAL TABLE x3 USING fuzzer(x3_rules); - SELECT * FROM x3_rules; - - - SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' - - - SELECT word FROM x3 WHERE ruleset<=1 AND word MATCH 'a' - - - SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY distance ASC; - - - SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY distance DESC; - - - SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY word ASC; - - - SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY word DESC; - - - CREATE TABLE x4_rules(a, b, c, d); - INSERT INTO x4_rules VALUES(0, 'a', 'b', 10); - INSERT INTO x4_rules VALUES(0, 'a', 'c', 11); - INSERT INTO x4_rules VALUES(0, 'bx', 'zz', 20); - INSERT INTO x4_rules VALUES(0, 'cx', 'yy', 15); - INSERT INTO x4_rules VALUES(0, 'zz', '!!', 50); - CREATE VIRTUAL TABLE x4 USING fuzzer(x4_rules); - - - SELECT word, distance FROM x4 WHERE word MATCH 'ax'; - - - CREATE TABLE x5_rules(a, b, c, d); - CREATE VIRTUAL TABLE x5 USING fuzzer(x5_rules); - - - SELECT word, distance FROM x5 WHERE word MATCH - 'aaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaa' || - 'aaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaa' || - 'aaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaa' - - - INSERT INTO x5_rules VALUES(0, 'a', '0.1.2.3.4.5.6.7.8.9.a', 1); - DROP TABLE x5; - CREATE VIRTUAL TABLE x5 USING fuzzer(x5_rules); - SELECT length(word) FROM x5 WHERE word MATCH 'a' LIMIT 50; - diff --git a/libsql-wal/tests/assets/fixtures/fuzzer2.test b/libsql-wal/tests/assets/fixtures/fuzzer2.test deleted file mode 100644 index 2e57c5a701..0000000000 --- a/libsql-wal/tests/assets/fixtures/fuzzer2.test +++ /dev/null @@ -1,16 +0,0 @@ - - DROP TABLE IF EXISTS x1; - DROP TABLE IF EXISTS x1_rules; - CREATE TABLE x1_rules(ruleset, cFrom, cTo, cost); - - - SELECT count(*) FROM x1_rules WHERE cTo!=cFrom; - - - CREATE VIRTUAL TABLE x1 USING fuzzer(x1_rules); - SELECT word FROM x1 WHERE word MATCH 'xx' LIMIT 10; - - - SELECT cTo FROM x1_rules WHERE cFrom='xx' - ORDER BY cost asc, rowid asc LIMIT 9; - diff --git a/libsql-wal/tests/assets/fixtures/fuzzerfault.test b/libsql-wal/tests/assets/fixtures/fuzzerfault.test deleted file mode 100644 index 1963d23efa..0000000000 --- a/libsql-wal/tests/assets/fixtures/fuzzerfault.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1_a(a INTEFDR PRIMARY KEY, b TEXT); - CREATE TABLE t3_a(k FnTEGER PRIMARY KEY, v TEXT); - CREATE TABLE t3_b(k INTEÀ5R PRIMARY KEY, v TEXT); - CREATE VIEW t3 AS SELECT * FROM t3_a UNION ALL SELECT * FROM t3_b; - diff --git a/libsql-wal/tests/assets/fixtures/gcfault.test b/libsql-wal/tests/assets/fixtures/gcfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/gencol1.test b/libsql-wal/tests/assets/fixtures/gencol1.test deleted file mode 100644 index 726f08ebe5..0000000000 --- a/libsql-wal/tests/assets/fixtures/gencol1.test +++ /dev/null @@ -1,329 +0,0 @@ - - CREATE TABLE t0(c0 AS(TYPEOF(c1)), c1); - INSERT INTO t0(c1) VALUES(0); - CREATE TABLE t1(x AS (typeof(y)), y); - INSERT INTO t1 SELECT * FROM t0; - SELECT * FROM t1; - - - PRAGMA foreign_keys = true; - CREATE TABLE t0(c0 PRIMARY KEY, c1, c2 AS (c0+c1-c3) REFERENCES t0, c3); - INSERT INTO t0 VALUES (0, 0, 0), (11, 5, 5); - UPDATE t0 SET c1 = c0, c3 = c0; - SELECT *, '|' FROM t0 ORDER BY +c0; - - - CREATE TABLE t0 ( - c0, - c1 a UNIQUE AS (1), - c2, - c3 REFERENCES t0(c1) - ); - PRAGMA foreign_keys = true; - INSERT INTO t0(c0,c2,c3) VALUES(0,0,1); - - - PRAGMA foreign_keys=ON; - CREATE TABLE t1( - gcb AS (b*1), - a INTEGER PRIMARY KEY, - gcc AS (c+0), - b UNIQUE, - gca AS (1*a+0), - c UNIQUE - ) WITHOUT ROWID; - INSERT INTO t1 VALUES(1,2,3); - INSERT INTO t1 VALUES(4,5,6); - INSERT INTO t1 VALUES(7,8,9); - CREATE TABLE t1a( - gcx AS (x+0) REFERENCES t1(a) ON DELETE CASCADE, - id, - x, - gcid AS (1*id) - ); - INSERT INTO t1a VALUES(1, 1); - INSERT INTO t1a VALUES(2, 4); - INSERT INTO t1a VALUES(3, 7); - DELETE FROM t1 WHERE b=5; - SELECT id,x,'|' FROM t1a ORDER BY id; - - - CREATE TABLE t0 (c0 GENERATED ALWAYS AS (1), c1 UNIQUE, c2 UNIQUE); - INSERT INTO t0(c1) VALUES (1); - SELECT quote(0 = t0.c2 OR t0.c1 BETWEEN t0.c2 AND 1) FROM t0; - - - DROP TABLE t0; - CREATE TABLE t0(c0 NOT NULL DEFAULT 'xyz', c1 AS(c0) NOT NULL); - REPLACE INTO t0(c0) VALUES(NULL); - SELECT * FROM t0; - - - DROP TABLE t0; - CREATE TABLE t0(c0 NOT NULL DEFAULT 'xyz', c1 AS(c0) STORED NOT NULL); - REPLACE INTO t0(c0) VALUES(NULL); - SELECT * FROM t0; - - - CREATE TABLE t1( - a NOT NULL DEFAULT 'aaa', - b AS(c) NOT NULL, - c NOT NULL DEFAULT 'ccc'); - REPLACE INTO t1(a,c) VALUES(NULL,NULL); - SELECT * FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1( - a NOT NULL DEFAULT 'aaa', - b AS(c) STORED NOT NULL, - c NOT NULL DEFAULT 'ccc'); - REPLACE INTO t1(a,c) VALUES(NULL,NULL); - SELECT * FROM t1; - - - CREATE TABLE t2( - a NOT NULL DEFAULT 'aaa', - b AS(a) NOT NULL, - c NOT NULL DEFAULT 'ccc'); - REPLACE INTO t2(a,c) VALUES(NULL,NULL); - SELECT * FROM t2; - - - DROP TABLE t2; - CREATE TABLE t2( - a NOT NULL DEFAULT 'aaa', - b AS(a) STORED NOT NULL, - c NOT NULL DEFAULT 'ccc'); - REPLACE INTO t2(a,c) VALUES(NULL,NULL); - SELECT * FROM t2; - - - CREATE TABLE t3(a NOT NULL DEFAULT 123, b AS(a) UNIQUE); - REPLACE INTO t3 VALUES(NULL); - SELECT * FROM t3; - - - SELECT * FROM t3 WHERE b=123; - - - CREATE TABLE t4(a NOT NULL DEFAULT 123, b AS(a*10+4) STORED UNIQUE); - REPLACE INTO t4 VALUES(NULL); - SELECT * FROM t4; - - - SELECT * FROM t4 WHERE b=1234; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0( - c0 AS (('a', 9) < ('b', c1)), - c1 AS (1), - c2 CHECK (1 = c1) - ); - INSERT INTO t0 VALUES (0),(99); - SELECT * FROM t0; - - - PRAGMA foreign_keys=OFF; - CREATE TABLE t1(aa , bb AS (17) UNIQUE); - INSERT INTO t1 VALUES(17); - CREATE TABLE t2(cc); - INSERT INTO t2 VALUES(41); - SELECT * FROM t2 JOIN t1 WHERE t1.bb=t1.aa AND t1.bb=17; - - - CREATE TABLE t3(aa INT PRIMARY KEY, bb UNIQUE AS(aa)); - INSERT INTO t3 VALUES(1); - SELECT 100, * FROM t3; - DELETE FROM t3 WHERE (SELECT bb FROM t3); - SELECT 200, * FROM t3; - - - CREATE TABLE t1(aa,bb); - CREATE TABLE IF NOT EXISTS t1(aa, bb AS (aa+1)); - PRAGMA integrity_check; - - - PRAGMA foreign_keys = true; - CREATE TABLE t0( - c0, - c1 INTEGER PRIMARY KEY, - c2 BLOB UNIQUE DEFAULT x'00', - c3 BLOB GENERATED ALWAYS AS (1), - FOREIGN KEY(c1) REFERENCES t0(c2) - ); - - - DROP TABLE t0; - CREATE TABLE t0( - c0, - c1 INTEGER PRIMARY KEY, - c3 BLOB GENERATED ALWAYS AS (1), - c2 BLOB UNIQUE DEFAULT x'00', - FOREIGN KEY(c1) REFERENCES t0(c2) - ); - - - DROP TABLE t0; - CREATE TABLE t0( - c0, - c3 BLOB GENERATED ALWAYS AS (1), - c1 INTEGER PRIMARY KEY, - c2 BLOB UNIQUE DEFAULT x'00', - FOREIGN KEY(c1) REFERENCES t0(c2) - ); - - - DROP TABLE t0; - CREATE TABLE t0( - c3 BLOB GENERATED ALWAYS AS (1), - c0, - c1 INTEGER PRIMARY KEY, - c2 BLOB UNIQUE DEFAULT x'00', - FOREIGN KEY(c1) REFERENCES t0(c2) - ); - - - CREATE TABLE t0 (c0, c1 NOT NULL AS (c0==0)); - INSERT INTO t0(c0) VALUES (0); - PRAGMA integrity_check; - - - CREATE TABLE t1(x, y AS(x+1)); - INSERT INTO t1 VALUES(10); - SELECT y FROM t1 JOIN t1 USING (y,y); - - - SELECT 123 FROM t1 JOIN t1 USING (x); - - - SELECT 456 FROM t1 JOIN t1 USING (x,x); - - - CREATE INDEX t1y ON t1(y); - SELECT y FROM t1 JOIN t1 USING (y,y); - - - CREATE INDEX t1x ON t1(x); - SELECT 123 FROM t1 JOIN t1 USING (x); - - - SELECT 456 FROM t1 JOIN t1 USING (x,x); - - - CREATE TABLE t0(c0 AS(1 >= 1), c1 UNIQUE AS(TYPEOF(c0)), c2); - INSERT INTO t0 VALUES(0); - REINDEX; - SELECT * FROM t0; - - - PRAGMA writable_schema=ON; - REPLACE INTO t1 VALUES(9); - SELECT a, quote(b) FROM t1 - - - CREATE TABLE t0(c0); - CREATE TABLE t1(c1, c2 AS(1)); - INSERT INTO t0 VALUES(0); - SELECT c0, c1, c2 FROM t0 LEFT JOIN t1; - - - DROP TABLE t1; - CREATE TABLE t1(c1, c2 AS (c1 ISNULL)); - SELECT c0, c1, c2 FROM t0 LEFT JOIN t1; - - - INSERT INTO t1(c1) VALUES(1),(NULL); - SELECT * FROM t1; - - - SELECT c0, c1, c2 FROM t0 LEFT JOIN t1 ON c0=c1; - - - CREATE TABLE t0(c0 REAL AS(1) UNIQUE, c1 INT); - INSERT INTO t0 VALUES(''); - SELECT quote(c0), quote(c1) from t0; - - - SELECT *, (1 BETWEEN CAST(t0.c0 AS TEXT) AND t0.c0) FROM t0; - - - SELECT * FROM t0 WHERE (1 BETWEEN CAST(t0.c0 AS TEXT) AND t0.c0); - - - CREATE TABLE t1(a TEXT AS(b) COLLATE nocase, b TEXT, c INT, d DEFAULT 1); - INSERT INTO t1(b,c) VALUES('abc',11),('DEF',22),('ghi',33); - SELECT a FROM t1 WHERE b='DEF' AND a='def'; - - - CREATE INDEX t1bca ON t1(b,c,a); - SELECT a FROM t1 WHERE b='DEF' AND a='def'; - - - CREATE TABLE t0(c0 UNIQUE AS(0), c1, c2); - INSERT INTO t0(c1) VALUES(0); - SELECT * FROM t0; - - - UPDATE t0 SET c1=0, c2=0 WHERE c0>=0; - SELECT * FROM t0; - - - CREATE TEMPORARY TABLE tab ( - prim DATE PRIMARY KEY, - a INTEGER, - comp INTEGER AS (a), - b INTEGER, - x INTEGER - ); - -- Add some data - INSERT INTO tab (prim, a, b) VALUES ('2001-01-01', 0, 0); - -- Check that each column is 0 like I expect - SELECT * FROM tab; - - - -- Do an UPSERT on the b column - INSERT INTO tab (prim, b) - VALUES ('2001-01-01',5) - ON CONFLICT(prim) DO UPDATE SET b=excluded.b; - -- Now b is NULL rather than 5 - SELECT * FROM tab; - - - CREATE TABLE t1( - a integer primary key, - b int generated always as (a+5), - c text GENERATED ALWAYS as (printf('%08x',a)), - d Generated - Always - AS ('xyzzy'), - e int Always default(5) - ); - INSERT INTO t1(a) VALUES(5); - SELECT name, type FROM pragma_table_xinfo('t1'); - - - CREATE TABLE t0(a PRIMARY KEY,b TEXT AS ('2') UNIQUE); - INSERT INTO t0(a) VALUES(2); - SELECT * FROM t0 AS x JOIN t0 AS y - WHERE x.b='2' - AND (y.a=2 OR (x.b LIKE '2*' AND y.a=x.b)); - - - DROP TABLE t1; - CREATE TABLE t1( - x, - a INT AS (x) VIRTUAL, - b BLOB AS (x) VIRTUAL - ); - CREATE INDEX x2 ON t1(a); - INSERT INTO t1(x) VALUES(NULL),('1'),('xyz'),(2),(3.5); - SELECT quote(a) FROM t1 INDEXED BY x2; - - - EXPLAIN SELECT a FROM t1 INDEXED BY x2; - - - EXPLAIN SELECT b FROM t1 INDEXED BY x2; - diff --git a/libsql-wal/tests/assets/fixtures/having.test b/libsql-wal/tests/assets/fixtures/having.test deleted file mode 100644 index 91d0346c6c..0000000000 --- a/libsql-wal/tests/assets/fixtures/having.test +++ /dev/null @@ -1,59 +0,0 @@ - - CREATE TABLE t2(c, d); - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t1 VALUES(2, 2); - INSERT INTO t1 VALUES(1, 3); - INSERT INTO t1 VALUES(2, 4); - INSERT INTO t1 VALUES(1, 5); - INSERT INTO t1 VALUES(2, 6); - - - SELECT x,y FROM ( - SELECT a AS x, sum(b) AS y FROM t1 - GROUP BY a - ) WHERE x BETWEEN 2 AND 9999 - - - SELECT x,y FROM ( - SELECT a AS x, sum(b) AS y FROM t1 - WHERE x BETWEEN 2 AND 9999 - GROUP BY a - ) - - - CREATE TABLE t3(a, b); - INSERT INTO t3 VALUES(1, 1); - INSERT INTO t3 VALUES(1, 2); - INSERT INTO t3 VALUES(1, 3); - INSERT INTO t3 VALUES(2, 1); - INSERT INTO t3 VALUES(2, 2); - INSERT INTO t3 VALUES(2, 3); - - - SELECT a, sum(b) FROM t3 GROUP BY a HAVING nondeter(a) - - - SELECT a, sum(b) FROM t3 WHERE nondeter(a) GROUP BY a - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(x, y); - INSERT INTO t1 VALUES('a', 'b'); - - - SELECT min(b), ( - SELECT x FROM t2 WHERE a=2 GROUP BY y HAVING 0 - ) FROM t1; - - - SELECT EXISTS ( - SELECT * FROM ( - SELECT * FROM ( - SELECT 1 - ) WHERE Col0 = 1 GROUP BY 1 - ) WHERE 0 - ) - FROM (SELECT 1 Col0) GROUP BY 1 - diff --git a/libsql-wal/tests/assets/fixtures/hexlit.test b/libsql-wal/tests/assets/fixtures/hexlit.test deleted file mode 100644 index 4a02027ead..0000000000 --- a/libsql-wal/tests/assets/fixtures/hexlit.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(x INT, y REAL); - INSERT INTO t1 VALUES('1234','4567'),('0x1234','0x4567'); - SELECT typeof(x), x, typeof(y), y, '#' FROM t1 ORDER BY rowid; - - - SELECT CAST('0x1234' AS INTEGER); - diff --git a/libsql-wal/tests/assets/fixtures/hidden.test b/libsql-wal/tests/assets/fixtures/hidden.test deleted file mode 100644 index ad0dedbfb1..0000000000 --- a/libsql-wal/tests/assets/fixtures/hidden.test +++ /dev/null @@ -1,70 +0,0 @@ - - CREATE TABLE t1(__hidden__a, b); - INSERT INTO t1 VALUES('1'); - INSERT INTO t1(__hidden__a, b) VALUES('x', 'y'); - - - SELECT * FROM t1; - - - SELECT __hidden__a, * FROM t1; - - - CREATE TABLE t4(a, __hidden__b, c); - INSERT INTO t4 SELECT 1, 2; - SELECT a, __hidden__b, c FROM t4; - - - CREATE TABLE t5(__hidden__a, b, c); - CREATE TABLE t6(__hidden__a, b, c); - INSERT INTO t6(__hidden__a, b, c) VALUES(1, 2, 3); - INSERT INTO t6(__hidden__a, b, c) VALUES(4, 5, 6); - INSERT INTO t6(__hidden__a, b, c) VALUES(7, 8, 9); - - - INSERT INTO t5 SELECT * FROM t6; - SELECT * FROM t5; - - - SELECT __hidden__a FROM t5; - - - CREATE TABLE t5a(a, b, __hidden__c); - CREATE TABLE t6a(a, b, __hidden__c); - INSERT INTO t6a(a, b, __hidden__c) VALUES(1, 2, 3); - INSERT INTO t6a(a, b, __hidden__c) VALUES(4, 5, 6); - INSERT INTO t6a(a, b, __hidden__c) VALUES(7, 8, 9); - - - INSERT INTO t5a SELECT * FROM t6a; - SELECT * FROM t5a; - - - SELECT __hidden__c FROM t5a; - - - CREATE TABLE t5b(a, __hidden__b, c); - CREATE TABLE t6b(a, b, __hidden__c); - INSERT INTO t6b(a, b, __hidden__c) VALUES(1, 2, 3); - INSERT INTO t6b(a, b, __hidden__c) VALUES(4, 5, 6); - INSERT INTO t6b(a, b, __hidden__c) VALUES(7, 8, 9); - - - INSERT INTO t5b SELECT * FROM t6b; - SELECT * FROM t5b; - - - SELECT __hidden__b FROM t5b; - - - CREATE TABLE t1(a, __hidden__b, c UNIQUE); - INSERT INTO t1(a, __hidden__b, c) VALUES(1, 2, 3); - INSERT INTO t1(a, __hidden__b, c) VALUES(4, 5, 6); - INSERT INTO t1(a, __hidden__b, c) VALUES(7, 8, 9); - DELETE FROM t1 WHERE __hidden__b = 5; - SELECT rowid, a, __hidden__b, c FROM t1; - - - VACUUM; - SELECT rowid, a, __hidden__b, c FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/hook.test b/libsql-wal/tests/assets/fixtures/hook.test deleted file mode 100644 index 67fa965093..0000000000 --- a/libsql-wal/tests/assets/fixtures/hook.test +++ /dev/null @@ -1,153 +0,0 @@ - - SELECT * FROM t4 ORDER BY a; - - - SELECT * FROM t4 ORDER BY a; - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(x, y); - CREATE TABLE t3(i, j, UNIQUE(i)); - - INSERT INTO t2 VALUES('a', 'b'); - INSERT INTO t2 VALUES('c', 'd'); - - INSERT INTO t3 VALUES(4, 16); - INSERT INTO t3 VALUES(5, 25); - INSERT INTO t3 VALUES(6, 36); - - SELECT rowid FROM t1 - - DELETE FROM t1; - DELETE FROM t2; - DELETE FROM t3; - - INSERT INTO t2 VALUES('a', 'b'); - INSERT INTO t2 VALUES('c', 'd'); - - INSERT INTO t3 VALUES(4, 16); - INSERT INTO t3 VALUES(5, 25); - INSERT INTO t3 VALUES(6, 36); - - - INSERT INTO t3 VALUES(10, 100); - SELECT rowid, * FROM t3; - - - CREATE TABLE t4(a, b); - INSERT INTO t4 VALUES('a', 1); - INSERT INTO t4 VALUES('b', 2); - INSERT INTO t4 VALUES('c', 3); - - CREATE TRIGGER t4t BEFORE DELETE ON t4 BEGIN - DELETE FROM t4 WHERE b = 1; - END; - - - INSERT INTO t4(rowid, a, b) VALUES(1, 'a', 1); - INSERT INTO t4(rowid, a, b) VALUES(3, 'c', 3); - - - CREATE TABLE t5(a, b); - INSERT INTO t5 VALUES('a', 1); - INSERT INTO t5 VALUES('b', 2); - INSERT INTO t5 VALUES('c', 3); - - CREATE TRIGGER t5t BEFORE UPDATE ON t5 BEGIN - DELETE FROM t5 WHERE b = 1; - END; - - - INSERT INTO t5(rowid, a, b) VALUES(1, 'a', 1); - - - CREATE TABLE t7(a, b); - INSERT INTO t7 VALUES('one', 'two'); - INSERT INTO t7 VALUES('three', 'four'); - ALTER TABLE t7 ADD COLUMN c DEFAULT NULL; - - - CREATE TABLE t8(a, b); - INSERT INTO t8 VALUES('one', 'two'); - INSERT INTO t8 VALUES('three', 'four'); - ALTER TABLE t8 ADD COLUMN c DEFAULT 'xxx'; - - CREATE TABLE t9(a, b INTEGER PRIMARY KEY, c) - - CREATE TABLE t1(x PRIMARY KEY); - CREATE TABLE t2(x PRIMARY KEY); - CREATE TABLE t3(x PRIMARY KEY); - CREATE TABLE t4(x PRIMARY KEY); - - CREATE TRIGGER a AFTER INSERT ON t1 BEGIN INSERT INTO t2 VALUES(new.x); END; - CREATE TRIGGER b AFTER INSERT ON t2 BEGIN INSERT INTO t3 VALUES(new.x); END; - CREATE TRIGGER c AFTER INSERT ON t3 BEGIN INSERT INTO t4 VALUES(new.x); END; - - CREATE TRIGGER d AFTER UPDATE ON t1 BEGIN UPDATE t2 SET x = new.x; END; - CREATE TRIGGER e AFTER UPDATE ON t2 BEGIN UPDATE t3 SET x = new.x; END; - CREATE TRIGGER f AFTER UPDATE ON t3 BEGIN UPDATE t4 SET x = new.x; END; - - CREATE TRIGGER g AFTER DELETE ON t1 BEGIN DELETE FROM t2 WHERE 1; END; - CREATE TRIGGER h AFTER DELETE ON t2 BEGIN DELETE FROM t3 WHERE 1; END; - CREATE TRIGGER i AFTER DELETE ON t3 BEGIN DELETE FROM t4 WHERE 1; END; - - - DROP TRIGGER a; DROP TRIGGER b; DROP TRIGGER c; - DROP TRIGGER d; DROP TRIGGER e; DROP TRIGGER f; - DROP TRIGGER g; DROP TRIGGER h; DROP TRIGGER i; - - CREATE TRIGGER a BEFORE INSERT ON t1 BEGIN INSERT INTO t2 VALUES(new.x); END; - CREATE TRIGGER b BEFORE INSERT ON t2 BEGIN INSERT INTO t3 VALUES(new.x); END; - CREATE TRIGGER c BEFORE INSERT ON t3 BEGIN INSERT INTO t4 VALUES(new.x); END; - - CREATE TRIGGER d BEFORE UPDATE ON t1 BEGIN UPDATE t2 SET x = new.x; END; - CREATE TRIGGER e BEFORE UPDATE ON t2 BEGIN UPDATE t3 SET x = new.x; END; - CREATE TRIGGER f BEFORE UPDATE ON t3 BEGIN UPDATE t4 SET x = new.x; END; - - CREATE TRIGGER g BEFORE DELETE ON t1 BEGIN DELETE FROM t2 WHERE 1; END; - CREATE TRIGGER h BEFORE DELETE ON t2 BEGIN DELETE FROM t3 WHERE 1; END; - CREATE TRIGGER i BEFORE DELETE ON t3 BEGIN DELETE FROM t4 WHERE 1; END; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - CREATE TABLE t2(a, b INTEGER PRIMARY KEY); - - - ALTER TABLE t1 ADD COLUMN d; - - - CREATE TABLE t3(a, b INTEGER PRIMARY KEY); - - SELECT * FROM t3 - - CREATE TABLE t1(a, b); - CREATE INDEX idx1 ON t1(a); - CREATE INDEX idx2 ON t1(b); - - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t1 VALUES(7, 8); - - - INSERT INTO t1 VALUES(9, 10); - INSERT INTO t1 VALUES(11, 12); - INSERT INTO t1 VALUES(13, 14); - INSERT INTO t1 VALUES(15, 16); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - CREATE TABLE t2(a INTEGER PRIMARY KEY, b) WITHOUT ROWID; - - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t2 VALUES(5, 6); - INSERT INTO t2 VALUES(7, 8); - - CREATE TABLE t3 (a INTEGER PRIMARY KEY, b) WITHOUT ROWID; - - - CREATE TABLE t4(a COLLATE nocase PRIMARY KEY, b) WITHOUT ROWID; - INSERT INTO t4 VALUES('abc', 1); - INSERT INTO t4 VALUES('DEF', 2); - diff --git a/libsql-wal/tests/assets/fixtures/hook2.test b/libsql-wal/tests/assets/fixtures/hook2.test deleted file mode 100644 index f28307a71b..0000000000 --- a/libsql-wal/tests/assets/fixtures/hook2.test +++ /dev/null @@ -1,28 +0,0 @@ - - CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT ROWID; - - - CREATE TABLE t2(a DEFAULT 4, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; - CREATE UNIQUE INDEX t2a ON t2(a); - - - CREATE TABLE d1(a DEFAULT 4, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; - CREATE UNIQUE INDEX d1a ON d1(a); - INSERT INTO d1 VALUES(1, 2, 3); - INSERT INTO d1 VALUES(11, 12, 13); - - - SELECT * FROM t2 ORDER BY b, c; - - - SELECT * FROM t2 ORDER BY b,c; - - - CREATE TABLE t3(x, y PRIMARY KEY, z UNIQUE) WITHOUT ROWID; - INSERT INTO t3 VALUES('a', 'b', 'c'); - INSERT INTO t3 VALUES('d', 'e', 'f'); - - INSERT INTO t3 VALUES(1, 1, 1); - INSERT INTO t3 VALUES(2, 2, 2); - INSERT INTO t3 VALUES(3, 3, 3); - diff --git a/libsql-wal/tests/assets/fixtures/icu.test b/libsql-wal/tests/assets/fixtures/icu.test deleted file mode 100644 index 13983df9f2..0000000000 --- a/libsql-wal/tests/assets/fixtures/icu.test +++ /dev/null @@ -1,17 +0,0 @@ - - SELECT upper(char(0xfb04,0xfb04,0xfb04,0xfb04)); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(id INTEGER PRIMARY KEY, x TEXT); - INSERT INTO t1 VALUES - (1,'abcde'), - (2,'abc_'), - (3,'abc__'), - (4,'abc%'), - (5,'abc%%'); - SELECT id FROM t1 WHERE x LIKE 'abc%%' ESCAPE '%'; - - - SELECT id FROM t1 WHERE x LIKE 'abc__' ESCAPE '_'; - diff --git a/libsql-wal/tests/assets/fixtures/ieee754.test b/libsql-wal/tests/assets/fixtures/ieee754.test deleted file mode 100644 index fab04ed6d6..0000000000 --- a/libsql-wal/tests/assets/fixtures/ieee754.test +++ /dev/null @@ -1,3 +0,0 @@ - - SELECT ieee754(4503599627370495,973) is null; - diff --git a/libsql-wal/tests/assets/fixtures/imposter1.test b/libsql-wal/tests/assets/fixtures/imposter1.test deleted file mode 100644 index 547f3ddfe8..0000000000 --- a/libsql-wal/tests/assets/fixtures/imposter1.test +++ /dev/null @@ -1,39 +0,0 @@ - - SELECT rowid FROM xt1 WHERE a IS NOT NULL; - - - SELECT a,b,c,d FROM t1 EXCEPT SELECT rowid,b,c,d FROM xt1; - SELECT rowid,b,c,d FROM xt1 EXCEPT SELECT a,b,c,d FROM t1; - - - DELETE FROM xt1 WHERE rowid=5; - INSERT INTO xt1(rowid,a,b,c,d) VALUES(99,'hello',1099,2022,NULL); - SELECT * FROM chnglog ORDER BY rowid; - - - PRAGMA integrity_check; - - - PRAGMA integrity_check; - - - PRAGMA integrity_check; - - - DELETE FROM t1; - WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<10) - INSERT INTO t1(a,b,c,d) SELECT i,i,i,i FROM c; - UPDATE xt1c SET c=NULL WHERE rowid=5; - PRAGMA integrity_check; - - - DELETE FROM t1; - WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<10) - INSERT INTO t1(a,b,c,d) SELECT i,i,i,i FROM c; - UPDATE xt1c SET c=99 WHERE rowid IN (5,7,9); - SELECT c FROM t1 ORDER BY c; - - - UPDATE xt1 SET c=99 WHERE rowid IN (5,7,9); - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/in.test b/libsql-wal/tests/assets/fixtures/in.test deleted file mode 100644 index 988d343f51..0000000000 --- a/libsql-wal/tests/assets/fixtures/in.test +++ /dev/null @@ -1,175 +0,0 @@ - - CREATE TABLE c1(a); - INSERT INTO c1 VALUES(1), (2), (4), (3); - - - SELECT * FROM c1 WHERE a IN (SELECT a FROM c1) ORDER BY 1 - - - DROP TABLE IF EXISTS t1; - CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY); - INSERT INTO t1 VALUES(1); - SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3); - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER PRIMARY KEY,b); - INSERT INTO t2 VALUES(1,11); - INSERT INTO t2 VALUES(2,22); - INSERT INTO t2 VALUES(3,33); - SELECT b, a IN (3,4,5) FROM t2 ORDER BY b; - - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(x INTEGER PRIMARY KEY); - INSERT INTO t3 VALUES(8); - SELECT CASE WHEN x NOT IN (5,6,7) THEN 'yes' ELSE 'no' END FROM t3; - SELECT CASE WHEN x NOT IN (NULL,6,7) THEN 'yes' ELSE 'no' END FROM t3; - - - SELECT CASE WHEN x NOT IN (5,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; - SELECT CASE WHEN x NOT IN (NULL,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(a INTEGER PRIMARY KEY, b INT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) - INSERT INTO t4(a,b) SELECT x, x+100 FROM c; - SELECT b FROM t4 WHERE a IN (3,null,8) ORDER BY +b; - - - SELECT b FROM t4 WHERE a NOT IN (3,null,8); - - - DROP TABLE IF EXISTS t5; - DROP TABLE IF EXISTS t6; - CREATE TABLE t5(id INTEGER PRIMARY KEY, name TEXT); - CREATE TABLE t6(id INTEGER PRIMARY KEY, name TEXT, t5_id INT); - INSERT INTO t5 VALUES(1,'Alice'),(2,'Emma'); - INSERT INTO t6 VALUES(1,'Bob',1),(2,'Cindy',1),(3,'Dave',2); - SELECT a.* - FROM t5 AS 'a' JOIN t5 AS 'b' ON b.id=a.id - WHERE b.id IN ( - SELECT t6.t5_id - FROM t6 - WHERE name='Bob' - AND t6.t5_id IS NOT NULL - AND t6.id IN ( - SELECT id - FROM (SELECT t6.id, count(*) AS x - FROM t6 - WHERE name='Bob' - ) AS 't' - WHERE x=1 - ) - AND t6.id IN (1,id) - ); - - - CREATE TABLE x1(a, b); - INSERT INTO x1(a) VALUES(1), (2), (3), (4), (5), (6); - CREATE INDEX x1i ON x1(a, b); - - - SELECT * FROM x1 - WHERE a IN (SELECT a FROM x1 WHERE (a%2)==0) - ORDER BY a DESC, b; - - - SELECT * FROM x1 - WHERE a IN (SELECT a FROM x1 WHERE (a%7)==0) - ORDER BY a DESC, b; - - - SELECT 1 IN ('1'); - - - SELECT 1 IN ('1' COLLATE nocase); - - - SELECT 1 IN (CAST('1' AS text)); - - - SELECT 1 IN (CAST('1' AS text) COLLATE nocase); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 INT UNIQUE); - INSERT INTO t0(c0) VALUES (1); - SELECT * FROM t0 WHERE '1' IN (t0.c0); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 REAL UNIQUE); - INSERT INTO t0(c0) VALUES(2.0625E00); - SELECT 1 FROM t0 WHERE c0 IN ('2.0625'); - - - SELECT c0 IN ('2.0625') FROM t0; - - - SELECT c0 = ('2.0625') FROM t0; - - - SELECT c0 = ('0.20625e+01') FROM t0; - - - SELECT c0 IN ('2.0625',2,3) FROM t0; - - - DROP TABLE t0; - CREATE TABLE t0(c0 TEXT, c1 REAL, c2, PRIMARY KEY(c2, c0, c1)); - CREATE INDEX i0 ON t0(c1 IN (c0)); - INSERT INTO t0(c0, c2) VALUES (0, NULL) ON CONFLICT(c2, c1, c0) DO NOTHING; - PRAGMA integrity_check; - - - SELECT (1 IN (2 IS TRUE)); - - - CREATE TABLE t0(c0); - SELECT COUNT(*) FROM t0 ORDER BY (t0.c0 IN ()); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x INT PRIMARY KEY, y INT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<8) - INSERT INTO t1(x,y) SELECT x, x*100 FROM c; - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INT); - INSERT INTO t2 VALUES(2),(4),(6); - SELECT * FROM t1 WHERE x IN (SELECT a FROM t2); - - - SELECT * FROM t1 WHERE x IN ((SELECT a FROM t2)); - - - SELECT * FROM t1 WHERE x IN (((SELECT a FROM t2))); - - - SELECT * FROM t1 WHERE x IN ((((((SELECT a FROM t2)))))); - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(a TEXT, b INT); - INSERT INTO t4(a,b) VALUES('abc',0),('ABC',1),('def',2); - CREATE INDEX t4x ON t4(a, +a COLLATE NOCASE); - SELECT a0.a, group_concat(a1.a) AS b - FROM t4 AS a0 JOIN t4 AS a1 - GROUP BY a0.a - HAVING (SELECT sum( (a1.a == +a0.a COLLATE NOCASE) IN (SELECT b FROM t4))); - - - SELECT a0.a, group_concat(a1.a) AS b - FROM t4 AS a0 JOIN t4 AS a1 - GROUP BY a0.a - HAVING (SELECT sum( (a1.a GLOB +a0.a COLLATE NOCASE) IN (SELECT b FROM t4))); - - - CREATE VIEW t5 AS - SELECT 1 AS b - WHERE (SELECT count(0=NOT+a COLLATE NOCASE IN (SELECT 0)) - FROM t4 - GROUP BY a); - SELECT * FROM t5; - diff --git a/libsql-wal/tests/assets/fixtures/in2.test b/libsql-wal/tests/assets/fixtures/in2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/in3.test b/libsql-wal/tests/assets/fixtures/in3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/in4.test b/libsql-wal/tests/assets/fixtures/in4.test deleted file mode 100644 index 1ff0d79daf..0000000000 --- a/libsql-wal/tests/assets/fixtures/in4.test +++ /dev/null @@ -1,273 +0,0 @@ - - SELECT * FROM t3 WHERE x=10 AND y IN (10); - - - SELECT * FROM t3 WHERE x IN (10) AND y=10; - - - SELECT * FROM t3 WHERE x IN (10) AND y IN (10); - - - SELECT * FROM t3 WHERE x=1 AND y NOT IN (10); - - - SELECT * FROM t3 WHERE x NOT IN (10) AND y=1; - - - SELECT * FROM t3 WHERE x NOT IN (10) AND y NOT IN (10); - - - DROP INDEX t3i1; - CREATE UNIQUE INDEX t3xy ON t3(x,y); - - SELECT *, '|' FROM t3 A, t3 B - WHERE A.x=10 AND A.y IN (10) - AND B.x=1 AND B.y IN (1); - - - EXPLAIN QUERY PLAN - SELECT *, '|' FROM t3 A, t3 B - WHERE A.x=10 AND A.y IN (10) - AND B.x=1 AND B.y IN (1); - - - SELECT *, '|' FROM t3 A, t3 B - WHERE A.x IN (10) AND A.y=10 - AND B.x IN (1) AND B.y=1; - - - EXPLAIN QUERY PLAN - SELECT *, '|' FROM t3 A, t3 B - WHERE A.x IN (10) AND A.y=10 - AND B.x IN (1) AND B.y=1; - - - SELECT * FROM t3 WHERE x IN (10,11); - - - EXPLAIN - SELECT * FROM t3 WHERE x IN (10,11); - - - SELECT * FROM t3 WHERE x IN (10); - - -# EXPLAIN -# SELECT * FROM t3 WHERE x IN (10); -# - - SELECT * FROM t3 WHERE x NOT IN (10,11,99999); - - - EXPLAIN - SELECT * FROM t3 WHERE x NOT IN (10,11,99999); - - - SELECT * FROM t3 WHERE x NOT IN (10); - - - EXPLAIN - SELECT * FROM t3 WHERE x NOT IN (10); - - - CREATE TABLE t4a(a TEXT, b TEXT COLLATE nocase, c); - INSERT INTO t4a VALUES('ABC','abc',1); - INSERT INTO t4a VALUES('def','xyz',2); - INSERT INTO t4a VALUES('ghi','ghi',3); - SELECT c FROM t4a WHERE a=b ORDER BY c; - - - SELECT c FROM t4a WHERE b=a ORDER BY c; - - - SELECT c FROM t4a WHERE (a||'')=b ORDER BY c; - - - SELECT c FROM t4a WHERE (a||'')=(b||'') ORDER BY c; - - - SELECT c FROM t4a WHERE a IN (b) ORDER BY c; - - - SELECT c FROM t4a WHERE (a||'') IN (b) ORDER BY c; - - - CREATE TABLE t4b(a TEXT, b NUMERIC, c); - INSERT INTO t4b VALUES('1.0',1,4); - SELECT c FROM t4b WHERE a=b; - - - SELECT c FROM t4b WHERE b=a; - - - SELECT c FROM t4b WHERE +a=b; - - - SELECT c FROM t4b WHERE a=+b; - - - SELECT c FROM t4b WHERE +b=a; - - - SELECT c FROM t4b WHERE b=+a; - - - SELECT c FROM t4b WHERE a IN (b); - - - SELECT c FROM t4b WHERE b IN (a); - - - SELECT c FROM t4b WHERE +b IN (a); - - - CREATE TABLE t5(c INTEGER PRIMARY KEY, d TEXT COLLATE nocase); - INSERT INTO t5 VALUES(17, 'fuzz'); - SELECT 1 FROM t5 WHERE 'fuzz' IN (d); -- match - SELECT 2 FROM t5 WHERE 'FUZZ' IN (d); -- no match - SELECT 3 FROM t5 WHERE d IN ('fuzz'); -- match - SELECT 4 FROM t5 WHERE d IN ('FUZZ'); -- match - - - CREATE TABLE t6a(a INTEGER PRIMARY KEY, b); - INSERT INTO t6a VALUES(1,2),(3,4),(5,6); - CREATE TABLE t6b(c INTEGER PRIMARY KEY, d); - INSERT INTO t6b VALUES(4,44),(5,55),(6,66); - - SELECT * FROM t6a, t6b WHERE a=3 AND b IN (c); - - - EXPLAIN QUERY PLAN - SELECT * FROM t6a, t6b WHERE a=3 AND b IN (c); - - - SELECT * FROM t6a, t6b WHERE a=3 AND c IN (b); - - - EXPLAIN QUERY PLAN - SELECT * FROM t6a, t6b WHERE a=3 AND c IN (b); - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(d, e); - CREATE INDEX t1bc ON t1(c, b); - INSERT INTO t2(e) VALUES(1); - INSERT INTO t1 VALUES(NULL, NULL, NULL); - - - SELECT * FROM t2 LEFT JOIN t1 ON c = d AND b IN (10,10,10); - - - CREATE VIRTUAL TABLE t1 USING rtree(a, b, c); - CREATE TABLE t2(d INTEGER, e INT); - INSERT INTO t2(e) VALUES(1); - - - SELECT * FROM t2 LEFT JOIN t1 ON c IN (d) AND b IN (10,10,10); - - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y); - CREATE UNIQUE INDEX t1y ON t1(y); - INSERT INTO t1 VALUES(111, 'AAA'),(222, 'BBB'),(333, 'CCC'); - CREATE TABLE t2(z); - INSERT INTO t2 VALUES('BBB'),('AAA'); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1', 't1y','100 1'); - - - SELECT t1.x FROM t2 CROSS JOIN t1 WHERE t2.z = t1.y; - - - SELECT t1.x FROM t2 CROSS JOIN t1 WHERE t2.z = t1.y AND +t1.x IN (111, 222); - - - SELECT t1.x FROM t2 CROSS JOIN t1 WHERE t2.z = t1.y AND t1.x IN (111, 222); - - - CREATE TABLE node(node_id INTEGER PRIMARY KEY); - CREATE TABLE edge(node_from INT, node_to INT); - CREATE TABLE sub_nodes(node_id INTEGER PRIMARY KEY); - CREATE INDEX edge_from_to ON edge(node_from,node_to); - CREATE INDEX edge_to_from ON edge(node_to,node_from); - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1 VALUES - ('sub_nodes',NULL,'1000000'), - ('edge','edge_to_from','20000000 2 2'), - ('edge','edge_from_to','20000000 2 2'), - ('node',NULL,'10000000'); - ANALYZE sqlite_schema; - - - CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,b,c)) WITHOUT ROWID; - INSERT INTO t1(a,b,c,d) VALUES - (0,-2,2,3), - (0,2,3,4), - (0,5,8,10), - (1,7,11,13); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1','t1','10 3 2 1'); - ANALYZE sqlite_schema; - PRAGMA reverse_unordered_selects(1); - SELECT d FROM t1 WHERE 0=a AND b IN (-17,-4,-3,1,5,25,7798); - - - CREATE TABLE t1(a TEXT, b INT, c INT, d INT); - INSERT INTO t1 VALUES('abc',123,4,5); - INSERT INTO t1 VALUES('xyz',1,'abcdefxyz',99); - CREATE INDEX t1abc ON t1(b,b,c); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1','t1abc','10000 5 00 2003 10'); - ANALYZE sqlite_schema; - - - SELECT * FROM t1 - WHERE b IN (345, (SELECT 1 FROM t1 - WHERE b IN (345 NOT GLOB 510) - AND c GLOB 'abc*xyz')) - AND c BETWEEN 'abc' AND 'xyz'; - - - EXPLAIN SELECT * FROM t1 - WHERE b IN (345, (SELECT 1 FROM t1 - WHERE b IN (345 NOT GLOB 510) - AND c GLOB 'abc*xyz')) - AND c BETWEEN 'abc' AND 'xyz'; - - - CREATE TABLE t1(a,b,c); - CREATE INDEX t1abc ON t1(a,b,c); - CREATE INDEX t1bca on t1(b,c,a); - INSERT INTO t1 VALUES(56,1119,1115); - INSERT INTO t1 VALUES(57,1147,1137); - INSERT INTO t1 VALUES(100,1050,1023); - INSERT INTO t1 VALUES(101,1050,1023); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1','t1abc','358677 2 2 1'); - INSERT INTO sqlite_stat1 VALUES('t1','t1bca','358677 4 2 1'); - ANALYZE sqlite_schema; - SELECT * FROM t1 NOT INDEXED - WHERE (b = 1137 AND c IN (97, 98)) - OR (b = 1119 AND c IN (1115, 1023)); - - - SELECT * FROM t1 - WHERE (b = 1137 AND c IN (97, 98)) - OR (b = 1119 AND c IN (1115, 1023)); - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, a INT, b INT, c INT); - INSERT INTO t1 VALUES(10,1,2,5); - INSERT INTO t1 VALUES(20,1,3,5); - INSERT INTO t1 VALUES(30,1,2,4); - INSERT INTO t1 VALUES(40,1,3,4); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('t1','t1x','84000 3 2 1'); - CREATE INDEX t1x ON t1(a,b,c); - PRAGMA writable_schema=RESET; - SELECT * FROM t1 - WHERE a=1 - AND b IN (2,3) - AND c BETWEEN 4 AND 5 - ORDER BY +id; - diff --git a/libsql-wal/tests/assets/fixtures/in5.test b/libsql-wal/tests/assets/fixtures/in5.test deleted file mode 100644 index 3ed35a53d7..0000000000 --- a/libsql-wal/tests/assets/fixtures/in5.test +++ /dev/null @@ -1,93 +0,0 @@ - - CREATE TABLE t1(a COLLATE nocase); - INSERT INTO t1 VALUES('one'); - INSERT INTO t1 VALUES('ONE'); - - - SELECT count(*) FROM t1 WHERE a COLLATE BINARY IN (SELECT DISTINCT a FROM t1) - - - CREATE TABLE t3(a, b); - INSERT INTO t3 VALUES(1, 1); - INSERT INTO t3 VALUES(1, 2); - INSERT INTO t3 VALUES(1, 3); - INSERT INTO t3 VALUES(2, 4); - INSERT INTO t3 VALUES(2, 5); - INSERT INTO t3 VALUES(2, 6); - INSERT INTO t3 VALUES(3, 7); - INSERT INTO t3 VALUES(3, 8); - INSERT INTO t3 VALUES(3, 9); - - - SELECT count(*) FROM t3 WHERE b IN (SELECT DISTINCT a FROM t3 LIMIT 5); - - - SELECT count(*) FROM t3 WHERE b IN (SELECT a FROM t3 LIMIT 5); - - - CREATE TABLE x1(a); - CREATE TABLE x2(b); - INSERT INTO x1 VALUES(1), (1), (2); - INSERT INTO x2 VALUES(1), (2); - SELECT count(*) FROM x2 WHERE b IN (SELECT DISTINCT a FROM x1 LIMIT 2); - - - CREATE TABLE y1(a, b); - CREATE TABLE y2(c); - - INSERT INTO y1 VALUES(1, 'one'); - INSERT INTO y1 VALUES('two', 'two'); - INSERT INTO y1 VALUES(3, 'three'); - - INSERT INTO y2 VALUES('one'); - INSERT INTO y2 VALUES('two'); - INSERT INTO y2 VALUES('three'); - - - SELECT a FROM y1 WHERE b NOT IN (SELECT a FROM y2); - - - SELECT a FROM y1 WHERE b IN (SELECT a FROM y2); - - - CREATE INDEX y2c ON y2(c); - SELECT a FROM y1 WHERE b NOT IN (SELECT a FROM y2); - - - SELECT a FROM y1 WHERE b IN (SELECT a FROM y2); - - - CREATE TABLE n1(a INTEGER PRIMARY KEY, b VARCHAR(500)); - CREATE UNIQUE INDEX n1a ON n1(a); - - - SELECT count(*) FROM n1 WHERE a IN (1, 2, 3) - - - SELECT count(*) FROM n1 WHERE a IN (SELECT +a FROM n1) - - - INSERT INTO n1 VALUES(1, NULL), (2, NULL), (3, NULL); - SELECT count(*) FROM n1 WHERE a IN (1, 2, 3) - - - SELECT count(*) FROM n1 WHERE a IN (SELECT +a FROM n1) - - - CREATE TABLE t9(a INTEGER PRIMARY KEY); - INSERT INTO t9 VALUES (44), (45); - - - SELECT * FROM t9 WHERE a IN (44, 45, 44, 45) - - - CREATE TABLE t0(c0); - CREATE VIEW v0(c0) AS SELECT LOWER(CAST('1e500' AS TEXT)) FROM t0; - INSERT INTO t0(c0) VALUES (NULL); - - - SELECT lower('1e500') FROM t0 WHERE rowid NOT IN (0, 0, lower('1e500')); - - - SELECT lower('1e500') FROM t0 WHERE rowid != lower('1e500'); - diff --git a/libsql-wal/tests/assets/fixtures/in6.test b/libsql-wal/tests/assets/fixtures/in6.test deleted file mode 100644 index 1724d64e2b..0000000000 --- a/libsql-wal/tests/assets/fixtures/in6.test +++ /dev/null @@ -1,42 +0,0 @@ - - SELECT d FROM t1 - WHERE a=100 - AND b IN (200,201,202,204) - AND c IN (300,302,301,305) - ORDER BY +d; - - - CREATE TABLE t2(e INT UNIQUE, f TEXT); - SELECT d, f FROM t1 LEFT JOIN t2 ON (e=d) - WHERE a=100 - AND b IN (200,201,202,204) - AND c IN (300,302,301,305) - ORDER BY +d; - - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(0); - CREATE TABLE t2(b, c, d); - INSERT INTO t2(b,c,d) VALUES(4,5,3),(4,5,4),(4,5,8); - CREATE INDEX t2bcd ON t2(b, c, d); - SELECT * FROM t1 LEFT JOIN t2 ON b=NULL AND c=5 AND d IN (2,3,4); - - - CREATE TABLE v0(v1); - CREATE TABLE v3(v5, v4); - INSERT INTO v0 VALUES(0); - CREATE INDEX v9 ON v3(v4, v4, v5); - SELECT quote(v5) FROM v0 LEFT JOIN v3 ON v4 = NULL AND v5 IN(0); - - - CREATE TABLE t1(a TEXT, b TEXT); - INSERT INTO t1 VALUES(null,10),(0,10),(10,10); - CREATE INDEX t1ab ON t1(a,b); - SELECT quote(a), quote(b), '|' FROM t1 WHERE b in (SELECT a FROM t1) AND a=0; - - - CREATE TABLE t2(x TEXT); - INSERT INTO t2(x) VALUES(NULL),(0),(10); - SELECT quote(x), quote(a), quote(b), 'x' - FROM t2 LEFT JOIN t1 ON a=x AND b in (null,0,10); - diff --git a/libsql-wal/tests/assets/fixtures/incrblob.test b/libsql-wal/tests/assets/fixtures/incrblob.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/incrblob2.test b/libsql-wal/tests/assets/fixtures/incrblob2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/incrblob3.test b/libsql-wal/tests/assets/fixtures/incrblob3.test deleted file mode 100644 index e3f91b8dec..0000000000 --- a/libsql-wal/tests/assets/fixtures/incrblob3.test +++ /dev/null @@ -1,18 +0,0 @@ - - CREATE TABLE blobs(k INTEGER PRIMARY KEY, v BLOB); - INSERT INTO blobs VALUES(1, zeroblob(100)); - INSERT INTO blobs VALUES(2, zeroblob(100)); - - - INSERT INTO blobs VALUES(3, 42); - INSERT INTO blobs VALUES(4, 54.4); - INSERT INTO blobs VALUES(5, NULL); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b); - - INSERT INTO t1 VALUES(4, 'hello'); - INSERT INTO aux.t1 VALUES(4, 'world'); - diff --git a/libsql-wal/tests/assets/fixtures/incrblob4.test b/libsql-wal/tests/assets/fixtures/incrblob4.test deleted file mode 100644 index e5ea7abde5..0000000000 --- a/libsql-wal/tests/assets/fixtures/incrblob4.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b); - INSERT INTO t2 VALUES(456, '0123456789'); - diff --git a/libsql-wal/tests/assets/fixtures/incrblob_err.test b/libsql-wal/tests/assets/fixtures/incrblob_err.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/incrblobfault.test b/libsql-wal/tests/assets/fixtures/incrblobfault.test deleted file mode 100644 index 7d43521185..0000000000 --- a/libsql-wal/tests/assets/fixtures/incrblobfault.test +++ /dev/null @@ -1,15 +0,0 @@ - - CREATE TABLE blob(x INTEGER PRIMARY KEY, v BLOB); - INSERT INTO blob VALUES(1, 'hello world'); - INSERT INTO blob VALUES(2, 'world hello'); - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - INSERT INTO blob SELECT NULL, v FROM blob; - diff --git a/libsql-wal/tests/assets/fixtures/incrcorrupt.test b/libsql-wal/tests/assets/fixtures/incrcorrupt.test deleted file mode 100644 index 217a4e6fe2..0000000000 --- a/libsql-wal/tests/assets/fixtures/incrcorrupt.test +++ /dev/null @@ -1,22 +0,0 @@ - - PRAGMA auto_vacuum = 2; - CREATE TABLE t1(a PRIMARY KEY, b); - - WITH data(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM data - ) - INSERT INTO t1 SELECT i, randomblob(600) FROM data LIMIT 20; - PRAGMA page_count; - - - PRAGMA incremental_vacuum; - - - PRAGMA auto_vacuum = 1; - CREATE TABLE t1(a PRIMARY KEY, b); - WITH data(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM data - ) - INSERT INTO t1 SELECT i, randomblob(600) FROM data LIMIT 20; - PRAGMA page_count; - diff --git a/libsql-wal/tests/assets/fixtures/incrvacuum.test b/libsql-wal/tests/assets/fixtures/incrvacuum.test deleted file mode 100644 index f1c33a9d95..0000000000 --- a/libsql-wal/tests/assets/fixtures/incrvacuum.test +++ /dev/null @@ -1,19 +0,0 @@ - - PRAGMA auto_vacuum = 2; - CREATE TABLE t3(a); - INSERT INTO t3 VALUES(1), (2), (3), (4); - - CREATE TABLE t2(x); - INSERT INTO t2 VALUES( randomblob(1000) ); - INSERT INTO t2 VALUES( randomblob(1000) ); - INSERT INTO t2 VALUES( randomblob(1000) ); - INSERT INTO t2 VALUES( randomblob(1000) ); - INSERT INTO t2 VALUES( randomblob(1000) ); - INSERT INTO t2 VALUES( randomblob(1000) ); - - - PRAGMA mmap_size = 1000000; - BEGIN; - DELETE FROM t2; - PRAGMA incremental_vacuum = 1000; - diff --git a/libsql-wal/tests/assets/fixtures/incrvacuum2.test b/libsql-wal/tests/assets/fixtures/incrvacuum2.test deleted file mode 100644 index e7313fb25f..0000000000 --- a/libsql-wal/tests/assets/fixtures/incrvacuum2.test +++ /dev/null @@ -1,20 +0,0 @@ - - PRAGMA page_size = 512; - PRAGMA auto_vacuum = 2; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(400)); - INSERT INTO t1 SELECT * FROM t1; -- 2 - INSERT INTO t1 SELECT * FROM t1; -- 4 - INSERT INTO t1 SELECT * FROM t1; -- 8 - INSERT INTO t1 SELECT * FROM t1; -- 16 - INSERT INTO t1 SELECT * FROM t1; -- 32 - INSERT INTO t1 SELECT * FROM t1; -- 128 - INSERT INTO t1 SELECT * FROM t1; -- 256 - INSERT INTO t1 SELECT * FROM t1; -- 512 - INSERT INTO t1 SELECT * FROM t1; -- 1024 - INSERT INTO t1 SELECT * FROM t1; -- 2048 - INSERT INTO t1 SELECT * FROM t1; -- 4096 - INSERT INTO t1 SELECT * FROM t1; -- 8192 - DELETE FROM t1 WHERE oid>512; - DELETE FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/incrvacuum3.test b/libsql-wal/tests/assets/fixtures/incrvacuum3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/incrvacuum_ioerr.test b/libsql-wal/tests/assets/fixtures/incrvacuum_ioerr.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/index.test b/libsql-wal/tests/assets/fixtures/index.test deleted file mode 100644 index 0f587762c6..0000000000 --- a/libsql-wal/tests/assets/fixtures/index.test +++ /dev/null @@ -1,24 +0,0 @@ - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a, b TEXT); - CREATE UNIQUE INDEX IF NOT EXISTS x1 ON t1(b==0); - CREATE INDEX IF NOT EXISTS x2 ON t1(a || 0) WHERE b; - INSERT INTO t1(a,b) VALUES('a',1),('a',0); - SELECT a, b, '|' FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1(a TEXT, b REAL); - CREATE UNIQUE INDEX t1x1 ON t1(a GLOB b); - INSERT INTO t1(a,b) VALUES('0.0','1'),('1.0','1'); - SELECT * FROM t1; - REINDEX; - - - DROP TABLE t1; - CREATE TABLE t1(a REAL); - CREATE UNIQUE INDEX index_0 ON t1(TYPEOF(a)); - INSERT OR IGNORE INTO t1(a) VALUES (0.1),(FALSE); - SELECT * FROM t1; - REINDEX; - diff --git a/libsql-wal/tests/assets/fixtures/index2.test b/libsql-wal/tests/assets/fixtures/index2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/index3.test b/libsql-wal/tests/assets/fixtures/index3.test deleted file mode 100644 index c7fe657f25..0000000000 --- a/libsql-wal/tests/assets/fixtures/index3.test +++ /dev/null @@ -1,29 +0,0 @@ - - DROP TABLE t1; - CREATE TABLE t1(a, b, c, d, e, - PRIMARY KEY('a'), UNIQUE('b' COLLATE nocase DESC)); - CREATE INDEX t1c ON t1('c'); - CREATE INDEX t1d ON t1('d' COLLATE binary ASC); - WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<30) - INSERT INTO t1(a,b,c,d,e) - SELECT x, printf('ab%03xxy',x), x, x, x FROM c; - - - SELECT a FROM t1 WHERE b='ab005xy' COLLATE nocase; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b='ab005xy' COLLATE nocase; - - - SELECT name FROM sqlite_master WHERE tbl_name='t1' ORDER BY name - - - CREATE TABLE t2a(a integer, b, PRIMARY KEY(a)); - CREATE TABLE t2b("a" integer, b, PRIMARY KEY("a")); - CREATE TABLE t2c([a] integer, b, PRIMARY KEY([a])); - CREATE TABLE t2d('a' integer, b, PRIMARY KEY('a')); - - - SELECT name FROM sqlite_master WHERE tbl_name LIKE 't2_' ORDER BY name - diff --git a/libsql-wal/tests/assets/fixtures/index4.test b/libsql-wal/tests/assets/fixtures/index4.test deleted file mode 100644 index 461db9b519..0000000000 --- a/libsql-wal/tests/assets/fixtures/index4.test +++ /dev/null @@ -1,83 +0,0 @@ - - BEGIN; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(102)); - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 2 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 4 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 8 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 16 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 32 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 64 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 128 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 256 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 512 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 1024 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 2048 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 4096 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 8192 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 16384 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 32768 - INSERT INTO t1 SELECT randomblob(102) FROM t1; -- 65536 - COMMIT; - - - CREATE INDEX i1 ON t1(x); - - - PRAGMA integrity_check - - - PRAGMA cache_size = 10; - CREATE INDEX i2 ON t1(x); - - - PRAGMA integrity_check - - - BEGIN; - DROP TABLE t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('a'); - INSERT INTO t1 VALUES('b'); - INSERT INTO t1 VALUES('c'); - INSERT INTO t1 VALUES('d'); - INSERT INTO t1 VALUES('e'); - INSERT INTO t1 VALUES('f'); - INSERT INTO t1 VALUES('g'); - INSERT INTO t1 VALUES(NULL); - INSERT INTO t1 SELECT randomblob(1202) FROM t1; -- 16 - INSERT INTO t1 SELECT randomblob(2202) FROM t1; -- 32 - INSERT INTO t1 SELECT randomblob(3202) FROM t1; -- 64 - INSERT INTO t1 SELECT randomblob(4202) FROM t1; -- 128 - INSERT INTO t1 SELECT randomblob(5202) FROM t1; -- 256 - COMMIT; - CREATE INDEX i1 ON t1(x); - PRAGMA integrity_check - - - BEGIN; - DROP TABLE t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('a'); - COMMIT; - CREATE INDEX i1 ON t1(x); - PRAGMA integrity_check - - - BEGIN; - DROP TABLE t1; - CREATE TABLE t1(x); - COMMIT; - CREATE INDEX i1 ON t1(x); - PRAGMA integrity_check - - - BEGIN; - CREATE TABLE t2(x); - INSERT INTO t2 VALUES(14); - INSERT INTO t2 VALUES(35); - INSERT INTO t2 VALUES(15); - INSERT INTO t2 VALUES(35); - INSERT INTO t2 VALUES(16); - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/index5.test b/libsql-wal/tests/assets/fixtures/index5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/index6.test b/libsql-wal/tests/assets/fixtures/index6.test deleted file mode 100644 index 0fd0734f28..0000000000 --- a/libsql-wal/tests/assets/fixtures/index6.test +++ /dev/null @@ -1,255 +0,0 @@ - - SELECT count(*) FROM t1; - - - DROP INDEX IF EXISTS bad1; - - - DROP INDEX t2a1; - UPDATE t2 SET a=b, b=b+10000; - SELECT b FROM t2 WHERE a=15; - - - CREATE INDEX t2a2 ON t2(a) WHERE a<100 OR a>200; - SELECT b FROM t2 WHERE a=15; - PRAGMA integrity_check; - - - EXPLAIN QUERY PLAN - SELECT b FROM t2 WHERE a=15; - - - SELECT b FROM t2 WHERE a=15 AND a<100; - - - EXPLAIN QUERY PLAN - SELECT b FROM t2 WHERE a=15 AND a<100; - - - SELECT b FROM t2 WHERE a=515 AND a>200; - - - EXPLAIN QUERY PLAN - SELECT b FROM t2 WHERE a=515 AND a>200; - - - CREATE TABLE t3(a,b); - INSERT INTO t3 SELECT value, value FROM nums WHERE value<200; - UPDATE t3 SET a=999 WHERE b%5!=0; - CREATE UNIQUE INDEX t3a ON t3(a) WHERE a<>999; - - - SELECT count(*) FROM t3 WHERE a=999; - - - VACUUM; - PRAGMA integrity_check; - - - CREATE INDEX t3b ON t3(b) WHERE xyzzy.t3.b BETWEEN 5 AND 10; - /* ^^^^^-- ignored */ - ANALYZE; - SELECT count(*) FROM t3 WHERE t3.b BETWEEN 5 AND 10; - SELECT stat+0 FROM sqlite_stat1 WHERE idx='t3b'; - - - CREATE TABLE t6(a,b); - CREATE UNIQUE INDEX t6ab ON t1(a,b); - CREATE INDEX t6b ON t6(b) WHERE b=1; - INSERT INTO t6(a,b) VALUES(123,456); - SELECT * FROM t6; - - - UPDATE OR REPLACE t6 SET b=789; - SELECT * FROM t6; - - - PRAGMA integrity_check; - - - CREATE TABLE t7a(x); - CREATE TABLE t7b(y); - INSERT INTO t7a(x) VALUES(1); - CREATE INDEX t7ax ON t7a(x) WHERE x=99; - PRAGMA automatic_index=OFF; - SELECT * FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x; - - - INSERT INTO t7b(y) VALUES(2); - SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x; - - - INSERT INTO t7a(x) VALUES(99); - SELECT * FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x; - - - SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x; - - - EXPLAIN QUERY PLAN - SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x; - - - CREATE TABLE t8a(a,b); - CREATE TABLE t8b(x,y); - CREATE INDEX i8c ON t8b(y) WHERE x = 'value'; - - INSERT INTO t8a VALUES(1, 'one'); - INSERT INTO t8a VALUES(2, 'two'); - INSERT INTO t8a VALUES(3, 'three'); - - INSERT INTO t8b VALUES('value', 1); - INSERT INTO t8b VALUES('dummy', 2); - INSERT INTO t8b VALUES('value', 3); - INSERT INTO t8b VALUES('dummy', 4); - - - SELECT * FROM t8a LEFT JOIN t8b ON (x = 'value' AND y = a) - - - CREATE TABLE t9(a int, b int, c int); - CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20); - INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3); - UPDATE t9 SET b=c WHERE a in (10,12,20); - SELECT a,b,c,'|' FROM t9 ORDER BY a; - - - DROP TABLE t9; - CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a)) WITHOUT ROWID; - CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20); - INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5); - UPDATE t9 SET b=c WHERE a in (10,12,20); - SELECT a,b,c,'|' FROM t9 ORDER BY a; - - - CREATE TABLE t10(a,b,c,d,e INTEGER PRIMARY KEY); - INSERT INTO t10 VALUES - (1,2,3,4,5), - (2,3,4,5,6), - (3,4,5,6,7), - (1,2,3,8,9); - CREATE INDEX t10x ON t10(d) WHERE a=1 AND b=2 AND c=3; - SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d; - - - EXPLAIN QUERY PLAN - SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d; - - - SELECT e FROM t10 WHERE c=3 AND 2=b AND a=1 ORDER BY d DESC; - - - EXPLAIN QUERY PLAN - SELECT e FROM t10 WHERE c=3 AND 2=b AND a=1 ORDER BY d DESC; - - - SELECT e FROM t10 WHERE a=1 AND b=2 ORDER BY d DESC; - - - EXPLAIN QUERY PLAN - SELECT e FROM t10 WHERE a=1 AND b=2 ORDER BY d DESC; - - - CREATE TABLE t11(a,b,c); - CREATE INDEX t11x ON t11(a) WHERE b<>99; - EXPLAIN QUERY PLAN SELECT a FROM t11 WHERE b<>99; - - - EXPLAIN QUERY PLAN SELECT a FROM t11 WHERE b<>99 AND c<>98; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,1); - INSERT INTO t1 VALUES(2,2); - CREATE TABLE t2(x); - INSERT INTO t2 VALUES(1); - INSERT INTO t2 VALUES(2); - SELECT 'one', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); - CREATE INDEX t1a ON t1(a) WHERE b=1; - SELECT 'two', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); - - - SELECT x FROM t2 WHERE x IN (SELECT a FROM t1) ORDER BY +x; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0); - CREATE INDEX index_0 ON t0(c0) WHERE c0 NOT NULL; - INSERT INTO t0(c0) VALUES (NULL); - SELECT * FROM t0 WHERE c0 OR 1; - - - CREATE TABLE IF NOT EXISTS t0 (c0, c1); - CREATE INDEX IF NOT EXISTS i0 ON t0(c0, c1) WHERE c0 NOT NULL; - INSERT INTO t0(c0, c1) VALUES(NULL, 'row'); - SELECT * FROM t0 WHERE t0.c0 IS NOT 1; - - - SELECT * FROM t0 WHERE CASE c0 WHEN 0 THEN 0 ELSE 1 END; - - - DROP TABLE t0; - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES (NULL); - CREATE INDEX i0 ON t0(1) WHERE c0 NOT NULL; - SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) IS FALSE; - - - SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) BETWEEN FALSE AND TRUE; - - - SELECT 1 FROM t0 WHERE TRUE BETWEEN (t0.c0 IS FALSE) AND TRUE; - - - SELECT 1 FROM t0 WHERE FALSE BETWEEN FALSE AND (t0.c0 IS FALSE); - - - SELECT 1 FROM t0 WHERE (c0 IS FALSE) IN (FALSE); - - - DROP TABLE t0; - CREATE TABLE t0(c0 COLLATE NOCASE, c1); - CREATE INDEX i0 ON t0(0) WHERE c0 >= c1; - INSERT INTO t0 VALUES('a', 'B'); - SELECT c1 <= c0, c0 >= c1 FROM t0; - - - SELECT 2 FROM t0 WHERE c0 >= c1; - - - SELECT 3 FROM t0 WHERE c1 <= c0; - - - CREATE TABLE t0(c0); - CREATE INDEX i0 ON t0(0) WHERE c0 GLOB c0; - INSERT INTO t0 VALUES (0); - CREATE UNIQUE INDEX i1 ON t0(0); - PRAGMA integrity_check; - - - CREATE UNIQUE INDEX i2 ON t0(0); - REPLACE INTO t0 VALUES(0); - PRAGMA integrity_check; - - - SELECT COUNT(*) FROM t0 WHERE t0.c0 GLOB t0.c0; - - - CREATE TABLE t1(a INT, b INT); - INSERT INTO t1 VALUES(10,10); - CREATE UNIQUE INDEX t1b ON t1(b) WHERE a>NULL; - SELECT * FROM t1 WHERE a IS NOT NULL; - - - CREATE TABLE t1(a INT, b INT); - INSERT INTO t1(a) VALUES(2); - CREATE TABLE t2(c INT); - CREATE INDEX i0 ON t2(c) WHERE c=3; - CREATE TABLE t3(d INT); - INSERT INTO t3 VALUES(1); - - - SELECT * FROM t2 RIGHT JOIN t3 ON d<>0 LEFT JOIN t1 ON c=3 WHERE t1.a<>0; - diff --git a/libsql-wal/tests/assets/fixtures/index7.test b/libsql-wal/tests/assets/fixtures/index7.test deleted file mode 100644 index cc507f79d1..0000000000 --- a/libsql-wal/tests/assets/fixtures/index7.test +++ /dev/null @@ -1,97 +0,0 @@ - - SELECT count(*) FROM t1; - - - INSERT INTO t1(a,b,c) - VALUES('abcde',1,101),('abdef',2,102),('xyz',3,103),('abcz',4,104); - SELECT c FROM t1 WHERE a NOT LIKE 'abc%' AND a=7 ORDER BY +b; - - - EXPLAIN QUERY PLAN - SELECT b FROM t1 WHERE a NOT LIKE 'abc%' AND a=7 ORDER BY +b; - - - DELETE FROM t1 WHERE c>=101; - DROP INDEX IF EXISTS bad1; - - - DROP INDEX t2a1; - UPDATE t2 SET a=b, b=b+10000; - SELECT b FROM t2 WHERE a=15; - - - CREATE INDEX t2a2 ON t2(a) WHERE a<100 OR a>200; - SELECT b FROM t2 WHERE a=15; - PRAGMA integrity_check; - - - EXPLAIN QUERY PLAN - SELECT b FROM t2 WHERE a=15; - - - SELECT b FROM t2 WHERE a=15 AND a<100; - - - EXPLAIN QUERY PLAN - SELECT b FROM t2 WHERE a=15 AND a<100; - - - SELECT b FROM t2 WHERE a=515 AND a>200; - - - EXPLAIN QUERY PLAN - SELECT b FROM t2 WHERE a=515 AND a>200; - - - CREATE TABLE t3(a,b PRIMARY KEY) without rowid; - INSERT INTO t3 SELECT value, value FROM nums WHERE value<200; - UPDATE t3 SET a=999 WHERE b%5!=0; - CREATE UNIQUE INDEX t3a ON t3(a) WHERE a<>999; - - - SELECT count(*) FROM t3 WHERE a=999; - - - VACUUM; - PRAGMA integrity_check; - - - CREATE INDEX t3b ON t3(b) WHERE xyzzy.t3.b BETWEEN 5 AND 10; - /* ^^^^^-- ignored */ - ANALYZE; - SELECT count(*) FROM t3 WHERE t3.b BETWEEN 5 AND 10; - SELECT stat+0 FROM sqlite_stat1 WHERE idx='t3b'; - - - CREATE TABLE t5(a, b); - CREATE TABLE t4(c, d); - INSERT INTO t5 VALUES(1, 'xyz'); - INSERT INTO t4 VALUES('abc', 'not xyz'); - SELECT * FROM (SELECT * FROM t5 WHERE a=1 AND b='xyz'), t4 WHERE c='abc'; - - - CREATE INDEX i4 ON t4(c) WHERE d='xyz'; - SELECT * FROM (SELECT * FROM t5 WHERE a=1 AND b='xyz'), t4 WHERE c='abc'; - - - CREATE VIEW v4 AS SELECT * FROM t4; - INSERT INTO t4 VALUES('def', 'xyz'); - SELECT * FROM v4 WHERE d='xyz' AND c='def' - - - CREATE TABLE t6(x, y); - INSERT INTO t6 VALUES(1, 1); - INSERT INTO t6 VALUES(0, 0); - SELECT * FROM t6 WHERE y IS TRUE ORDER BY x; - - - CREATE INDEX i6 ON t6(x) WHERE y IS NOT TRUE; - SELECT * FROM t6 WHERE y IS TRUE ORDER BY x; - - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y); - CREATE INDEX t1y ON t1(y) WHERE y IS NOT NULL; - INSERT INTO t1(x) VALUES(1),(2); - ANALYZE; - EXPLAIN QUERY PLAN SELECT 1 FROM t1 WHERE y=5; - diff --git a/libsql-wal/tests/assets/fixtures/index8.test b/libsql-wal/tests/assets/fixtures/index8.test deleted file mode 100644 index 1155fad965..0000000000 --- a/libsql-wal/tests/assets/fixtures/index8.test +++ /dev/null @@ -1,21 +0,0 @@ - - CREATE TABLE t1(a,b,c,d); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c,d) - SELECT x/10, x%10, x%19, x FROM c; - CREATE INDEX t1abc ON t1(a,b,c); - SELECT * FROM t1 WHERE c=4 ORDER BY a, b LIMIT 2; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE c=4 ORDER BY a, b LIMIT 2; - - - DROP INDEX t1abc; - CREATE INDEX t1abd ON t1(a,b,d); - SELECT * FROM t1 WHERE c=4 ORDER BY a, b LIMIT 2; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE c=4 ORDER BY a, b LIMIT 2; - diff --git a/libsql-wal/tests/assets/fixtures/index9.test b/libsql-wal/tests/assets/fixtures/index9.test deleted file mode 100644 index 4b59ef31e5..0000000000 --- a/libsql-wal/tests/assets/fixtures/index9.test +++ /dev/null @@ -1,13 +0,0 @@ - - CREATE TABLE t1(x, y); - CREATE INDEX t1x ON t1(x) WHERE y=45; - - - CREATE INDEX t1x2 ON t1(x) WHERE y=-20111000111 - - - CREATE INDEX t1x3 ON t1(x) WHERE y=9223372036854775807 - - - CREATE INDEX t1x4 ON t1(x) WHERE y=-9223372036854775808 - diff --git a/libsql-wal/tests/assets/fixtures/indexA.test b/libsql-wal/tests/assets/fixtures/indexA.test deleted file mode 100644 index c054a0364e..0000000000 --- a/libsql-wal/tests/assets/fixtures/indexA.test +++ /dev/null @@ -1,119 +0,0 @@ - - CREATE TABLE t1(a TEXT, b, c); - CREATE INDEX i1 ON t1(b, c) WHERE a='abc'; - INSERT INTO t1 VALUES('abc', 1, 2); - - - SELECT * FROM t1 WHERE a='abc' - - - CREATE INDEX i2 ON t1(b, c) WHERE a=5; - INSERT INTO t1 VALUES(5, 4, 3); - - SELECT a, typeof(a), b, c FROM t1 WHERE a=5; - - - CREATE TABLE t2(x); - INSERT INTO t2 VALUES('v'); - - - SELECT x, a, b, c FROM t2 LEFT JOIN t1 ON (a=5 AND b=x) - - - SELECT x, a, b, c FROM t2 RIGHT JOIN t1 ON (t1.a=5 AND t1.b=t2.x) - - - CREATE TABLE x1(a TEXT, b, c); - INSERT INTO x1 VALUES('2', 'two', 'ii'); - INSERT INTO x1 VALUES('2.0', 'twopointoh', 'ii.0'); - - CREATE TABLE x2(a NUMERIC, b, c); - INSERT INTO x2 VALUES('2', 'two', 'ii'); - INSERT INTO x2 VALUES('2.0', 'twopointoh', 'ii.0'); - - CREATE TABLE x3(a REAL, b, c); - INSERT INTO x3 VALUES('2', 'two', 'ii'); - INSERT INTO x3 VALUES('2.0', 'twopointoh', 'ii.0'); - - - CREATE TABLE x1(a TEXT, d PRIMARY KEY, b, c) WITHOUT ROWID; - INSERT INTO x1 VALUES('2', 1, 'two', 'ii'); - INSERT INTO x1 VALUES('2.0', 2, 'twopointoh', 'ii.0'); - - CREATE TABLE x2(a NUMERIC, b, c, d PRIMARY KEY) WITHOUT ROWID; - INSERT INTO x2 VALUES('2', 'two', 'ii', 1); - INSERT INTO x2 VALUES('2.0', 'twopointoh', 'ii.0', 2); - - CREATE TABLE x3(d PRIMARY KEY, a REAL, b, c) WITHOUT ROWID; - INSERT INTO x3 VALUES(34, '2', 'two', 'ii'); - INSERT INTO x3 VALUES(35, '2.0', 'twopointoh', 'ii.0'); - - - CREATE TABLE t2(a INTEGER, b TEXT); - INSERT INTO t2 VALUES(1, 'two'); - INSERT INTO t2 VALUES(2, 'two'); - INSERT INTO t2 VALUES(3, 'two'); - INSERT INTO t2 VALUES(1, 'three'); - INSERT INTO t2 VALUES(2, 'three'); - INSERT INTO t2 VALUES(3, 'three'); - - CREATE INDEX t2a_two ON t2(a) WHERE b='two'; - - - SELECT sum(a), b FROM t2 WHERE b='two' - - - CREATE TABLE t1(a INTEGER PRIMQRY KEY, b, c); - - - CREATE INDEX ex1 ON t1(c) WHERE b IS 'abc' COLLATE xyz; - - - SELECT * FROM t1 - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - CREATE TABLE t2(x INTEGER PRIMARY KEY, y INTEGER, z INTEGER); - INSERT INTO t1 VALUES(1, 1, 1); - INSERT INTO t1 VALUES(2, 1, 2); - INSERT INTO t2 VALUES(1, 5, 1); - INSERT INTO t2 VALUES(2, 5, 2); - - CREATE INDEX t2z ON t2(z) WHERE y=5; - - - ANALYZE; - UPDATE sqlite_stat1 SET stat = '50 1' WHERE idx='t2z'; - UPDATE sqlite_stat1 SET stat = '50' WHERE tbl='t2' AND idx IS NULL; - UPDATE sqlite_stat1 SET stat = '5000' WHERE tbl='t1' AND idx IS NULL; - ANALYZE sqlite_schema; - - - SELECT * FROM t1, t2 WHERE b=1 AND z=c AND y=5; - - - SELECT * FROM t1 LEFT JOIN t2 ON (y=5) WHERE b=1 AND z IS c; - - - CREATE INDEX t2yz ON t2(y, z) WHERE y=5; - - - SELECT * FROM t1 LEFT JOIN t2 ON (y=5) WHERE b=1 AND z IS c; - - - CREATE TABLE t1(i INTEGER PRIMARY KEY, b TEXT, c TEXT); - CREATE INDEX i1 ON t1(c) WHERE b='abc' AND i=5; - INSERT INTO t1 VALUES(5, 'abc', 'xyz'); - SELECT * FROM t1 INDEXED BY i1 WHERE b='abc' AND i=5 ORDER BY c; - - - CREATE TABLE t1(a, b, c); - CREATE INDEX ex2 ON t1(a, 4); - CREATE INDEX ex1 ON t1(a) WHERE 4=b; - INSERT INTO t1 VALUES(1, 4, 1); - INSERT INTO t1 VALUES(1, 5, 1); - INSERT INTO t1 VALUES(2, 4, 2); - - - SELECT * FROM t1 WHERE b=4; - diff --git a/libsql-wal/tests/assets/fixtures/indexedby.test b/libsql-wal/tests/assets/fixtures/indexedby.test deleted file mode 100644 index 86cf19cd46..0000000000 --- a/libsql-wal/tests/assets/fixtures/indexedby.test +++ /dev/null @@ -1,52 +0,0 @@ - - CREATE VIEW v2 AS SELECT * FROM t1 INDEXED BY i1 WHERE a > 5; - EXPLAIN QUERY PLAN SELECT * FROM v2 - - - EXPLAIN QUERY PLAN SELECT * FROM v2 WHERE b = 10 - - - CREATE TABLE x1(a, b TEXT); - CREATE INDEX x1i ON x1(a, b); - INSERT INTO x1 VALUES(1, 1); - INSERT INTO x1 VALUES(1, 1); - INSERT INTO x1 VALUES(1, 1); - INSERT INTO x1 VALUES(1, 1); - - - SELECT a,b,rowid FROM x1 INDEXED BY x1i WHERE a=1 AND b=1 AND rowid=3; - - - SELECT a,b,rowid FROM x1 INDEXED BY x1i WHERE a=1 AND b=1 AND rowid='3'; - - - SELECT a,b,rowid FROM x1 INDEXED BY x1i WHERE a=1 AND b=1 AND rowid='3.0'; - - - CREATE TABLE x2(c INTEGER PRIMARY KEY, a, b TEXT); - CREATE INDEX x2i ON x2(a, b); - INSERT INTO x2 VALUES(1, 1, 1); - INSERT INTO x2 VALUES(2, 1, 1); - INSERT INTO x2 VALUES(3, 1, 1); - INSERT INTO x2 VALUES(4, 1, 1); - - - SELECT a,b,c FROM x2 INDEXED BY x2i WHERE a=1 AND b=1 AND c=3; - - - SELECT a,b,c FROM x2 INDEXED BY x2i WHERE a=1 AND b=1 AND c='3'; - - - SELECT a,b,c FROM x2 INDEXED BY x2i WHERE a=1 AND b=1 AND c='3.0'; - - - CREATE TABLE o1(x INTEGER PRIMARY KEY, y, z); - CREATE INDEX p1 ON o1(z); - CREATE INDEX p2 ON o1(y) WHERE z=1; - - - DROP INDEX p1; - DROP INDEX p2; - CREATE INDEX p2 ON o1(y) WHERE z=1; - CREATE INDEX p1 ON o1(z); - diff --git a/libsql-wal/tests/assets/fixtures/indexexpr1.test b/libsql-wal/tests/assets/fixtures/indexexpr1.test deleted file mode 100644 index 9aece9cc33..0000000000 --- a/libsql-wal/tests/assets/fixtures/indexexpr1.test +++ /dev/null @@ -1,443 +0,0 @@ - - CREATE TABLE t1(a,b,c); - INSERT INTO t1(a,b,c) - /* 123456789 123456789 123456789 123456789 123456789 123456789 */ - VALUES('In_the_beginning_was_the_Word',1,1), - ('and_the_Word_was_with_God',1,2), - ('and_the_Word_was_God',1,3), - ('The_same_was_in_the_beginning_with_God',2,1), - ('All_things_were_made_by_him',3,1), - ('and_without_him_was_not_any_thing_made_that_was_made',3,2); - CREATE INDEX t1a1 ON t1(substr(a,1,12)); - - - SELECT b, c, '|' FROM t1 WHERE substr(a,1,12)=='and_the_Word' ORDER BY b, c; - - - EXPLAIN QUERY PLAN - SELECT b, c, '|' FROM t1 WHERE substr(a,1,12)=='and_the_Word' ORDER BY b, c; - - - SELECT b, c, '|' FROM t1 WHERE 'and_the_Word'==substr(a,1,12) ORDER BY b, c; - - - EXPLAIN QUERY PLAN - SELECT b, c, '|' FROM t1 WHERE 'and_the_Word'==substr(a,1,12) ORDER BY b, c; - - - CREATE INDEX t1ba ON t1(b,substr(a,2,3),c); - SELECT c FROM t1 WHERE b=1 AND substr(a,2,3)='nd_' ORDER BY c; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 WHERE b=1 AND substr(a,2,3)='nd_' ORDER BY c; - - - SELECT rowid, substr(a,b,3), '|' FROM t1 ORDER BY 2; - - - CREATE INDEX t1abx ON t1(substr(a,b,3)); - SELECT rowid FROM t1 WHERE substr(a,b,3)<='and' ORDER BY +rowid; - - - EXPLAIN QUERY PLAN - SELECT rowid FROM t1 WHERE substr(a,b,3)<='and' ORDER BY +rowid; - - - SELECT rowid FROM t1 WHERE +substr(a,b,3)<='and' ORDER BY +rowid; - - - SELECT rowid FROM t1 WHERE substr(a,b,3) IN ('and','l_t','xyz') - ORDER BY +rowid; - - - EXPLAIN QUERY PLAN - SELECT rowid FROM t1 WHERE substr(a,b,3) IN ('and','l_t','xyz') - ORDER BY +rowid; - - - ALTER TABLE t1 ADD COLUMN d; - UPDATE t1 SET d=length(a); - CREATE INDEX t1a2 ON t1(SUBSTR(a, 27, 3)) WHERE d>=29; - SELECT rowid, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; - - - EXPLAIN QUERY PLAN - SELECT rowid, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; - - - CREATE INDEX t1alen ON t1(length(a)); - SELECT length(a) FROM t1 ORDER BY length(a); - - - EXPLAIN QUERY PLAN - SELECT length(a) FROM t1 ORDER BY length(a); - - - SELECT length(a) FROM t1 ORDER BY length(a) DESC; - - - EXPLAIN QUERY PLAN - SELECT length(a) FROM t1 ORDER BY length(a) DESC; - - - DROP TABLE t1; - CREATE TABLE t1(id ANY PRIMARY KEY, a,b,c) WITHOUT ROWID; - INSERT INTO t1(id,a,b,c) - VALUES(1,'In_the_beginning_was_the_Word',1,1), - (2,'and_the_Word_was_with_God',1,2), - (3,'and_the_Word_was_God',1,3), - (4,'The_same_was_in_the_beginning_with_God',2,1), - (5,'All_things_were_made_by_him',3,1), - (6,'and_without_him_was_not_any_thing_made_that_was_made',3,2); - CREATE INDEX t1a1 ON t1(substr(a,1,12)); - - - SELECT b, c, '|' FROM t1 WHERE substr(a,1,12)=='and_the_Word' ORDER BY b, c; - - - EXPLAIN QUERY PLAN - SELECT b, c, '|' FROM t1 WHERE substr(a,1,12)=='and_the_Word' ORDER BY b, c; - - - SELECT b, c, '|' FROM t1 WHERE 'and_the_Word'==substr(a,1,12) ORDER BY b, c; - - - EXPLAIN QUERY PLAN - SELECT b, c, '|' FROM t1 WHERE 'and_the_Word'==substr(a,1,12) ORDER BY b, c; - - - CREATE INDEX t1ba ON t1(b,substr(a,2,3),c); - SELECT c FROM t1 WHERE b=1 AND substr(a,2,3)='nd_' ORDER BY c; - - - EXPLAIN QUERY PLAN - SELECT c FROM t1 WHERE b=1 AND substr(a,2,3)='nd_' ORDER BY c; - - - SELECT id, substr(a,b,3), '|' FROM t1 ORDER BY 2; - - - CREATE INDEX t1abx ON t1(substr(a,b,3)); - SELECT id FROM t1 WHERE substr(a,b,3)<='and' ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t1 WHERE substr(a,b,3)<='and' ORDER BY +id; - - - SELECT id FROM t1 WHERE +substr(a,b,3)<='and' ORDER BY +id; - - - SELECT id FROM t1 WHERE substr(a,b,3) IN ('and','l_t','xyz') - ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t1 WHERE substr(a,b,3) IN ('and','l_t','xyz') - ORDER BY +id; - - - ALTER TABLE t1 ADD COLUMN d; - UPDATE t1 SET d=length(a); - CREATE INDEX t1a2 ON t1(SUBSTR(a, 27, 3)) WHERE d>=29; - SELECT id, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; - - - EXPLAIN QUERY PLAN - SELECT id, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; - - - CREATE TABLE t3(a,b,c); - WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<30) - INSERT INTO t3(a,b,c) - SELECT x, printf('ab%04xyz',x), random() FROM c; - CREATE UNIQUE INDEX t3abc ON t3(CAST(a AS text), b, substr(c,1,3)); - SELECT a FROM t3 WHERE CAST(a AS text)<='10' ORDER BY +a; - PRAGMA integrity_check; - - - CREATE TABLE t5(a); - CREATE TABLE cnt(x); - WITH RECURSIVE - c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<5) - INSERT INTO cnt(x) SELECT x FROM c; - INSERT INTO t5(a) SELECT printf('abc%03dxyz',x) FROM cnt; - CREATE INDEX t5ax ON t5( substr(a,4,3) ); - - - -- The use of the "k" alias in the WHERE clause is technically - -- illegal, but SQLite allows it for historical reasons. In this - -- test and the next, verify that "k" can be used by the t5ax index - SELECT substr(a,4,3) AS k FROM cnt, t5 WHERE k=printf('%03d',x); - - - EXPLAIN QUERY PLAN - SELECT substr(a,4,3) AS k FROM cnt, t5 WHERE k=printf('%03d',x); - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(a,b,c,d,e,f,g,h,i); - CREATE INDEX t4all ON t4(a,b,c c0) WHERE (NULL NOT NULL); - SELECT * FROM t0 WHERE ((NULL IS FALSE) IS FALSE); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 REAL, c1 TEXT); - CREATE INDEX i0 ON t0(+c0, c0); - INSERT INTO t0(c0) VALUES(0); - SELECT CAST(+ t0.c0 AS BLOB) LIKE 0 FROM t0; - - - SELECT CAST(+ t0.c0 AS BLOB) LIKE '0.0' FROM t0; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x REAL); - CREATE INDEX t1x ON t1(x, +x); - INSERT INTO t1(x) VALUES(2); - SELECT +x FROM t1 WHERE x=2; - - - CREATE TABLE t1(x TEXT PRIMARY KEY, y TEXT, z INT); - INSERT INTO t1(x,y,z) VALUES('alpha','ALPHA',1),('bravo','charlie',1); - CREATE INDEX i1 ON t1(+y COLLATE NOCASE); - SELECT * FROM t1; - - - DELETE FROM t1 INDEXED BY i1 - WHERE x IS +y COLLATE NOCASE IN (SELECT z FROM t1) - RETURNING *; - - - SELECT * FROM t1; - - - CREATE TABLE t1(a INT, b TEXT); - INSERT INTO t1(a,b) VALUES - (10, '{"one":5,"two":6 - - EXPLAIN QUERY PLAN - SELECT sum(b->>'one') FROM t1 WHERE a=10; /* Query AA */ - - - SELECT sum(b->>'one') FROM t1 WHERE a=10; /* Query AA */ - - - EXPLAIN QUERY PLAN - SELECT sum(b->>'two') FROM t1 WHERE a=10; /* Query BB */ - - - SELECT sum(b->>'two') FROM t1 WHERE a=10; /* Query BB */ - - - DROP TABLE t1; - CREATE TABLE t1(a INT, b TEXT, c INT, d INT); - INSERT INTO t1(a,b,c,d) VALUES - (1, '{"x":1 - - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1; - - - explain query plan - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); - INSERT INTO t1(a,b) VALUES(1,0); - CREATE INDEX x1 ON t1( "y" ); - CREATE INDEX x2 ON t1( +"y" ); - CREATE INDEX x3 ON t1( +'y' ); - CREATE INDEX x4 ON t1( "y*" ); - - - UPDATE t1 SET b=100 WHERE (SELECT 'y') GLOB "y"; - SELECT b FROM t1; - - - UPDATE t1 SET b=200 WHERE (SELECT 'y') GLOB +"y"; - SELECT b FROM t1; - - - UPDATE t1 SET b=300 WHERE (SELECT 'y') GLOB +'y'; - SELECT b FROM t1; - - - UPDATE t1 SET b=400 WHERE (SELECT 'y') GLOB "y*"; - SELECT b FROM t1; - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, tag INT); - INSERT INTO t1 VALUES (0, 7), (1, 8); - CREATE TABLE t2(type INT, t1_id INT, value INT); - INSERT INTO t2 VALUES (0, 0, 100), (0, 1, 101); - CREATE INDEX t1x ON t1(-tag); - SELECT u.tag, v.max_value - FROM (SELECT tag FROM t1 GROUP BY -tag) u - JOIN (SELECT t1.tag AS "tag", t2.type AS "type", - MAX(t2.value) AS "max_value" - FROM t1 - JOIN t2 ON t2.t1_id = t1.id - GROUP BY t2.type, t1.tag - ) v ON v.type = 0 AND v.tag = u.tag; - diff --git a/libsql-wal/tests/assets/fixtures/indexexpr2.test b/libsql-wal/tests/assets/fixtures/indexexpr2.test deleted file mode 100644 index 164409dd57..0000000000 --- a/libsql-wal/tests/assets/fixtures/indexexpr2.test +++ /dev/null @@ -1,204 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t1 VALUES(3, 'three'); - - CREATE INDEX i1 ON t1(b || 'x'); - - - SELECT 'TWOX' == (b || 'x') FROM t1 WHERE (b || 'x')>'onex' - - - SELECT 'TWOX' == (b || 'x') COLLATE nocase FROM t1 WHERE (b || 'x')>'onex' - - - CREATE INDEX i2 ON t1(a+1); - - - SELECT a+1, quote(a+1) FROM t1 ORDER BY 1; - - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - - - CREATE TABLE t2(x); - - INSERT INTO t2 VALUES('.ABC'); - INSERT INTO t2 VALUES('.abcd'); - INSERT INTO t2 VALUES('.defg'); - INSERT INTO t2 VALUES('.DEF'); - - - SELECT x FROM t2 ORDER BY substr(x, 2) COLLATE nocase; - - - CREATE INDEX i2 ON t2( substr(x, 2) ); - SELECT x FROM t2 ORDER BY substr(x, 2) COLLATE nocase; - - - CREATE TABLE t3(x); - - - CREATE INDEX i3 ON t3(json_extract(x, '$.a'), json_extract(x, '$.b')); - - - CREATE TABLE t4(a, b); - INSERT INTO t4 VALUES('.ABC', 1); - INSERT INTO t4 VALUES('.abc', 2); - INSERT INTO t4 VALUES('.ABC', 3); - INSERT INTO t4 VALUES('.abc', 4); - - - SELECT * FROM t4 - WHERE substr(a, 2) = 'abc' COLLATE NOCASE - ORDER BY substr(a, 2), b; - - - CREATE INDEX i4 ON t4( substr(a, 2) COLLATE NOCASE, b ); - SELECT * FROM t4 - WHERE substr(a, 2) = 'abc' COLLATE NOCASE - ORDER BY substr(a, 2), b; - - - DROP INDEX i4; - UPDATE t4 SET a = printf('%s%d',a,b); - SELECT * FROM t4 ORDER BY Substr(a,-2) COLLATE nocase; - - - SELECT * FROM t4 ORDER BY Substr(a,-2) COLLATE binary; - - - CREATE INDEX i4 ON t4( Substr(a,-2) COLLATE nocase ); - SELECT * FROM t4 ORDER BY Substr(a,-2) COLLATE nocase; - - - EXPLAIN QUERY PLAN - SELECT * FROM t4 ORDER BY Substr(a,-2) COLLATE nocase; - - - SELECT * FROM t4 ORDER BY Substr(a,-2) COLLATE binary; - - - CREATE TABLE t2(a,b,c,d,e,f); - INSERT INTO t2 VALUES(2,3,4,5,6,7); - CREATE INDEX t2abc ON t2(a+b+c); - CREATE INDEX t2cd ON t2(c*d); - CREATE INDEX t2def ON t2(d,e+25*f); - SELECT sqlite_master.name - FROM sqlite_master, explain('UPDATE t2 SET b=b+1') - WHERE explain.opcode LIKE 'Open%' - AND sqlite_master.rootpage=explain.p2 - ORDER BY 1; - - - SELECT sqlite_master.name - FROM sqlite_master, explain('UPDATE t2 SET c=c+1') - WHERE explain.opcode LIKE 'Open%' - AND sqlite_master.rootpage=explain.p2 - ORDER BY 1; - - - SELECT sqlite_master.name - FROM sqlite_master, explain('UPDATE t2 SET c=c+1, f=NULL') - WHERE explain.opcode LIKE 'Open%' - AND sqlite_master.rootpage=explain.p2 - ORDER BY 1; - - - CREATE TABLE t5(a INTEGER, b INTEGER); - INSERT INTO t5 VALUES(2, 4), (3, 9); - - - SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; - - - CREATE INDEX t5a ON t5( abs(a) ); - CREATE INDEX t5b ON t5( abs(b) ); - - - SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b); - INSERT INTO x1 VALUES - (1, 123), (2, '123'), (3, '123abc'), (4, 123.0), (5, 1234); - - - SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; - - - CREATE INDEX x1i ON x1( CAST(b AS INTEGER) ); - SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; - - - SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; - - - CREATE INDEX x1i2 ON x1( CAST(b AS TEXT) ); - SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; - - - CREATE TABLE IF NOT EXISTS t0(c0); - INSERT INTO t0(c0) VALUES (-9223372036854775808); - BEGIN; - - - COMMIT; - SELECT sql FROM sqlite_master WHERE tbl_name = 't0'; - CREATE INDEX i0 ON t0(c0); - - - REINDEX; - - - CREATE TABLE t0(c0); - CREATE INDEX i0 ON t0(c0) WHERE c0 NOT NULL; - INSERT INTO t0(c0) VALUES (NULL); - - - SELECT * FROM t0 WHERE ~('' BETWEEN t0.c0 AND TRUE); - - - SELECT ~('' BETWEEN t0.c0 AND TRUE) FROM t0; - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2), (3, 4); - CREATE TABLE t2(x, y); - - - CREATE TABLE t1(a INT, b INT); - CREATE INDEX t1x ON t1(a, abs(b)); - CREATE TABLE t2(c INT, d INT); - INSERT INTO t1(a,b) VALUES(4,4),(5,-5),(5,20),(6,6); - INSERT INTO t2(c,d) VALUES(100,1),(200,1),(300,2); - SELECT *, - (SELECT max(c+abs(b)) FROM t2 GROUP BY d ORDER BY d LIMIT 1) AS subq - FROM t1 WHERE a=5; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - CREATE INDEX t1x ON t1 (b, +b COLLATE NOCASE); - INSERT INTO t1(a,b) VALUES(1,'abcde'); - SELECT * FROM t1 AS a0 - WHERE (SELECT count(a0.b=+a0.b COLLATE NOCASE IN (b)) FROM t1 GROUP BY 2.5) - ORDER BY a0.b; - - - CREATE TABLE t2(a TEXT); - INSERT INTO t2 VALUES('alice'),('bob'),('cindy'),('david'); - CREATE INDEX t2x ON t2 (+a COLLATE NOCASE); - SELECT count(+a COLLATE NOCASE IN (SELECT 1)) AS x - FROM t2 - GROUP BY SUBSTR(0,0); - - - CREATE TABLE t3 (a INT, b AS (-a)); - CREATE INDEX t3x ON t3(b, a); - INSERT INTO t3(a) VALUES(44); - SELECT * FROM t3 AS a0 - WHERE (SELECT sum(-a0.a=b) FROM t3 GROUP BY b) - GROUP BY b; - diff --git a/libsql-wal/tests/assets/fixtures/indexfault.test b/libsql-wal/tests/assets/fixtures/indexfault.test deleted file mode 100644 index fe41dd0b66..0000000000 --- a/libsql-wal/tests/assets/fixtures/indexfault.test +++ /dev/null @@ -1,74 +0,0 @@ - - BEGIN; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(202)); - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 2 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 4 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 8 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 16 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 32 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 64 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 128 - INSERT INTO t1 SELECT randomblob(202) FROM t1; -- 256 - COMMIT; - - - BEGIN; - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(t,u,v,w,x,y,z); - INSERT INTO t1 VALUES( - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) - ); - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 2 - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 4 - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 8 - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 16 - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 32 - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 64 - INSERT INTO t1 SELECT - randomblob(30), randomblob(30), randomblob(30), randomblob(30), - randomblob(30), randomblob(30), randomblob(30) FROM t1; -- 128 - COMMIT; - - - BEGIN; - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(11000)); - INSERT INTO t1 SELECT randomblob(11001) FROM t1; -- 2 - INSERT INTO t1 SELECT randomblob(11002) FROM t1; -- 4 - INSERT INTO t1 SELECT randomblob(11003) FROM t1; -- 8 - INSERT INTO t1 SELECT randomblob(11004) FROM t1; -- 16 - INSERT INTO t1 SELECT randomblob(11005) FROM t1; -- 32 - INSERT INTO t1 SELECT randomblob(11006) FROM t1; -- 64 - INSERT INTO t1 SELECT randomblob(11007) FROM t1; -- 128 - INSERT INTO t1 SELECT randomblob(11008) FROM t1; -- 256 - INSERT INTO t1 SELECT randomblob(11009) FROM t1; -- 512 - COMMIT; - - - BEGIN; - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(11000)); - INSERT INTO t1 SELECT randomblob(11001) FROM t1; -- 2 - INSERT INTO t1 SELECT randomblob(11002) FROM t1; -- 4 - INSERT INTO t1 SELECT randomblob(11003) FROM t1; -- 8 - INSERT INTO t1 SELECT randomblob(11004) FROM t1; -- 16 - INSERT INTO t1 SELECT randomblob(11005) FROM t1; -- 32 - INSERT INTO t1 SELECT randomblob(11005) FROM t1; -- 64 - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/init.test b/libsql-wal/tests/assets/fixtures/init.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/insert.test b/libsql-wal/tests/assets/fixtures/insert.test deleted file mode 100644 index eed2c9730b..0000000000 --- a/libsql-wal/tests/assets/fixtures/insert.test +++ /dev/null @@ -1,102 +0,0 @@ - - CREATE TABLE t11a AS SELECT '123456789' AS x; - CREATE TABLE t11b (a INTEGER PRIMARY KEY, b, c); - INSERT INTO t11b SELECT x, x, x FROM t11a; - SELECT quote(a), quote(b), quote(c) FROM t11b; - - - CREATE TABLE t12a(a,b,c,d,e,f,g); - INSERT INTO t12a VALUES(101,102,103,104,105,106,107); - CREATE TABLE t12b(x); - INSERT INTO t12b(x,rowid,x,x,x,x,x) SELECT * FROM t12a; - SELECT rowid, x FROM t12b; - - - CREATE TABLE tab1( value INTEGER); - INSERT INTO tab1 (value, _rowid_) values( 11, 1); - INSERT INTO tab1 (value, _rowid_) SELECT 22,999; - SELECT * FROM tab1; - - - CREATE TABLE t12c(a, b DEFAULT 'xyzzy', c); - INSERT INTO t12c(a, rowid, c) SELECT 'one', 999, 'two'; - SELECT * FROM t12c; - - - DROP TABLE IF EXISTS t13; - CREATE TABLE t13(a INTEGER PRIMARY KEY,b UNIQUE); - CREATE INDEX t13x1 ON t13(-b=b); - INSERT INTO t13 VALUES(1,5),(6,2); - REPLACE INTO t13 SELECT b,0 FROM t13; - SELECT * FROM t13 ORDER BY +b; - - - DROP TABLE IF EXISTS t14; - CREATE TABLE t14(x INTEGER PRIMARY KEY); - INSERT INTO t14 VALUES(CASE WHEN 1 THEN null END); - SELECT x FROM t14; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - CREATE INDEX i1 ON t1(b); - CREATE TABLE t2(a, b); - INSERT INTO t2 VALUES(4, randomblob(31000)); - INSERT INTO t2 VALUES(4, randomblob(32000)); - INSERT INTO t2 VALUES(4, randomblob(33000)); - REPLACE INTO t1 SELECT a, b FROM t2; - SELECT a, length(b) FROM t1; - - - SELECT * FROM t0; - - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b); - CREATE UNIQUE INDEX t2b ON t2(b); - INSERT INTO t2(a,b) VALUES(1,1),(2,2),(3,3),(4,4); - CREATE TABLE fire(x); - CREATE TRIGGER t2r1 AFTER DELETE ON t2 BEGIN - INSERT INTO fire VALUES(old.a); - END; - UPDATE OR REPLACE t2 SET a=4, b=3 WHERE a=1; - SELECT *, 'x' FROM t2 ORDER BY a; - - - SELECT x FROM fire ORDER BY x; - - - DELETE FROM t2; - DELETE FROM fire; - INSERT INTO t2(a,b) VALUES(1,1),(2,2),(3,3),(4,4); - UPDATE OR REPLACE t2 SET a=1, b=3 WHERE a=1; - SELECT *, 'x' FROM t2 ORDER BY a; - - - SELECT x FROM fire ORDER BY x; - - - CREATE TABLE t3(a INTEGER PRIMARY KEY, b INT, c INT, d INT); - CREATE UNIQUE INDEX t3bpi ON t3(b) WHERE c<=d; - CREATE UNIQUE INDEX t3d ON t3(d); - INSERT INTO t3(a,b,c,d) VALUES(1,1,1,1),(2,1,3,2),(3,4,5,6); - CREATE TRIGGER t3r1 AFTER DELETE ON t3 BEGIN - SELECT 'hi'; - END; - REPLACE INTO t3(a,b,c,d) VALUES(4,4,8,9); - - - SELECT *, 'x' FROM t3 ORDER BY a; - - - REPLACE INTO t3(a,b,c,d) VALUES(5,1,11,2); - SELECT *, 'x' FROM t3 ORDER BY a; - - - DELETE FROM t3; - INSERT INTO t3(a,b,c,d) VALUES(1,1,1,1),(2,1,3,2),(3,4,5,6); - DROP TRIGGER t3r1; - CREATE TRIGGER t3r1 AFTER DELETE ON t3 BEGIN - INSERT INTO t3(b,c,d) VALUES(old.b,old.c,old.d); - END; - diff --git a/libsql-wal/tests/assets/fixtures/insert2.test b/libsql-wal/tests/assets/fixtures/insert2.test deleted file mode 100644 index 54774da3e3..0000000000 --- a/libsql-wal/tests/assets/fixtures/insert2.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE TABLE t5(a, b, c DEFAULT 'c', d); - - - INSERT INTO t5(a) SELECT 456 UNION ALL SELECT 123 ORDER BY 1; - SELECT * FROM t5 ORDER BY rowid; - - - CREATE VIRTUAL TABLE t0 USING fts4(a); - - - INSERT INTO t0 SELECT 0 UNION SELECT 0 AS 'x' ORDER BY x; - SELECT * FROM t0; - diff --git a/libsql-wal/tests/assets/fixtures/insert3.test b/libsql-wal/tests/assets/fixtures/insert3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/insert4.test b/libsql-wal/tests/assets/fixtures/insert4.test deleted file mode 100644 index b08ea3e968..0000000000 --- a/libsql-wal/tests/assets/fixtures/insert4.test +++ /dev/null @@ -1,31 +0,0 @@ - - CREATE TABLE t8( - rid INTEGER, - pid INTEGER, - mid INTEGER, - px INTEGER DEFAULT(0) CHECK(px IN(0, 1)) - ); - CREATE TEMP TABLE x( - rid INTEGER, - pid INTEGER, - mid INTEGER, - px INTEGER DEFAULT(0) CHECK(px IN(0, 1)) - ); - - - CREATE TABLE t9(a, b, c); - CREATE INDEX t9a ON t9(a); - CREATE INDEX t9b ON t9(b) WHERE c=0; - - INSERT INTO t9 VALUES(1, 1, 1); - INSERT INTO t9 VALUES(2, 2, 2); - INSERT INTO t9 VALUES(3, 3, 3); - - CREATE TABLE t10(a, b, c); - CREATE INDEX t10a ON t10(a); - CREATE INDEX t10b ON t10(b) WHERE c=0; - - INSERT INTO t10 SELECT * FROM t9; - SELECT * FROM t10; - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/insert5.test b/libsql-wal/tests/assets/fixtures/insert5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/insertfault.test b/libsql-wal/tests/assets/fixtures/insertfault.test deleted file mode 100644 index 755d58cdc5..0000000000 --- a/libsql-wal/tests/assets/fixtures/insertfault.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d DEFAULT true); - INSERT INTO t1 DEFAULT VALUES; - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/instr.test b/libsql-wal/tests/assets/fixtures/instr.test deleted file mode 100644 index 32429674d8..0000000000 --- a/libsql-wal/tests/assets/fixtures/instr.test +++ /dev/null @@ -1,35 +0,0 @@ - - SELECT coalesce(instr(NULL,'abc'), 999); - - - SELECT coalesce(instr('abc',NULL), 999); - - - SELECT coalesce(instr(NULL,NULL), 999); - - - SELECT instr(X'', 'abc') - - - CREATE TABLE x1(a, b); - INSERT INTO x1 VALUES(X'', 'abc'); - SELECT instr(a, b) FROM x1; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 PRIMARY KEY, c1); - INSERT INTO t0(c0) VALUES (x'bb'), (0); - SELECT COUNT(*) FROM t0 WHERE INSTR(x'aabb', t0.c0) ORDER BY t0.c0, t0.c1; - - - SELECT quote(c0) FROM t0 WHERE INSTR(x'aabb', t0.c0) ORDER BY t0.c0, t0.c1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES('text'),(x'bb'); - SELECT quote(x) FROM t1 WHERE instr(x'aabb',x); - - - SELECT quote(x) FROM t1 WHERE x>'zzz' AND instr(x'aabb',x); - diff --git a/libsql-wal/tests/assets/fixtures/instrfault.test b/libsql-wal/tests/assets/fixtures/instrfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/intarray.test b/libsql-wal/tests/assets/fixtures/intarray.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/interrupt.test b/libsql-wal/tests/assets/fixtures/interrupt.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/interrupt2.test b/libsql-wal/tests/assets/fixtures/interrupt2.test deleted file mode 100644 index 902e31c288..0000000000 --- a/libsql-wal/tests/assets/fixtures/interrupt2.test +++ /dev/null @@ -1,18 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1b ON t1(b); - PRAGMA journal_mode = wal; - - WITH ii(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM ii WHERE i<1000 ) - INSERT INTO t1 SELECT i, i FROM ii; - - - CREATE TEMP TABLE z1(a, b); - INSERT INTO z1 SELECT * FROM t1; - - - SELECT count(*) FROM t1 - UNION ALL - SELECT count(*) FROM z1 - diff --git a/libsql-wal/tests/assets/fixtures/intpkey.test b/libsql-wal/tests/assets/fixtures/intpkey.test deleted file mode 100644 index 80654f7539..0000000000 --- a/libsql-wal/tests/assets/fixtures/intpkey.test +++ /dev/null @@ -1,27 +0,0 @@ - - CREATE TABLE t16a(id "INTEGER" PRIMARY KEY AUTOINCREMENT, b [TEXT], c `INT`); - - - PRAGMA table_info=t16a; - - - CREATE TABLE t17(x INTEGER PRIMARY KEY, y TEXT); - INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe'); - CREATE INDEX t17x ON t17(x); - DELETE FROM t17 WHERE x=99 OR x<130; - SELECT * FROM t17; - - - DROP INDEX t17x; - DELETE FROM t17; - INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe'); - CREATE UNIQUE INDEX t17x ON t17(abs(x)); - DELETE FROM t17 WHERE abs(x) IS NULL OR abs(x)<130; - SELECT * FROM t17; - - - DELETE FROM t17; - INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe'); - UPDATE t17 SET y='ostrich' WHERE abs(x)=248; - SELECT * FROM t17 ORDER BY +x; - diff --git a/libsql-wal/tests/assets/fixtures/intreal.test b/libsql-wal/tests/assets/fixtures/intreal.test deleted file mode 100644 index 9ec407d25d..0000000000 --- a/libsql-wal/tests/assets/fixtures/intreal.test +++ /dev/null @@ -1,77 +0,0 @@ - - SELECT intreal(5); - - - SELECT intreal(5)=5, 6=intreal(6); - - - SELECT intreal(7)=7.0, 8.0=intreal(8); - - - SELECT typeof(intreal(9)); - - - SELECT 'a'||intreal(11)||'z'; - - - SELECT max(1.0,intreal(2),3.0), max(1,intreal(2),3); - - - SELECT max(1.0,intreal(4),3.0), max(1,intreal(4),3); - - - SELECT max(1.0,intreal(2),intreal(3),4.0), - max(1,intreal(2),intreal(3),4); - - - SELECT max(1.0,intreal(5),intreal(3),4.0), - max(1,intreal(5),intreal(3),4); - - - CREATE TABLE t2(a REAL); - INSERT INTO t2 VALUES( 836627109860825358 ); - SELECT substr(a,1,4) FROM t2 WHERE a = CAST(836627109860825358 AS REAL); - - - CREATE INDEX i2 ON t2(a); - SELECT substr(a,1,4) FROM t2 WHERE a = CAST(836627109860825358 AS REAL); - - - CREATE TABLE t0 (c0); - CREATE TABLE t1 (c1 REAL); - INSERT INTO t1(c1) VALUES (8366271098608253588); - INSERT INTO t0(c0) VALUES ('a'); - - - SELECT * FROM t1 WHERE (t1.c1 = CAST(8366271098608253588 AS REAL)); - - - SELECT * FROM t0, t1 WHERE (t1.c1 = CAST(8366271098608253588 AS REAL)); - - - SELECT * FROM t0, t1 - WHERE ( - t1.c1 >= CAST(8366271098608253588 AS REAL) - AND t1.c1 <= CAST(8366271098608253588 AS REAL) - ); - - - CREATE TABLE t0 (c0 REAL, c1); - CREATE UNIQUE INDEX i0 ON t0(c1, 0 | c0); - INSERT INTO t0(c0) VALUES (4750228396194493326), (0); - UPDATE OR REPLACE t0 SET c0 = 'a', c1 = ''; - SELECT * FROM t0 ORDER BY t0.c1; - PRAGMA integrity_check; - - - CREATE TABLE t1(a REAL, b AS ('expr') ); - - - INSERT INTO t1 VALUES( REPLACE(0, '', 'expr') ); - - - INSERT INTO t1 SELECT REPLACE(4, '', 'expr'); - - - SELECT typeof(a), a FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/io.test b/libsql-wal/tests/assets/fixtures/io.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ioerr.test b/libsql-wal/tests/assets/fixtures/ioerr.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ioerr2.test b/libsql-wal/tests/assets/fixtures/ioerr2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ioerr3.test b/libsql-wal/tests/assets/fixtures/ioerr3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ioerr4.test b/libsql-wal/tests/assets/fixtures/ioerr4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ioerr5.test b/libsql-wal/tests/assets/fixtures/ioerr5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ioerr6.test b/libsql-wal/tests/assets/fixtures/ioerr6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/istrue.test b/libsql-wal/tests/assets/fixtures/istrue.test deleted file mode 100644 index f16d5ed860..0000000000 --- a/libsql-wal/tests/assets/fixtures/istrue.test +++ /dev/null @@ -1,127 +0,0 @@ - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y BOOLEAN); - INSERT INTO t1 VALUES(1, true),(2, false),(3, null); - SELECT x FROM t1 WHERE y IS TRUE; - - - SELECT x FROM t1 WHERE y IS FALSE; - - - SELECT x FROM t1 WHERE y IS NULL; - - - SELECT x FROM t1 WHERE y IS NOT TRUE; - - - SELECT x FROM t1 WHERE y IS NOT FALSE; - - - SELECT x FROM t1 WHERE y IS NOT NULL; - - - SELECT x FROM t1 WHERE y IS TRUE OR (8==$X) - - - SELECT x FROM t1 WHERE y IS FALSE OR (8==$X) - - - SELECT x FROM t1 WHERE y IS NULL OR (8==$X); - - - SELECT x FROM t1 WHERE y IS NOT TRUE OR (8==$X); - - - SELECT x FROM t1 WHERE y IS NOT FALSE OR (8==$X); - - - SELECT x FROM t1 WHERE y IS NOT NULL OR (8==$X); - - - SELECT x, - y IS TRUE, y IS FALSE, y is NULL, - y IS NOT TRUE, y IS NOT FALSE, y IS NOT NULL, '|' - FROM t1 ORDER BY x; - - - SELECT x FROM t1 WHERE true; - - - SELECT x FROM t1 WHERE false; - - - CREATE TABLE t2( - a INTEGER PRIMARY KEY, - b BOOLEAN DEFAULT true, - c BOOLEAN DEFAULT(true), - d BOOLEAN DEFAULT false, - e BOOLEAN DEFAULT(false) - ); - INSERT INTO t2 DEFAULT VALUES; - SELECT * FROM t2; - - - DROP TABLE t2; - CREATE TABLE t2( - a INTEGER PRIMARY KEY, - b BOOLEAN DEFAULT(not true), - c BOOLEAN DEFAULT(not false) - ); - INSERT INTO t2(a) VALUES(99); - SELECT * FROM t2; - - - DROP TABLE t2; - CREATE TABLE t2( - a INTEGER PRIMARY KEY, - b BOOLEAN CHECK(b IS TRUE), - c BOOLEAN CHECK(c IS FALSE), - d BOOLEAN CHECK(d IS NOT TRUE), - e BOOLEAN CHECK(e IS NOT FALSE) - ); - INSERT INTO t2 VALUES(1,true,false,null,null); - SELECT * FROM t2; - - - CREATE TABLE t7( - a INTEGER PRIMARY KEY, - b BOOLEAN DEFAULT false, - c BOOLEAN DEFAULT true - ); - INSERT INTO t7(a) VALUES(1); - INSERT INTO t7(a,b,c) VALUES(2,true,false); - ALTER TABLE t7 ADD COLUMN d BOOLEAN DEFAULT false; - ALTER TABLE t7 ADD COLUMN e BOOLEAN DEFAULT true; - INSERT INTO t7(a,b,c) VALUES(3,true,false); - INSERT INTO t7 VALUES(4,false,true,true,false); - SELECT *,'x' FROM t7 ORDER BY a; - - - SELECT 0.5 IS TRUE COLLATE NOCASE; - SELECT 0.5 IS TRUE COLLATE RTRIM; - SELECT 0.5 IS TRUE COLLATE BINARY; - - SELECT 0.5 IS TRUE; - SELECT 0.5 COLLATE NOCASE IS TRUE; - SELECT 0.0 IS FALSE; - - SELECT 0.0 IS FALSE COLLATE NOCASE; - SELECT 0.0 IS FALSE COLLATE RTRIM; - SELECT 0.0 IS FALSE COLLATE BINARY; - - - CREATE TABLE t8(a INT, true INT, false INT, d INT); - INSERT INTO t8(a,true,false,d) VALUES(5,6,7,8),(4,3,2,1),('a','b','c','d'); - SELECT * FROM t8 ORDER BY false; - - - CREATE TABLE false(true INT, false INT, x INT CHECK (5 IN (false.false))); - - - INSERT INTO False VALUES(4,5,6); - - - SELECT 9 IN (false.false) FROM false; - - - SELECT 5 IN (false.false) FROM false; - diff --git a/libsql-wal/tests/assets/fixtures/join.test b/libsql-wal/tests/assets/fixtures/join.test deleted file mode 100644 index 631e6198f0..0000000000 --- a/libsql-wal/tests/assets/fixtures/join.test +++ /dev/null @@ -1,421 +0,0 @@ - - SELECT t1.rowid, t2.rowid, '|' FROM t1, t2 ON t1.a=t2.b; - - - CREATE TABLE t14(x); - INSERT INTO t14 VALUES('abcdefghij'); - - - CREATE TABLE aa(a); - CREATE TABLE bb(b); - CREATE TABLE cc(c); - - INSERT INTO aa VALUES(45); - INSERT INTO cc VALUES(45); - INSERT INTO cc VALUES(45); - - - SELECT * FROM aa LEFT JOIN bb, cc WHERE cc.c=aa.a; - - - CREATE INDEX ccc ON cc(c); - SELECT * FROM aa LEFT JOIN bb, cc WHERE cc.c=aa.a; - - - SELECT * - FROM (SELECT 1 a) AS x - LEFT JOIN (SELECT 1, * FROM (SELECT * FROM (SELECT 1))); - - - SELECT * - FROM (SELECT 1 a) AS x - LEFT JOIN (SELECT 1, * FROM (SELECT * FROM (SELECT * FROM (SELECT 1)))) AS y - JOIN (SELECT * FROM (SELECT 9)) AS z; - - - SELECT * - FROM (SELECT 111) - LEFT JOIN (SELECT cc+222, * FROM (SELECT * FROM (SELECT 333 cc))); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(c PRIMARY KEY, a TEXT(10000), b TEXT(10000)); - SELECT * FROM (SELECT 111) LEFT JOIN (SELECT c+222 FROM t1) GROUP BY 1; - - - SELECT * FROM (SELECT 111) LEFT JOIN (SELECT c+222 FROM t1); - - - SELECT * FROM (SELECT 111 AS x UNION ALL SELECT 222) - LEFT JOIN (SELECT c+333 AS y FROM t1) ON x=y GROUP BY 1; - - - SELECT count(*) - FROM (SELECT 111 AS x UNION ALL SELECT 222) - LEFT JOIN (SELECT c+333 AS y FROM t1) ON x=y; - - - SELECT count(*) - FROM (SELECT c+333 AS y FROM t1) - RIGHT JOIN (SELECT 111 AS x UNION ALL SELECT 222) ON x=y; - - - SELECT * FROM (SELECT 111 AS x UNION ALL SELECT 111) - LEFT JOIN (SELECT c+333 AS y FROM t1) ON x=y GROUP BY 1; - - - SELECT * FROM (SELECT 111 AS x UNION ALL SELECT 111 UNION ALL SELECT 222) - LEFT JOIN (SELECT c+333 AS y FROM t1) ON x=y GROUP BY 1; - - - INSERT INTO t1(c) VALUES(-111); - SELECT * FROM (SELECT 111 AS x UNION ALL SELECT 111 UNION ALL SELECT 222) - LEFT JOIN (SELECT c+333 AS y FROM t1) ON x=y GROUP BY 1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(c PRIMARY KEY) WITHOUT ROWID; - SELECT * FROM (SELECT 111) LEFT JOIN (SELECT c+222 FROM t1) GROUP BY 1; - - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1),(2),(3); - CREATE VIEW v2 AS SELECT a, 1 AS b FROM t1; - CREATE TABLE t3(x); - INSERT INTO t3 VALUES(2),(4); - SELECT *, '|' FROM t3 LEFT JOIN v2 ON a=x WHERE b=1; - - - SELECT *, '|' FROM t3 LEFT JOIN v2 ON a=x WHERE b+1=x; - - - SELECT *, '|' FROM t3 LEFT JOIN v2 ON a=x ORDER BY b; - - - CREATE TABLE t1(id INTEGER PRIMARY KEY); - CREATE TABLE t2(id INTEGER PRIMARY KEY, c2 INTEGER); - CREATE TABLE t3(id INTEGER PRIMARY KEY, c3 INTEGER); - INSERT INTO t1(id) VALUES(456); - INSERT INTO t3(id) VALUES(1),(2); - SELECT t1.id, x2.id, x3.id - FROM t1 - LEFT JOIN (SELECT * FROM t2) AS x2 ON t1.id=x2.c2 - LEFT JOIN t3 AS x3 ON x2.id=x3.c3; - - - CREATE TABLE t1(a INT, b INT); - INSERT INTO t1 VALUES(1,2),(3,4); - CREATE TABLE t2(x INT, y INT); - SELECT *, 'x' - FROM t1 LEFT JOIN t2 - WHERE CASE WHEN FALSE THEN a=x ELSE 1 END; - - - SELECT *, 'x' - FROM t1 LEFT JOIN t2 - WHERE a IN (1,3,x,y); - - - SELECT *, 'x' - FROM t1 LEFT JOIN t2 - WHERE NOT ( 'x'='y' AND t2.y=1 ); - - - SELECT *, 'x' - FROM t1 LEFT JOIN t2 - WHERE ~ ( 'x'='y' AND t2.y=1 ); - - - SELECT *, 'x' - FROM t1 LEFT JOIN t2 - WHERE t2.y IS NOT 'abc' - - - DROP TABLE t1; - DROP TABLE t2; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); - INSERT INTO t1(a,b) VALUES(1,0),(11,1),(12,1),(13,1),(121,12); - CREATE INDEX t1b ON t1(b); - CREATE TABLE t2(x INTEGER PRIMARY KEY); - INSERT INTO t2(x) VALUES(0),(1); - SELECT a1, a2, a3, a4, a5 - FROM (SELECT a AS a1 FROM t1 WHERE b=0) - JOIN (SELECT x AS x1 FROM t2) - LEFT JOIN (SELECT a AS a2, b AS b2 FROM t1) - ON x1 IS TRUE AND b2=a1 - JOIN (SELECT x AS x2 FROM t2) - ON x2<=CASE WHEN x1 THEN CASE WHEN a2 THEN 1 ELSE -1 END ELSE 0 END - LEFT JOIN (SELECT a AS a3, b AS b3 FROM t1) - ON x2 IS TRUE AND b3=a2 - JOIN (SELECT x AS x3 FROM t2) - ON x3<=CASE WHEN x2 THEN CASE WHEN a3 THEN 1 ELSE -1 END ELSE 0 END - LEFT JOIN (SELECT a AS a4, b AS b4 FROM t1) - ON x3 IS TRUE AND b4=a3 - JOIN (SELECT x AS x4 FROM t2) - ON x4<=CASE WHEN x3 THEN CASE WHEN a4 THEN 1 ELSE -1 END ELSE 0 END - LEFT JOIN (SELECT a AS a5, b AS b5 FROM t1) - ON x4 IS TRUE AND b5=a4 - ORDER BY a1, a2, a3, a4, a5; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a INT); - INSERT INTO t1(a) VALUES(1); - CREATE TABLE t2(b INT); - SELECT a, b - FROM t1 LEFT JOIN t2 ON 0 - WHERE (b IS NOT NULL)=0; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES(0),(1); - SELECT * FROM t1 LEFT JOIN (SELECT abs(1) AS y FROM t1) ON x WHERE NOT(y='a'); - - - SELECT * FROM t1 LEFT JOIN (SELECT abs(1)+2 AS y FROM t1) ON x - WHERE NOT(y='a'); - - - CREATE TABLE t0(a); - CREATE TABLE t1(b); - CREATE VIEW v0 AS SELECT a FROM t1 LEFT JOIN t0; - INSERT INTO t1 VALUES (1); - - - SELECT * FROM v0 WHERE NOT(v0.a IS FALSE); - - - SELECT * FROM t1 LEFT JOIN t0 WHERE NOT(a IS FALSE); - - - SELECT NOT(v0.a IS FALSE) FROM v0 - - - CREATE TABLE t1(a); - CREATE TABLE t2(b); - INSERT INTO t1(a) VALUES(0); - CREATE VIEW v0(c) AS SELECT t2.b FROM t1 LEFT JOIN t2; - - - SELECT * FROM v0 WHERE v0.c NOTNULL NOTNULL; - - - SELECT * FROM t1 LEFT JOIN t2 - - - SELECT * FROM t1 LEFT JOIN t2 WHERE (b IS NOT NULL) IS NOT NULL; - - - SELECT (b IS NOT NULL) IS NOT NULL FROM t1 LEFT JOIN t2 - - - SELECT * FROM t1 LEFT JOIN t2 WHERE - (b IS NOT NULL AND b IS NOT NULL) IS NOT NULL; - - - CREATE TABLE t1(c1); - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES (0); - SELECT * FROM t0 LEFT JOIN t1 WHERE NULL IN (c1); - - - CREATE INDEX t1x ON t1(0) WHERE NULL IN (c1); - SELECT * FROM t0 LEFT JOIN t1 WHERE NULL IN (c1); - - - DROP TABLE t0; - DROP TABLE t1; - CREATE TABLE t0(aa); - CREATE TABLE t1(bb); - INSERT INTO t0(aa) VALUES (1); - INSERT INTO t1(bb) VALUES (1); - SELECT 11, * FROM t1 LEFT JOIN t0 WHERE aa ISNULL; - SELECT 12, * FROM t1 LEFT JOIN t0 WHERE +aa ISNULL; - SELECT 13, * FROM t1 LEFT JOIN t0 ON aa ISNULL; - SELECT 14, * FROM t1 LEFT JOIN t0 ON +aa ISNULL; - CREATE INDEX i0 ON t0(aa) WHERE aa ISNULL; - SELECT 21, * FROM t1 LEFT JOIN t0 WHERE aa ISNULL; - SELECT 22, * FROM t1 LEFT JOIN t0 WHERE +aa ISNULL; - SELECT 23, * FROM t1 LEFT JOIN t0 ON aa ISNULL; - SELECT 24, * FROM t1 LEFT JOIN t0 ON +aa ISNULL; - - - CREATE TABLE t0(a, b); - CREATE INDEX t0a ON t0(a); - INSERT INTO t0 VALUES(10,10),(10,11),(10,12); - SELECT DISTINCT c FROM t0 LEFT JOIN (SELECT a+1 AS c FROM t0) ORDER BY c ; - - - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES(123); - CREATE VIEW v0(c0) AS SELECT 0 GROUP BY 1; - SELECT t0.c0, v0.c0, vt0.name - FROM v0, t0 LEFT JOIN pragma_table_info('t0') AS vt0 - ON vt0.name LIKE 'c0' - WHERE v0.c0 == 0; - - - CREATE TABLE a(value TEXT); - INSERT INTO a(value) SELECT value FROM json_each('["a", "b", null]'); - CREATE TABLE b(value TEXT); - INSERT INTO b(value) SELECT value FROM json_each('["a", "c", null]'); - SELECT a.value, b.value FROM a RIGHT JOIN b ON a.value = b.value; - - - SELECT a.value, b.value FROM b LEFT JOIN a ON a.value = b.value; - - - SELECT a.value, b.value - FROM json_each('["a", "c", null]') AS b - LEFT JOIN - json_each('["a", "b", null]') AS a ON a.value = b.value; - - - SELECT a.value, b.value - FROM json_each('["a", "b", null]') AS a - RIGHT JOIN - json_each('["a", "c", null]') AS b ON a.value = b.value; - - - SELECT a.value, b.value - FROM json_each('["a", "b", null]') AS a - RIGHT JOIN - b ON a.value = b.value; - - - SELECT a.value, b.value - FROM a - RIGHT JOIN - json_each('["a", "c", null]') AS b ON a.value = b.value; - - - CREATE TABLE t1(a PRIMARY KEY, x); - CREATE TABLE t2(b INT); - CREATE INDEX t1aa ON t1(a, a); - - INSERT INTO t1 VALUES('abc', 'def'); - INSERT INTO t2 VALUES(1); - - - SELECT * FROM t2 JOIN t1 WHERE a='abc' AND x='def'; - - - SELECT * FROM t2 JOIN t1 WHERE a='abc' AND x='abc'; - - - SELECT * FROM t2 LEFT JOIN t1 ON a=0 WHERE (x='x' OR x IS NULL); - - - CREATE TABLE t0(c0 INT); - CREATE VIEW v0 AS SELECT (NULL AND 5) as c0 FROM t0; - INSERT INTO t0(c0) VALUES (NULL); - SELECT count(*) FROM v0 LEFT JOIN t0 ON v0.c0; - - - CREATE TABLE t1(a INT,b INT,c INT); INSERT INTO t1 VALUES(NULL,NULL,NULL); - CREATE TABLE t2(d INT,e INT); INSERT INTO t2 VALUES(NULL,NULL); - CREATE INDEX x2 ON t1(c,b); - CREATE TABLE t3(x INT); INSERT INTO t3 VALUES(NULL); - - - WITH t99(b) AS MATERIALIZED ( - SELECT b FROM t2 LEFT JOIN t1 ON c IN (SELECT x FROM t3) - ) - SELECT 5 FROM t2 JOIN t99 ON b IN (1,2,3); - - - WITH t99(b) AS NOT MATERIALIZED ( - SELECT b FROM t2 LEFT JOIN t1 ON c IN (SELECT x FROM t3) - ) - SELECT 5 FROM t2 JOIN t99 ON b IN (1,2,3); - - - WITH t99(b) AS (SELECT b FROM t2 LEFT JOIN t1 ON c IN (SELECT x FROM t3)) - SELECT 5 FROM t2 JOIN t99 ON b IN (1,2,3); - - - SELECT 5 - FROM t2 JOIN ( - SELECT b FROM t2 LEFT JOIN t1 ON c IN (SELECT x FROM t3) - ) AS t99 ON b IN (1,2,3); - - - INSERT INTO t1 VALUES(3,4,NULL); - INSERT INTO t2 VALUES(1,2); - WITH t99(b) AS ( - SELECT coalesce(b,3) FROM t2 AS x LEFT JOIN t1 ON c IN (SELECT x FROM t3) - ) - SELECT d, e, b FROM t2 JOIN t99 ON b IN (1,2,3) ORDER BY +d; - - - SELECT d, e, b2 - FROM t2 - JOIN (SELECT coalesce(b,3) AS b2 FROM t2 AS x LEFT JOIN t1 - ON c IN (SELECT x FROM t3)) AS t99 - ON b2 IN (1,2,3) ORDER BY +d; - - - DELETE FROM t1; - DELETE FROM t2 WHERE d IS NOT NULL; - DELETE FROM t3; - SELECT * FROM t2 JOIN (SELECT b FROM t2 LEFT JOIN t1 - ON c IN (SELECT x FROM t3)) AS t99 ON b IN (1,2,3); - - - DELETE FROM t1; - DELETE FROM t2; - DELETE FROM t3; - INSERT INTO t1 VALUES(4,3,5); - INSERT INTO t2 VALUES(1,2); - INSERT INTO t3 VALUES(5); - SELECT * FROM t2 JOIN (SELECT b FROM t2 LEFT JOIN t1 - ON c IN (SELECT x FROM t3)) AS t99 ON b IS NULL; - - - WITH t99(b) AS ( - SELECT b FROM t2 AS x LEFT JOIN t1 ON c IN (SELECT x FROM t3) - ) - SELECT d, e, b FROM t2 JOIN t99 ON b IS NULL; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT); - CREATE TABLE t2(d INTEGER PRIMARY KEY, e INT); - CREATE VIEW t3(a,b,c,d,e) AS SELECT * FROM t1 LEFT JOIN t2 ON d=c; - CREATE TABLE t4(x INT, y INT); - INSERT INTO t1 VALUES(1,2,3); - INSERT INTO t2 VALUES(1,5); - INSERT INTO t4 VALUES(1,4); - SELECT a, b, y FROM t4 JOIN t3 ON a=x; - - - CREATE TABLE t0(a INT); INSERT INTO t0(a) VALUES (1); - CREATE TABLE t1(b INT); INSERT INTO t1(b) VALUES (2); - CREATE VIEW v2(c) AS SELECT 3 FROM t1; - SELECT * FROM t1 JOIN v2 ON 0 FULL OUTER JOIN t0 ON true; - - - SELECT * FROM t1 JOIN v2 ON 1=0 FULL OUTER JOIN t0 ON true; - - - SELECT * FROM t1 JOIN v2 ON false FULL OUTER JOIN t0 ON true; - - - CREATE TABLE t0(z INT); INSERT INTO t0 VALUES(1),(2); - CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(1); - CREATE TABLE t2(b INT); INSERT INTO t2 VALUES(2); - CREATE TABLE t3(c INT, d INT); INSERT INTO t3 VALUES(3,4); - CREATE TABLE t4(e INT); INSERT INTO t4 VALUES(5); - CREATE VIEW v5(x,y) AS SELECT c, d FROM t3 LEFT JOIN t4 ON false; - - - SELECT DISTINCT a, b - FROM t1 RIGHT JOIN t2 ON a=b LEFT JOIN v5 ON false - WHERE x <= y; - - - SELECT DISTINCT a, b - FROM t0 JOIN t1 ON z=a RIGHT JOIN t2 ON a=b LEFT JOIN v5 ON false - WHERE x <= y; - diff --git a/libsql-wal/tests/assets/fixtures/join2.test b/libsql-wal/tests/assets/fixtures/join2.test deleted file mode 100644 index 21fa862386..0000000000 --- a/libsql-wal/tests/assets/fixtures/join2.test +++ /dev/null @@ -1,193 +0,0 @@ - - CREATE TABLE aa(a); - CREATE TABLE bb(b); - CREATE TABLE cc(c); - INSERT INTO aa VALUES('one'); - INSERT INTO bb VALUES('one'); - INSERT INTO cc VALUES('one'); - - - CREATE TABLE t1(k1 INTEGER PRIMARY KEY, k2, k3); - CREATE TABLE t2(k2 INTEGER PRIMARY KEY, v2); - - -- Prior to this problem being fixed, table t3_2 would be omitted from - -- the join queries below, but if t3_1 were used in its place it would - -- not. - CREATE TABLE t3_1(k3 PRIMARY KEY, v3) WITHOUT ROWID; - CREATE TABLE t3_2(v3, k3 PRIMARY KEY) WITHOUT ROWID; - - - CREATE TABLE c1(k INTEGER PRIMARY KEY, v1); - CREATE TABLE c2(k INTEGER PRIMARY KEY, v2); - CREATE TABLE c3(k INTEGER PRIMARY KEY, v3); - - INSERT INTO c1 VALUES(1, 2); - INSERT INTO c2 VALUES(2, 3); - INSERT INTO c3 VALUES(3, 'v3'); - - INSERT INTO c1 VALUES(111, 1112); - INSERT INTO c2 VALUES(112, 1113); - INSERT INTO c3 VALUES(113, 'v1113'); - - - SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2); - - - SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1); - - - SELECT DISTINCT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1); - - - SELECT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1); - - - DROP TABLE c1; - DROP TABLE c2; - DROP TABLE c3; - CREATE TABLE c1(k UNIQUE, v1); - CREATE TABLE c2(k UNIQUE, v2); - CREATE TABLE c3(k UNIQUE, v3); - - INSERT INTO c1 VALUES(1, 2); - INSERT INTO c2 VALUES(2, 3); - INSERT INTO c3 VALUES(3, 'v3'); - - INSERT INTO c1 VALUES(111, 1112); - INSERT INTO c2 VALUES(112, 1113); - INSERT INTO c3 VALUES(113, 'v1113'); - - - SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2); - - - SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1); - - - SELECT DISTINCT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1); - - - SELECT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(x PRIMARY KEY) WITHOUT ROWID; - CREATE TABLE t2(x); - SELECT a.x - FROM t1 AS a - LEFT JOIN t1 AS b ON (a.x=b.x) - LEFT JOIN t2 AS c ON (a.x=c.x); - - - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) - INSERT INTO t1(x) SELECT x FROM c; - INSERT INTO t2(x) SELECT x+9 FROM t1; - SELECT a.x, c.x - FROM t1 AS a - LEFT JOIN t1 AS b ON (a.x=b.x) - LEFT JOIN t2 AS c ON (a.x=c.x); - - - CREATE TABLE s1 (a INTEGER PRIMARY KEY); - CREATE TABLE s2 (a INTEGER PRIMARY KEY); - CREATE TABLE s3 (a INTEGER); - CREATE UNIQUE INDEX ndx on s3(a); - - - CREATE TABLE u1(a INTEGER PRIMARY KEY, b, c); - CREATE TABLE u2(a INTEGER PRIMARY KEY, b, c); - CREATE INDEX u1ab ON u1(b, c); - - - CREATE TABLE t1(a,b); INSERT INTO t1 VALUES(1,2),(3,4),(5,6); - CREATE TABLE t2(c,d); INSERT INTO t2 VALUES(2,4),(3,6); - CREATE TABLE t3(x); INSERT INTO t3 VALUES(9); - CREATE VIEW test AS - SELECT *, 'x' - FROM t1 LEFT JOIN (SELECT * FROM t2, t3) ON (c=b AND x=9) - WHERE c IS NULL; - SELECT * FROM test; - - - CREATE TABLE t0(c0); - CREATE TABLE t1(c0); - - - SELECT * FROM t0 LEFT JOIN t1 - WHERE (t1.c0 BETWEEN 0 AND 0) > ('' AND t0.c0); - - - CREATE TABLE t0(c0 INT); - CREATE VIEW v0(c0) AS SELECT CAST(t0.c0 AS INTEGER) FROM t0; - INSERT INTO t0(c0) VALUES (0); - - - SELECT typeof(c0), c0 FROM v0 WHERE c0>='0' - - - SELECT * FROM t0, v0 WHERE v0.c0 >= '0'; - - - SELECT * FROM t0 LEFT JOIN v0 WHERE v0.c0 >= '0'; - - - SELECT * FROM t0 LEFT JOIN v0 ON v0.c0 >= '0'; - - - SELECT * FROM t0 LEFT JOIN v0 ON v0.c0 >= '0' WHERE TRUE - UNION SELECT 0,0 WHERE 0; - - - CREATE TABLE t1 (aaa); - INSERT INTO t1 VALUES(23456); - CREATE TABLE t2(bbb); - CREATE VIEW v2(ccc) AS SELECT bbb IS 1234 FROM t2; - SELECT ccc, ccc IS NULL AS ddd FROM t1 LEFT JOIN v2; - - - SELECT ccc, ccc IS NULL AS ddd FROM t1 LEFT JOIN v2; - - - CREATE TABLE t1 (x INTEGER); - INSERT INTO t1 VALUES(1); -- Some true value - CREATE TABLE t2 (z TEXT); - INSERT INTO t2 VALUES('some value'); - CREATE TABLE t3(w TEXT); - INSERT INTO t3 VALUES('some other value'); - - - SELECT ( - SELECT 1 FROM t2 LEFT JOIN (SELECT x AS v FROM t3) ON 500=v WHERE (v OR FALSE) - ) FROM t1; - - - SELECT ( - SELECT 1 FROM t2 LEFT JOIN (SELECT x AS v FROM t3) ON 500=v WHERE (v) - ) FROM t1; - - - SELECT ( - SELECT 1 FROM t2 LEFT JOIN (SELECT x AS v FROM t3) ON 500=v WHERE (v OR FALSE) - ) FROM t1; - - - DROP TABLE t1; - DROP TABLE t2; - DROP TABLE t3; - CREATE TABLE t1(x TEXT, y INTEGER); - INSERT INTO t1(x,y) VALUES(NULL,-2),(NULL,1),('0',2); - CREATE TABLE t2(z INTEGER); - INSERT INTO t2(z) VALUES(2),(-2); - CREATE VIEW t3 AS SELECT z, (SELECT count(*) FROM t1) AS w FROM t2; - SELECT * FROM t1 LEFT JOIN t3 ON y=z; - - - DROP TABLE t1; - DROP TABLE t2; - DROP VIEW t3; - CREATE TABLE t1(a INTEGER PRIMARY KEY); - WITH RECURSIVE c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<100) - INSERT INTO t1(a) SELECT n FROM c; - CREATE VIEW t2(b) AS SELECT a FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/join3.test b/libsql-wal/tests/assets/fixtures/join3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/join4.test b/libsql-wal/tests/assets/fixtures/join4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/join5.test b/libsql-wal/tests/assets/fixtures/join5.test deleted file mode 100644 index ff246ad7be..0000000000 --- a/libsql-wal/tests/assets/fixtures/join5.test +++ /dev/null @@ -1,226 +0,0 @@ - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - DROP TABLE IF EXISTS t3; - CREATE TABLE x1(a); - INSERT INTO x1 VALUES(1); - CREATE TABLE x2(b NOT NULL); - CREATE TABLE x3(c, d); - INSERT INTO x3 VALUES('a', NULL); - INSERT INTO x3 VALUES('b', NULL); - INSERT INTO x3 VALUES('c', NULL); - SELECT * FROM x1 LEFT JOIN x2 LEFT JOIN x3 ON x3.d = x2.b; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - DROP TABLE IF EXISTS t3; - DROP TABLE IF EXISTS t4; - DROP TABLE IF EXISTS t5; - CREATE TABLE t1(x text NOT NULL, y text); - CREATE TABLE t2(u text NOT NULL, x text NOT NULL); - CREATE TABLE t3(w text NOT NULL, v text); - CREATE TABLE t4(w text NOT NULL, z text NOT NULL); - CREATE TABLE t5(z text NOT NULL, m text); - INSERT INTO t1 VALUES('f6d7661f-4efe-4c90-87b5-858e61cd178b',NULL); - INSERT INTO t1 VALUES('f6ea82c3-2cad-45ce-ae8f-3ddca4fb2f48',NULL); - INSERT INTO t1 VALUES('f6f47499-ecb4-474b-9a02-35be73c235e5',NULL); - INSERT INTO t1 VALUES('56f47499-ecb4-474b-9a02-35be73c235e5',NULL); - INSERT INTO t3 VALUES('007f2033-cb20-494c-b135-a1e4eb66130c', - 'f6d7661f-4efe-4c90-87b5-858e61cd178b'); - SELECT * - FROM t3 - INNER JOIN t1 ON t1.x= t3.v AND t1.y IS NULL - LEFT JOIN t4 ON t4.w = t3.w - LEFT JOIN t5 ON t5.z = t4.z - LEFT JOIN t2 ON t2.u = t5.m - LEFT JOIN t1 xyz ON xyz.y = t2.x; - - - DROP TABLE IF EXISTS x1; - DROP TABLE IF EXISTS x2; - DROP TABLE IF EXISTS x3; - CREATE TABLE x1(a); - INSERT INTO x1 VALUES(1); - CREATE TABLE x2(b NOT NULL); - CREATE TABLE x3(c, d); - INSERT INTO x3 VALUES('a', NULL); - INSERT INTO x3 VALUES('b', NULL); - INSERT INTO x3 VALUES('c', NULL); - SELECT * FROM x1 LEFT JOIN x2 JOIN x3 WHERE x3.d = x2.b; - - - SELECT * - FROM ( - SELECT 'apple' fruit - UNION ALL SELECT 'banana' - ) a - JOIN ( - SELECT 'apple' fruit - UNION ALL SELECT 'banana' - ) b ON a.fruit=b.fruit - LEFT JOIN ( - SELECT 1 isyellow - ) c ON b.fruit='banana'; - - - SELECT * - FROM (SELECT 'apple' fruit UNION ALL SELECT 'banana') - LEFT JOIN (SELECT 1) ON fruit='banana'; - - - CREATE TABLE y1(x, y, z); - INSERT INTO y1 VALUES(0, 0, 1); - CREATE TABLE y2(a); - - - SELECT count(z) FROM y1 LEFT JOIN y2 ON x GROUP BY y; - - - SELECT count(z) FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x GROUP BY y; - - - CREATE VIEW v1 AS SELECT x, y, z FROM y1; - SELECT count(z) FROM v1 LEFT JOIN y2 ON x GROUP BY y; - - - SELECT count(z) FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x - - - SELECT * FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1); - - CREATE TABLE t2(y INTEGER PRIMARY KEY,a,b); - INSERT INTO t2 VALUES(1,2,3); - CREATE INDEX t2a ON t2(a); - CREATE INDEX t2b ON t2(b); - - - SELECT * FROM t1 LEFT JOIN t2 ON a=2 OR b=3 WHERE y IS NULL; - - - CREATE TABLE t3(x); - INSERT INTO t3 VALUES(1); - CREATE TABLE t4(y, z); - SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y); - - - CREATE INDEX t4i ON t4(y, ifnull(z, '!!!')); - SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y); - - - CREATE TABLE t1(aa, bb); - CREATE INDEX t1x1 on t1(abs(aa), abs(bb)); - INSERT INTO t1 VALUES(-2,-3),(+2,-3),(-2,+3),(+2,+3); - SELECT * FROM (t1) - WHERE ((abs(aa)=1 AND 1=2) OR abs(aa)=2) - AND abs(bb)=3 - ORDER BY +1, +2; - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1); - - - CREATE TABLE t2(x, y, z); - CREATE INDEX t2xy ON t2(x, y); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000 - ) - INSERT INTO t2 SELECT i/10, i, NULL FROM s; - ANALYZE; - - - CREATE TABLE t3(x); - INSERT INTO t3(x) VALUES(1); - CREATE INDEX t3x ON t3(x); - - CREATE TABLE t4(x, y, z); - CREATE INDEX t4xy ON t4(x, y); - CREATE INDEX t4xz ON t4(x, z); - - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000) - INSERT INTO t4 SELECT i/10, i, i FROM s; - - ANALYZE; - UPDATE sqlite_stat1 SET stat='1000000 10 1' WHERE idx='t3x'; - ANALYZE sqlite_schema; - - - CREATE TABLE t0 (c0, c1, PRIMARY KEY (c0, c1)); - CREATE TABLE t1 (c0); - - INSERT INTO t1 VALUES (2); - - INSERT INTO t0 VALUES(0, 10); - INSERT INTO t0 VALUES(1, 10); - INSERT INTO t0 VALUES(2, 10); - INSERT INTO t0 VALUES(3, 10); - - - SELECT * FROM t0, t1 - WHERE (t0.c1 >= 1 OR t0.c1 < 1) AND t0.c0 IN (1, t1.c0) ORDER BY 1; - - - CREATE TABLE t1(a ,b FLOAT); - INSERT INTO t1 VALUES(1,1); - CREATE INDEX t1x1 ON t1(a,b,a,a,a,a,a,a,a,a,a,b); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t1','t1x1','648 324 81 81 81 81 81 81 81081 81 81 81'); - ANALYZE sqlite_schema; - SELECT a FROM (SELECT a FROM t1 NATURAL LEFT JOIN t1) NATURAL LEFT JOIN t1 WHERE (rowid,1)<=(5,0); - - - CREATE TABLE t1(x INT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) - INSERT INTO t1(x) SELECT 0 FROM c; - CREATE INDEX t1x1 ON t1(x BETWEEN 0 AND 10, x); - ANALYZE; - DELETE FROM t1; - INSERT INTO t1 VALUES(0),(0); - CREATE VIEW v1 AS SELECT * FROM t1 NATURAL JOIN t1 WHERE (x BETWEEN 0 AND 10) OR true; - CREATE VIEW v2 AS SELECT * FROM v1 NATURAL JOIN v1; - CREATE VIEW v3 AS SELECT * FROM v2, v1 USING (x) GROUP BY x; - SELECT x FROM v3; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); - CREATE TABLE t2(c INTEGER PRIMARY KEY, d INT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<8) - INSERT INTO t1(a,b) SELECT x, 10*x FROM c; - INSERT INTO t2(c,d) SELECT b*2, 100*a FROM t1; - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES - ('t1',NULL,150105),('t2',NULL,98747); - ANALYZE sqlite_schema; - - - SELECT count(*) FROM t1 LEFT JOIN t2 ON c=b WHERE d IS NULL; - - - SELECT count(*) FROM t1 LEFT JOIN t2 ON c=b WHERE d=100; - - - SELECT count(*) FROM t1 LEFT JOIN t2 ON c=b WHERE d>=300; - - - CREATE TABLE t1(a INT, b INT, c INT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c) SELECT x, x*1000, x*1000000 FROM c; - CREATE TABLE t2(b INT, x INT); - INSERT INTO t2(b,x) SELECT b, a FROM t1 WHERE a%3==0; - CREATE INDEX t2b ON t2(b); - CREATE TABLE t3(c INT, y INT); - INSERT INTO t3(c,y) SELECT c, a FROM t1 WHERE a%4==0; - CREATE INDEX t3c ON t3(c); - INSERT INTO t1(a,b,c) VALUES(200, 200000, NULL); - ANALYZE; - - - SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3 WHERE x>0 AND y>0 - ORDER BY +a; - diff --git a/libsql-wal/tests/assets/fixtures/join6.test b/libsql-wal/tests/assets/fixtures/join6.test deleted file mode 100644 index d224e1682f..0000000000 --- a/libsql-wal/tests/assets/fixtures/join6.test +++ /dev/null @@ -1,15 +0,0 @@ - - CREATE TABLE tx(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o PRIMARY KEY) - WITHOUT ROWID; - INSERT INTO tx VALUES( - 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 - ); - - - SELECT o FROM tx NATURAL JOIN tx; - - - CREATE TABLE ty(a,Ñ,x6,x7,x8,Q,I,v,x1,L,E,x2,x3,x4,x5,s,g PRIMARY KEY,b,c) - WITHOUT ROWID; - SELECT a FROM ty NATURAL JOIN ty; - diff --git a/libsql-wal/tests/assets/fixtures/join7.test b/libsql-wal/tests/assets/fixtures/join7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/join8.test b/libsql-wal/tests/assets/fixtures/join8.test deleted file mode 100644 index 595717d74e..0000000000 --- a/libsql-wal/tests/assets/fixtures/join8.test +++ /dev/null @@ -1,545 +0,0 @@ - - CREATE TABLE t1(a,b,c); - CREATE TABLE t2(x,y); - CREATE INDEX t2x ON t2(x); - SELECT avg(DISTINCT b) FROM (SELECT * FROM t2 LEFT RIGHT JOIN t1 ON c); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s); - CREATE INDEX t1x1 ON t1(g+h,j,k); - CREATE INDEX t1x2 ON t1(b); - INSERT INTO t1 DEFAULT VALUES; - - - CREATE TABLE t1(a int, b int, c int); - INSERT INTO t1 VALUES(1,2,3),(4,5,6); - CREATE TABLE t2(d int, e int); - INSERT INTO t2 VALUES(3,333),(4,444); - CREATE TABLE t3(f int, g int); - PRAGMA automatic_index=off; - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, a INT); - CREATE TABLE t2(id INTEGER PRIMARY KEY, b INT); - CREATE TABLE t3(id INTEGER PRIMARY KEY, c INT); - CREATE TABLE t4(id INTEGER PRIMARY KEY, d INT); - CREATE TABLE t5(id INTEGER PRIMARY KEY, e INT); - CREATE TABLE t6(id INTEGER PRIMARY KEY, f INT); - CREATE TABLE t7(id INTEGER PRIMARY KEY, g INT); - CREATE TABLE t8(id INTEGER PRIMARY KEY, h INT); - INSERT INTO t1 SELECT value, 1 FROM generate_series(1,256) WHERE value & 1; - INSERT INTO t2 SELECT value, 1 FROM generate_series(1,256) WHERE value & 2; - INSERT INTO t3 SELECT value, 1 FROM generate_series(1,256) WHERE value & 4; - INSERT INTO t4 SELECT value, 1 FROM generate_series(1,256) WHERE value & 8; - INSERT INTO t5 SELECT value, 1 FROM generate_series(1,256) WHERE value & 16; - INSERT INTO t6 SELECT value, 1 FROM generate_series(1,256) WHERE value & 32; - INSERT INTO t7 SELECT value, 1 FROM generate_series(1,256) WHERE value & 64; - INSERT INTO t8 SELECT value, 1 FROM generate_series(1,256) WHERE value & 128; - CREATE TABLE t9 AS - SELECT id, h, g, f, e, d, c, b, a - FROM t1 - NATURAL FULL JOIN t2 - NATURAL FULL JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - NATURAL FULL JOIN t6 - NATURAL FULL JOIN t7 - NATURAL FULL JOIN t8; - - - SELECT count(*) FROM t9; - - - SELECT id, count(*) FROM t9 GROUP BY id HAVING count(*)!=1; - - - UPDATE t9 SET a=0 WHERE a IS NULL; - UPDATE t9 SET b=0 WHERE b IS NULL; - UPDATE t9 SET c=0 WHERE c IS NULL; - UPDATE t9 SET d=0 WHERE d IS NULL; - UPDATE t9 SET e=0 WHERE e IS NULL; - UPDATE t9 SET f=0 WHERE f IS NULL; - UPDATE t9 SET g=0 WHERE g IS NULL; - UPDATE t9 SET h=0 WHERE h IS NULL; - SELECT count(*) FROM t9 WHERE id=128*h+64*g+32*f+16*e+8*d+4*c+2*b+a; - - - SELECT * FROM t9 WHERE id<>128*h+64*g+32*f+16*e+8*d+4*c+2*b+a; - - - CREATE TABLE t1(x INTEGER PRIMARY KEY, a, b); - INSERT INTO t1 VALUES(1,5555,4); - CREATE INDEX i1a ON t1(a); - CREATE INDEX i1b ON t1(b); - SELECT a FROM t1 NATURAL RIGHT JOIN t1 WHERE a=5555 OR (1,b)==(SELECT 2 IN (2,2),4); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d REAL); - INSERT INTO t1 VALUES(1,'A','aa',2.5); - SELECT * FROM t1 AS t2 NATURAL RIGHT JOIN t1 AS t3 - WHERE (a,b) IN (SELECT rowid, b FROM t1); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, c TEXT, d INT) WITHOUT ROWID; - INSERT INTO t1 VALUES(15,'xray','baker',42); - SELECT value, t1.* FROM json_each('7') NATURAL RIGHT JOIN t1 - WHERE (a,b) IN (SELECT a, b FROM t1); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY,b); - INSERT INTO t1 VALUES(0,NULL),(1,2); - SELECT value, t1.* FROM json_each('17') NATURAL RIGHT JOIN t1 - WHERE (a,b) IN (SELECT rowid, b FROM t1); - - - SELECT value, t1.* FROM json_each('null') NATURAL RIGHT JOIN t1 - WHERE (a,b) IN (SELECT rowid, b FROM t1); - - - CREATE TABLE a(key TEXT); - INSERT INTO a(key) VALUES('a'),('b'); - SELECT quote(a.key), b.value - FROM a RIGHT JOIN json_each('["a","c"]') AS b ON a.key=b.value; - - -CREATE TABLE t1(a INT, b INT, c INT, d INT); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<10) - INSERT INTO t1(a,b,c,d) SELECT x, x+100, x+200, x+300 FROM c; - CREATE TABLE t2(b INT, x INT); - INSERT INTO t2(b,x) SELECT b, a FROM t1 WHERE a%2=0; - CREATE INDEX t2b ON t2(b); - CREATE TABLE t3(c INT, y INT); - INSERT INTO t3(c,y) SELECT c, a FROM t1 WHERE a%3=0; - CREATE INDEX t3c ON t3(c); - CREATE TABLE t4(d INT, z INT); - INSERT INTO t4(d,z) SELECT d, a FROM t1 WHERE a%5=0; - CREATE INDEX t4d ON t4(d); - INSERT INTO t1(a,b,c,d) VALUES - (96,NULL,296,396), - (97,197,NULL,397), - (98,198,298,NULL), - (99,NULL,NULL,NULL); - ANALYZE sqlite_schema; - INSERT INTO sqlite_stat1 VALUES('t4','t4d','20 1'); - INSERT INTO sqlite_stat1 VALUES('t3','t3c','32 1'); - INSERT INTO sqlite_stat1 VALUES('t2','t2b','48 1'); - INSERT INTO sqlite_stat1 VALUES('t1',NULL,'100'); - ANALYZE sqlite_schema; - - - WITH t0 AS MATERIALIZED ( - SELECT t1.*, t2.*, t3.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - ) - SELECT * FROM t0 FULL JOIN t4 ON t0.a=t4.d AND t4.z>0 - ORDER BY coalesce(t0.a, t0.y+200, t4.d); - - - WITH t0 AS MATERIALIZED ( - SELECT t1.*, t2.*, t3.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - ) - SELECT * FROM t0 LEFT RIGHT JOIN t4 ON t0.a=t4.d AND t4.z>0 - ORDER BY coalesce(t0.a, t0.y+200, t4.d); - - - EXPLAIN QUERY PLAN - WITH t0 AS MATERIALIZED ( - SELECT t1.*, t2.*, t3.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - ) - SELECT * FROM t0 FULL JOIN t4 ON t0.a=t4.d AND t4.z>0 - ORDER BY coalesce(t0.a, t0.y+200, t4.d); - - - CREATE TABLE t1(a INT, b INT); - CREATE TABLE t2(c INT, d INT); - CREATE TABLE t3(e INT, f INT); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t2 VALUES(3, 4); - INSERT INTO t3 VALUES(5, 6); - - - SELECT * - FROM t3 LEFT JOIN t2 ON true - JOIN t1 ON (t3.e IS t2.c); - - - SELECT * - FROM t3 LEFT JOIN t2 ON true - JOIN t1 ON (t3.e IS NOT DISTINCT FROM t2.c); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d REAL); - INSERT INTO t1 VALUES(1,'E','bb',NULL),(2,NULL,NULL,NULL); - SELECT * FROM t1 NATURAL RIGHT JOIN t1 AS t2 WHERE (a,b) IN (SELECT a+0, b FROM t1); - - - CREATE TABLE t1(c0 INT UNIQUE); - CREATE TABLE t2(c0); - CREATE TABLE t2i(c0 INT); - CREATE TABLE t3(c0 INT); - INSERT INTO t1 VALUES(1); - INSERT INTO t2 VALUES(2); - INSERT INTO t2i VALUES(2); - INSERT INTO t3 VALUES(3); - - - SELECT DISTINCT t1.c0, t3.c0 - FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0; - - - SELECT t1.c0, t3.c0 - FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0; - - - SELECT DISTINCT t1.c0, t3.c0 - FROM t2 NATURAL CROSS JOIN t1 RIGHT JOIN t3 ON t1.c0; - - - SELECT t1.c0, t3.c0 - FROM t1 NATURAL CROSS JOIN t2 RIGHT JOIN t3 ON t1.c0; - - - SELECT DISTINCT t1.c0, t3.c0 - FROM t2i NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0; - - - SELECT DISTINCT +t1.c0, t3.c0 - FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0; - - - SELECT DISTINCT +t1.c0, t3.c0 - FROM t1 NATURAL CROSS JOIN t2 RIGHT JOIN t3 ON t1.c0; - - - SELECT DISTINCT t1.c0, t3.c0 - FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0<>0; - - - CREATE TABLE t1(a); - CREATE TABLE t2(b); - INSERT INTO t2 VALUES(0),(1),(2); - SELECT * FROM t1 RIGHT JOIN t2 ON (a=b) WHERE 99+(b+1)!=99; - - - CREATE INDEX t2b ON t2(b+1) WHERE b IS NOT NULL; - SELECT * FROM t1 RIGHT JOIN t2 ON (a=b) WHERE 99+(b+1)!=99; - - - DROP TABLE t1; - DROP TABLE t2; - CREATE TABLE t1(a); - CREATE TABLE t2(b, c, d); - INSERT INTO t2 VALUES(1, 3, 'not-4'); - SELECT b, d FROM t1 RIGHT JOIN t2 WHERE (b+0)=1 AND d!=4; - - - CREATE INDEX i2 ON t2((b+0), d); - SELECT b, d FROM t1 RIGHT JOIN t2 WHERE (b+0)=1 AND d!=4; - - - DROP INDEX i2; - CREATE INDEX i2 ON t2((b+0), d) WHERE d IS NOT NULL; - SELECT b, d FROM t1 RIGHT JOIN t2 WHERE (b+0)=1 AND d!=4; - - - CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(0),(1); - CREATE TABLE t2(a INT); INSERT INTO t2 VALUES(0),(2); - CREATE TABLE t3(a INT); INSERT INTO t3 VALUES(0),(3); - - - CREATE TABLE t0(t TEXT, u TEXT); INSERT INTO t0 VALUES('t', 'u'); - CREATE TABLE t1(v TEXT, w TEXT); INSERT INTO t1 VALUES('v', 'w'); - CREATE TABLE t2(x TEXT, y TEXT); INSERT INTO t2 VALUES('x', 'y'); - SELECT * FROM t0 JOIN t1 ON (t2.x NOTNULL) LEFT JOIN t2 ON false; - SELECT * FROM t0 JOIN t1 ON (t2.x NOTNULL) LEFT JOIN t2 ON false - WHERE t2.y ISNULL; - - - CREATE TABLE t0(a TEXT, b TEXT, c TEXT); - CREATE TABLE t1(a TEXT); - INSERT INTO t1 VALUES('1'); - CREATE VIEW v0 AS SELECT 'xyz' AS d; - SELECT * FROM v0 RIGHT JOIN t1 ON t1.a<>'' INNER JOIN t0 ON t0.c<>''; - SELECT * FROM v0 RIGHT JOIN t1 ON t1.a<>'' INNER JOIN t0 ON t0.c<>'' WHERE b ISNULL; - - - CREATE TABLE y0(a INT); - CREATE TABLE y1(b INT); INSERT INTO y1 VALUES(1), (2); - CREATE TABLE y2(c INT); INSERT INTO y2 VALUES(3), (4); - - - SELECT * FROM y0 RIGHT JOIN y1 ON true INNER JOIN y2 ON true WHERE y2.c!=99 AND y2.c!=98; - - - CREATE TABLE t1(x INT); - CREATE TABLE t2(y INT); - CREATE TABLE t3(z INT); - INSERT INTO t1 VALUES(10); - INSERT INTO t3 VALUES(20),(30); - - - SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON t2.y IS NOT NULL; - - - SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON t2.y IS NOT NULL - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600); - - - PRAGMA automatic_index = 0; - CREATE TABLE t4(x TEXT); - CREATE TABLE t5(y TEXT); - CREATE TABLE t6(z TEXT); - INSERT INTO t4 VALUES('a'), ('b'); - INSERT INTO t5 VALUES('b'), ('c'); - INSERT INTO t6 VALUES('a'), ('d'); - - - SELECT * FROM t4 LEFT JOIN t5 ON x=y LEFT JOIN t6 ON (x=z) ORDER BY +x; - - - SELECT * FROM t4 LEFT JOIN t5 ON x=y LEFT JOIN t6 ON (x=z) - WHERE t5.y!='x' AND t4.x!='x'; - - - CREATE TABLE t1(a TEXT); - CREATE TABLE t2(b TEXT); - CREATE TABLE t3(c TEXT); - INSERT INTO t2(b) VALUES ('x'); - INSERT INTO t3(c) VALUES ('y'), ('z'); - - - SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>''; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'' WHERE c IS NULL; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'' WHERE c IS NULL; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>''; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'' WHERE c<>''; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'' WHERE c IS NOT NULL; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'' WHERE c<>''; - - - SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'' WHERE c IS NOT NULL; - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, x INT, y INT); - CREATE TABLE t2(z INT); - INSERT INTO t1(id,x,y) VALUES(1, 0, 0); - - - SELECT * FROM t2 RIGHT JOIN t1 ON true; - - - SELECT 99=id AND 0=y AS "truth" FROM t2 RIGHT JOIN t1 ON true; - - - SELECT (99, 0)==(id, y) AS "truth" FROM t2 RIGHT JOIN t1; - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE 99=id AND 0=y; - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE 99=+id AND 0=y; - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE (99, 0)==(id,y); - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE (99, 0)==(+id,y); - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE 1=id AND 0=y; - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE 1=+id AND 0=y; - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE (1, 0)==(id,y); - - - SELECT * FROM t2 RIGHT JOIN t1 WHERE (1, 0)==(+id,y); - - - CREATE TABLE t3(a INTEGER PRIMARY KEY, b INT); - CREATE TABLE t4(x INT, y INT); - INSERT INTO t3(a,b) VALUES(1, 3); - - - SELECT t3.a FROM t4 RIGHT JOIN t3 ON (x=a) WHERE (b, 4)=(SELECT 3, 4); - - - SELECT t3.a FROM t4 RIGHT JOIN t3 ON (x=a) WHERE (b, 4) IS (SELECT 3, 4); - - - CREATE TABLE t1(a BOOLEAN); INSERT INTO t1 VALUES (false); - CREATE TABLE t2(x INT); INSERT INTO t2 VALUES (0); - SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 RIGHT JOIN t1 ON true WHERE (x NOTNULL)=a; - - - CREATE INDEX t1a ON t1(a); - SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 RIGHT JOIN t1 ON true WHERE (x NOTNULL)=a; - - - CREATE TABLE t3(z); - INSERT INTO t3 VALUES('t3value'); - SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 RIGHT JOIN t1 ON true INNER JOIN t3 ON (x NOTNULL)=a; - - - CREATE VIRTUAL TABLE rtree1 USING rtree(a, x1, x2); - INSERT INTO rtree1 VALUES(0, 0, 0); - - - SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 - RIGHT JOIN rtree1 ON true INNER JOIN t3 ON (x NOTNULL)=+a; - - - SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 - RIGHT JOIN rtree1 ON true INNER JOIN t3 ON (x NOTNULL)=a; - - - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT, c INT); - CREATE TABLE t3(d INT); - - INSERT INTO t1 VALUES(10); - INSERT INTO t2 VALUES(50,51); - INSERT INTO t3 VALUES(299); - - CREATE INDEX t2b ON t2( (b IS NOT NULL) ); - - - SELECT * FROM t1 LEFT JOIN t2 ON true INNER JOIN t3 ON (b IS NOT NULL)=0; - - - CREATE TABLE t1(x TEXT); - INSERT INTO t1(x) VALUES('aaa'); - CREATE VIEW v0(y) AS SELECT x FROM t1; - CREATE TABLE t2(z TEXT); - - - SELECT * FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc'; - - - SELECT * FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc' ORDER BY z; - - - SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc'; - - - SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc' ORDER BY z; - - - SELECT count(*) - FROM (SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'' RIGHT JOIN t1 ON z<>'') AS "t3"; - - - SELECT count(*) - FROM (SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'' RIGHT JOIN t1 ON z<>'' ORDER BY z) AS "t3"; - - - CREATE TABLE t1(a INT,b BOOLEAN); - CREATE TABLE t2(c INT); INSERT INTO t2 VALUES(NULL); - CREATE TABLE t3(d INT); - - - SELECT (b IS TRUE) FROM t1 JOIN t3 ON (b=TRUE) RIGHT JOIN t2 ON TRUE; - - - SELECT * FROM t1 JOIN t3 ON (b=TRUE) RIGHT JOIN t2 ON TRUE WHERE (b IS TRUE); - - - DROP TABLE t1; - DROP TABLE t2; - DROP TABLE t3; - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT); - CREATE TABLE t3(c INTEGER PRIMARY KEY, d INT); - CREATE INDEX t3d ON t3(d); - INSERT INTO t3 VALUES(0, 0); - - - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT); - CREATE TABLE t3(c TEXT); INSERT INTO t3 VALUES('x'); - CREATE TABLE t4(d TEXT); INSERT INTO t4 VALUES('y'); - SELECT 99 - FROM t1 - LEFT JOIN t2 ON true - RIGHT JOIN t3 ON true - RIGHT JOIN t4 ON true - WHERE a=b; - - - CREATE TABLE t1(a TEXT); - INSERT INTO t1 VALUES('c'); - CREATE TABLE t2(b TEXT, c TEXT NOT NULL); - INSERT INTO t2 VALUES('a', 'b'); - CREATE TABLE t3(d TEXT); - INSERT INTO t3 VALUES('x'); - CREATE TABLE t4(e TEXT); - INSERT INTO t4 VALUES('y'); - - - SELECT * - FROM t1 - LEFT JOIN t2 ON TRUE - JOIN t3 ON c='' - RIGHT JOIN t4 ON b=''; - - - SELECT * - FROM t1 - LEFT JOIN t2 ON TRUE - JOIN t3 ON c='' - RIGHT JOIN t4 ON b='' - WHERE d ISNULL - - - CREATE TABLE t4(b INT, c INT); - CREATE TABLE t5(a INT, f INT); - INSERT INTO t5 VALUES(1,2); - WITH t7(x, y) AS (SELECT 100, 200 FROM t5) - SELECT * FROM t4 JOIN t7 ON true RIGHT JOIN (SELECT y AS z FROM t7) AS t6 ON (x=z); - - - CREATE TABLE t1(a1 INT); - CREATE TABLE t2(b2 INT); - CREATE TABLE t3(c3 INT, d3 INT UNIQUE); - CREATE TABLE t4(e4 INT, f4 TEXT); - INSERT INTO t3(c3, d3) VALUES (2, 1); - INSERT INTO t4(f4) VALUES ('x'); - CREATE INDEX i0 ON t3(c3) WHERE d3 ISNULL; - ANALYZE main; - - - SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON (b2 IN (a1)) FULL JOIN t4 ON true; - - - SELECT 1 FROM t1 LEFT JOIN t2 ON true JOIN t3 ON (b2 IN (a1)) FULL JOIN t4 ON true; - - - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT, c INT); - CREATE VIEW t3(d) AS SELECT NULL FROM t2 FULL OUTER JOIN t1 ON c=a UNION ALL SELECT b FROM t2; - INSERT INTO t1(a) VALUES (NULL); - INSERT INTO t2(b, c) VALUES (99, NULL); - SELECT DISTINCT b, c, d FROM t2, t3 WHERE b<>0 - UNION SELECT DISTINCT b, c, d FROM t2, t3 WHERE b ISNULL; - diff --git a/libsql-wal/tests/assets/fixtures/join9.test b/libsql-wal/tests/assets/fixtures/join9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/joinA.test b/libsql-wal/tests/assets/fixtures/joinA.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/joinB.test b/libsql-wal/tests/assets/fixtures/joinB.test deleted file mode 100644 index 6dc493e844..0000000000 --- a/libsql-wal/tests/assets/fixtures/joinB.test +++ /dev/null @@ -1,4736 +0,0 @@ - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL INNER JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL INNER JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL INNER JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL INNER JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL FULL JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL FULL JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL FULL JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - INNER JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - INNER JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - INNER JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL INNER JOIN t2 - NATURAL FULL JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - LEFT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - LEFT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - LEFT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL LEFT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL INNER JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - RIGHT JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - RIGHT JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - RIGHT JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL RIGHT JOIN t2 - NATURAL FULL JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL INNER JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL INNER JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL INNER JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 INNER JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - INNER JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - INNER JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL INNER JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 LEFT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - LEFT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - LEFT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL LEFT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 RIGHT JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - RIGHT JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - RIGHT JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL RIGHT JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - INNER JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - INNER JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - INNER JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL FULL JOIN t3 - NATURAL INNER JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - LEFT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - LEFT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - LEFT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL FULL JOIN t3 - NATURAL LEFT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - RIGHT JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - RIGHT JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - RIGHT JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL FULL JOIN t3 - NATURAL RIGHT JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - INNER JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - INNER JOIN t5 USING(a,b) - WHERE a<>13 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - LEFT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, c, d, e, f, g - FROM t1 - FULL JOIN (t2 FULL JOIN t3 USING(a)) USING(a) - FULL JOIN (t4 LEFT JOIN t5 USING(a)) USING(a) - WHERE a<=18 - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - RIGHT JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, b, c, d, e, f, g - FROM t1 - FULL JOIN t2 USING(a,b) - FULL JOIN t3 USING(a,b) - FULL JOIN t4 USING(a,b) - RIGHT JOIN t5 USING(a,b) - WHERE d<>33 OR d IS NULL - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 - FULL JOIN t2 USING(a) - FULL JOIN t3 USING(a) - FULL JOIN t4 USING(a) - FULL JOIN t5 USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT b, c, d, e, f, g - FROM t1 - NATURAL FULL JOIN t2 - NATURAL FULL JOIN t3 - NATURAL FULL JOIN t4 - NATURAL FULL JOIN t5 - WHERE b BETWEEN 12 AND 17 - ORDER BY 1 NULLS FIRST; - diff --git a/libsql-wal/tests/assets/fixtures/joinC.test b/libsql-wal/tests/assets/fixtures/joinC.test deleted file mode 100644 index 9a56d0e4c1..0000000000 --- a/libsql-wal/tests/assets/fixtures/joinC.test +++ /dev/null @@ -1,2816 +0,0 @@ - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 INNER JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 LEFT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 RIGHT JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 INNER JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 LEFT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 RIGHT JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 INNER JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 LEFT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 RIGHT JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 INNER JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 LEFT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 RIGHT JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - - - SELECT a, t1.a, t2.a, t3.a, t4.a, t5.a - FROM t1 FULL JOIN ( - t2 FULL JOIN ( - t3 FULL JOIN ( - t4 FULL JOIN t5 USING(a) - ) USING(a) - ) USING(a) - ) USING(a) - ORDER BY 1 NULLS FIRST; - diff --git a/libsql-wal/tests/assets/fixtures/joinD.test b/libsql-wal/tests/assets/fixtures/joinD.test deleted file mode 100644 index 80198c40b9..0000000000 --- a/libsql-wal/tests/assets/fixtures/joinD.test +++ /dev/null @@ -1,9090 +0,0 @@ - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 INNER JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 LEFT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IS NOT DISTINCT FROM t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b IS NOT DISTINCT FROM t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 RIGHT JOIN t2 ON t1.b IN (t2.b,-2,-3) AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - INNER JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - INNER JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - INNER JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - LEFT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - LEFT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - LEFT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - RIGHT JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c IS NOT DISTINCT FROM t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - RIGHT JOIN t3 ON t1.c IS NOT DISTINCT FROM t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c IN (-4,t3.c,-5) AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - INNER JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - INNER JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - INNER JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - LEFT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - LEFT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - LEFT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - RIGHT JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - RIGHT JOIN t4 ON t1.d IS NOT DISTINCT FROM t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - RIGHT JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d IS NOT DISTINCT FROM t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE (t2.x>0 OR t2.x IS NULL) - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON true - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t1.b=t2.b AND t2.x>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t3.y>0 OR t3.y IS NULL - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z IS NULL OR t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t4.z>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d AND t4.z>0 - WHERE t2.x>0 AND t3.y>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b=t2.b - FULL JOIN t3 ON t1.c=t3.c - FULL JOIN t4 ON t1.d=t4.d - WHERE t2.x>0 AND t3.y>0 AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t1.b = t2.b AND t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t3.y>0 - FULL JOIN t4 ON t1.d = t4.d AND t4.z>0 - WHERE t1.b = t2.b AND t1.c = t3.c - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - SELECT t1.*, t2.*, t3.*, t4.* - FROM t1 FULL JOIN t2 ON t2.x>0 - FULL JOIN t3 ON t1.c = t3.c AND t3.y>0 - FULL JOIN t4 ON t4.z>0 - WHERE t1.b = t2.b AND t1.d = t4.d - ORDER BY coalesce(t1.a,t2.b,t3.c,t4.d,0); - - - CREATE VIEW v1 AS - SELECT * - FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0 - RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0 - LEFT JOIN t4 ON t1.d=t4.d AND t4.z>0; - CREATE TRIGGER v1r1 INSTEAD OF UPDATE OF c ON v1 BEGIN - UPDATE t1 SET c=new.c WHERE (a,b,c,d) IS (old.a,old.b,old.c,old.d); - UPDATE t3 SET c=new.c WHERE (c,y) IS (old.c,old.y); - END; - SELECT * FROM v1 WHERE y BETWEEN 30 AND 40 ORDER BY y; - - - BEGIN; - UPDATE v1 SET c=c+1000 WHERE y BETWEEN 30 and 40; - SELECT * FROM v1 WHERE y BETWEEN 30 AND 40 ORDER BY y; - ROLLBACK; - diff --git a/libsql-wal/tests/assets/fixtures/joinE.test b/libsql-wal/tests/assets/fixtures/joinE.test deleted file mode 100644 index 6ea0b0cc32..0000000000 --- a/libsql-wal/tests/assets/fixtures/joinE.test +++ /dev/null @@ -1,200 +0,0 @@ - - SELECT a, b - FROM t1 INNER JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 FULL JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 FULL JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - -# SELECT a, b -# FROM t1 FULL JOIN t2 ON a IS NULL -# ORDER BY coalesce(a,b,3); -# - - SELECT a, b - FROM t1 FULL JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - -# SELECT a, b -# FROM t1 FULL JOIN t2 ON b IS NULL -# ORDER BY coalesce(a,b,3); -# - - SELECT a, b - FROM t1 INNER JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 INNER JOIN t2 ON b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 LEFT JOIN t2 ON b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON a IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 RIGHT JOIN t2 ON b IS NULL - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 FULL JOIN t2 ON true - ORDER BY coalesce(a,b,3); - - - SELECT a, b - FROM t1 FULL JOIN t2 ON true WHERE a IS NULL - ORDER BY coalesce(a,b,3); - - -# SELECT a, b -# FROM t1 FULL JOIN t2 ON a IS NULL -# ORDER BY coalesce(a,b,3); -# - - SELECT a, b - FROM t1 FULL JOIN t2 ON true WHERE b IS NULL - ORDER BY coalesce(a,b,3); - - -# SELECT a, b -# FROM t1 FULL JOIN t2 ON b IS NULL -# ORDER BY coalesce(a,b,3); -# diff --git a/libsql-wal/tests/assets/fixtures/joinF.test b/libsql-wal/tests/assets/fixtures/joinF.test deleted file mode 100644 index 701e6df90f..0000000000 --- a/libsql-wal/tests/assets/fixtures/joinF.test +++ /dev/null @@ -1,405 +0,0 @@ - - SELECT * - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 INNER JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 LEFT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - INNER JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - LEFT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - INNER JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - LEFT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - - - SELECT * - FROM t1 RIGHT JOIN t2 ON true - RIGHT JOIN t3 ON t2.y IS NOT NULL - RIGHT JOIN t4 ON true - WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600) - ORDER BY coalesce(t1.x,t2.y,t3.z,t4.w,0); - diff --git a/libsql-wal/tests/assets/fixtures/joinH.test b/libsql-wal/tests/assets/fixtures/joinH.test deleted file mode 100644 index cb0ded1290..0000000000 --- a/libsql-wal/tests/assets/fixtures/joinH.test +++ /dev/null @@ -1,140 +0,0 @@ - - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT); - INSERT INTO t2(b) VALUES(NULL); - - - SELECT DISTINCT a FROM t1 FULL JOIN t2 ON true WHERE (b ISNULL); - - - SELECT a FROM t1 FULL JOIN t2 ON true; - - - SELECT a FROM t1 FULL JOIN t2 ON true WHERE (b ISNULL); - - - SELECT DISTINCT a FROM t1 FULL JOIN t2 ON true; - - - CREATE TABLE r3(x); - CREATE TABLE r4(y INTEGER PRIMARY KEY); - INSERT INTO r4 VALUES(55); - - - SELECT 'value!' FROM r3 FULL JOIN r4 ON (y=x); - - - SELECT 'value!' FROM r3 FULL JOIN r4 ON (y=x) WHERE +y=55; - - - CREATE TABLE t0 (c0); - CREATE TABLE t1 (c0); - CREATE TABLE t2 (c0 , c1 , c2 , UNIQUE (c0), UNIQUE (c2 DESC)); - INSERT INTO t2 VALUES ('x', 'y', 'z'); - ANALYZE; - CREATE VIEW v0(c0) AS SELECT FALSE; - - - CREATE TABLE t1(a,b,c,d,e,f,g,h,PRIMARY KEY(a,b,c)) WITHOUT ROWID; - CREATE TABLE t2(i, j); - INSERT INTO t2 VALUES(10, 20); - - - SELECT (d IS NULL) FROM t1 RIGHT JOIN t2 ON (j=33); - - - CREATE INDEX i1 ON t1( (d IS NULL), d ); - - - SELECT (d IS NULL) FROM t1 RIGHT JOIN t2 ON (j=33); - - - CREATE TABLE t0(w); - CREATE TABLE t1(x); - CREATE TABLE t2(y); - CREATE TABLE t3(z); - INSERT INTO t3 VALUES('t3val'); - - - SELECT * FROM t1 INNER JOIN t2 ON (0) RIGHT OUTER JOIN t3; - - - SELECT * FROM t1 INNER JOIN t2 ON (0) FULL OUTER JOIN t3; - - - SELECT * FROM t3 LEFT JOIN t2 ON (0); - - - SELECT * FROM t0 RIGHT JOIN t1 INNER JOIN t2 ON (0) RIGHT JOIN t3 - - - SELECT * FROM t0 RIGHT JOIN t1 INNER JOIN t2 ON (0) - - - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT); - INSERT INTO t1 VALUES(3); - SELECT CASE WHEN t2.b THEN 0 ELSE 1 END FROM t1 LEFT JOIN t2 ON true; - - - SELECT * FROM t1 LEFT JOIN t2 ON true WHERE CASE WHEN t2.b THEN 0 ELSE 1 END; - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c); - CREATE TABLE t3(d); - - INSERT INTO t1 VALUES ('a', 'a'); - INSERT INTO t2 VALUES ('ddd'); - INSERT INTO t3 VALUES(1234); - - - SELECT t2.rowid FROM t1 JOIN (t2 JOIN t3); - - - UPDATE t1 SET b = t2.rowid FROM t2, t3; - - - SELECT * FROM t1 - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b); - CREATE TABLE x2(c, d); - CREATE TABLE x3(rowid, _rowid_); - - CREATE TABLE x4(rowid, _rowid_, oid); - - INSERT INTO x1 VALUES(1000, 'thousand'); - INSERT INTO x2 VALUES('c', 'd'); - INSERT INTO x3(oid, rowid, _rowid_) VALUES(43, 'hello', 'world'); - INSERT INTO x4(oid, rowid, _rowid_) VALUES('forty three', 'hello', 'world'); - - - SELECT x3.oid FROM x1 JOIN (x2 JOIN x3 ON c='c') - - - SELECT x3.rowid FROM x1 JOIN (x2 JOIN x3 ON c='c') - - - SELECT x4.oid FROM x1 JOIN (x2 JOIN x4 ON c='c') - - - CREATE TABLE x1(a); - CREATE TABLE x2(b); - CREATE TABLE x3(c); - - CREATE TABLE wo1(a PRIMARY KEY, b) WITHOUT ROWID; - CREATE TABLE wo2(a PRIMARY KEY, rowid) WITHOUT ROWID; - CREATE TABLE wo3(a PRIMARY KEY, b) WITHOUT ROWID; - - - INSERT INTO x1(rowid, a) VALUES(101, 'A'); - INSERT INTO x2(rowid, b) VALUES(55, 'B'); - SELECT * FROM x1 NATURAL JOIN x2; - - - INSERT INTO wo1(a, b) VALUES('mya', 'myb'); - INSERT INTO wo2(a, rowid) VALUES('mypk', 'myrowid'); - INSERT INTO wo3(a, b) VALUES('MYA', 'MYB'); - INSERT INTO x3(rowid, c) VALUES(99, 'x3B'); - diff --git a/libsql-wal/tests/assets/fixtures/journal1.test b/libsql-wal/tests/assets/fixtures/journal1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/journal2.test b/libsql-wal/tests/assets/fixtures/journal2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/journal3.test b/libsql-wal/tests/assets/fixtures/journal3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/jrnlmode.test b/libsql-wal/tests/assets/fixtures/jrnlmode.test deleted file mode 100644 index 07348d7a65..0000000000 --- a/libsql-wal/tests/assets/fixtures/jrnlmode.test +++ /dev/null @@ -1,22 +0,0 @@ - INSERT INTO t2 VALUES(456) - SELECT * FROM t1, t2 - PRAGMA journal_mode=PERSIST - PRAGMA journal_mode=TRUNCATE - PRAGMA journal_mode=PERSIST - PRAGMA journal_mode=DELETE - PRAGMA journal_mode=TRUNCATE - CREATE TABLE t3(z) - BEGIN IMMEDIATE - PRAGMA journal_mode=DELETE - COMMIT - PRAGMA journal_mode=DELETE - PRAGMA journal_mode=TRUNCATE - CREATE TABLE t4(w) - BEGIN IMMEDIATE - PRAGMA journal_mode=DELETE - COMMIT - PRAGMA journal_mode=DELETE - - CREATE TABLE tx(a); - PRAGMA journal_mode = off; - diff --git a/libsql-wal/tests/assets/fixtures/jrnlmode2.test b/libsql-wal/tests/assets/fixtures/jrnlmode2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/jrnlmode3.test b/libsql-wal/tests/assets/fixtures/jrnlmode3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/json101.test b/libsql-wal/tests/assets/fixtures/json101.test deleted file mode 100644 index ae420514a5..0000000000 --- a/libsql-wal/tests/assets/fixtures/json101.test +++ /dev/null @@ -1,682 +0,0 @@ - - SELECT json_array(1,2.5,null,'hello'); - - - SELECT json_array(1,'{"abc":2.5,"def":null,"ghi":hello - - SELECT json_array(1,json('{"abc":2.5,"def":null,"ghi":"hello" - - SELECT json_array(1,json_object('abc',2.5,'def',null,'ghi','hello'),99); - -- the second term goes in as JSON - - - SELECT hex(json_array('String "\ Test')); - - - SELECT json_array(-9223372036854775808,9223372036854775807,0,1,-1, - 0.0, 1.0, -1.0, -1e99, +2e100, - 'one','two','three', - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, NULL, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 'abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 99); - - - SELECT json_object('a',1,'b',2.5,'c',null,'d','String Test'); - - - SELECT json_replace('{"a":1,"b":2 - - SELECT json_replace('{"a":1,"b":2 - - SELECT json_type(json_set('{"a":1,"b":2 - - SELECT json_type(json_set('{"a":1,"b":2 - - SELECT fullkey, atom, '|' FROM json_tree(json_set('{ - - CREATE TABLE j1(x); - INSERT INTO j1(x) - VALUES('true'),('false'),('null'),('123'),('-234'),('34.5e+6'), - ('""'),('"\""'),('"\\"'),('"abcdefghijlmnopqrstuvwxyz"'), - ('[]'),('{ - - SELECT * FROM j1 WHERE NOT json_valid(char(0x20,0x09,0x0a,0x0d)||x); - - - SELECT * FROM j1 WHERE NOT json_valid(x||char(0x20,0x09,0x0a,0x0d)); - - - SELECT json_valid(''), json_valid(char(0x20,0x09,0x0a,0x0d)); - - - SELECT x FROM j1 WHERE json_remove(x)<>x; - - - SELECT x FROM j1 WHERE json_replace(x)<>x; - - - SELECT x FROM j1 WHERE json_set(x)<>x; - - - SELECT x FROM j1 WHERE json_insert(x)<>x; - - - SELECT json_insert('{"a":1 - - SELECT count(*) FROM j1 WHERE json_type(x) IN ('object','array'); - SELECT x FROM j1 - WHERE json_extract(x,'$')<>x - AND json_type(x) IN ('object','array'); - - - CREATE TABLE j2(id INTEGER PRIMARY KEY, json, src); - INSERT INTO j2(id,json,src) - VALUES(1,'{ - "firstName": "John", - "lastName": "Smith", - "isAlive": true, - "age": 25, - "address": { - "streetAddress": "21 2nd Street", - "city": "New York", - "state": "NY", - "postalCode": "10021-3100" - - - SELECT id, json_valid(json), json_type(json), '|' FROM j2 ORDER BY id; - - - SELECT j2.rowid, jx.rowid, fullkey, path, key - FROM j2, json_tree(j2.json) AS jx - WHERE fullkey!=(path || CASE WHEN typeof(key)=='integer' THEN '['||key||']' - ELSE '.'||key END); - - - SELECT j2.rowid, jx.rowid, fullkey, path, key - FROM j2, json_each(j2.json) AS jx - WHERE fullkey!=(path || CASE WHEN typeof(key)=='integer' THEN '['||key||']' - ELSE '.'||key END); - - - SELECT j2.rowid, jx.rowid, fullkey, path, key - FROM j2, json_each(j2.json) AS jx - WHERE jx.json<>j2.json; - - - SELECT j2.rowid, jx.rowid, fullkey, path, key - FROM j2, json_tree(j2.json) AS jx - WHERE jx.json<>j2.json; - - - SELECT j2.rowid, jx.rowid, fullkey, path, key - FROM j2, json_each(j2.json) AS jx - WHERE jx.value<>jx.atom AND type NOT IN ('array','object'); - - - SELECT j2.rowid, jx.rowid, fullkey, path, key - FROM j2, json_tree(j2.json) AS jx - WHERE jx.value<>jx.atom AND type NOT IN ('array','object'); - - - SELECT json_valid('{"a":55,"b":72, - - SELECT json_error_position('{"a":55,"b":72, - - SELECT json_valid(json('{"a":55,"b":72, - - SELECT json_valid('{"a":55,"b":72 , - - SELECT json_error_position('{"a":55,"b":72 , - - SELECT json_error_position('{"a":55,"b":72,, - - SELECT json_valid('{"a":55,"b":72 - - SELECT json_error_position('["a",55,"b",72,]'); - - - SELECT json_error_position('["a",55,"b",72 , ]'); - - - SELECT json_error_position('["a",55,"b",72,,]'); - - - SELECT json_valid('["a",55,"b",72]'); - - - DROP TABLE IF EXISTS t8; - CREATE TABLE t8(a,b); - INSERT INTO t8(a) VALUES('abc' || char(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35) || 'xyz'); - UPDATE t8 SET b=json_array(a); - SELECT b FROM t8; - - - SELECT a=json_extract(b,'$[0]') FROM t8; - - - SELECT json_valid(char(0x22,0xe4,0x22)); - - - SELECT unicode(json_extract(char(0x22,228,0x22),'$')); - - - SELECT json_quote('abc"xyz'); - - - SELECT json_quote(3.14159); - - - SELECT json_quote(12345); - - - SELECT json_quote(null); - - - SELECT json_valid('" \ "'); - - - SELECT json_valid('" \! "'); - - - SELECT json_valid('" \" "'); - - - SELECT json_valid('" \# "'); - - - SELECT json_valid('" \$ "'); - - - SELECT json_valid('" \% "'); - - - SELECT json_valid('" \& "'); - - - SELECT json_valid('" \'' "'); - - - SELECT json_valid('" \( "'); - - - SELECT json_valid('" \) "'); - - - SELECT json_valid('" \* "'); - - - SELECT json_valid('" \+ "'); - - - SELECT json_valid('" \, "'); - - - SELECT json_valid('" \- "'); - - - SELECT json_valid('" \. "'); - - - SELECT json_valid('" \/ "'); - - - SELECT json_valid('" \0 "'); - - - SELECT json_valid('" \1 "'); - - - SELECT json_valid('" \2 "'); - - - SELECT json_valid('" \3 "'); - - - SELECT json_valid('" \4 "'); - - - SELECT json_valid('" \5 "'); - - - SELECT json_valid('" \6 "'); - - - SELECT json_valid('" \7 "'); - - - SELECT json_valid('" \8 "'); - - - SELECT json_valid('" \9 "'); - - - SELECT json_valid('" \: "'); - - - SELECT json_valid('" \; "'); - - - SELECT json_valid('" \< "'); - - - SELECT json_valid('" \= "'); - - - SELECT json_valid('" \> "'); - - - SELECT json_valid('" \? "'); - - - SELECT json_valid('" \@ "'); - - - SELECT json_valid('" \A "'); - - - SELECT json_valid('" \B "'); - - - SELECT json_valid('" \C "'); - - - SELECT json_valid('" \D "'); - - - SELECT json_valid('" \E "'); - - - SELECT json_valid('" \F "'); - - - SELECT json_valid('" \G "'); - - - SELECT json_valid('" \H "'); - - - SELECT json_valid('" \I "'); - - - SELECT json_valid('" \J "'); - - - SELECT json_valid('" \K "'); - - - SELECT json_valid('" \L "'); - - - SELECT json_valid('" \M "'); - - - SELECT json_valid('" \N "'); - - - SELECT json_valid('" \O "'); - - - SELECT json_valid('" \P "'); - - - SELECT json_valid('" \Q "'); - - - SELECT json_valid('" \R "'); - - - SELECT json_valid('" \S "'); - - - SELECT json_valid('" \T "'); - - - SELECT json_valid('" \U "'); - - - SELECT json_valid('" \V "'); - - - SELECT json_valid('" \W "'); - - - SELECT json_valid('" \X "'); - - - SELECT json_valid('" \Y "'); - - - SELECT json_valid('" \Z "'); - - - SELECT json_valid('" \[ "'); - - - SELECT json_valid('" \\ "'); - - - SELECT json_valid('" \] "'); - - - SELECT json_valid('" \^ "'); - - - SELECT json_valid('" \_ "'); - - - SELECT json_valid('" \` "'); - - - SELECT json_valid('" \a "'); - - - SELECT json_valid('" \b "'); - - - SELECT json_valid('" \c "'); - - - SELECT json_valid('" \d "'); - - - SELECT json_valid('" \e "'); - - - SELECT json_valid('" \f "'); - - - SELECT json_valid('" \g "'); - - - SELECT json_valid('" \h "'); - - - SELECT json_valid('" \i "'); - - - SELECT json_valid('" \j "'); - - - SELECT json_valid('" \k "'); - - - SELECT json_valid('" \l "'); - - - SELECT json_valid('" \m "'); - - - SELECT json_valid('" \n "'); - - - SELECT json_valid('" \o "'); - - - SELECT json_valid('" \p "'); - - - SELECT json_valid('" \q "'); - - - SELECT json_valid('" \r "'); - - - SELECT json_valid('" \s "'); - - - SELECT json_valid('" \t "'); - - - SELECT json_valid('" \u "'); - - - SELECT json_valid('" \ua "'); - - - SELECT json_valid('" \uab "'); - - - SELECT json_valid('" \uabc "'); - - - SELECT json_valid('" \uabcd "'); - - - SELECT json_valid('" \uFEDC "'); - - - SELECT json_valid('" \u1234 "'); - - - SELECT json_valid('" \v "'); - - - SELECT json_valid('" \w "'); - - - SELECT json_valid('" \x "'); - - - SELECT json_valid('" \y "'); - - - SELECT json_valid('" \z "'); - - - SELECT json_valid('" \{ "'); - - - SELECT json_valid('" \| "'); - - - SELECT json_valid('" \ - - SELECT json_valid('" \~ "'); - - - /* Shallow enough to be parsed */ - SELECT json_valid(printf('%.1000c0%.1000c','[',']')); - - - /* Too deep by one */ - SELECT json_valid(printf('%.1001c0%.1001c','[',']')); - - - /* Shallow enough to be parsed { */ - SELECT json_valid(replace(printf('%.1000c0%.1000c','[',' - - /* Too deep by one { */ - SELECT json_valid(replace(printf('%.1001c0%.1001c','[',' - - CREATE TABLE t12(x); - INSERT INTO t12(x) VALUES( - '{"settings": - {"layer2": - {"hapax.legomenon": - {"forceDisplay":true, - "transliterate":true, - "add.footnote":true, - "summary.report":true - - SELECT json_remove(x, '$.settings.layer2."dis.legomenon".forceDisplay') - FROM t12; - - - SELECT json_extract(x, '$.settings.layer2."tris.legomenon"."summary.report"') - FROM t12; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(id, json); - INSERT INTO t1(id,json) VALUES(1,'{"items":[3,5] - - SELECT * FROM t2 CROSS JOIN t1 - WHERE EXISTS(SELECT 1 FROM json_each(t1.json,'$.items') AS Z - WHERE Z.value==t2.id); - - - SELECT fullkey FROM json_each('123'); - - - SELECT fullkey FROM json_each('123.56'); - - - SELECT fullkey FROM json_each('"hello"'); - - - SELECT fullkey FROM json_each('null'); - - - SELECT fullkey FROM json_tree('123'); - - - SELECT fullkey FROM json_tree('123.56'); - - - SELECT fullkey FROM json_tree('"hello"'); - - - SELECT fullkey FROM json_tree('null'); - - - SELECT * FROM JSON_EACH('{"a":1, "b":2 - - SELECT xyz.* FROM JSON_EACH('{"a":1, "b":2 - - SELECT * FROM (JSON_EACH('{"a":1, "b":2 - - SELECT xyz.* FROM (JSON_EACH('{"a":1, "b":2 - - SELECT length(json_extract('"abc\uD834\uDD1Exyz"','$')); - - - SELECT length(json_extract('"\uD834\uDD1E"','$')); - - - SELECT unicode(json_extract('"\uD834\uDD1E"','$')); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a,b,c); - CREATE TABLE t2(d); - SELECT * FROM t1 LEFT JOIN t2 ON (SELECT b FROM json_each ORDER BY 1); - - - SELECT json_valid('{"":5 - - SELECT json_extract('{"":5 - - SELECT json_extract('[3,{"a":4,"":[5,{"hi":6 - - SELECT json_extract('[3,{"a":4,"":[5,{"hi":6 - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - - - COMMIT; - SELECT * FROM t1; - - - SELECT json_object('a',2e370,'b',-3e380); - - - SELECT json_object('a',2e370,'b',-3e380)->>'a'; - - - SELECT json_object('a',2e370,'b',-3e380)->>'b'; - - - SELECT json_valid(NULL); - - - SELECT json_valid(NULL); - - - SELECT json_error_position(NULL); - - - SELECT json(NULL); - - - SELECT json_array(NULL); - - - SELECT json_extract(NULL); - - - SELECT json_insert(NULL,'$',123); - - - SELECT NULL->0; - - - SELECT NULL->>0; - - - SELECT '{a:5 - - SELECT '{a:5 - - SELECT json_patch(NULL,'{a:5 - - SELECT json_patch('{a:5 - - SELECT json_patch(NULL,NULL); - - - SELECT json_remove(NULL,'$'); - - - SELECT json_remove('{a:5,b:7 - - SELECT json_replace(NULL,'$.a',123); - - - SELECT json_replace('{a:5,b:7 - - SELECT json_set(NULL,'$.a',123); - - - SELECT json_set('{a:5,b:7 - - SELECT json_type(NULL); - - - SELECT json_type('{a:5,b:7 - - SELECT json_quote(NULL); - - - SELECT count(*) FROM json_each(NULL); - - - SELECT count(*) FROM json_tree(NULL); - - - WITH c(x) AS (VALUES(1),(2.0),(NULL),('three')) - SELECT json_group_array(x) FROM c; - - - WITH c(x,y) AS (VALUES('a',1),('b',2.0),('c',NULL),(NULL,'three'),('e','four')) - SELECT json_group_object(x,y) FROM c; - - - SELECT json_set( - '{ - - SELECT json_replace( - '{"a":7,"b":8,"c":9 - - SELECT j, j->>0, j->>1 - FROM (SELECT json_set(json_set('[]','$[#]',0), '$[#]',1) AS j); - - - SELECT j, j->>0, j->>1 - FROM (SELECT json_set('[]','$[#]',0,'$[#]',1) AS j); - diff --git a/libsql-wal/tests/assets/fixtures/json102.test b/libsql-wal/tests/assets/fixtures/json102.test deleted file mode 100644 index 1353336969..0000000000 --- a/libsql-wal/tests/assets/fixtures/json102.test +++ /dev/null @@ -1,219 +0,0 @@ - - SELECT json_object('ex','[52,3.14159]'); - - - SELECT json_object('ex',json('[52,3.14159]')); - - - SELECT json_object('ex',json_array(52,3.14159)); - - - SELECT json(' { "this" : "is", "a": [ "test" ] - - SELECT json_array(1,2,'3',4); - - - SELECT json_array('[1,2]'); - - - SELECT json_array(json_array(1,2)); - - - SELECT json_array(1,null,'3','[4,5]','{"six":7.7 - - SELECT json_array(1,null,'3',json('[4,5]'),json('{"six":7.7 - - SELECT json_array_length('[1,2,3,4]'); - - - SELECT json_array_length( json_remove('[1,2,3,4]','$[2]') ); - - - SELECT json_array_length('[1,2,3,4]', '$'); - - - SELECT json_array_length('[1,2,3,4]', '$[2]'); - - - SELECT json_array_length('{"one":[1,2,3] - - SELECT json_array_length('{"one":[1,2,3] - - SELECT json_array_length('{"one":[1,2,3] - - SELECT json_extract('{"a":2,"c":[4,5,{"f":7 - - SELECT json_extract('{"a":2,"c":[4,5,{"f":7 - - SELECT json_extract('{"a":2,"c":[4,5,{"f":7 - - SELECT json_extract('{"a":2,"c":[4,5,{"f":7 - - SELECT json_extract('{"a":2,"c":[4,5],"f":7 - - SELECT json_extract('{"a":2,"c":[4,5,{"f":7 - - SELECT json_extract('{"a":2,"c":[4,5,{"f":7 - - SELECT json_insert('{"a":2,"c":4 - - SELECT json_insert('{"a":2,"c":4 - - SELECT json_replace('{"a":2,"c":4 - - SELECT json_replace('{"a":2,"c":4 - - SELECT json_set('{"a":2,"c":4 - - SELECT json_set('{"a":2,"c":4 - - SELECT json_set('{"a":2,"c":4 - - SELECT json_set('{"a":2,"c":4 - - SELECT json_set('{"a":2,"c":4 - - SELECT json_object('a',2,'c',4); - - - SELECT json_object('a',2,'c','{e:5 - - SELECT json_object('a',2,'c',json_object('e',5)); - - - SELECT json_remove('[0,1,2,3,4]','$[2]'); - - - SELECT json_remove('[0,1,2,3,4]','$[2]','$[0]'); - - - SELECT json_remove('[0,1,2,3,4]','$[0]','$[2]'); - - - SELECT json_remove('{"x":25,"y":42 - - SELECT json_remove('{"x":25,"y":42 - - SELECT json_remove('{"x":25,"y":42 - - SELECT json_remove('{"x":25,"y":42 - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_type('{"a":[2,3.5,true,false,null,"x"] - - SELECT json_valid(char(123)||'"x":35'||char(125)); - - - SELECT json_valid(char(123)||'"x":35'); - - - CREATE TABLE user(name,phone); - INSERT INTO user(name,phone) VALUES - ('Alice','["919-555-2345","804-555-3621"]'), - ('Bob','["201-555-8872"]'), - ('Cindy','["704-555-9983"]'), - ('Dave','["336-555-8421","704-555-4321","803-911-4421"]'); - SELECT DISTINCT user.name - FROM user, json_each(user.phone) - WHERE json_each.value LIKE '704-%' - ORDER BY 1; - - - UPDATE user - SET phone=json_extract(phone,'$[0]') - WHERE json_array_length(phone)<2; - SELECT name, substr(phone,1,5) FROM user ORDER BY name; - - - SELECT name FROM user WHERE phone LIKE '704-%' - UNION - SELECT user.name - FROM user, json_each(user.phone) - WHERE json_valid(user.phone) - AND json_each.value LIKE '704-%'; - - - CREATE TABLE big(json JSON); - INSERT INTO big(json) VALUES('{ - "id":123, - "stuff":[1,2,3,4], - "partlist":[ - {"uuid":"bb108722-572e-11e5-9320-7f3b63a4ca74" - - SELECT big.rowid, fullkey, value - FROM big, json_tree(big.json) - WHERE json_tree.type NOT IN ('object','array') - ORDER BY +big.rowid, +json_tree.id - - - SELECT big.rowid, fullkey, atom - FROM big, json_tree(big.json) - WHERE atom IS NOT NULL - ORDER BY +big.rowid, +json_tree.id - - - SELECT DISTINCT json_extract(big.json,'$.id') - FROM big, json_tree(big.json,'$.partlist') - WHERE json_tree.key='uuid' - AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808'; - - - SELECT DISTINCT json_extract(big.json,'$.id') - FROM big, json_tree(big.json,'$') - WHERE json_tree.key='uuid' - AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808'; - - - SELECT DISTINCT json_extract(big.json,'$.id') - FROM big, json_tree(big.json) - WHERE json_tree.key='uuid' - AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808'; - - SELECT json_valid(char(32) || '"xyz"') - SELECT json_valid(char(200) || '"xyz"') - - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<0x20) - SELECT x FROM c WHERE json_valid(printf('{"a":"x%sz" - - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<0x1f) - SELECT sum(json_valid(json_quote('a'||char(x)||'z'))) FROM c ORDER BY x; - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, x JSON); - INSERT INTO t1(id,x) VALUES - (1, '{"a":null - - DELETE FROM t1; - INSERT INTO t1(x) VALUES('[null,123,4.5,"six",[7,8],{"b":9 - - CREATE TABLE t1(a1 DATE, a2 INTEGER PRIMARY KEY, a3 INTEGER, memo TEXT); - CREATE INDEX t1x1 ON t1(a3, a1, memo->>'y'); - INSERT INTO t1(a2,a1,a3,memo) VALUES (876, '2023-08-03', 5, '{"x":77,"y":4 - - UPDATE t1 SET memo = JSON_REMOVE(memo, '$.y'); - PRAGMA integrity_check; - SELECT * FROM t1; - - - UPDATE t1 SET memo = JSON_SET(memo, '$.y', 6) - WHERE a2 IN (876) AND JSON_TYPE(memo, '$.y') IS NULL; - PRAGMA integrity_check; - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/json103.test b/libsql-wal/tests/assets/fixtures/json103.test deleted file mode 100644 index 466ab9f5f0..0000000000 --- a/libsql-wal/tests/assets/fixtures/json103.test +++ /dev/null @@ -1,56 +0,0 @@ - - CREATE TABLE t1(a,b,c); - WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c) SELECT x, x%3, printf('n%d',x) FROM c; - UPDATE t1 SET a='orange' WHERE rowid=39; - UPDATE t1 SET a=32.5 WHERE rowid=31; - UPDATE t1 SET a=x'303132' WHERE rowid=29; - UPDATE t1 SET a=NULL WHERE rowid=37; - SELECT json_group_array(a) FROM t1 WHERE a<0 AND typeof(a)!='blob'; - - - SELECT json_group_array(a) FROM t1 - WHERE rowid BETWEEN 31 AND 39; - - - SELECT json_array_length(json_group_array(a)) FROM t1 - WHERE rowid BETWEEN 31 AND 39; - - - SELECT b, json_group_array(a) FROM t1 WHERE rowid<10 GROUP BY b ORDER BY b; - - - SELECT json_group_object(c,a) FROM t1 WHERE a<0 AND typeof(a)!='blob'; - - - SELECT json_group_object(c,a) FROM t1 - WHERE rowid BETWEEN 31 AND 39 AND rowid%2==1; - - - SELECT b, json_group_object(c,a) FROM t1 - WHERE rowid<7 GROUP BY b ORDER BY b; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1),('abc'); - SELECT - json_group_array(x), - json_group_array(json_object('x',x)) - FROM t1; - - - CREATE TABLE t4(x); - INSERT INTO t4 VALUES - (1), - ('a,b'), - (3), - ('x"y'), - (5), - (6), - (7); - SELECT json_group_array(x) OVER (ROWS 2 PRECEDING) FROM t4; - - - SELECT json_group_object(rowid, x) OVER (ROWS 2 PRECEDING) FROM t4; - diff --git a/libsql-wal/tests/assets/fixtures/json104.test b/libsql-wal/tests/assets/fixtures/json104.test deleted file mode 100644 index 649d7f3888..0000000000 --- a/libsql-wal/tests/assets/fixtures/json104.test +++ /dev/null @@ -1,102 +0,0 @@ - - SELECT json_patch('{ - "a": "b", - "c": { - "d": "e", - "f": "g" - - - SELECT json_patch('{ - "a": "b", - "c": { - "d": "e", - "f": "g" - - - SELECT json_patch('{ - a: "b", - c: { - d: "e", - f: "g" - - - SELECT json_patch('{ - a: "b", - c: { - d: "e", - f: "g" - - - SELECT json_patch('{ - "title": "Goodbye!", - "author" : { - "givenName" : "John", - "familyName" : "Doe" - - - SELECT json_patch('[1,2,3]','{"x":null - - SELECT json_patch('[1,2,3]','{"x":null,"y":1,"z":null - - SELECT json_patch('{ - - SELECT json_patch('{ - - SELECT json_patch('{ - - SELECT json_patch('{"a":"b" - - SELECT coalesce(json_patch(null,'{"a":"c" - - SELECT json_patch('{"a":"b" - - SELECT json_patch('{"a":"b" - - SELECT json_patch('{"a":"b","b":"c" - - SELECT json_patch('{"a":["b"] - - SELECT json_patch('{"a":"c" - - SELECT json_patch('{"a":{"b":"c" - - SELECT json_patch('{"a":[{"b":"c" - - SELECT json_patch('["a","b"]','["c","d"]'); - - - SELECT json_patch('{"a":"b" - - SELECT json_patch('{"a":"foo" - - SELECT coalesce(json_patch('{"a":"foo" - - SELECT json_patch('{"a":"foo" - - SELECT json_patch('{"e":null - - SELECT json_patch('[1,2]','{"a":"b","c":null - - SELECT json_patch('{ - - SELECT json_patch('{"x":{"one":1 - - CREATE TABLE obj(x); - INSERT INTO obj VALUES('{"a":1,"b":2 - - UPDATE obj SET x = json_insert(x, '$.c', 3); - SELECT * FROM obj; - - - SELECT json_extract(x, '$.b') FROM obj; - SELECT json_extract(x, '$."b"') FROM obj; - - - UPDATE obj SET x = json_set(x, '$."b"', 555); - SELECT json_extract(x, '$.b') FROM obj; - SELECT json_extract(x, '$."b"') FROM obj; - - - UPDATE obj SET x = json_set(x, '$."d"', 4); - SELECT json_extract(x, '$."d"') FROM obj; - diff --git a/libsql-wal/tests/assets/fixtures/json105.test b/libsql-wal/tests/assets/fixtures/json105.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/json501.test b/libsql-wal/tests/assets/fixtures/json501.test deleted file mode 100644 index 68a3eaf6f2..0000000000 --- a/libsql-wal/tests/assets/fixtures/json501.test +++ /dev/null @@ -1,118 +0,0 @@ - - WITH c(x) AS (VALUES('{a:5,b:6 - - SELECT '[7,null,{a:5,b:6 - - SELECT '{ $123 : 789 - - SELECT '{ _123$xyz : 789 - - SELECT '{ MNO_123$xyz : 789 - - SELECT json('{ MNO_123$xyz : 789 - - SELECT '{ MNO_123æxyz : 789 - - WITH c(x) AS (VALUES('{"a":5, "b":6, - - SELECT '{a:5, b:6 , - - WITH c(x) AS (VALUES('[5, 6,]')) - SELECT x->>1, json(x), json_valid(x), NOT json_error_position(x) FROM c; - - - SELECT '[5, 6 , ]'->>1; - - - WITH c(x) AS (VALUES('{"a": ''abcd'' - - SELECT '{b: 123, ''a'': ''ab\''cd'' - - WITH c(x) AS (VALUES('{a: "abc'||char(0x5c,0x0a)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x0d)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x0d,0x0a)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x2028)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x2029)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x27)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x22)||'xyz" - - SELECT ('{a: "abc'||char(0x5c,0x5c)||'xyz" - - SELECT hex(('{a: "abc\bxyz" - - SELECT hex(('{a: "abc\f\n\r\t\vxyz" - - SELECT hex(('{a: "abc\0xyz" - - SELECT '{a: "abc\x35\x4f\x6Exyz" - - SELECT '{a: "\x6a\x6A\x6b\x6B\x6c\x6C\x6d\x6D\x6e\x6E\x6f\x6F" - - SELECT '{a: 0x0 - - SELECT '{a: -0x0 - - SELECT '{a: +0x0 - - SELECT '{a: 0xabcdef - - SELECT '{a: -0xaBcDeF - - SELECT '{a: +0xABCDEF - - WITH c(x) AS (VALUES('{x: 4. - - WITH c(x) AS (VALUES('{x: +4. - - WITH c(x) AS (VALUES('{x: -4. - - WITH c(x) AS (VALUES('{x: .5 - - WITH c(x) AS (VALUES('{x: -.5 - - WITH c(x) AS (VALUES('{x: +.5 - - WITH c(x) AS (VALUES('{x: 4.e0 - - WITH c(x) AS (VALUES('{x: +4.e1 - - WITH c(x) AS (VALUES('{x: -4.e2 - - WITH c(x) AS (VALUES('{x: .5e3 - - WITH c(x) AS (VALUES('{x: -.5e-1 - - WITH c(x) AS (VALUES('{x: +.5e-2 - - WITH c(x) AS (VALUES('{x: +Infinity - - WITH c(x) AS (VALUES('{x: -Infinity - - WITH c(x) AS (VALUES('{x: Infinity - - WITH c(x) AS (VALUES('{x: NaN - - SELECT '{a: +123 - - SELECT ' /* abc */ { /*def*/ aaa /* xyz */ : // to the end of line - 123 /* xyz */ , /* 123 */ - - SELECT (char(0x09,0x0a,0x0b,0x0c,0x0d,0x20,0xa0,0x2028,0x2029) - || '{a: "xyz" - - SELECT ('{a:' || char(0x09,0x0a,0x0b,0x0c,0x0d,0x20,0xa0,0x2028,0x2029) - || '"xyz" - - SELECT (char(0x1680,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005, - 0x2006,0x2007,0x2008,0x2009,0x200a,0x3000,0xfeff) - || '{a: "xyz" - - SELECT ('{a: ' ||char(0x1680,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005, - 0x2006,0x2007,0x2008,0x2009,0x200a,0x3000,0xfeff) - || ' "xyz" diff --git a/libsql-wal/tests/assets/fixtures/json502.test b/libsql-wal/tests/assets/fixtures/json502.test deleted file mode 100644 index 48a3762e7d..0000000000 --- a/libsql-wal/tests/assets/fixtures/json502.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE TABLE t1(x JSON); - INSERT INTO t1(x) VALUES('{a:{b:{c:"hello", - - SELECT json_error_position('{a:null,{"h":[1,[1,2,3]],"j":"abc" diff --git a/libsql-wal/tests/assets/fixtures/keyword1.test b/libsql-wal/tests/assets/fixtures/keyword1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lastinsert.test b/libsql-wal/tests/assets/fixtures/lastinsert.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/laststmtchanges.test b/libsql-wal/tests/assets/fixtures/laststmtchanges.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/like.test b/libsql-wal/tests/assets/fixtures/like.test deleted file mode 100644 index 73c4a7b8ce..0000000000 --- a/libsql-wal/tests/assets/fixtures/like.test +++ /dev/null @@ -1,140 +0,0 @@ - - CREATE TABLE t12nc(id INTEGER, x TEXT UNIQUE COLLATE nocase); - INSERT INTO t12nc VALUES(1,'abcde'),(2,'uvwxy'),(3,'ABCDEF'); - CREATE TABLE t12b(id INTEGER, x TEXT UNIQUE COLLATE binary); - INSERT INTO t12b VALUES(1,'abcde'),(2,'uvwxy'),(3,'ABCDEF'); - SELECT id FROM t12nc WHERE x LIKE 'abc%' ORDER BY +id; - - - SELECT id FROM t12b WHERE x LIKE 'abc%' ORDER BY +id; - - - SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; - - - SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; - - - SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; - - - SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t12nc WHERE x LIKE 'abc%' ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t12b WHERE x LIKE 'abc%' ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; - - - EXPLAIN QUERY PLAN - SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; - - - SELECT char(0x304d) LIKE char(0x306d); - - - SELECT char(0x4d) LIKE char(0x306d); - - - SELECT char(0x304d) LIKE char(0x6d); - - - SELECT char(0x4d) LIKE char(0x6d); - - - CREATE TABLE t15(x TEXT COLLATE nocase, y, PRIMARY KEY(x)); - INSERT INTO t15(x,y) VALUES - ('abcde',1), ('ab%de',2), ('a_cde',3), - ('uvwxy',11),('uvwx%',12),('uvwx_',13), - ('_bcde',21),('%bcde',22), - ('abcd_',31),('abcd%',32), - ('ab%xy',41); - SELECT y FROM t15 WHERE x LIKE 'ab/%d%' ESCAPE '/'; - - - EXPLAIN QUERY PLAN - SELECT y FROM t15 WHERE x LIKE 'ab/%d%' ESCAPE '/'; - - - EXPLAIN QUERY PLAN - SELECT y FROM t15 WHERE x LIKE 'ab/%d%' ESCAPE '//'; - - - EXPLAIN QUERY PLAN - SELECT y FROM t15 WHERE x LIKE 'ab/%d%' ESCAPE ''; - - - SELECT y FROM t15 WHERE x LIKE 'abcdx%%' ESCAPE 'x'; - - - SELECT y FROM t15 WHERE x LIKE 'abx%%' ESCAPE 'x' ORDER BY +y - - - EXPLAIN QUERY PLAN - SELECT y FROM t15 WHERE x LIKE 'abx%%' ESCAPE 'x' ORDER BY +y - - - SELECT y FROM t15 WHERE x LIKE '/%bc%' ESCAPE '/'; - - - EXPLAIN QUERY PLAN - SELECT y FROM t15 WHERE x LIKE '/%bc%' ESCAPE '/'; - - - CREATE TABLE t1(a INTEGER COLLATE NOCASE); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES(' 1x'); - INSERT INTO t1 VALUES(' 1-'); - - - SELECT * FROM t1 WHERE a LIKE ' 1%'; - - - SELECT * FROM t1 WHERE a LIKE ' 1-'; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(id INTEGER PRIMARY KEY, x TEXT); - INSERT INTO t1 VALUES - (1,'abcde'), - (2,'abc_'), - (3,'abc__'), - (4,'abc%'), - (5,'abc%%'); - SELECT id FROM t1 WHERE x LIKE 'abc%%' ESCAPE '%'; - - - SELECT id FROM t1 WHERE x LIKE 'abc__' ESCAPE '_'; - - - SELECT 'x' LIKE '%' ESCAPE '_'; - - - CREATE TABLE t1(x INT, y TEXT); - INSERT INTO t1 VALUES(1,'abc'),(2,'ABC'),(3,'Abc'); - CREATE VIEW t2 AS SELECT * FROM t1 WHERE y LIKE 'a%'; - SELECT * FROM t2; - - - PRAGMA case_sensitive_like=OFF; - SELECT * FROM t2; - - - PRAGMA case_sensitive_like=ON; - SELECT * FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/like2.test b/libsql-wal/tests/assets/fixtures/like2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/like3.test b/libsql-wal/tests/assets/fixtures/like3.test deleted file mode 100644 index 17f697b02d..0000000000 --- a/libsql-wal/tests/assets/fixtures/like3.test +++ /dev/null @@ -1,133 +0,0 @@ - - PRAGMA encoding=UTF8; - CREATE TABLE t1(a,b TEXT COLLATE nocase); - INSERT INTO t1(a,b) - VALUES(1,'abc'), - (2,'ABX'), - (3,'BCD'), - (4,x'616263'), - (5,x'414258'), - (6,x'424344'); - CREATE INDEX t1ba ON t1(b,a); - - SELECT a, b FROM t1 WHERE b LIKE 'aB%' ORDER BY +a; - - - SELECT a, b FROM t1 WHERE +b LIKE 'aB%' ORDER BY +a; - - - CREATE TABLE t2(a, b TEXT); - INSERT INTO t2 SELECT a, b FROM t1; - CREATE INDEX t2ba ON t2(b,a); - SELECT a, b FROM t2 WHERE b GLOB 'ab*' ORDER BY +a; - - - SELECT a, b FROM t2 WHERE +b GLOB 'ab*' ORDER BY +a; - - - SELECT a, b FROM t2 WHERE b>=x'6162' AND b GLOB 'ab*' - - - SELECT a, b FROM t2 WHERE +b>=x'6162' AND +b GLOB 'ab*' - - - SELECT a, b FROM t2 WHERE b GLOB 'ab*' AND b>=x'6162' - - - SELECT a, b FROM t2 WHERE +b GLOB 'ab*' AND +b>=x'6162' - - - CREATE TABLE t3(x TEXT PRIMARY KEY COLLATE nocase); - INSERT INTO t3(x) VALUES('aaa'),('abc'),('abd'),('abe'),('acz'); - INSERT INTO t3(x) SELECT CAST(x AS blob) FROM t3; - SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x; - - - SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x DESC; - - - SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY +x DESC; - - - SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x ASC; - - - SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY +x ASC; - - - CREATE TABLE t4(x TEXT COLLATE nocase); - CREATE INDEX t4x ON t4(x DESC); - INSERT INTO t4(x) SELECT x FROM t3; - SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x; - - - SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x DESC; - - - SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY +x DESC; - - - SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x ASC; - - - SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY +x ASC; - - - CREATE TABLE t5a(x INT UNIQUE COLLATE nocase); - INSERT INTO t5a(x) VALUES('/abc'),(123),(-234); - SELECT x FROM t5a WHERE x LIKE '/%'; - - - SELECT x FROM t5a WHERE x LIKE '/a%'; - - - SELECT x FROM t5a WHERE x LIKE '^12%' ESCAPE '^'; - - - SELECT x FROM t5a WHERE x LIKE '^-2%' ESCAPE '^'; - - - CREATE TABLE t5b(x INT UNIQUE COLLATE binary); - INSERT INTO t5b(x) VALUES('/abc'),(123),(-234); - SELECT x FROM t5b WHERE x GLOB '/*'; - - - SELECT x FROM t5b WHERE x GLOB '/a*'; - - - CREATE TABLE t5c (c0 REAL); - CREATE INDEX t5c_0 ON t5c(c0 COLLATE NOCASE); - INSERT INTO t5c(rowid, c0) VALUES (99,'+/'); - SELECT * FROM t5c WHERE (c0 LIKE '+/'); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 INT UNIQUE COLLATE NOCASE); - INSERT INTO t0(c0) VALUES ('./'); - SELECT * FROM t0 WHERE t0.c0 LIKE './'; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 INT UNIQUE COLLATE NOCASE); - INSERT INTO t0(c0) VALUES ('.1%'); - SELECT * FROM t0 WHERE t0.c0 LIKE '.1%'; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 UNIQUE); - INSERT INTO t0(c0) VALUES(-1); - SELECT * FROM t0 WHERE t0.c0 GLOB '-*'; - - - SELECT t0.c0 GLOB '-*' FROM t0; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(path TEXT COLLATE nocase PRIMARY KEY,a,b,c) WITHOUT ROWID; - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(path TEXT,x,y,z); - CREATE INDEX t2path ON t2(path COLLATE nocase); - CREATE INDEX t2path2 ON t2(path); - diff --git a/libsql-wal/tests/assets/fixtures/limit.test b/libsql-wal/tests/assets/fixtures/limit.test deleted file mode 100644 index 262a9ec934..0000000000 --- a/libsql-wal/tests/assets/fixtures/limit.test +++ /dev/null @@ -1,38 +0,0 @@ - - SELECT 123 LIMIT 1 OFFSET 0 - - - SELECT 123 LIMIT 1 OFFSET 1 - - - SELECT 123 LIMIT 0 OFFSET 0 - - - SELECT 123 LIMIT 0 OFFSET 1 - - - SELECT 123 LIMIT -1 OFFSET 0 - - - SELECT 123 LIMIT -1 OFFSET 1 - - - CREATE TABLE t1(a PRIMARY KEY, b TEXT); - CREATE TABLE t4(c PRIMARY KEY, d); - CREATE TABLE t5(e PRIMARY KEY, f); - CREATE TABLE t6(g, h); - CREATE TABLE t3_a(k, v); - CREATE TABLE t3_b(k, v); - CREATE VIEW t3 AS SELECT * FROM t3_a UNION ALL SELECT * FROM t3_b; - INSERT INTO t5(e,f) VALUES(500000,'orange'); - INSERT INTO t4(c,d) VALUES(300000,'blue'),(400,'green'),(8000,'grey'); - INSERT INTO t1(a,b) VALUES(300000,'purple'); - INSERT INTO t3_a VALUES(300000,'yellow'),(500,'pink'),(8000,'red'); - INSERT INTO t6 default values; - SELECT ( - SELECT 100000 FROM - (SELECT 200000 FROM t6 WHERE a = ( SELECT 300000 FROM t3 WHERE a ) ), - (SELECT 400000 FROM t5 WHERE e=500000), - (SELECT 600000 FROM t4 WHERE c=a) - ) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/limit2.test b/libsql-wal/tests/assets/fixtures/limit2.test deleted file mode 100644 index 0f49e448d8..0000000000 --- a/libsql-wal/tests/assets/fixtures/limit2.test +++ /dev/null @@ -1,141 +0,0 @@ - - CREATE TABLE t1(a,b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t1(a,b) SELECT 1, (x*17)%1000 + 1000 FROM c; - INSERT INTO t1(a,b) VALUES(2,2),(3,1006),(4,4),(5,9999); - CREATE INDEX t1ab ON t1(a,b); - - - SELECT a, b, '|' FROM t1 WHERE a IN (2,4,5,3,1) ORDER BY b LIMIT 5; - - - SELECT a, b, '|' FROM t1 WHERE a IN (2,4,5,3,1) ORDER BY +b LIMIT 5; - - - CREATE TABLE t2(x,y); - INSERT INTO t2(x,y) VALUES('a',1),('a',2),('a',3),('a',4); - INSERT INTO t2(x,y) VALUES('b',1),('c',2),('d',3),('e',4); - CREATE INDEX t2xy ON t2(x,y); - - - SELECT a, b, '|' FROM t2, t1 WHERE t2.x='a' AND t1.a=t2.y ORDER BY t1.b LIMIT 5; - - - SELECT a, b, '|' FROM t2, t1 WHERE t2.x='a' AND t1.a=t2.y ORDER BY +t1.b LIMIT 5; - - - DROP INDEX t1ab; - CREATE INDEX t1ab ON t1(a,b DESC); - - - SELECT a, b, '|' FROM t1 WHERE a IN (2,4,5,3,1) ORDER BY b DESC LIMIT 5; - - - SELECT a, b, '|' FROM t1 WHERE a IN (2,4,5,3,1) ORDER BY +b DESC LIMIT 5; - - - CREATE TABLE t200(a, b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t200(a,b) SELECT x, x FROM c; - CREATE TABLE t201(x INTEGER PRIMARY KEY, y); - INSERT INTO t201(x,y) VALUES(2,12345); - - SELECT *, '|' FROM t200, t201 WHERE x=b ORDER BY y LIMIT 3; - - - SELECT *, '|' FROM t200 LEFT JOIN t201 ON x=b ORDER BY y LIMIT 3; - - - CREATE TABLE t300(a,b,c); - CREATE INDEX t300x ON t300(a,b,c); - INSERT INTO t300 VALUES(0,1,99),(0,1,0),(0,0,0); - SELECT *,'.' FROM t300 WHERE a=0 AND (c=0 OR c=99) ORDER BY c DESC; - - - SELECT *,'.' FROM t300 WHERE a=0 AND (c=0 OR c=99) ORDER BY c DESC LIMIT 1; - - - CREATE TABLE t400(a,b); - CREATE INDEX t400_ab ON t400(a,b); - INSERT INTO t400(a,b) VALUES(1,90),(1,40),(2,80),(2,30),(3,70),(3,20); - SELECT *,'x' FROM t400 WHERE a IN (1,2,3) ORDER BY b DESC LIMIT 3; - SELECT *,'y' FROM t400 WHERE a IN (1,2,3) ORDER BY +b DESC LIMIT 3; - - - CREATE TABLE t500(i INTEGER PRIMARY KEY, j); - INSERT INTO t500 VALUES(1, 1); - INSERT INTO t500 VALUES(2, 2); - INSERT INTO t500 VALUES(3, 3); - INSERT INTO t500 VALUES(4, 0); - INSERT INTO t500 VALUES(5, 5); - SELECT j FROM t500 WHERE i IN (1,2,3,4,5) ORDER BY j DESC LIMIT 3; - - - CREATE TABLE t501(i INTEGER PRIMARY KEY, j); - INSERT INTO t501 VALUES(1, 5); - INSERT INTO t501 VALUES(2, 4); - INSERT INTO t501 VALUES(3, 3); - INSERT INTO t501 VALUES(4, 6); - INSERT INTO t501 VALUES(5, 1); - SELECT j FROM t501 WHERE i IN (1,2,3,4,5) ORDER BY j LIMIT 3; - - - CREATE TABLE t502(i INT PRIMARY KEY, j); - INSERT INTO t502 VALUES(1, 5); - INSERT INTO t502 VALUES(2, 4); - INSERT INTO t502 VALUES(3, 3); - INSERT INTO t502 VALUES(4, 6); - INSERT INTO t502 VALUES(5, 1); - SELECT j FROM t502 WHERE i IN (1,2,3,4,5) ORDER BY j LIMIT 3; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a, b); INSERT INTO t1 VALUES(1,2); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x, y); INSERT INTO t2 VALUES(1,3); - CREATE INDEX t1ab ON t1(a,b); - SELECT y FROM t1, t2 WHERE a=x AND b<=y ORDER BY b DESC; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(aa VARCHAR PRIMARY KEY NOT NULL,bb,cc,x VARCHAR(400)); - INSERT INTO t1(aa,bb,cc) VALUES('maroon','meal','lecture'); - INSERT INTO t1(aa,bb,cc) VALUES('reality','meal','catsear'); - CREATE TABLE t2(aa VARCHAR PRIMARY KEY, dd INT DEFAULT 1, ee, x VARCHAR(100)); - INSERT INTO t2(aa,dd,ee) VALUES('maroon',0,'travel'),('reality',0,'hour'); - CREATE INDEX t2x1 ON t2(dd,ee); - ANALYZE; - DROP TABLE IF EXISTS sqlite_stat4; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1 VALUES - ('t2','t2x1','3 3 3'), - ('t2','sqlite_autoindex_t2_1','3 1'), - ('t1','sqlite_autoindex_t1_1','2 1'); - ANALYZE sqlite_master; - SELECT * - FROM t1 LEFT JOIN t2 ON t1.aa=t2.aa - WHERE t1.bb='meal' - ORDER BY t2.dd DESC - LIMIT 1; - - - DROP TABLE t1; - DROP TABLE t2; - CREATE TABLE t1(aa, bb); - INSERT INTO t1 VALUES('maroon','meal'); - CREATE TABLE t2(cc, dd, ee, x VARCHAR(100)); - INSERT INTO t2(cc,dd,ee) VALUES('maroon',1,'one'); - INSERT INTO t2(cc,dd,ee) VALUES('maroon',2,'two'); - INSERT INTO t2(cc,dd,ee) VALUES('maroon',0,'zero'); - CREATE INDEX t2ddee ON t2(dd,ee); - CREATE INDEX t2cc ON t2(cc); - ANALYZE; - SELECT t2.cc, t2.dd, t2.ee FROM t1 CROSS JOIN t2 ON t1.aa=t2.cc - ORDER BY t2.dd LIMIT 1; - - - SELECT t2.cc, t2.dd, t2.ee FROM t1 CROSS JOIN t2 ON t1.aa=t2.cc - WHERE t1.bb='meal' - ORDER BY t2.dd LIMIT 1; - diff --git a/libsql-wal/tests/assets/fixtures/loadext.test b/libsql-wal/tests/assets/fixtures/loadext.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/loadext2.test b/libsql-wal/tests/assets/fixtures/loadext2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock.test b/libsql-wal/tests/assets/fixtures/lock.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock2.test b/libsql-wal/tests/assets/fixtures/lock2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock3.test b/libsql-wal/tests/assets/fixtures/lock3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock4.test b/libsql-wal/tests/assets/fixtures/lock4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock5.test b/libsql-wal/tests/assets/fixtures/lock5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock6.test b/libsql-wal/tests/assets/fixtures/lock6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lock7.test b/libsql-wal/tests/assets/fixtures/lock7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/lookaside.test b/libsql-wal/tests/assets/fixtures/lookaside.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/main.test b/libsql-wal/tests/assets/fixtures/main.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc.test b/libsql-wal/tests/assets/fixtures/malloc.test deleted file mode 100644 index 0e1041709d..0000000000 --- a/libsql-wal/tests/assets/fixtures/malloc.test +++ /dev/null @@ -1,26 +0,0 @@ - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES('fghij'); - INSERT INTO t1 VALUES('pqrst'); - INSERT INTO t1 VALUES('abcde'); - INSERT INTO t1 VALUES('uvwxy'); - INSERT INTO t1 VALUES('klmno'); - - - SELECT * FROM t1 ORDER BY 1 COLLATE utf16bin; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a COLLATE utf16bin); - INSERT INTO t1 VALUES('fghij' || $::big); - INSERT INTO t1 VALUES('pqrst' || $::big); - INSERT INTO t1 VALUES('abcde' || $::big); - INSERT INTO t1 VALUES('uvwxy' || $::big); - INSERT INTO t1 VALUES('klmno' || $::big); - CREATE INDEX i1 ON t1(a); - - - CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z); - CREATE TABLE t2(a, b); - CREATE VIEW a002 AS SELECT *, sum(b) AS m FROM t2 GROUP BY a; - diff --git a/libsql-wal/tests/assets/fixtures/malloc3.test b/libsql-wal/tests/assets/fixtures/malloc3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc4.test b/libsql-wal/tests/assets/fixtures/malloc4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc5.test b/libsql-wal/tests/assets/fixtures/malloc5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc6.test b/libsql-wal/tests/assets/fixtures/malloc6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc7.test b/libsql-wal/tests/assets/fixtures/malloc7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc8.test b/libsql-wal/tests/assets/fixtures/malloc8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/malloc9.test b/libsql-wal/tests/assets/fixtures/malloc9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocA.test b/libsql-wal/tests/assets/fixtures/mallocA.test deleted file mode 100644 index 62dbcc59b5..0000000000 --- a/libsql-wal/tests/assets/fixtures/mallocA.test +++ /dev/null @@ -1,18 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - INSERT INTO t1 VALUES('abc', 'w'); -- rowid=1 - INSERT INTO t1 VALUES('abc', 'x'); -- rowid=2 - INSERT INTO t1 VALUES('abc', 'y'); -- rowid=3 - INSERT INTO t1 VALUES('abc', 'z'); -- rowid=4 - - INSERT INTO t1 VALUES('def', 'w'); -- rowid=5 - INSERT INTO t1 VALUES('def', 'x'); -- rowid=6 - INSERT INTO t1 VALUES('def', 'y'); -- rowid=7 - INSERT INTO t1 VALUES('def', 'z'); -- rowid=8 - - ANALYZE; - - - PRAGMA cache_size = 5; - diff --git a/libsql-wal/tests/assets/fixtures/mallocAll.test b/libsql-wal/tests/assets/fixtures/mallocAll.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocB.test b/libsql-wal/tests/assets/fixtures/mallocB.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocC.test b/libsql-wal/tests/assets/fixtures/mallocC.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocD.test b/libsql-wal/tests/assets/fixtures/mallocD.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocE.test b/libsql-wal/tests/assets/fixtures/mallocE.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocF.test b/libsql-wal/tests/assets/fixtures/mallocF.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocG.test b/libsql-wal/tests/assets/fixtures/mallocG.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocH.test b/libsql-wal/tests/assets/fixtures/mallocH.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocI.test b/libsql-wal/tests/assets/fixtures/mallocI.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocJ.test b/libsql-wal/tests/assets/fixtures/mallocJ.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocK.test b/libsql-wal/tests/assets/fixtures/mallocK.test deleted file mode 100644 index 94a135f423..0000000000 --- a/libsql-wal/tests/assets/fixtures/mallocK.test +++ /dev/null @@ -1,58 +0,0 @@ - - CREATE TABLE t3(a TEXT, b TEXT COLLATE utf16_aligned, c); - INSERT INTO t3 VALUES('one', '.....', 0); - INSERT INTO t3 VALUES('one', '....x', 1); - INSERT INTO t3 VALUES('one', '...x.', 2); - INSERT INTO t3 VALUES('one', '...xx', 3); - INSERT INTO t3 VALUES('one', '..x..', 4); - INSERT INTO t3 VALUES('one', '..x.x', 5); - INSERT INTO t3 VALUES('one', '..xx.', 6); - INSERT INTO t3 VALUES('one', '..xxx', 7); - INSERT INTO t3 VALUES('one', '.x...', 8); - INSERT INTO t3 VALUES('one', '.x..x', 9); - INSERT INTO t3 VALUES('one', '.x.x.', 10); - INSERT INTO t3 VALUES('one', '.x.xx', 11); - INSERT INTO t3 VALUES('one', '.xx..', 12); - INSERT INTO t3 VALUES('one', '.xx.x', 13); - INSERT INTO t3 VALUES('one', '.xxx.', 14); - INSERT INTO t3 VALUES('one', '.xxxx', 15); - - INSERT INTO t3 VALUES('two', 'x....', 16); - INSERT INTO t3 VALUES('two', 'x...x', 17); - INSERT INTO t3 VALUES('two', 'x..x.', 18); - INSERT INTO t3 VALUES('two', 'x..xx', 19); - INSERT INTO t3 VALUES('two', 'x.x..', 20); - INSERT INTO t3 VALUES('two', 'x.x.x', 21); - INSERT INTO t3 VALUES('two', 'x.xx.', 22); - INSERT INTO t3 VALUES('two', 'x.xxx', 23); - INSERT INTO t3 VALUES('two', 'xx...', 24); - INSERT INTO t3 VALUES('two', 'xx..x', 25); - INSERT INTO t3 VALUES('two', 'xx.x.', 26); - INSERT INTO t3 VALUES('two', 'xx.xx', 27); - INSERT INTO t3 VALUES('two', 'xxx..', 28); - INSERT INTO t3 VALUES('two', 'xxx.x', 29); - INSERT INTO t3 VALUES('two', 'xxxx.', 30); - INSERT INTO t3 VALUES('two', 'xxxxx', 31); - - INSERT INTO t3 SELECT * FROM t3; - - CREATE INDEX i3 ON t3(a, b); - ANALYZE; - - SELECT 'x' > '.'; - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b); - - - PRAGMA encoding = 'utf-16'; - CREATE TABLE x2(x TEXT, y TEXT); - WITH data(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM data - ) - INSERT INTO x2 SELECT isqrt(i), isqrt(i) FROM data LIMIT 400; - CREATE INDEX x2x ON x2(x); - CREATE INDEX x2y ON x2(y); - ANALYZE; - DELETE FROM x2; - diff --git a/libsql-wal/tests/assets/fixtures/mallocL.test b/libsql-wal/tests/assets/fixtures/mallocL.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mallocM.test b/libsql-wal/tests/assets/fixtures/mallocM.test deleted file mode 100644 index e564445899..0000000000 --- a/libsql-wal/tests/assets/fixtures/mallocM.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1(x); - - SELECT instr(x'', x'') - SELECT instr(x'12345678', x'') - SELECT instr(x'', x'1234') diff --git a/libsql-wal/tests/assets/fixtures/manydb.test b/libsql-wal/tests/assets/fixtures/manydb.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mem5.test b/libsql-wal/tests/assets/fixtures/mem5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/memdb.test b/libsql-wal/tests/assets/fixtures/memdb.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/memdb1.test b/libsql-wal/tests/assets/fixtures/memdb1.test deleted file mode 100644 index c3f7007949..0000000000 --- a/libsql-wal/tests/assets/fixtures/memdb1.test +++ /dev/null @@ -1,68 +0,0 @@ - - SELECT * FROM t1; - - - PRAGMA auto_vacuum = off; - VACUUM; - - - CREATE TABLE t2(x, y); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t2(x, y) SELECT x, randomblob(1000) FROM c; - DROP TABLE t2; - PRAGMA page_count; - - - VACUUM; - PRAGMA page_count; - - - CREATE TABLE t3(x, y); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<400) - INSERT INTO t3(x, y) SELECT x, randomblob(1000) FROM c; - PRAGMA quick_check; - - - CREATE TABLE t3(x, y); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<400) - INSERT INTO t3(x, y) SELECT x, randomblob(1000) FROM c; - PRAGMA quick_check; - - - PRAGMA integrity_check; - - - CREATE TABLE t4(a,b); - INSERT INTO t4 VALUES('hello','world!'); - PRAGMA integrity_check; - SELECT * FROM t4; - - - PRAGMA journal_mode=TRUNCATE; - PRAGMA journal_mode=OFF; - PRAGMA journal_mode=DELETE; - PRAGMA journal_mode=WAL; - PRAGMA journal_mode=PERSIST; - PRAGMA journal_mode=MEMORY; - PRAGMA journal_mode=OFF; - PRAGMA journal_mode=DELETE; - - - CREATE TABLE t1(a, b); - PRAGMA schema_version = 0; - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 8192; - PRAGMA journal_mode = wal; - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - CREATE TABLE t2(x, y); - - - SELECT * FROM t1 - - - INSERT INTO t1 VALUES(3, 4); - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/memdb2.test b/libsql-wal/tests/assets/fixtures/memdb2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/memjournal.test b/libsql-wal/tests/assets/fixtures/memjournal.test deleted file mode 100644 index 65b9cc987d..0000000000 --- a/libsql-wal/tests/assets/fixtures/memjournal.test +++ /dev/null @@ -1,11 +0,0 @@ - - PRAGMA journal_mode = memory; - CREATE TABLE t1(a); - - - BEGIN; - INSERT INTO t1 VALUES( randomblob(500) ); - - - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/memjournal2.test b/libsql-wal/tests/assets/fixtures/memjournal2.test deleted file mode 100644 index 1d9f39b4bd..0000000000 --- a/libsql-wal/tests/assets/fixtures/memjournal2.test +++ /dev/null @@ -1,8 +0,0 @@ - PRAGMA journal_mode = memory; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE); - - BEGIN; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<500 - ) - INSERT INTO t1 SELECT NULL, randomblob(700) FROM s; diff --git a/libsql-wal/tests/assets/fixtures/memleak.test b/libsql-wal/tests/assets/fixtures/memleak.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/memsubsys1.test b/libsql-wal/tests/assets/fixtures/memsubsys1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/memsubsys2.test b/libsql-wal/tests/assets/fixtures/memsubsys2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/merge1.test b/libsql-wal/tests/assets/fixtures/merge1.test deleted file mode 100644 index 296b175b45..0000000000 --- a/libsql-wal/tests/assets/fixtures/merge1.test +++ /dev/null @@ -1,32 +0,0 @@ - - WITH data(v) AS ( - SELECT value FROM generate_series(1,35,3) - UNION ALL - SELECT value FROM generate_series(10,30,4) - UNION ALL - SELECT value FROM generate_series(20,50,5) - UNION ALL - SELECT value FROM generate_series(30,60,6) - UNION ALL - SELECT value FROM generate_series(1,50,7) - UNION ALL - SELECT value FROM generate_series(10,80,8) - ) - SELECT v FROM data ORDER BY v; - - - WITH data(v) AS ( - SELECT value FROM generate_series(1,35,3) - UNION ALL - SELECT value FROM generate_series(10,30,4) - UNION ALL - SELECT value FROM generate_series(20,50,5) - UNION ALL - SELECT value FROM generate_series(30,60,6) - UNION ALL - SELECT value FROM generate_series(1,50,7) - UNION ALL - SELECT value FROM generate_series(10,80,8) - ) - SELECT v FROM data ORDER BY v; - diff --git a/libsql-wal/tests/assets/fixtures/minmax.test b/libsql-wal/tests/assets/fixtures/minmax.test deleted file mode 100644 index b90c53a3d6..0000000000 --- a/libsql-wal/tests/assets/fixtures/minmax.test +++ /dev/null @@ -1,37 +0,0 @@ - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('a', 1, 1); - INSERT INTO t1 VALUES('b', 6, 6); - INSERT INTO t1 VALUES('c', 5, 5); - INSERT INTO t1 VALUES('a', 4, 4); - INSERT INTO t1 VALUES('a', 5, 5); - INSERT INTO t1 VALUES('c', 6, 6); - INSERT INTO t1 VALUES('b', 4, 4); - INSERT INTO t1 VALUES('c', 7, 7); - INSERT INTO t1 VALUES('b', 2, 2); - INSERT INTO t1 VALUES('b', 3, 3); - INSERT INTO t1 VALUES('a', 3, 3); - INSERT INTO t1 VALUES('b', 5, 5); - INSERT INTO t1 VALUES('c', 4, 4); - INSERT INTO t1 VALUES('c', 3, 3); - INSERT INTO t1 VALUES('a', 2, 2); - SELECT * FROM t1 ORDER BY a, b, c; - - CREATE INDEX i1 ON t1(a, b, c) - - CREATE TABLE t14(a INTEGER, b INTEGER); - INSERT INTO t14(a,b) VALUES(100,2),(200,2),(300,2),(400,1),(500,2); - SELECT min(a) FROM t14 WHERE b='2' AND a>'50'; - - - CREATE INDEX t14ba ON t14(b,a); - SELECT min(a) FROM t14 WHERE b='2' AND a>'50'; - - - CREATE TABLE t1(a); - CREATE TABLE t2(b); - CREATE TABLE t3(c); - INSERT INTO t1 VALUES(0); - INSERT INTO t2 VALUES(5); - SELECT MIN((SELECT b FROM t2 UNION SELECT x FROM (SELECT x FROM (SELECT 1 AS x WHERE t1.a=1) UNION ALL SELECT c FROM t3))) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/minmax2.test b/libsql-wal/tests/assets/fixtures/minmax2.test deleted file mode 100644 index 9183add755..0000000000 --- a/libsql-wal/tests/assets/fixtures/minmax2.test +++ /dev/null @@ -1,16 +0,0 @@ - - CREATE TABLE t11(a,b,c); - INSERT INTO t11(a,b,c) VALUES(1,10,5),(2,8,11),(3,1,4),(4,20,1),(5,16,4); - CREATE INDEX t11bc ON t11(b+c); - SELECT max(b+c) FROM t11; - - - SELECT a, max(b+c) FROM t11; - - - SELECT a, min(b+c) FROM t11; - - - INSERT INTO t11(a,b,c) VALUES(6,NULL,0),(7,0,NULL); - SELECT a, min(b+c) FROM t11; - diff --git a/libsql-wal/tests/assets/fixtures/minmax3.test b/libsql-wal/tests/assets/fixtures/minmax3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/minmax4.test b/libsql-wal/tests/assets/fixtures/minmax4.test deleted file mode 100644 index 69e7f4b999..0000000000 --- a/libsql-wal/tests/assets/fixtures/minmax4.test +++ /dev/null @@ -1,43 +0,0 @@ - - CREATE TABLE t0 (c0, c1); - CREATE INDEX i0 ON t0(c1, c1 + 1 DESC); - INSERT INTO t0(c0) VALUES (1); - - - SELECT MIN(t0.c1), t0.c0 FROM t0 WHERE t0.c1 ISNULL; - - - CREATE TABLE t1 (a, b); - INSERT INTO t1 VALUES(123, NULL); - CREATE INDEX i1 ON t1(a, b DESC); - - - SELECT MIN(a) FROM t1 WHERE a=123; - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(NULL, 1, 'x'); - CREATE INDEX i1 ON t1(a); - - - SELECT min(a), b, c FROM t1 WHERE c='x'; - - - INSERT INTO t1 VALUES(1, 2, 'y'); - - - SELECT min(a), b, c FROM t1 WHERE c='x'; - - - CREATE TABLE t0(c0 UNIQUE, c1); - INSERT INTO t0(c1) VALUES (0); - INSERT INTO t0(c0) VALUES (0); - CREATE VIEW v0(c0, c1) AS - SELECT t0.c1, t0.c0 FROM t0 WHERE CAST(t0.rowid AS INT) = 1; - - - SELECT c0, c1 FROM v0; - - - SELECT v0.c0, MIN(v0.c1) FROM v0; - diff --git a/libsql-wal/tests/assets/fixtures/misc1.test b/libsql-wal/tests/assets/fixtures/misc1.test deleted file mode 100644 index 04251dcf0a..0000000000 --- a/libsql-wal/tests/assets/fixtures/misc1.test +++ /dev/null @@ -1,52 +0,0 @@ - - CREATE TABLE t19 AS SELECT 1, 2 AS '', 3; - SELECT * FROM t19; - - - CREATE TABLE t19b AS SELECT 4 AS '', 5 AS '', 6 AS ''; - SELECT * FROM t19b; - - - CREATE TABLE t19c(x TEXT); - CREATE TABLE t19d AS SELECT * FROM t19c UNION ALL SELECT 1234; - SELECT x, typeof(x) FROM t19d; - - - CREATE TABLE t0(x INTEGER DEFAULT(0==0) NOT NULL); - REPLACE INTO t0(x) VALUES(''); - SELECT rowid, quote(x) FROM t0; - - - SELECT ''+3 FROM (SELECT ''+5); - - - CREATE TABLE t1(x); - PRAGMA writable_schema=ON; - UPDATE sqlite_master SET sql='CREATE table t(d CHECK(T(#0)'; - BEGIN; - CREATE TABLE t2(y); - ROLLBACK; - DROP TABLE IF EXISTS t3; - - - DROP TABLE IF EXISTS abc; - CREATE TABLE abc(a, b, c); - SELECT randomblob(min(max(coalesce(EXISTS (SELECT 1 FROM ( SELECT (SELECT 2147483647) NOT IN (SELECT 2147483649 UNION ALL SELECT DISTINCT -1) IN (SELECT 2147483649), 'fault', (SELECT ALL -1 INTERSECT SELECT 'experiments') IN (SELECT ALL 56.1 ORDER BY 'experiments' DESC) FROM (SELECT DISTINCT 2147483648, 'hardware' UNION ALL SELECT -2147483648, 'experiments' ORDER BY 2147483648 LIMIT 1 OFFSET 123456789.1234567899) GROUP BY (SELECT ALL 0 INTERSECT SELECT 'in') IN (SELECT DISTINCT 'experiments' ORDER BY zeroblob(1000) LIMIT 56.1 OFFSET -456) HAVING EXISTS (SELECT 'fault' EXCEPT SELECT DISTINCT 56.1) UNION SELECT 'The', 'The', 2147483649 UNION ALL SELECT DISTINCT 'hardware', 'first', 'experiments' ORDER BY 'hardware' LIMIT 123456789.1234567899 OFFSET -2147483647)) NOT IN (SELECT (SELECT DISTINCT (SELECT 'The') FROM abc ORDER BY EXISTS (SELECT -1 INTERSECT SELECT ALL NULL) ASC) IN (SELECT DISTINCT EXISTS (SELECT ALL 123456789.1234567899 ORDER BY 1 ASC, NULL DESC) FROM sqlite_master INTERSECT SELECT 456)), (SELECT ALL 'injection' UNION ALL SELECT ALL (SELECT DISTINCT 'first' UNION SELECT DISTINCT 'The') FROM (SELECT 456, 'in', 2147483649))),1), 500)), 'first', EXISTS (SELECT DISTINCT 456 FROM abc ORDER BY 'experiments' DESC) FROM abc; - - - CREATE TABLE dup1(a,b,c); - INSERT INTO dup1(a,b,c,a,b,c) VALUES(1,2,3,4,5,6); - SELECT a,b,c FROM dup1; - - - UPDATE dup1 SET a=7, b=8, c=9, a=10, b=11, c=12; - SELECT a,b,c FROM dup1; - - - CREATE TABLE t1(x); - CREATE UNIQUE INDEX t1x ON t1(x) WHERE x=1; - INSERT OR ABORT INTO t1 DEFAULT VALUES; - UPDATE OR REPLACE t1 SET x = 1; - PRAGMA integrity_check; - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/misc2.test b/libsql-wal/tests/assets/fixtures/misc2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/misc3.test b/libsql-wal/tests/assets/fixtures/misc3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/misc4.test b/libsql-wal/tests/assets/fixtures/misc4.test deleted file mode 100644 index 54da6e9319..0000000000 --- a/libsql-wal/tests/assets/fixtures/misc4.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t0(a,b); - INSERT INTO t0 VALUES(1,0),(2,0); - UPDATE t0 SET b=9 WHERE a AND (SELECT a FROM t0 WHERE a); - SELECT * FROM t0 ORDER BY +a; - diff --git a/libsql-wal/tests/assets/fixtures/misc5.test b/libsql-wal/tests/assets/fixtures/misc5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/misc6.test b/libsql-wal/tests/assets/fixtures/misc6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/misc7.test b/libsql-wal/tests/assets/fixtures/misc7.test deleted file mode 100644 index c9ca9b9a8d..0000000000 --- a/libsql-wal/tests/assets/fixtures/misc7.test +++ /dev/null @@ -1,10 +0,0 @@ - - CREATE TABLE abc(a PRIMARY KEY, b, c); - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - - - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/misc8.test b/libsql-wal/tests/assets/fixtures/misc8.test deleted file mode 100644 index 92c7b364a2..0000000000 --- a/libsql-wal/tests/assets/fixtures/misc8.test +++ /dev/null @@ -1,45 +0,0 @@ - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(1,2,3),(4,5,6); - SELECT quote(eval('SELECT * FROM t1 ORDER BY a','-abc-')); - - - SELECT quote(eval('SELECT * FROM t1 ORDER BY a')); - - - INSERT INTO t1 VALUES(7,null,9); - SELECT eval('SELECT * FROM t1 ORDER BY a',','); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER) WITHOUT ROWID; - CREATE TABLE t2(c INTEGER PRIMARY KEY, d INTEGER, x BLOB); - INSERT INTO t1 VALUES(0,0); - INSERT INTO t1 VALUES(10,10); - INSERT INTO t2 VALUES(1,1,zeroblob(200)); - INSERT INTO t2 VALUES(2,2,zeroblob(200)); - INSERT INTO t2 VALUES(3,3,zeroblob(200)); - INSERT INTO t2 VALUES(4,4,zeroblob(200)); - INSERT INTO t2 VALUES(5,5,zeroblob(200)); - INSERT INTO t2 VALUES(6,6,zeroblob(200)); - INSERT INTO t2 VALUES(7,7,zeroblob(200)); - INSERT INTO t2 VALUES(8,8,zeroblob(200)); - INSERT INTO t2 VALUES(9,9,zeroblob(200)); - INSERT INTO t2 VALUES(10,10,zeroblob(200)); - SELECT a, c, eval( - printf('DELETE FROM t2 WHERE c=%d AND %d>5', a+c, a+c) - ) FROM t1, t2; - - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(1,2,3); - ATTACH 'test2.db' AS aux2; - CREATE TABLE aux2.t2(c,d,e); - INSERT INTO t2 VALUES(4,5,6); - SELECT * FROM t1, t2; - - - PRAGMA database_list; - - - SELECT name FROM icecube.sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/misuse.test b/libsql-wal/tests/assets/fixtures/misuse.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mjournal.test b/libsql-wal/tests/assets/fixtures/mjournal.test deleted file mode 100644 index afd1a0928e..0000000000 --- a/libsql-wal/tests/assets/fixtures/mjournal.test +++ /dev/null @@ -1,22 +0,0 @@ - - CREATE TABLE t1(a, b); - - - SELECT * FROM t1; - - - SELECT * FROM t1; - - - SELECT * FROM t1; - - - ATTACH 'test.db2' AS dbfile; - ATTACH '' AS dbtemp; - ATTACH ':memory:' AS dbmem; - - CREATE TABLE t1(x); - CREATE TABLE dbfile.t2(x); - CREATE TABLE dbtemp.t3(x); - CREATE TABLE dbmem.t4(x); - diff --git a/libsql-wal/tests/assets/fixtures/mmap1.test b/libsql-wal/tests/assets/fixtures/mmap1.test deleted file mode 100644 index f04f5fcee4..0000000000 --- a/libsql-wal/tests/assets/fixtures/mmap1.test +++ /dev/null @@ -1,60 +0,0 @@ - - PRAGMA auto_vacuum = 1; - PRAGMA mmap_size = 67108864; - PRAGMA journal_mode = wal; - CREATE TABLE t1(a, b, UNIQUE(a, b)); - INSERT INTO t1 VALUES(rblob(500), rblob(500)); - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 2 - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 4 - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 8 - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 16 - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 32 - PRAGMA wal_checkpoint; - - - PRAGMA auto_vacuum; - SELECT count(*) FROM t1; - - - PRAGMA wal_checkpoint; - - - PRAGMA auto_vacuum = 1; - - CREATE TABLE t1(a, b, UNIQUE(a, b)); - INSERT INTO t1 VALUES(rblob(500), rblob(500)); - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 2 - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 4 - INSERT INTO t1 SELECT rblob(500), rblob(500) FROM t1; -- 8 - - CREATE TABLE t2(a, b, UNIQUE(a, b)); - INSERT INTO t2 SELECT * FROM t1; - - - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES($aaa); - INSERT INTO t1 VALUES($bbb); - INSERT INTO t1 VALUES($ccc); - INSERT INTO t1 VALUES($ddd); - SELECT * FROM t1; - BEGIN; - - COMMIT - - PRAGMA auto_vacuum = 2; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES($aaa); - INSERT INTO t1 VALUES($bbb); - INSERT INTO t1 VALUES($ccc); - INSERT INTO t1 VALUES($ddd); - - PRAGMA auto_vacuum; - SELECT * FROM t1; - - - CREATE TABLE t2(x); - INSERT INTO t2 VALUES('tricked you!'); - INSERT INTO t2 VALUES('tricked you!'); - diff --git a/libsql-wal/tests/assets/fixtures/mmap2.test b/libsql-wal/tests/assets/fixtures/mmap2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mmap3.test b/libsql-wal/tests/assets/fixtures/mmap3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mmap4.test b/libsql-wal/tests/assets/fixtures/mmap4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mmapfault.test b/libsql-wal/tests/assets/fixtures/mmapfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mmapwarm.test b/libsql-wal/tests/assets/fixtures/mmapwarm.test deleted file mode 100644 index e9070e4ec1..0000000000 --- a/libsql-wal/tests/assets/fixtures/mmapwarm.test +++ /dev/null @@ -1,9 +0,0 @@ - - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(x, y); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<500 - ) - INSERT INTO t1 SELECT randomblob(400), randomblob(500) FROM s; - PRAGMA page_count; - diff --git a/libsql-wal/tests/assets/fixtures/multiplex.test b/libsql-wal/tests/assets/fixtures/multiplex.test deleted file mode 100644 index 8ed9abda0f..0000000000 --- a/libsql-wal/tests/assets/fixtures/multiplex.test +++ /dev/null @@ -1,14 +0,0 @@ - - PRAGMA multiplex_enabled; - PRAGMA multiplex_filecount; - PRAGMA multiplex_chunksize; - - - PRAGMA multiplex_enabled; - PRAGMA multiplex_filecount; - PRAGMA multiplex_chunksize; - - - PRAGMA multiplex_filecount; - PRAGMA multiplex_chunksize; - diff --git a/libsql-wal/tests/assets/fixtures/multiplex2.test b/libsql-wal/tests/assets/fixtures/multiplex2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/multiplex3.test b/libsql-wal/tests/assets/fixtures/multiplex3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/multiplex4.test b/libsql-wal/tests/assets/fixtures/multiplex4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mutex1.test b/libsql-wal/tests/assets/fixtures/mutex1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/mutex2.test b/libsql-wal/tests/assets/fixtures/mutex2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/nan.test b/libsql-wal/tests/assets/fixtures/nan.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/nockpt.test b/libsql-wal/tests/assets/fixtures/nockpt.test deleted file mode 100644 index 15955d8888..0000000000 --- a/libsql-wal/tests/assets/fixtures/nockpt.test +++ /dev/null @@ -1,27 +0,0 @@ - - PRAGMA auto_vacuum=OFF; - PRAGMA page_size = 1024; - PRAGMA journal_mode = wal; - CREATE TABLE c1(x, y, z); - INSERT INTO c1 VALUES(1, 2, 3); - - - INSERT INTO c1 VALUES(4, 5, 6); - INSERT INTO c1 VALUES(7, 8, 9); - - - SELECT * FROM c1 - - PRAGMA main.journal_mode - PRAGMA main.journal_mode = delete - - PRAGMA auto_vacuum=OFF; - PRAGMA journal_mode = wal; - CREATE TABLE y1(a PRIMARY KEY, b UNIQUE, c); - INSERT INTO y1 VALUES('a', 'b', 'c'); - INSERT INTO y1 VALUES('d', 'e', 'f'); - - - UPDATE y1 SET c='g' WHERE a='d'; - PRAGMA wal_checkpoint; - diff --git a/libsql-wal/tests/assets/fixtures/nolock.test b/libsql-wal/tests/assets/fixtures/nolock.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/normalize.test b/libsql-wal/tests/assets/fixtures/normalize.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/notify1.test b/libsql-wal/tests/assets/fixtures/notify1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/notify2.test b/libsql-wal/tests/assets/fixtures/notify2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/notify3.test b/libsql-wal/tests/assets/fixtures/notify3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/notnull.test b/libsql-wal/tests/assets/fixtures/notnull.test deleted file mode 100644 index 2e89de6598..0000000000 --- a/libsql-wal/tests/assets/fixtures/notnull.test +++ /dev/null @@ -1,15 +0,0 @@ - - CREATE TABLE t1(a UNIQUE); - CREATE TABLE t2(a NOT NULL UNIQUE); - CREATE TABLE t3(a UNIQUE NOT NULL); - CREATE TABLE t4(a NOT NULL); - CREATE UNIQUE INDEX t4a ON t4(a); - - CREATE TABLE t5(a PRIMARY KEY); - CREATE TABLE t6(a PRIMARY KEY NOT NULL); - CREATE TABLE t7(a NOT NULL PRIMARY KEY); - CREATE TABLE t8(a PRIMARY KEY) WITHOUT ROWID; - - CREATE TABLE t9(a PRIMARY KEY UNIQUE NOT NULL); - CREATE TABLE t10(a UNIQUE PRIMARY KEY NOT NULL); - diff --git a/libsql-wal/tests/assets/fixtures/notnull2.test b/libsql-wal/tests/assets/fixtures/notnull2.test deleted file mode 100644 index 7de5763ea1..0000000000 --- a/libsql-wal/tests/assets/fixtures/notnull2.test +++ /dev/null @@ -1,40 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d NOT NULL); - - WITH x(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 - ) - INSERT INTO t1 SELECT i, i FROM x; - INSERT INTO t2 SELECT * FROM t1; - - - CREATE TABLE T1(a INTEGER PRIMARY KEY, b); - CREATE TABLE T3(k, v); - - - SELECT * FROM (SELECT a, b FROM t1) LEFT JOIN t3 ON a IS NULL; - - - CREATE TABLE t0(c0 PRIMARY KEY); - INSERT INTO t0(c0) VALUES (0); - - - SELECT * FROM t0 WHERE ((c0 NOT NULL) AND 1) OR (c0 == NULL); - - - SELECT *, '/' - FROM ( - SELECT NULL val FROM (SELECT 1) - UNION ALL - SELECT 'missing' FROM (SELECT 1) - ) a - LEFT JOIN (SELECT 1) - ON a.val IS NULL; - - - CREATE TABLE t1(a INT); - INSERT INTO t1(a) VALUES(1); - CREATE TABLE t2(b INT); - SELECT * FROM (SELECT 3 AS c FROM t1) AS t3 LEFT JOIN t2 ON c IS NULL; - diff --git a/libsql-wal/tests/assets/fixtures/notnullfault.test b/libsql-wal/tests/assets/fixtures/notnullfault.test deleted file mode 100644 index eb00ae8713..0000000000 --- a/libsql-wal/tests/assets/fixtures/notnullfault.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d NOT NULL); - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b, c)) WITHOUT ROWID; - diff --git a/libsql-wal/tests/assets/fixtures/null.test b/libsql-wal/tests/assets/fixtures/null.test deleted file mode 100644 index 68907c3308..0000000000 --- a/libsql-wal/tests/assets/fixtures/null.test +++ /dev/null @@ -1,20 +0,0 @@ - - CREATE TABLE t5(a, b, c); - CREATE UNIQUE INDEX t5ab ON t5(a, b); - - INSERT INTO t5 VALUES(1, NULL, 'one'); - INSERT INTO t5 VALUES(1, NULL, 'i'); - INSERT INTO t5 VALUES(NULL, 'x', 'two'); - INSERT INTO t5 VALUES(NULL, 'x', 'ii'); - - - SELECT * FROM t5 WHERE a = 1 AND b IS NULL; - - - SELECT * FROM t5 WHERE a IS NULL AND b = 'x'; - - - CREATE TABLE t0(c0 PRIMARY KEY DESC); - INSERT INTO t0(c0) VALUES (0); - SELECT * FROM t0 WHERE t0.c0 > NULL; - diff --git a/libsql-wal/tests/assets/fixtures/nulls1.test b/libsql-wal/tests/assets/fixtures/nulls1.test deleted file mode 100644 index 93b2715f39..0000000000 --- a/libsql-wal/tests/assets/fixtures/nulls1.test +++ /dev/null @@ -1,159 +0,0 @@ - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a INTEGER); - INSERT INTO t3 VALUES(NULL), (10), (30), (20), (NULL); - - - CREATE TABLE t2(a, b, c); - CREATE INDEX i2 ON t2(a, b); - INSERT INTO t2 VALUES(1, 1, 1); - INSERT INTO t2 VALUES(1, NULL, 2); - INSERT INTO t2 VALUES(1, NULL, 3); - INSERT INTO t2 VALUES(1, 4, 4); - - - SELECT * FROM t2 WHERE a=1 ORDER BY b NULLS LAST - - - SELECT * FROM t2 WHERE a=1 ORDER BY b DESC NULLS FIRST - - - CREATE TABLE t1(a, b, c, d, UNIQUE (b)); - - - CREATE TABLE first(nulls, last); - INSERT INTO first(last, nulls) VALUES(100,200), (300,400), (200,300); - SELECT * FROM first ORDER BY nulls; - - - CREATE TABLE tx(a INTEGER PRIMARY KEY, b, c); - CREATE INDEX i1 ON tx(b); - INSERT INTO tx VALUES(1, 1, 1); - INSERT INTO tx VALUES(2, NULL, 2); - INSERT INTO tx VALUES(3, 3, 3); - INSERT INTO tx VALUES(4, NULL, 4); - INSERT INTO tx VALUES(5, 5, 5); - CREATE VIRTUAL TABLE te USING echo(tx); - - - SELECT * FROM tx ORDER BY b NULLS FIRST; - - - SELECT * FROM te ORDER BY b NULLS FIRST; - - - SELECT * FROM tx ORDER BY b NULLS LAST; - - - SELECT * FROM te ORDER BY b NULLS LAST; - - - CREATE TABLE t4(a, b, c); - INSERT INTO t4 VALUES(1, 1, 11); - INSERT INTO t4 VALUES(1, 2, 12); - INSERT INTO t4 VALUES(1, NULL, 1); - - INSERT INTO t4 VALUES(2, NULL, 1); - INSERT INTO t4 VALUES(2, 2, 12); - INSERT INTO t4 VALUES(2, 1, 11); - - INSERT INTO t4 VALUES(3, NULL, 1); - INSERT INTO t4 VALUES(3, 2, 12); - INSERT INTO t4 VALUES(3, NULL, 3); - - - SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST - - - CREATE INDEX t4ab ON t4(a, b); - SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST - - - SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a DESC, b DESC NULLS FIRST - - - CREATE TABLE t5(a, b, c); - WITH s(i) AS ( - VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<200 - ) - INSERT INTO t5 SELECT i%2, CASE WHEN (i%10)==0 THEN NULL ELSE i END, i FROM s; - - - CREATE INDEX t5ab ON t5(a, b, c); - SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c; - - - SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC - - - CREATE TABLE t71(a, b, c); - CREATE INDEX t71abc ON t71(a, b, c); - - SELECT * FROM t71 WHERE a=1 AND b=2 ORDER BY c NULLS LAST; - SELECT * FROM t71 WHERE a=1 AND b=2 ORDER BY c DESC NULLS FIRST; - - SELECT * FROM t71 ORDER BY a NULLS LAST; - SELECT * FROM t71 ORDER BY a DESC NULLS FIRST; - - - CREATE TABLE v0 (c1, c2, c3); - CREATE INDEX v3 ON v0 (c1, c2, c3); - - - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('v0','v3','648 324 81'); - ANALYZE sqlite_master; - - - INSERT INTO v0 VALUES - (1, 10, 'b'), - (1, 10, 'd'), - (1, 10, NULL), - (2, 10, 'a'), - (2, 10, NULL), - (1, 10, 'c'), - (2, 10, 'b'), - (1, 10, 'a'), - (1, 10, NULL), - (2, 10, NULL), - (2, 10, 'd'), - (2, 10, 'c'); - - - SELECT c1, c2, ifnull(c3, 'NULL') FROM v0 - WHERE c2=10 ORDER BY c1, c3 NULLS LAST - - - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES('X'); - CREATE TABLE t2(c, d); - CREATE INDEX t2dc ON t2(d, c); - SELECT c FROM t1 LEFT JOIN t2 ON d=NULL ORDER BY d, c NULLS LAST; - - - INSERT INTO t2(c,d) VALUES(5,'X'),(6,'Y'),(7,'Z'),(3,'A'),(4,'B'); - SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY d, c NULLS LAST; - - - UPDATE t2 SET d='X'; - UPDATE t2 SET c=NULL WHERE c=6; - SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY d NULLS FIRST, c NULLS FIRST; - - - SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY d NULLS LAST, c NULLS LAST; - - - SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY c NULLS LAST; - - - SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY +d NULLS LAST, +c NULLS LAST; - - - INSERT INTO t1(x) VALUES(NULL),('Y'); - SELECT x, c, d, '|' FROM t1 LEFT JOIN t2 ON d=x - ORDER BY d NULLS LAST, c NULLS LAST; - - - SELECT x, c, d, '|' FROM t1 LEFT JOIN t2 ON d=x - ORDER BY +d NULLS LAST, +c NULLS LAST; - diff --git a/libsql-wal/tests/assets/fixtures/numcast.test b/libsql-wal/tests/assets/fixtures/numcast.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/numindex1.test b/libsql-wal/tests/assets/fixtures/numindex1.test deleted file mode 100644 index 5082105c34..0000000000 --- a/libsql-wal/tests/assets/fixtures/numindex1.test +++ /dev/null @@ -1,51 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - CREATE INDEX t1b ON t1(b); - INSERT INTO t1(a,b) VALUES(100, 356282677878746339); - INSERT INTO t1(a,b) VALUES(50, 356282677878746339.0); - INSERT INTO t1(a,b) VALUES(0, 356282677878746340); - DELETE FROM t1 WHERE a=50; - PRAGMA integrity_check; - - - CREATE TABLE t2(a,b); - INSERT INTO t2(a,b) VALUES('b', 1<<58), - ('c', (1<<58)+1e-7), ('d', (1<<58)+1); - SELECT a, b, typeof(b), '|' FROM t2 ORDER BY +a; - - - SELECT x.a || CASE WHEN x.b==y.b THEN '==' ELSE '<>' END || y.a - FROM t2 AS x, t2 AS y - ORDER BY +x.a, +x.b; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY,b); - CREATE INDEX t1b ON t1(b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b) SELECT x, 10000000000000004.0 FROM c - WHERE x NOT IN (23,37); - INSERT INTO t1(a,b) VALUES(23,10000000000000005); - INSERT INTO t1(a,b) VALUES(37,10000000000000003); - DELETE FROM t1 WHERE a NOT IN (23,37); - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY,b); - CREATE INDEX t1b ON t1(b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) - INSERT INTO t1(a,b) SELECT x, 100000000000000005.0 - FROM c WHERE x NOT IN (3,5,7,11,13,17,19); - INSERT INTO t1(a,b) VALUES(3,100000000000000005); - INSERT INTO t1(a,b) VALUES(5,100000000000000000); - INSERT INTO t1(a,b) VALUES(7,100000000000000008); - INSERT INTO t1(a,b) VALUES(11,100000000000000006); - INSERT INTO t1(a,b) VALUES(13,100000000000000001); - INSERT INTO t1(a,b) VALUES(17,100000000000000004); - INSERT INTO t1(a,b) VALUES(19,100000000000000003); - PRAGMA integrity_check; - - - SELECT a FROM t1 ORDER BY b; - diff --git a/libsql-wal/tests/assets/fixtures/offset1.test b/libsql-wal/tests/assets/fixtures/offset1.test deleted file mode 100644 index 734c9010fd..0000000000 --- a/libsql-wal/tests/assets/fixtures/offset1.test +++ /dev/null @@ -1,163 +0,0 @@ - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'); - CREATE TABLE t2(x,y); - INSERT INTO t2 VALUES(8,'y'),(9,'z'),(6,'w'),(7,'x'); - SELECT count(*) FROM t1, t2; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 0; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 2; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 3; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 4; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 5; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 6; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 7; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 8; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 9; - - - SELECT * FROM t1 LIMIT 0; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 0 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 1 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 2 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 3 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 4 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 5 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 6 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 7 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 8 OFFSET 1; - - - SELECT a, b FROM t1 - UNION ALL - SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) - LIMIT 9 OFFSET 1; - - - CREATE TABLE employees ( - id integer primary key, - name text, - city text, - department text, - salary integer - ); - INSERT INTO employees VALUES - (11,'Diane','London','hr',70), - (12,'Bob','London','hr',78), - (21,'Emma','London','it',84), - (22,'Grace','Berlin','it',90), - (23,'Henry','London','it',104), - (24,'Irene','Berlin','it',104), - (25,'Frank','Berlin','it',120), - (31,'Cindy','Berlin','sales',96), - (32,'Dave','London','sales',96), - (33,'Alice','Berlin','sales',100); - CREATE VIEW v AS - SELECT * FROM ( - SELECT * FROM employees - WHERE salary < 100 - ORDER BY salary desc) - UNION ALL - SELECT * FROM ( - SELECT * FROM employees - WHERE salary >= 100 - ORDER BY salary asc); - - - SELECT * FROM v LIMIT 5 OFFSET 2; - diff --git a/libsql-wal/tests/assets/fixtures/openv2.test b/libsql-wal/tests/assets/fixtures/openv2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/orderby1.test b/libsql-wal/tests/assets/fixtures/orderby1.test deleted file mode 100644 index b5090a5a1f..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderby1.test +++ /dev/null @@ -1,54 +0,0 @@ - - EXPLAIN QUERY PLAN SELECT 5 UNION ALL SELECT 3 ORDER BY 1 - - - SELECT 5 UNION ALL SELECT 3 ORDER BY 1 - - - SELECT 986 AS x GROUP BY X ORDER BY X - - - CREATE TABLE abc(a, b, c); - INSERT INTO abc VALUES(1, 2, 3); - INSERT INTO abc VALUES(4, 5, 6); - INSERT INTO abc VALUES(7, 8, 9); - SELECT ( - SELECT 'hardware' FROM ( - SELECT 'software' ORDER BY 'firmware' ASC, 'sportswear' DESC - ) GROUP BY 1 HAVING length(b) - ) - FROM abc; - - - CREATE TABLE t7(a,b); - CREATE INDEX t7a ON t7(a); - CREATE INDEX t7ab ON t7(a,b); - EXPLAIN QUERY PLAN - SELECT * FROM t7 WHERE a=?1 ORDER BY rowid; - - - PRAGMA cache_size = 5; - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a); - - - WITH cnt(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM cnt WHERE i<10000 - ) - INSERT INTO t1 SELECT i%2, randomblob(500) FROM cnt; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x INTEGER PRIMARY KEY); - INSERT INTO t1 VALUES(1),(2); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(y); - INSERT INTO t2 VALUES(9),(8),(3),(4); - SELECT (SELECT x||y FROM t2, t1 ORDER BY x, y); - - - CREATE TABLE t10(a,b); - INSERT INTO t10 VALUES(1,2),(8,9),(3,4),(5,4),(0,7); - CREATE INDEX t10b ON t10(b); - SELECT b, rowid, '^' FROM t10 ORDER BY b, a LIMIT 4; - diff --git a/libsql-wal/tests/assets/fixtures/orderby2.test b/libsql-wal/tests/assets/fixtures/orderby2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/orderby3.test b/libsql-wal/tests/assets/fixtures/orderby3.test deleted file mode 100644 index 45666081f1..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderby3.test +++ /dev/null @@ -1,97 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY); - CREATE TABLE t2(b INTEGER PRIMARY KEY, c INTEGER); - CREATE TABLE t3(d INTEGER); - - INSERT INTO t1 VALUES(1),(2),(3); - - INSERT INTO t2 VALUES(3, 1); - INSERT INTO t2 VALUES(4, 2); - INSERT INTO t2 VALUES(5, 3); - - INSERT INTO t3 VALUES(4),(3),(5); - - - SELECT t1.a - FROM t1, t2, t3 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t1, t2, t3 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - - - SELECT t1.a - FROM t1 CROSS JOIN t2 CROSS JOIN t3 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t1 CROSS JOIN t2 CROSS JOIN t3 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - - - SELECT t1.a - FROM t1 CROSS JOIN t3 CROSS JOIN t2 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t1 CROSS JOIN t3 CROSS JOIN t2 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - - - SELECT t1.a - FROM t2 CROSS JOIN t1 CROSS JOIN t3 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t2 CROSS JOIN t1 CROSS JOIN t3 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - - - SELECT t1.a - FROM t2 CROSS JOIN t3 CROSS JOIN t1 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t2 CROSS JOIN t3 CROSS JOIN t1 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - - - SELECT t1.a - FROM t3 CROSS JOIN t1 CROSS JOIN t2 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t3 CROSS JOIN t1 CROSS JOIN t2 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - - - SELECT t1.a - FROM t3 CROSS JOIN t2 CROSS JOIN t1 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a; - - - SELECT t1.a - FROM t3 CROSS JOIN t2 CROSS JOIN t1 - WHERE t1.a=t2.c AND t2.b=t3.d - ORDER BY t1.a DESC; - diff --git a/libsql-wal/tests/assets/fixtures/orderby4.test b/libsql-wal/tests/assets/fixtures/orderby4.test deleted file mode 100644 index bc9c5004c1..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderby4.test +++ /dev/null @@ -1,28 +0,0 @@ - - CREATE TABLE t1(a, b, PRIMARY KEY(a,b)); - INSERT INTO t1 VALUES(1,1),(1,2); - CREATE TABLE t2(x, y, PRIMARY KEY(x,y)); - INSERT INTO t2 VALUES(3,3),(4,4); - SELECT a, x FROM t1, t2 ORDER BY 1, 2; - - - SELECT a, x FROM t1 CROSS JOIN t2 ORDER BY 1, 2; - - - SELECT a, x FROM t2 CROSS JOIN t1 ORDER BY 1, 2; - - - CREATE TABLE t3(a); - INSERT INTO t3 VALUES(1),(1); - CREATE INDEX t3a ON t3(a); - CREATE TABLE t4(x); - INSERT INTO t4 VALUES(3),(4); - CREATE INDEX t4x ON t4(x); - SELECT a, x FROM t3, t4 ORDER BY 1, 2; - - - SELECT a, x FROM t3 CROSS JOIN t4 ORDER BY 1, 2; - - - SELECT a, x FROM t4 CROSS JOIN t3 ORDER BY 1, 2; - diff --git a/libsql-wal/tests/assets/fixtures/orderby5.test b/libsql-wal/tests/assets/fixtures/orderby5.test deleted file mode 100644 index be6f6fc814..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderby5.test +++ /dev/null @@ -1,141 +0,0 @@ - - CREATE TABLE t1(a,b,c); - CREATE INDEX t1bc ON t1(b,c); - - EXPLAIN QUERY PLAN - SELECT DISTINCT a, b, c FROM t1 WHERE a=0; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT a, c, b FROM t1 WHERE a=0; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT a, c, b FROM t1 WHERE a='xyz' COLLATE nocase; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT a COLLATE nocase, c, b FROM t1 WHERE a='xyz'; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT a COLLATE nocase, c, b FROM t1 WHERE a='xyz' COLLATE nocase; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT b, a, c FROM t1 WHERE a=0; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT b, c, a FROM t1 WHERE a=0; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT c, a, b FROM t1 WHERE a=0; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT c, b, a FROM t1 WHERE a=0; - - - EXPLAIN QUERY PLAN - SELECT DISTINCT c, b, a FROM t1 WHERE +a=0; - - - CREATE TABLE t2(a,b,c); - CREATE INDEX t2bc ON t2(b,c); - ANALYZE; - INSERT INTO sqlite_stat1 VALUES('t1','t1bc','1000000 10 9'); - INSERT INTO sqlite_stat1 VALUES('t2','t2bc','100 10 5'); - ANALYZE sqlite_master; - - EXPLAIN QUERY PLAN - SELECT * FROM t2 WHERE a=0 ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE likelihood(a=0, 0.03) ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE +a=0 ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a=0 ORDER BY b, a, c; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a=0 ORDER BY b, c, a; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a=0 ORDER BY a, c, b; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a=0 ORDER BY c, a, b; - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE a=0 ORDER BY c, b, a; - - - CREATE TABLE t3(a INTEGER PRIMARY KEY, b, c, d, e, f); - CREATE INDEX t3bcde ON t3(b, c, d, e); - EXPLAIN QUERY PLAN - SELECT a FROM t3 WHERE b=2 AND c=3 ORDER BY d DESC, e DESC, b, c, a DESC; - - - DROP TABLE t3; - CREATE TABLE t3(a INTEGER PRIMARY KEY, b, c, d, e, f) WITHOUT rowid; - CREATE INDEX t3bcde ON t3(b, c, d, e); - EXPLAIN QUERY PLAN - SELECT a FROM t3 WHERE b=2 AND c=3 ORDER BY d DESC, e DESC, b, c, a DESC; - - - CREATE TABLE t4(b COLLATE nocase); - INSERT INTO t4 VALUES('abc'); - INSERT INTO t4 VALUES('ABC'); - INSERT INTO t4 VALUES('aBC'); - - - SELECT * FROM t4 ORDER BY b COLLATE binary - - - SELECT * FROM t4 WHERE b='abc' ORDER BY b COLLATE binary - - - CREATE TABLE Records(typeID INTEGER, key TEXT COLLATE nocase, value TEXT); - CREATE INDEX RecordsIndex ON Records(typeID, key, value); - - - explain query plan - SELECT typeID, key, value FROM Records - WHERE typeID = 2 AND key = 'x' - ORDER BY key, value; - - - explain query plan - SELECT typeID, key, value FROM Records - WHERE typeID = 2 AND (key = 'x' COLLATE binary) - ORDER BY key, value; - - - explain query plan - SELECT typeID, key, value FROM Records - WHERE typeID = 2 - ORDER BY key, value; - - - CREATE TABLE t5(a INTEGER PRIMARY KEY, b COLLATE hello, c, d); - - - DROP TABLE t1; - CREATE TABLE t1(a); - DROP TABLE t2; - CREATE TABLE t2(b INTEGER PRIMARY KEY, c INT); - SELECT DISTINCT * - FROM t1 LEFT JOIN t2 ON b=c AND b=(SELECT a FROM t1) - WHERE c>10; - diff --git a/libsql-wal/tests/assets/fixtures/orderby6.test b/libsql-wal/tests/assets/fixtures/orderby6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/orderby7.test b/libsql-wal/tests/assets/fixtures/orderby7.test deleted file mode 100644 index 126e68dbfa..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderby7.test +++ /dev/null @@ -1,75 +0,0 @@ - - CREATE VIRTUAL TABLE fts USING fts3(content TEXT); - INSERT INTO fts(rowid,content) - VALUES(1,'this is a test of the fts3 virtual'), - (2,'table used as part of a join together'), - (3,'with the DISTINCT keyword. There was'), - (4,'a bug at one time (2013-06 through 2014-04)'), - (5,'that prevented this from working correctly.'), - (11,'a row that occurs twice'), - (12,'a row that occurs twice'); - - CREATE TABLE t1(x TEXT PRIMARY KEY, y); - INSERT OR IGNORE INTO t1 SELECT content, rowid+100 FROM fts; - - - SELECT DISTINCT fts.rowid, t1.y - FROM fts, t1 - WHERE fts MATCH 'that twice' - AND content=x - ORDER BY y; - - - SELECT DISTINCT fts.rowid, t1.x - FROM fts, t1 - WHERE fts MATCH 'that twice' - AND content=x - ORDER BY 1; - - - SELECT DISTINCT t1.x - FROM fts, t1 - WHERE fts MATCH 'that twice' - AND content=x - ORDER BY 1; - - - SELECT t1.x - FROM fts, t1 - WHERE fts MATCH 'that twice' - AND content=x - ORDER BY 1; - - - SELECT DISTINCT t1.x - FROM fts, t1 - WHERE fts MATCH 'that twice' - AND content=x; - - - SELECT t1.x - FROM fts, t1 - WHERE fts MATCH 'that twice' - AND content=x; - - - SELECT DISTINCT t1.x - FROM fts, t1 - WHERE fts.rowid=11 - AND content=x - ORDER BY fts.rowid; - - - SELECT DISTINCT t1.* - FROM fts, t1 - WHERE fts.rowid=11 - AND content=x - ORDER BY fts.rowid; - - - SELECT DISTINCT t1.* - FROM fts, t1 - WHERE fts.rowid=11 - AND content=x - ORDER BY t1.y - diff --git a/libsql-wal/tests/assets/fixtures/orderby8.test b/libsql-wal/tests/assets/fixtures/orderby8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/orderby9.test b/libsql-wal/tests/assets/fixtures/orderby9.test deleted file mode 100644 index af7c2e1f48..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderby9.test +++ /dev/null @@ -1,7 +0,0 @@ - - -- create a table with many entries - CREATE TABLE t1(x); - WITH RECURSIVE - c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1 SELECT x FROM c; - diff --git a/libsql-wal/tests/assets/fixtures/orderbyA.test b/libsql-wal/tests/assets/fixtures/orderbyA.test deleted file mode 100644 index fae33923e4..0000000000 --- a/libsql-wal/tests/assets/fixtures/orderbyA.test +++ /dev/null @@ -1,35 +0,0 @@ - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('one', 1, 11); - INSERT INTO t1 VALUES('three', 7, 11); - INSERT INTO t1 VALUES('one', 2, 11); - INSERT INTO t1 VALUES('one', 3, 11); - INSERT INTO t1 VALUES('two', 4, 11); - INSERT INTO t1 VALUES('two', 6, 11); - INSERT INTO t1 VALUES('three', 8, 11); - INSERT INTO t1 VALUES('two', 5, 11); - INSERT INTO t1 VALUES('three', 9, 11); - - - CREATE TABLE t2(a, b, c); - INSERT INTO t2 VALUES(1, 'one', 1); - INSERT INTO t2 VALUES(1, 'two', 2); - INSERT INTO t2 VALUES(1, 'one', 3); - INSERT INTO t2 VALUES(1, 'two', 4); - INSERT INTO t2 VALUES(1, 'one', 5); - INSERT INTO t2 VALUES(1, 'two', 6); - - INSERT INTO t2 VALUES(2, 'one', 7); - INSERT INTO t2 VALUES(2, 'two', 8); - INSERT INTO t2 VALUES(2, 'one', 9); - INSERT INTO t2 VALUES(2, 'two', 10); - INSERT INTO t2 VALUES(2, 'one', 11); - INSERT INTO t2 VALUES(2, 'two', 12); - - INSERT INTO t2 VALUES(NULL, 'one', 13); - INSERT INTO t2 VALUES(NULL, 'two', 14); - INSERT INTO t2 VALUES(NULL, 'one', 15); - INSERT INTO t2 VALUES(NULL, 'two', 16); - INSERT INTO t2 VALUES(NULL, 'one', 17); - INSERT INTO t2 VALUES(NULL, 'two', 18); - diff --git a/libsql-wal/tests/assets/fixtures/oserror.test b/libsql-wal/tests/assets/fixtures/oserror.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ovfl.test b/libsql-wal/tests/assets/fixtures/ovfl.test deleted file mode 100644 index 8c00061898..0000000000 --- a/libsql-wal/tests/assets/fixtures/ovfl.test +++ /dev/null @@ -1,3 +0,0 @@ - - SELECT sum(length(c2)) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/pager1.test b/libsql-wal/tests/assets/fixtures/pager1.test deleted file mode 100644 index 83537728b8..0000000000 --- a/libsql-wal/tests/assets/fixtures/pager1.test +++ /dev/null @@ -1,173 +0,0 @@ - - PRAGMA cache_size = 10; - BEGIN; - INSERT INTO t1 VALUES(1, randomblob(1500)); - INSERT INTO t1 VALUES(2, randomblob(1500)); - INSERT INTO t1 VALUES(3, randomblob(1500)); - SELECT * FROM counter; - - SELECT * FROM counter - SELECT a FROM t1 - COMMIT - - PRAGMA journal_mode = DELETE; - PRAGMA page_size = 1024; - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - INSERT INTO t1 VALUES('I', 'II'); - INSERT INTO t2 VALUES('III', 'IV'); - BEGIN; - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t2 VALUES(3, 4); - COMMIT; - - - SELECT * FROM t1; - SELECT * FROM t2; - - - SELECT * FROM t1; - SELECT * FROM t2; - - - SELECT * FROM t1; - SELECT * FROM t2; - - - SELECT * FROM t1; - SELECT * FROM t2; - - SELECT * FROM t1 - - ATTACH 'test.db2' AS two; - SELECT * FROM t2; - - SELECT * FROM t1 - - ATTACH 'test.db2' AS two; - SELECT * FROM t2; - - - ATTACH 'test.db3' AS three; - SELECT * FROM t3; - - - PRAGMA journal_mode = DELETE; - CREATE TABLE t1(x PRIMARY KEY, y); - CREATE INDEX i1 ON t1(y); - INSERT INTO t1 VALUES('I', 'one'); - INSERT INTO t1 VALUES('II', 'four'); - INSERT INTO t1 VALUES('III', 'nine'); - BEGIN; - INSERT INTO t1 VALUES('IV', 'sixteen'); - INSERT INTO t1 VALUES('V' , 'twentyfive'); - COMMIT; - - PRAGMA max_page_count - PRAGMA max_page_count = 15 - CREATE TABLE t11(a, b) - - BEGIN; - INSERT INTO t11 VALUES(1, 2); - PRAGMA max_page_count = 13; - - - INSERT INTO t11 VALUES(3, 4); - PRAGMA max_page_count = 10; - - COMMIT - PRAGMA max_page_count = 10 - SELECT * FROM t11 - PRAGMA max_page_count - - PRAGMA journal_mode = DELETE; - PRAGMA cache_size = 10; - BEGIN; - CREATE TABLE zz(top PRIMARY KEY); - INSERT INTO zz VALUES(a_string(222)); - INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz; - INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz; - INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz; - INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz; - INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz; - COMMIT; - BEGIN; - UPDATE zz SET top = a_string(345); - - SELECT count(*) FROM zz - - PRAGMA page_size = 1024; - PRAGMA journal_mode = PERSIST; - PRAGMA cache_size = 10; - BEGIN; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB); - INSERT INTO t1 VALUES(NULL, a_string(400)); - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 2 */ - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 4 */ - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 8 */ - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 16 */ - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 32 */ - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 64 */ - INSERT INTO t1 SELECT NULL, a_string(400) FROM t1; /* 128 */ - COMMIT; - UPDATE t1 SET b = a_string(400); - - - CREATE INDEX i1 ON t1(b); - UPDATE t1 SET b = a_string(400); - - - PRAGMA journal_mode = OFF; - CREATE TABLE t1(a, b); - BEGIN; - INSERT INTO t1 VALUES(1, 2); - COMMIT; - SELECT * FROM t1; - - - SELECT * FROM t1; - - - COMMIT; - - - SELECT * FROM t1; - - - CREATE TABLE tx(y, z); - INSERT INTO tx VALUES('Ayutthaya', 'Beijing'); - INSERT INTO tx VALUES('London', 'Tokyo'); - - - UPDATE tbl SET b = a_string(550); - - - PRAGMA auto_vacuum = 2; - CREATE TABLE t3(x); - CREATE TABLE t4(x); - - DROP TABLE t2; - DROP TABLE t3; - DROP TABLE t4; - - - PRAGMA page_size=4096; - PRAGMA auto_vacuum=FULL; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b ANY); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<50) - INSERT INTO t1(a,b) SELECT x, zeroblob(1000) FROM c; - CREATE TABLE t2 AS SELECT * FROM t1; - PRAGMA page_count; - - - BEGIN; - DROP TABLE t2; - PRAGMA incremental_vacuum=50; - PRAGMA page_count; - PRAGMA max_page_count=2; - - - ROLLBACK; - PRAGMA page_count; - PRAGMA max_page_count; - diff --git a/libsql-wal/tests/assets/fixtures/pager2.test b/libsql-wal/tests/assets/fixtures/pager2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pager3.test b/libsql-wal/tests/assets/fixtures/pager3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pager4.test b/libsql-wal/tests/assets/fixtures/pager4.test deleted file mode 100644 index 0b01e12299..0000000000 --- a/libsql-wal/tests/assets/fixtures/pager4.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(673,'stone','philips'); - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/pagerfault.test b/libsql-wal/tests/assets/fixtures/pagerfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pagerfault2.test b/libsql-wal/tests/assets/fixtures/pagerfault2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pagerfault3.test b/libsql-wal/tests/assets/fixtures/pagerfault3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pageropt.test b/libsql-wal/tests/assets/fixtures/pageropt.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pagesize.test b/libsql-wal/tests/assets/fixtures/pagesize.test deleted file mode 100644 index 4e70982f69..0000000000 --- a/libsql-wal/tests/assets/fixtures/pagesize.test +++ /dev/null @@ -1,16 +0,0 @@ - - BEGIN; - SELECT * FROM sqlite_master; - PRAGMA page_size=2048; - PRAGMA main.page_size; - - - CREATE TABLE t1(x); - COMMIT; - - - BEGIN; - PRAGMA page_size = 2048; - COMMIT; - PRAGMA main.page_size; - diff --git a/libsql-wal/tests/assets/fixtures/parser1.test b/libsql-wal/tests/assets/fixtures/parser1.test deleted file mode 100644 index 90f9939270..0000000000 --- a/libsql-wal/tests/assets/fixtures/parser1.test +++ /dev/null @@ -1,38 +0,0 @@ - - CREATE TABLE t1( - a TEXT PRIMARY KEY, - b TEXT, - FOREIGN KEY(b) REFERENCES t1(a) - ); - INSERT INTO t1 VALUES('abc',NULL),('xyz','abc'); - PRAGMA writable_schema=on; - UPDATE sqlite_master SET sql='CREATE TABLE t1( - a TEXT PRIMARY KEY, - b TEXT, - FOREIGN KEY(b COLLATE nocase) REFERENCES t1(a) - )' WHERE name='t1'; - SELECT name FROM sqlite_master WHERE sql LIKE '%collate%'; - - - UPDATE sqlite_master SET sql='CREATE TABLE t1( - a TEXT PRIMARY KEY, - b TEXT, - FOREIGN KEY(b ASC) REFERENCES t1(a) - )' WHERE name='t1'; - SELECT name FROM sqlite_master WHERE sql LIKE '%ASC%'; - - - CREATE TABLE t300(id INTEGER PRIMARY KEY); - CREATE TABLE t301( - id INTEGER PRIMARY KEY, - c1 INTEGER NOT NULL, - c2 INTEGER NOT NULL, - c3 BOOLEAN NOT NULL DEFAULT 0, - FOREIGN KEY(c1) REFERENCES t300(id) ON DELETE CASCADE ON UPDATE RESTRICT - /* no comma */ - FOREIGN KEY(c2) REFERENCES t300(id) ON DELETE CASCADE ON UPDATE RESTRICT - /* no comma */ - UNIQUE(c1, c2) - ); - PRAGMA foreign_key_list(t301); - diff --git a/libsql-wal/tests/assets/fixtures/pcache.test b/libsql-wal/tests/assets/fixtures/pcache.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pcache2.test b/libsql-wal/tests/assets/fixtures/pcache2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pendingrace.test b/libsql-wal/tests/assets/fixtures/pendingrace.test deleted file mode 100644 index e7a748fac2..0000000000 --- a/libsql-wal/tests/assets/fixtures/pendingrace.test +++ /dev/null @@ -1,9 +0,0 @@ - - PRAGMA cache_size = 5; - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10 - ) - INSERT INTO t1 SELECT hex(randomblob(100)), hex(randomblob(100)) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/percentile.test b/libsql-wal/tests/assets/fixtures/percentile.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/permutations.test b/libsql-wal/tests/assets/fixtures/permutations.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pragma.test b/libsql-wal/tests/assets/fixtures/pragma.test deleted file mode 100644 index b8841cc9e8..0000000000 --- a/libsql-wal/tests/assets/fixtures/pragma.test +++ /dev/null @@ -1,115 +0,0 @@ - - PRAGMA default_cache_size = 0; - - - PRAGMA default_cache_size; - - - PRAGMA default_cache_size = -500; - - - PRAGMA default_cache_size; - - - PRAGMA default_cache_size = 500; - - - PRAGMA default_cache_size; - - - PRAGMA default_cache_size; - - - PRAGMA t2.integrity_check=t2; - - - PRAGMA t2.integrity_check=sqlite_schema; - - - CREATE TABLE t1(a,b); - CREATE INDEX t1a ON t1(a); - INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(2,4),(NULL,5),(NULL,6); - PRAGMA writable_schema=ON; - UPDATE sqlite_master SET sql='CREATE UNIQUE INDEX t1a ON t1(a)' - WHERE name='t1a'; - UPDATE sqlite_master SET sql='CREATE TABLE t1(a NOT NULL,b)' - WHERE name='t1'; - PRAGMA writable_schema=OFF; - ALTER TABLE t1 RENAME TO t1x; - PRAGMA integrity_check; - - - PRAGMA integrity_check(3); - - - PRAGMA integrity_check(2); - - - PRAGMA integrity_check(1); - - - CREATE TABLE t1( - a INTEGER PRIMARY KEY, - b TEXT COLLATE nocase, - c INT COLLATE nocase, - d TEXT - ); - INSERT INTO t1(a,b,c,d) VALUES - (1, 'one','one','one'), - (2, 'two','two','two'), - (3, 'three','three','three'), - (4, 'four','four','four'), - (5, 'five','five','five'); - CREATE INDEX t1bcd ON t1(b,c,d); - CREATE TABLE t2( - a INTEGER PRIMARY KEY, - b TEXT COLLATE nocase, - c INT COLLATE nocase, - d TEXT - ); - INSERT INTO t2(a,b,c,d) VALUES - (1, 'one','one','one'), - (2, 'two','two','TWO'), - (3, 'three','THREE','three'), - (4, 'FOUR','four','four'), - (5, 'FIVE','FIVE','five'); - CREATE INDEX t2bcd ON t2(b,c,d); - CREATE TEMP TABLE saved_schema AS SELECT name, rootpage FROM sqlite_schema; - PRAGMA writable_schema=ON; - UPDATE sqlite_schema - SET rootpage=(SELECT rootpage FROM saved_schema WHERE name='t2bcd') - WHERE name='t1bcd'; - UPDATE sqlite_schema - SET rootpage=(SELECT rootpage FROM saved_schema WHERE name='t1bcd') - WHERE name='t2bcd'; - PRAGMA Writable_schema=RESET; - - - SELECT integrity_check AS x FROM pragma_integrity_check ORDER BY 1; - - - CREATE INDEX t3i2 ON t3(b,a); - PRAGMA index_info='t3i2'; - DROP INDEX t3i2; - - - PRAGMA schema_version = 106; - PRAGMA schema_version; - - - PRAGMA schema_version = 106; - PRAGMA schema_version; - - - PRAGMA page_size = 1024; - CREATE TABLE t1(a, b, c); - CREATE INDEX i1 ON t1(b); - INSERT INTO t1 VALUES('a', 'b', 'c'); - PRAGMA integrity_check; - - - CREATE TABLE t1(a INT, b AS (a*2) NOT NULL); - CREATE TEMP TABLE t2(a PRIMARY KEY, b, c UNIQUE) WITHOUT ROWID; - CREATE UNIQUE INDEX t2x ON t2(c,b); - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/pragma2.test b/libsql-wal/tests/assets/fixtures/pragma2.test deleted file mode 100644 index 0463c738d8..0000000000 --- a/libsql-wal/tests/assets/fixtures/pragma2.test +++ /dev/null @@ -1,66 +0,0 @@ - - PRAGMA main.cache_size=2000; - PRAGMA temp.cache_size=2000; - PRAGMA cache_spill; - PRAGMA main.cache_spill; - PRAGMA temp.cache_spill; - - - PRAGMA cache_spill=OFF; - PRAGMA cache_spill; - PRAGMA main.cache_spill; - PRAGMA temp.cache_spill; - - - PRAGMA page_size=1024; - PRAGMA cache_size=50; - BEGIN; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d); - INSERT INTO t1 VALUES(1, randomblob(400), 1, randomblob(400)); - INSERT INTO t1 SELECT a+1, randomblob(400), a+1, randomblob(400) FROM t1; - INSERT INTO t1 SELECT a+2, randomblob(400), a+2, randomblob(400) FROM t1; - INSERT INTO t1 SELECT a+4, randomblob(400), a+4, randomblob(400) FROM t1; - INSERT INTO t1 SELECT a+8, randomblob(400), a+8, randomblob(400) FROM t1; - INSERT INTO t1 SELECT a+16, randomblob(400), a+16, randomblob(400) FROM t1; - INSERT INTO t1 SELECT a+32, randomblob(400), a+32, randomblob(400) FROM t1; - INSERT INTO t1 SELECT a+64, randomblob(400), a+64, randomblob(400) FROM t1; - COMMIT; - ATTACH 'test2.db' AS aux1; - CREATE TABLE aux1.t2(a INTEGER PRIMARY KEY, b, c, d); - INSERT INTO t2 SELECT * FROM t1; - DETACH aux1; - PRAGMA cache_spill=ON; - - - ROLLBACK; - PRAGMA cache_spill=OFF; - ATTACH 'test2.db' AS aux1; - PRAGMA aux1.cache_size=50; - BEGIN; - UPDATE t2 SET c=c+1; - PRAGMA lock_status; - - - COMMIT; - - - PRAGMA cache_spill=ON; -- Applies to all databases - BEGIN; - UPDATE t2 SET c=c-1; - PRAGMA lock_status; - - - PRAGMA page_size=16384; - CREATE TABLE t1(x); - PRAGMA cache_size=2; - PRAGMA cache_spill=YES; - PRAGMA cache_spill; - - - PRAGMA cache_spill=NO; - PRAGMA cache_spill; - - - PRAGMA cache_spill(-51); - PRAGMA cache_spill; - diff --git a/libsql-wal/tests/assets/fixtures/pragma3.test b/libsql-wal/tests/assets/fixtures/pragma3.test deleted file mode 100644 index 89ce7c47da..0000000000 --- a/libsql-wal/tests/assets/fixtures/pragma3.test +++ /dev/null @@ -1,36 +0,0 @@ - - PRAGMA data_version; - - - PRAGMA temp.data_version; - - - PRAGMA main.data_version=1234; - PRAGMA main.data_version; - - - PRAGMA data_version; - BEGIN IMMEDIATE; - PRAGMA data_version; - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(100),(200),(300); - PRAGMA data_version; - COMMIT; - SELECT * FROM t1; - PRAGMA data_version; - - - PRAGMA data_version; - BEGIN IMMEDIATE; - PRAGMA data_version; - INSERT INTO t1 VALUES(400),(500); - PRAGMA data_version; - COMMIT; - SELECT * FROM t1; - PRAGMA data_version; - PRAGMA shrink_memory; - - - SELECT * FROM t1; - PRAGMA data_version; - diff --git a/libsql-wal/tests/assets/fixtures/pragma4.test b/libsql-wal/tests/assets/fixtures/pragma4.test deleted file mode 100644 index 1e6f8242bc..0000000000 --- a/libsql-wal/tests/assets/fixtures/pragma4.test +++ /dev/null @@ -1,64 +0,0 @@ - - CREATE TABLE t1(a, b, c); - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t2(d, e, f); - - PRAGMA table_info = t1 - PRAGMA table_info = t2 - - PRAGMA table_info(t1) - - PRAGMA table_info(t2) - - CREATE TABLE t1(a, b, c); - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t2(d, e, f); - - SELECT * FROM pragma_table_info('t1') - SELECT * FROM pragma_table_info('t2') - SELECT * FROM pragma_table_info('t1') - SELECT * FROM pragma_table_info('t2') - - CREATE TABLE t1(a, b, c); - CREATE INDEX i1 ON t1(b); - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t2(d, e, f); - CREATE INDEX aux.i2 ON t2(e); - - SELECT * FROM pragma_index_info('i1') - SELECT * FROM pragma_index_info('i2') - SELECT * FROM pragma_index_info('i1') - SELECT * FROM pragma_index_info('i2') - - CREATE INDEX main.i1 ON t1(b, c); - CREATE INDEX aux.i2 ON t2(e, f); - - SELECT * FROM pragma_index_list('t1') - SELECT * FROM pragma_index_list('t2') - SELECT * FROM pragma_index_list('t1') - SELECT * FROM pragma_index_list('t2') - - CREATE UNIQUE INDEX main.i1 ON t1(a); - CREATE UNIQUE INDEX aux.i2 ON t2(d); - CREATE TABLE main.c1 (a, b, c REFERENCES t1(a)); - CREATE TABLE aux.c2 (d, e, r REFERENCES t2(d)); - - SELECT * FROM pragma_foreign_key_list('c1') - SELECT * FROM pragma_foreign_key_list('c2') - SELECT * FROM pragma_foreign_key_list('c1') - SELECT * FROM pragma_foreign_key_list('c2') - - CREATE TABLE main.c1 (a, b, c REFERENCES t1(a)); - CREATE TABLE aux.c2 (d, e, r REFERENCES t2(d)); - INSERT INTO main.c1 VALUES(1, 2, 3); - INSERT INTO aux.c2 VALUES(4, 5, 6); - - pragma foreign_key_check('c1') - pragma foreign_key_check('c2') - pragma foreign_key_check('c1') - - CREATE TABLE t4(a DEFAULT 'abc' /* comment */, b DEFAULT -1 -- comment - , c DEFAULT +4.0 /* another comment */ - ); - PRAGMA table_info = t4; - diff --git a/libsql-wal/tests/assets/fixtures/pragma5.test b/libsql-wal/tests/assets/fixtures/pragma5.test deleted file mode 100644 index 37cbb590f2..0000000000 --- a/libsql-wal/tests/assets/fixtures/pragma5.test +++ /dev/null @@ -1,23 +0,0 @@ - - PRAGMA table_info(pragma_function_list) - - - SELECT DISTINCT name, builtin - FROM pragma_function_list WHERE name='upper' AND builtin - - - SELECT DISTINCT name, builtin - FROM pragma_function_list WHERE name LIKE 'exter%'; - - - PRAGMA table_info(pragma_module_list) - - - SELECT * FROM pragma_module_list WHERE name='fts5' - - - PRAGMA table_info(pragma_pragma_list) - - - SELECT * FROM pragma_pragma_list WHERE name='pragma_list' - diff --git a/libsql-wal/tests/assets/fixtures/pragmafault.test b/libsql-wal/tests/assets/fixtures/pragmafault.test deleted file mode 100644 index b7a40a9e80..0000000000 --- a/libsql-wal/tests/assets/fixtures/pragmafault.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE TABLE t1(a, b, CHECK(a!=b)); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/prefixes.test b/libsql-wal/tests/assets/fixtures/prefixes.test deleted file mode 100644 index 2c4c372406..0000000000 --- a/libsql-wal/tests/assets/fixtures/prefixes.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(k TEXT UNIQUE, v INTEGER); - INSERT INTO t1 VALUES - ('aback', 1), - ('abaft', 2), - ('abandon', 3), - ('abandoned', 4), - ('abandoning', 5), - ('abandonment', 6), - ('abandons', 7), - ('abase', 8), - ('abased', 9), - ('abasement', 10), - ('abasements', 11), - ('abases', 12), - ('abash', 13), - ('abashed', 14), - ('abashes', 15), - ('abashing', 16), - ('abasing', 17), - ('abate', 18), - ('abated', 19), - ('abatement', 20), - ('abatements', 21); - diff --git a/libsql-wal/tests/assets/fixtures/printf.test b/libsql-wal/tests/assets/fixtures/printf.test deleted file mode 100644 index 03f83044cd..0000000000 --- a/libsql-wal/tests/assets/fixtures/printf.test +++ /dev/null @@ -1,39 +0,0 @@ - - SELECT printf('%.*g',2147483647,0.01); - - - SELECT format('%!.20g', 13.0); - - - SELECT format('%.3e', 199990000.0); - - - SELECT format('%.3f', 199990000.0); - - - SELECT format('%.3g', 199990000.0); - - - SELECT format('%.4e', 199990000.0); - - - SELECT format('%.4f', 199990000.0); - - - SELECT format('%.4g', 199990000.0); - - - SELECT format('%.5e', 199990000.0); - - - SELECT format('%.5f', 199990000.0); - - - SELECT format('%.5g', 199990000.0); - - - SELECT format('%.30f',1.0000000000000000076e-50); - - - SELECT length( format('%,.249f', -5.0e-300) ); - diff --git a/libsql-wal/tests/assets/fixtures/printf2.test b/libsql-wal/tests/assets/fixtures/printf2.test deleted file mode 100644 index 6a74b32332..0000000000 --- a/libsql-wal/tests/assets/fixtures/printf2.test +++ /dev/null @@ -1,155 +0,0 @@ - - SELECT quote(format()), quote(format(NULL,1,2,3)); - - - SELECT printf('hello'); - - - SELECT format('%d,%d,%d',55,-11,3421); - - - SELECT printf('%d,%d,%d',55,'-11',3421); - - - SELECT format('%d,%d,%d,%d',55,'-11',3421); - - - SELECT printf('%.2f',3.141592653); - - - SELECT format('%.*f',2,3.141592653); - - - SELECT printf('%*.*f',5,2,3.141592653); - - - SELECT format('%d',314159.2653); - - - SELECT printf('%lld',314159.2653); - - - SELECT format('%lld%n',314159.2653,'hi'); - - - SELECT printf('%n',0); - - - SELECT format('%.*z',5,'abcdefghijklmnop'); - - - SELECT printf('%c','abcdefghijklmnop'); - - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(1,2,3); - INSERT INTO t1 VALUES(-1,-2,-3); - INSERT INTO t1 VALUES('abc','def','ghi'); - INSERT INTO t1 VALUES(1.5,2.25,3.125); - SELECT printf('(%s)-%n-(%s)',a,b,c) FROM t1 ORDER BY rowid; - - - SELECT printf('%s=(%p)',a,a) FROM t1 ORDER BY a; - - - SELECT printf('%s=(%d/%g/%s)',a) FROM t1 ORDER BY a; - - - SELECT printf('|%110.100c|','*'); - - - SELECT printf('|%-110.100c|','*'); - - - SELECT printf('|%9.8c|%-9.8c|','*','*'); - - - SELECT printf('|%8.8c|%-8.8c|','*','*'); - - - SELECT printf('|%7.8c|%-7.8c|','*','*'); - - - SELECT printf('|%,d|%,d|',0,-1); - - - SELECT printf('|%,d|%,d|',12,-12); - - - SELECT printf('|%,d|%,d|',123,-123); - - - SELECT printf('|%,d|%,d|',1234,-1234); - - - SELECT printf('|%,d|%,d|',12345,-12345); - - - SELECT printf('|%,d|%,d|',123456,-123456); - - - SELECT printf('|%,d|%,d|',1234567,-1234567); - - - SELECT printf('|%,d|%,d|',12345678,-12345678); - - - SELECT printf('|%,d|%,d|',123456789,-123456789); - - - SELECT printf('|%,d|%,d|',1234567890,-1234567890); - - - SELECT printf('(%8c)',char(11106)); - - - SELECT printf('(%-8c)',char(11106)); - - - SELECT printf('(%5.3c)',char(1492)); - - - SELECT printf('(%-5.3c)',char(1492)); - - - SELECT printf('(%3.3c)',char(1492)); - - - SELECT printf('(%-3.3c)',char(1492)); - - - SELECT printf('(%2c)',char(1513)); - - - SELECT printf('(%-2c)',char(1513)); - - - SELECT printf('(%!.3s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%.6s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%!5.3s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%8.6s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%!-5.3s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%-8.6s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%!.3Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%.6Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%!7.3Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - - - SELECT printf('(%10.6Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); - diff --git a/libsql-wal/tests/assets/fixtures/progress.test b/libsql-wal/tests/assets/fixtures/progress.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/ptrchng.test b/libsql-wal/tests/assets/fixtures/ptrchng.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/pushdown.test b/libsql-wal/tests/assets/fixtures/pushdown.test deleted file mode 100644 index 9ba174522b..0000000000 --- a/libsql-wal/tests/assets/fixtures/pushdown.test +++ /dev/null @@ -1,95 +0,0 @@ - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, 'b1', 'c1'); - INSERT INTO t1 VALUES(2, 'b2', 'c2'); - INSERT INTO t1 VALUES(3, 'b3', 'c3'); - INSERT INTO t1 VALUES(4, 'b4', 'c4'); - CREATE INDEX i1 ON t1(a, c); - - - DROP INDEX i1; - CREATE INDEX i1 ON t1(a, b); - - - CREATE TABLE u1(a, b, c); - CREATE TABLE u2(x, y, z); - - INSERT INTO u1 VALUES('a1', 'b1', 'c1'); - INSERT INTO u2 VALUES('a1', 'b1', 'c1'); - - - CREATE TABLE t0(c0 INT); - INSERT INTO t0 VALUES(0); - CREATE TABLE t1_a(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1_a VALUES(1,'one'); - CREATE TABLE t1_b(c INTEGER PRIMARY KEY, d TEXT); - INSERT INTO t1_b VALUES(2,'two'); - CREATE VIEW v0 AS SELECT CAST(t0.c0 AS INTEGER) AS c0 FROM t0; - CREATE VIEW v1(a,b) AS SELECT a, b FROM t1_a UNION ALL SELECT c, 0 FROM t1_b; - SELECT v1.a, quote(v1.b), t0.c0 AS cd FROM t0 LEFT JOIN v0 ON v0.c0!=0,v1; - - - SELECT a, quote(b), cd FROM ( - SELECT v1.a, v1.b, t0.c0 AS cd FROM t0 LEFT JOIN v0 ON v0.c0!=0, v1 - ) WHERE a=2 AND b='0' AND cd=0; - - - SELECT a, quote(b), cd FROM ( - SELECT v1.a, v1.b, t0.c0 AS cd FROM t0 LEFT JOIN v0 ON v0.c0!=0, v1 - ) WHERE a=1 AND b='one' AND cd=0; - - - SELECT a, quote(b), cd FROM ( - SELECT v1.a, v1.b, t0.c0 AS cd FROM t0 LEFT JOIN v0 ON v0.c0!=0, v1 - ) WHERE a=2 AND b=0 AND cd=0; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INT, b INT, c TEXT, PRIMARY KEY(a,b)) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES - (1,100,'abc'), - (2,200,'def'), - (3,300,'abc'); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INT, b INT, c TEXT, PRIMARY KEY(a,b)) WITHOUT ROWID; - INSERT INTO t2(a,b,c) VALUES - (1,110,'efg'), - (2,200,'hij'), - (3,330,'klm'); - CREATE VIEW v3 AS - SELECT a, b, c FROM t1 - UNION ALL - SELECT a, b, 'xyz' FROM t2; - SELECT * FROM v3 WHERE a=2 AND b=200; - - - SELECT count(*) FROM v3; - - - CREATE TABLE t1(a INT); - CREATE TABLE t2(b INT); - CREATE TABLE t3(c INT); - INSERT INTO t3(c) VALUES(3); - CREATE TABLE t4(d INT); - CREATE TABLE t5(e INT); - INSERT INTO t5(e) VALUES(5); - CREATE VIEW v6(f,g) AS SELECT d, e FROM t4 RIGHT JOIN t5 ON true; - SELECT * FROM t1 JOIN t2 ON false RIGHT JOIN t3 ON true CROSS JOIN v6; - - - SELECT * FROM v6 JOIN t5 ON false RIGHT JOIN t3 ON true; - - - SELECT * FROM t1 JOIN t2 ON false JOIN v6 ON true RIGHT JOIN t3 ON true; - - - CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(1); - CREATE TABLE t2(b INT); INSERT INTO t2 VALUES(2); - CREATE TABLE t3(c INT); INSERT INTO t3 VALUES(3); - CREATE TABLE t4(d INT); INSERT INTO t4 VALUES(4); - CREATE TABLE t5(e INT); INSERT INTO t5 VALUES(5); - SELECT * - FROM t1 JOIN t2 ON null RIGHT JOIN t3 ON true - LEFT JOIN (t4 JOIN t5 ON d+1=e) ON d=4 - WHERE e>0; - diff --git a/libsql-wal/tests/assets/fixtures/queryonly.test b/libsql-wal/tests/assets/fixtures/queryonly.test deleted file mode 100644 index 8698fd5f53..0000000000 --- a/libsql-wal/tests/assets/fixtures/queryonly.test +++ /dev/null @@ -1,30 +0,0 @@ - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(123),(456); - SELECT a FROM t1 ORDER BY a; - - - PRAGMA query_only; - - - PRAGMA query_only=ON; - PRAGMA query_only; - - - SELECT a FROM t1 ORDER BY a; - - - PRAGMA query_only; - - - PRAGMA query_only=OFF; - PRAGMA query_only; - - - INSERT INTO t1 VALUES(789); - SELECT a FROM t1 ORDER BY a; - - - UPDATE t1 SET a=a+1; - SELECT a FROM t1 ORDER BY a; - diff --git a/libsql-wal/tests/assets/fixtures/quick.test b/libsql-wal/tests/assets/fixtures/quick.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/quickcheck.test b/libsql-wal/tests/assets/fixtures/quickcheck.test deleted file mode 100644 index 6cbff62560..0000000000 --- a/libsql-wal/tests/assets/fixtures/quickcheck.test +++ /dev/null @@ -1,12 +0,0 @@ - - CREATE TABLE t1( - a INTEGER NOT NULL, b INTEGER NOT NULL, c AS (a+1), - PRIMARY KEY(b, a) - ) WITHOUT ROWID; - - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - - - PRAGMA quick_check - diff --git a/libsql-wal/tests/assets/fixtures/quota-glob.test b/libsql-wal/tests/assets/fixtures/quota-glob.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/quota.test b/libsql-wal/tests/assets/fixtures/quota.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/quota2.test b/libsql-wal/tests/assets/fixtures/quota2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/quote.test b/libsql-wal/tests/assets/fixtures/quote.test deleted file mode 100644 index beaf92b7ea..0000000000 --- a/libsql-wal/tests/assets/fixtures/quote.test +++ /dev/null @@ -1,21 +0,0 @@ - - CREATE TABLE t1(x, y, z); - - - PRAGMA writable_schema = 1; - CREATE TABLE xyz(a, b, c CHECK (c!="null") ); - CREATE INDEX i2 ON t1(x, y, z||"abc"); - CREATE INDEX i3 ON t1("w"||""); - CREATE INDEX i4 ON t1(x) WHERE z="w"; - - - INSERT INTO xyz VALUES(1, 2, 3); - - - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 'w'); - SELECT * FROM t1 WHERE z='w'; - - - SELECT sql FROM sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/randexpr1.test b/libsql-wal/tests/assets/fixtures/randexpr1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/rbu.test b/libsql-wal/tests/assets/fixtures/rbu.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/rdonly.test b/libsql-wal/tests/assets/fixtures/rdonly.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/recover.test b/libsql-wal/tests/assets/fixtures/recover.test deleted file mode 100644 index 789eb145b7..0000000000 --- a/libsql-wal/tests/assets/fixtures/recover.test +++ /dev/null @@ -1,35 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - INSERT INTO t1 VALUES(1, 4, X'1234567800'); - INSERT INTO t1 VALUES(2, 'test', 8.1); - INSERT INTO t1 VALUES(3, 'balbla', 8.4); - - - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - INSERT INTO t1 VALUES(7, 8, 9); - - - PRAGMA writable_schema = 1; - DELETE FROM sqlite_master WHERE name='t1'; - - - CREATE TABLE lost_and_found(a, b, c); - - - CREATE TABLE lost_and_found_0(a, b, c); - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(d, e, f); - CREATE TABLE t3(g, h, i); - - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES('a', 'b', 'c'); - - INSERT INTO t3 VALUES('one', 'two', 'three'); - DROP TABLE t1; - DROP TABLE t2; - diff --git a/libsql-wal/tests/assets/fixtures/regexp1.test b/libsql-wal/tests/assets/fixtures/regexp1.test deleted file mode 100644 index 6c29d03f80..0000000000 --- a/libsql-wal/tests/assets/fixtures/regexp1.test +++ /dev/null @@ -1,226 +0,0 @@ - - SELECT regexpi('abc','ABC'); - - - SELECT regexpi('ABC','ABC'); - - - SELECT regexpi('ABC','abc'); - - - SELECT regexpi('ABC.','ABC'); - - - SELECT x FROM t1 WHERE y REGEXP 'by|in' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'by|Christ' ORDER BY x; - - - SELECT x FROM t1 WHERE regexp('by|christ',y) ORDER BY x; - - - SELECT x FROM t1 WHERE regexpi('by|christ',y) ORDER BY x; - - - SELECT x FROM t1 WHERE regexpi('BY|CHRIST',y) ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'shal+ al+' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'shall x*y*z*all' ORDER BY x; - - - SELECT x FROM t1 WHERE regexp('shall x*y*z*all',y) ORDER BY x; - - - SELECT x FROM t1 WHERE regexp('SHALL x*y*z*all',y) ORDER BY x; - - - SELECT x FROM t1 WHERE regexpi('SHALL x*y*z*all',y) ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'shallx?y? ?z?all' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'r{2 - - SELECT x FROM t1 WHERE y REGEXP 'r{3 - - SELECT x FROM t1 WHERE y REGEXP 'r{1 - - SELECT x FROM t1 WHERE y REGEXP 'ur{2,10 - - SELECT x FROM t1 WHERE y REGEXP '[Aa]dam' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP '[^Aa]dam' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP '[^b-zB-Z]dam' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'alive' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP '^alive' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'alive$' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'alive.$' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'alive\.$' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'ma[nd]' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP '\bma[nd]' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'ma[nd]\b' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'ma\w' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'ma\W' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP '\sma\w' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP '\Sma\w' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP 'alive\S$' ORDER BY x; - - - SELECT x FROM t1 WHERE y REGEXP - '\b(unto|us|son|given|his|name|called|' || - 'wonderful|councelor|mighty|god|everlasting|father|' || - 'prince|peace|alive)\b'; - - - SELECT 'aaaabbbbcccc' REGEXP 'ab*c', - 'aaaacccc' REGEXP 'ab*c'; - - - SELECT 'aaaabbbbcccc' REGEXP 'ab+c', - 'aaaacccc' REGEXP 'ab+c'; - - - SELECT 'aaaabbbbcccc' REGEXP 'ab?c', - 'aaaacccc' REGEXP 'ab?c'; - - - SELECT 'aaaabbbbbbcccc' REGEXP 'ab{3,5 - - SELECT 'aaaabbbbcccc' REGEXP 'a(a|b|c)+c', - 'aaaabbbbcccc' REGEXP '^a(a|b|c){11 - - SELECT 'aaaabbbbcccc' REGEXP '^a(a|bb|c)+c$', - 'aaaabbbbcccc' REGEXP '^a(a|bbb|c)+c$', - 'aaaabbbbcccc' REGEXP '^a(a|bbbb|c)+c$' - - - SELECT 'aaaabbbbcccc' REGEXP '^a([ac]+|bb){3 - - SELECT 'abc*def+ghi.jkl[mno]pqr' REGEXP 'c.d', - 'abc*def+ghi.jkl[mno]pqr' REGEXP 'c\*d', - 'abc*def+ghi.jkl[mno]pqr' REGEXP 'f\+g', - 'abc*def+ghi.jkl[mno]pqr' REGEXP 'i\.j', - 'abc*def+ghi.jkl[mno]pqr' REGEXP 'l\[mno\]p' - - - SELECT 'abc\def' REGEXP '^abc\\def', - 'abc(def' REGEXP '^abc\(def', - 'abc)def' REGEXP '^abc\)def', - 'abc*def' REGEXP '^abc\*def', - 'abc.def' REGEXP '^abc\.def', - 'abc+def' REGEXP '^abc\+def', - 'abc?def' REGEXP '^abc\?def', - 'abc[def' REGEXP '^abc\[def', - 'abc$def' REGEXP '^abc\$', - '^def' REGEXP '\^def', - 'abc{4 - - SELECT 'abc$¢€xyz' REGEXP '^abc\u0024\u00a2\u20acxyz$', - 'abc$¢€xyz' REGEXP '^abc\u0024\u00A2\u20ACxyz$', - 'abc$¢€xyz' REGEXP '^abc\x24\xa2\u20acxyz$' - - - SELECT 'abc$¢€xyz' REGEXP '^abc[\u0024][\u00a2][\u20ac]xyz$', - 'abc$¢€xyz' REGEXP '^abc[\u0024\u00A2\u20AC]{3 - - SELECT 'abc$¢€xyz' REGEXP '^abc[^\u0025-X][^ -\u007f][^\u20ab]xyz$' - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, a TEXT); - INSERT INTO t1(id, a) VALUES(1, '日本語'); - SELECT a, hex(a), length(a) FROM t1; - - - SELECT * FROM t1 WHERE a='日本語'; - - - SELECT * FROM t1 WHERE a LIKE '日本語'; - - - SELECT * FROM t1 wHERE a REGEXP '日本語'; - -SELECT 'xab' REGEXP 'a(b$|cd)'; -SELECT 'xab' REGEXP '(b$|cd)'; -SELECT 'xaby' REGEXP 'a(b$|cd)'; -SELECT 'xacd' REGEXP 'a(b$|cd)'; -SELECT 'xacdy' REGEXP 'a(b$|cd)'; -SELECT 'xab' REGEXP 'a(cd|b$)'; -SELECT 'xaby' REGEXP 'a(cd|b$)'; -SELECT 'xacd' REGEXP 'a(cd|b$)'; -SELECT 'xacdy' REGEXP 'a(cd|b$)'; -SELECT 'xab' REGEXP 'a(cd|b$|e)'; -SELECT 'xaby' REGEXP 'a(cd|b$|e)'; -SELECT 'xacd' REGEXP 'a(cd|b$|e)'; -SELECT 'xacdy' REGEXP 'a(cd|b$|e)'; -SELECT 'fooX' REGEXP '^[a-z][a-z0-9]{0,30 -SELECT 'fooX' REGEXP '^[a-z][a-z0-9]{0,30 -SELECT 'fooX' REGEXP '^[a-z][a-z0-9]{0,2 -SELECT 'foooX' REGEXP '^[a-z][a-z0-9]{0,2 -SELECT 'foooX' REGEXP '^[a-z][a-z0-9]{0,3 -SELECT 'foo' REGEXP '[a-z]'; -SELECT 'foo' REGEXP '^[a-z]+$'; -SELECT 'foo' REGEXP '^([a-z]+)$'; -SELECT 'foo' REGEXP '(^[a-z]+)$'; -SELECT 'foo' REGEXP '(^[a-z]+$)'; -SELECT 'abc' REGEXP '(^abc|def)'; -SELECT 'xabc' REGEXP '(^abc|def)'; -SELECT 'def' REGEXP '(^abc|def)'; -SELECT 'xdef' REGEXP '(^abc|def)'; - - SELECT char(0x61,0x7ff,0x62) REGEXP char(0x7ff); - - - SELECT char(0x61,0x800,0x62) REGEXP char(0x800); - - - SELECT char(0x61,0xabc,0x62) REGEXP char(0xabc); - - - SELECT char(0x61,0xfff,0x62) REGEXP char(0xfff); - - - SELECT char(0x61,0x1000,0x62) REGEXP char(0x1000); - - - SELECT char(0x61,0xffff,0x62) REGEXP char(0xffff); - - - SELECT char(0x61,0x10000,0x62) REGEXP char(0x10000); - - - SELECT char(0x61,0x10ffff,0x62) REGEXP char(0x10ffff); - diff --git a/libsql-wal/tests/assets/fixtures/regexp2.test b/libsql-wal/tests/assets/fixtures/regexp2.test deleted file mode 100644 index 5352864634..0000000000 --- a/libsql-wal/tests/assets/fixtures/regexp2.test +++ /dev/null @@ -1,92 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE TABLE x1(x, y, z); - CREATE TABLE x2(x, y, z); - - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO x1 VALUES( - new.a REGEXP 'abc', - new.b REGEXP 'abc', - new.c REGEXP 'abc' - ); - END; - - CREATE TRIGGER tr2 AFTER INSERT ON t1 BEGIN - INSERT INTO x2 VALUES( - new.a REGEXP 'def', - new.b REGEXP 'def', - new.c REGEXP 'def' - ); - END; - - INSERT INTO t1 VALUES('abc', 'def', 'abc'); - SELECT * FROM t1; - - SELECT * FROM x1 - SELECT * FROM x2 - - CREATE TABLE t2(a, b); - CREATE TABLE t3(c, d); - CREATE TABLE t4(e, f); - - CREATE TRIGGER t2_tr1 AFTER UPDATE ON t2 BEGIN - UPDATE t3 SET d = new.b WHERE c = old.a; - END; - - CREATE TRIGGER t3_tr1 AFTER UPDATE ON t3 BEGIN - UPDATE t4 SET f = new.d WHERE e = old.c AND new.d REGEXP 'a.*'; - END; - - CREATE TRIGGER t4_tr1 AFTER UPDATE ON t4 BEGIN - SELECT CASE WHEN new.f REGEXP '.*y.*' THEN error() ELSE 1 END; - END; - - INSERT INTO t2 VALUES(1, 'a_x_1'); - INSERT INTO t2 VALUES(2, 'a_y_1'); - - INSERT INTO t3 VALUES(1, 'b1'); - INSERT INTO t3 VALUES(2, 'b2'); - - INSERT INTO t4 VALUES(1, 'b1'); - INSERT INTO t4 VALUES(2, 'b2'); - - - UPDATE t2 SET b = 'a_abc_1'; - - - SELECT * FROM t2; - SELECT * FROM t3; - SELECT * FROM t4; - - - CREATE TABLE t5(a); - CREATE TABLE t6(x); - - CREATE TRIGGER t5tr AFTER DELETE ON t5 BEGIN - DELETE FROM t6 WHERE t6.x REGEXP old.a; - END; - - INSERT INTO t5 VALUES ('^a.*'), ('^b.*'), ('^c.*'); - INSERT INTO t6 VALUES ('eab'), ('abc'), ('bcd'), ('cde'), ('dea'); - - DELETE FROM t5; - SELECT * FROM t6; - -SELECT 'abc' REGEXP '\W' -SELECT 'a c' REGEXP '\W' -SELECT ' ' REGEXP '\W' -SELECT 'abc' REGEXP '\w' -SELECT 'a c' REGEXP '\w' -SELECT ' ' REGEXP '\w' -SELECT 'abc' REGEXP '\D' -SELECT 'abc' REGEXP '[^a-z]' -SELECT 'a c' REGEXP '[^a-z]' -SELECT ' ' REGEXP '[^a-z]' -SELECT 'abc' REGEXP '[a-z]' -SELECT 'a c' REGEXP '[a-z]' -SELECT ' ' REGEXP '[a-z]' -SELECT 'abc' REGEXP '[^a-z]{2 -SELECT 'a c' REGEXP '[^a-z]{2 -SELECT ' ' REGEXP '[^a-z]{2 -SELECT 'abc' REGEXP '\W{1,1 -SELECT 'abc' REGEXP '\W{1 diff --git a/libsql-wal/tests/assets/fixtures/reindex.test b/libsql-wal/tests/assets/fixtures/reindex.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/resetdb.test b/libsql-wal/tests/assets/fixtures/resetdb.test deleted file mode 100644 index bf5dee76eb..0000000000 --- a/libsql-wal/tests/assets/fixtures/resetdb.test +++ /dev/null @@ -1,60 +0,0 @@ - - PRAGMA auto_vacuum = 0; - PRAGMA page_size=4096; - CREATE TABLE t1(a,b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) - INSERT INTO t1(a,b) SELECT x, randomblob(300) FROM c; - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1b ON t1(b); - SELECT sum(a), sum(length(b)) FROM t1; - PRAGMA integrity_check; - PRAGMA journal_mode; - PRAGMA page_count; - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size=8192; - PRAGMA journal_mode=WAL; - CREATE TABLE t1(a,b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) - INSERT INTO t1(a,b) SELECT x, randomblob(1300) FROM c; - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1b ON t1(b); - SELECT sum(a), sum(length(b)) FROM t1; - PRAGMA integrity_check; - PRAGMA journal_mode; - PRAGMA page_size; - PRAGMA page_count; - - - PRAGMA journal_mode = wal; - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1), (2), (3), (4); - - - PRAGMA page_size=512; - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(a,b,c); - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1bc ON t1(b,c); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) - INSERT INTO t1(a,b,c) SELECT x, randomblob(100),randomblob(100) FROM c; - PRAGMA page_count; - PRAGMA integrity_check; - - - UPDATE sqlite_dbpage SET data= - X'53514C69746520666F726D61742033000200030100402020000000000000001300000000000000000000000300000004000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000D00000003017C0001D801AC017C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E03061715110145696E6465787431626374310443524541544520494E4445582074316263204F4E20743128622C63292A0206171311013F696E64657874316174310343524541544520494E44455820743161204F4E20743128612926010617111101397461626C657431743102435245415445205441424C4520743128612C622C6329' WHERE pgno=1; - - - PRAGMA integrity_check; - - - PRAGMA page_count; - PRAGMA integrity_check; - - - PRAGMA encoding = 'utf8'; - CREATE TABLE t1(a, b); - PRAGMA encoding; - diff --git a/libsql-wal/tests/assets/fixtures/resolver01.test b/libsql-wal/tests/assets/fixtures/resolver01.test deleted file mode 100644 index ba10f53c45..0000000000 --- a/libsql-wal/tests/assets/fixtures/resolver01.test +++ /dev/null @@ -1,48 +0,0 @@ - - CREATE TABLE t4(m CHAR(2)); - INSERT INTO t4 VALUES('az'); - INSERT INTO t4 VALUES('by'); - INSERT INTO t4 VALUES('cx'); - SELECT '1', substr(m,2) AS m FROM t4 ORDER BY m; - SELECT '2', substr(m,2) AS m FROM t4 ORDER BY m COLLATE binary; - SELECT '3', substr(m,2) AS m FROM t4 ORDER BY lower(m); - - - CREATE TABLE t5(m CHAR(2)); - INSERT INTO t5 VALUES('ax'); - INSERT INTO t5 VALUES('bx'); - INSERT INTO t5 VALUES('cy'); - SELECT count(*), substr(m,2,1) AS m FROM t5 GROUP BY m ORDER BY 1, 2; - - - SELECT count(*), substr(m,2,1) AS mx FROM t5 GROUP BY m ORDER BY 1, 2; - - - SELECT count(*), substr(m,2,1) AS mx FROM t5 GROUP BY mx ORDER BY 1, 2; - - - SELECT count(*), substr(m,2,1) AS mx FROM t5 - GROUP BY substr(m,2,1) ORDER BY 1, 2; - - - CREATE TABLE t61(name); - SELECT min(name) FROM t61 GROUP BY lower(name); - - - SELECT min(name) AS name FROM t61 GROUP BY lower(name); - - - CREATE TABLE t63(name); - INSERT INTO t63 VALUES (NULL); - INSERT INTO t63 VALUES ('abc'); - SELECT count(), - NULLIF(name,'abc') AS name - FROM t63 - GROUP BY lower(name); - - - SELECT 2 AS x WHERE (SELECT x AS y WHERE 3>y); - - - SELECT 2 AS x WHERE (SELECT x AS y WHERE 1>y); - diff --git a/libsql-wal/tests/assets/fixtures/returning1.test b/libsql-wal/tests/assets/fixtures/returning1.test deleted file mode 100644 index 9ba1524f2c..0000000000 --- a/libsql-wal/tests/assets/fixtures/returning1.test +++ /dev/null @@ -1,225 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c DEFAULT 'pax'); - INSERT INTO t1(b) VALUES(10),('happy'),(NULL) RETURNING a,b,c; - - - SELECT * FROM t1; - - - INSERT INTO t1(b,c) VALUES(5,99) RETURNING b,c,a,rowid; - - - SELECT * FROM t1; - - - INSERT INTO t1 DEFAULT VALUES RETURNING *; - - - SELECT * FROM t1; - - - CREATE TABLE t2(x,y,z); - INSERT INTO t2 VALUES(11,12,13),(21,'b','c'),(31,'b-value',4.75); - - - INSERT INTO t1 SELECT * FROM t2 RETURNING *; - - - SELECT *, '|' FROM t1; - - - UPDATE t1 SET c='bellum' WHERE c='pax' RETURNING rowid, b, '|'; - - - SELECT *, '|' FROM t1; - - - DELETE FROM t1 WHERE c='bellum' RETURNING rowid, *, '|'; - - - SELECT *, '|' FROM t1; - - - CREATE TABLE t4(a INT, b INT DEFAULT 1234, c INT DEFAULT -16); - CREATE UNIQUE INDEX t4a ON t4(a); - INSERT INTO t4(a,b,c) VALUES(1,2,3); - - - INSERT INTO t4(a,b,c) VALUES(1,22,33) - ON CONFLICT(a) DO UPDATE SET b=44 - RETURNING *; - - - SELECT * FROM t4; - - - DELETE FROM t4; - INSERT INTO t4 VALUES(1,2,3),(4,5,6),(7,8,9); - - - INSERT INTO t4(a,b,c) VALUES(2,3,4),(4,5,6),(5,6,7) - ON CONFLICT(a) DO UPDATE SET b=100 - RETURNING *, '|'; - - - CREATE TABLE t1(xyz); - CREATE TABLE t2(a as (1+1), b); - - - UPDATE t2 SET b='123' WHERE b='abc' RETURNING (SELECT b FROM t1); - - - INSERT INTO t2(b) VALUES('abc'); - - - UPDATE t2 SET b='123' WHERE b='abc' RETURNING (SELECT b FROM t1); - - - INSERT INTO t2(b) VALUES('abc'); - INSERT INTO t1(xyz) VALUES(1); - UPDATE t2 SET b='123' WHERE b='abc' RETURNING b; - - - INSERT INTO t2(b) VALUES('abc'); - UPDATE t2 SET b='123' WHERE b='abc' RETURNING (SELECT b FROM t1); - - - CREATE TABLE t1(a INT, b INT); - CREATE TABLE t2(x INT, y INT); - INSERT INTO t1(a,b) VALUES(1,2); - INSERT INTO t2(x,y) VALUES(1,30); - - - CREATE TABLE t1(a); - CREATE TABLE t2(b,c); - INSERT INTO t1 VALUES(1); - INSERT INTO t2 VALUES(3,40); - - - CREATE TABLE t1_a(a, b); - CREATE VIEW t1 AS SELECT a, b FROM t1_a; - - INSERT INTO t1_a VALUES('x', 'y'); - INSERT INTO t1_a VALUES('x', 'y'); - INSERT INTO t1_a VALUES('x', 'y'); - - CREATE TABLE log(op, r, a, b); - - - CREATE TRIGGER tr1 INSTEAD OF INSERT ON t1 BEGIN - INSERT INTO log VALUES('insert', new.rowid, new.a, new.b); - END; - CREATE TRIGGER tr2 INSTEAD OF UPDATE ON t1 BEGIN - INSERT INTO log VALUES('update', new.rowid, new.a, new.b); - END; - - - SELECT * FROM log; - - - CREATE TEMP TABLE t1(a,b); - CREATE TEMP TABLE t2(c,d); - CREATE TEMP TABLE t3(e,f); - CREATE TEMP TABLE log(op,x,y); - CREATE TEMP TRIGGER t1r1 AFTER INSERT ON t1 BEGIN - INSERT INTO log(op,x,y) VALUES('I1',new.a,new.b); - END; - CREATE TEMP TRIGGER t1r2 BEFORE DELETE ON t1 BEGIN - INSERT INTO log(op,x,y) VALUES('D1',old.a,old.b); - END; - CREATE TEMP TRIGGER t2r3 AFTER UPDATE ON t1 BEGIN - INSERT INTO log(op,x,y) VALUES('U1',new.a,new.b); - END; - CREATE TEMP TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN - INSERT INTO log(op,x,y) VALUES('I2',new.c,new.d); - END; - CREATE TEMP TRIGGER t3r1 AFTER DELETE ON t3 BEGIN - INSERT INTO log(op,x,y) VALUES('D3',old.e,old.f); - END; - CREATE TEMP TRIGGER t3r2 BEFORE UPDATE ON t3 BEGIN - INSERT INTO log(op,x,y) VALUES('U3',new.e,new.f); - END; - INSERT INTO t1(a,b) VALUES(1,2),('happy','glad') RETURNING a, b, '|'; - - - UPDATE t1 SET b=9 WHERE a=1 RETURNING a, b, 'x'; - - - DELETE FROM t1 WHERE a<>'xray' RETURNING a, b, '@'; - - - SELECT * FROM log; - DELETE FROM log; - - - INSERT INTO t2 VALUES('bravo','charlie') RETURNING d, c, 'z'; - - - SELECT * FROM log; - DELETE FROM log; - - - INSERT INTO t3(e) VALUES(1),(2),(3) RETURNING 'I', e; - UPDATE t3 SET f=e+100 RETURNING 'U', e, f; - DELETE FROM t3 WHERE f>100 RETURNING 'D', e, f; - - - SELECT * FROM log; - DELETE FROM log; - - - CREATE TEMP TABLE t1(a,b); - CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN SELECT 1; END; - DELETE FROM t1 RETURNING *; - DROP TRIGGER r1; - INSERT INTO t1 VALUES(5,30); - - - SELECT * FROM t1; - - - CREATE VIRTUAL TABLE t1 USING rtree(a, b, c); - CREATE TABLE t2(x); - - - INSERT INTO t1(a,b,c) VALUES(1,2,3) - RETURNING (SELECT b FROM t2); - - - PRAGMA foreign_keys(1); - CREATE TABLE Parent(id INTEGER PRIMARY KEY); - CREATE TABLE Child(id INTEGER PRIMARY KEY, parent_id INTEGER REFERENCES Parent(id)); - - - CREATE TABLE t1(x REAL); - INSERT INTO t1(x) VALUES(5.0) RETURNING x, affinity(x); - - - UPDATE t1 SET x=x+1 RETURNING x, affinity(x); - - - DELETE FROM t1 RETURNING x, affinity(x); - - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(1,2,3),('a','b','c'); - CREATE TEMP TABLE t2(x,y,z); - INSERT INTO t2 SELECT * FROM t1 RETURNING *; - - - SELECT * FROM t2; - - - CREATE TABLE bug(id INTEGER PRIMARY KEY NOT NULL, x); - INSERT INTO bug(id,x) VALUES(20, NULL); - UPDATE bug SET x=NULL WHERE id = 20 RETURNING quote(x), x IS NULL; - - - CREATE TABLE v0(c1 INT); - CREATE VIEW view_2(c1) AS SELECT CASE WHEN c1 COLLATE TRUE THEN TRUE ELSE TRUE END FROM v0; - CREATE TRIGGER x1 INSTEAD OF INSERT ON view_2 BEGIN SELECT true; END; - - - DROP TABLE IF EXISTS t1;CREATE TABLE t1(a); - CREATE TRIGGER r1 AFTER UPDATE ON t1 BEGIN VALUES(0); END; - diff --git a/libsql-wal/tests/assets/fixtures/returningfault.test b/libsql-wal/tests/assets/fixtures/returningfault.test deleted file mode 100644 index 76f2e6a669..0000000000 --- a/libsql-wal/tests/assets/fixtures/returningfault.test +++ /dev/null @@ -1,3 +0,0 @@ - - CREATE TABLE t1 (b); - diff --git a/libsql-wal/tests/assets/fixtures/rollback.test b/libsql-wal/tests/assets/fixtures/rollback.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/rollback2.test b/libsql-wal/tests/assets/fixtures/rollback2.test deleted file mode 100644 index 8f737ca8a6..0000000000 --- a/libsql-wal/tests/assets/fixtures/rollback2.test +++ /dev/null @@ -1,14 +0,0 @@ - - SELECT int2hex(0), int2hex(100), int2hex(255) - - - CREATE TABLE t1(i, h); - CREATE INDEX i1 ON t1(h); - WITH data(a, b) AS ( - SELECT 1, int2hex(1) - UNION ALL - SELECT a+1, int2hex(a+1) FROM data WHERE a<40 - ) - INSERT INTO t1 SELECT * FROM data; - - UPDATE t1 SET h = $leader || h; diff --git a/libsql-wal/tests/assets/fixtures/rollbackfault.test b/libsql-wal/tests/assets/fixtures/rollbackfault.test deleted file mode 100644 index 1dad84e94b..0000000000 --- a/libsql-wal/tests/assets/fixtures/rollbackfault.test +++ /dev/null @@ -1,13 +0,0 @@ - - SELECT int2hex(0), int2hex(100), int2hex(255) - - - CREATE TABLE t1(i, h); - CREATE INDEX i1 ON t1(h); - WITH data(a, b) AS ( - SELECT 1, int2hex(1) - UNION ALL - SELECT a+1, int2hex(a+1) FROM data WHERE a<40 - ) - INSERT INTO t1 SELECT * FROM data; - diff --git a/libsql-wal/tests/assets/fixtures/round1.test b/libsql-wal/tests/assets/fixtures/round1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/rowallock.test b/libsql-wal/tests/assets/fixtures/rowallock.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/rowhash.test b/libsql-wal/tests/assets/fixtures/rowhash.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/rowid.test b/libsql-wal/tests/assets/fixtures/rowid.test deleted file mode 100644 index 601e02e39c..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowid.test +++ /dev/null @@ -1,58 +0,0 @@ - - CREATE TABLE t13(x); - INSERT INTO t13(rowid,x) VALUES(1234,5); - SELECT rowid, x, addrow(rowid+1000), '|' FROM t13 LIMIT 3; - SELECT last_insert_rowid(); - - - CREATE TABLE t14(x INTEGER PRIMARY KEY); - INSERT INTO t14(x) VALUES (100); - - - SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid ASC; - - - SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid DESC; - - - DELETE FROM t14; - SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid ASC; - - - SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid DESC; - - - PRAGMA reverse_unordered_selects=true; - CREATE TABLE t1 (c0, c1); - CREATE TABLE t2 (c0 INT UNIQUE); - INSERT INTO t1(c0, c1) VALUES (0, 0), (0, NULL); - INSERT INTO t2(c0) VALUES (1); - - - SELECT t2.c0, t1.c1 FROM t1, t2 - WHERE (t2.rowid <= 'a') OR (t1.c0 <= t2.c0) LIMIT 100 - - - SELECT 1, NULL INTERSECT SELECT * FROM ( - SELECT t2.c0, t1.c1 FROM t1, t2 - WHERE ((t2.rowid <= 'a')) OR (t1.c0 <= t2.c0) ORDER BY 'a' DESC LIMIT 100 - ); - - - CREATE TABLE t1(x); - CREATE TABLE t2(y PRIMARY KEY) WITHOUT ROWID; - CREATE VIEW v1 AS SELECT x FROM t1; - CREATE TABLE t3(z); - - INSERT INTO t1(rowid, x) VALUES(1, 1); - INSERT INTO t2(y) VALUES(2); - INSERT INTO t3(rowid, z) VALUES(3, 3); - - SELECT rowid FROM t1, t2; - SELECT rowid FROM t1, v1; - SELECT rowid FROM t3, v1; - SELECT rowid FROM t3, (SELECT 123); - SELECT rowid FROM t2, t1; - SELECT rowid FROM v1, t1; - SELECT rowid FROM v1, t3; - SELECT rowid FROM (SELECT 123), t3; diff --git a/libsql-wal/tests/assets/fixtures/rowvalue.test b/libsql-wal/tests/assets/fixtures/rowvalue.test deleted file mode 100644 index 360f972fc1..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue.test +++ /dev/null @@ -1,440 +0,0 @@ - - CREATE TABLE one(o); - INSERT INTO one VALUES(1); - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(2, 3); - INSERT INTO t1 VALUES(2, 4); - INSERT INTO t1 VALUES(3, 5); - INSERT INTO t1 VALUES(3, 6); - - - CREATE TABLE hh(a, b, c); - INSERT INTO hh VALUES('abc', 1, 'i'); - INSERT INTO hh VALUES('ABC', 1, 'ii'); - INSERT INTO hh VALUES('def', 2, 'iii'); - INSERT INTO hh VALUES('DEF', 2, 'iv'); - INSERT INTO hh VALUES('GHI', 3, 'v'); - INSERT INTO hh VALUES('ghi', 3, 'vi'); - - CREATE INDEX hh_ab ON hh(a, b); - - - SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1); - - - SELECT c FROM hh WHERE (a, b) = (SELECT 'abc' COLLATE nocase, 1); - - - SELECT c FROM hh WHERE a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1); - - - SELECT c FROM hh WHERE +a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1); - - - SELECT c FROM hh WHERE a = (SELECT 'abc') COLLATE nocase AND b = (SELECT 1); - - - SELECT c FROM hh WHERE (a COLLATE nocase, b) = (SELECT 'def', 2); - - - SELECT c FROM hh WHERE (a COLLATE nocase, b) IS NOT (SELECT 'def', 2); - - - SELECT c FROM hh WHERE (b, a) = (SELECT 2, 'def'); - - - CREATE TABLE xy(i INTEGER PRIMARY KEY, j, k); - INSERT INTO xy VALUES(1, 1, 1); - INSERT INTO xy VALUES(2, 2, 2); - INSERT INTO xy VALUES(3, 3, 3); - INSERT INTO xy VALUES(4, 4, 4); - - - CREATE TABLE j1(a); - - - SELECT * FROM j1 WHERE (select min(a) FROM j1) IN (?, ?, ?) - - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c); - INSERT INTO t2 VALUES(1, 1, 1); - INSERT INTO t2 VALUES(2, 2, 2); - INSERT INTO t2 VALUES(3, 3, 3); - INSERT INTO t2 VALUES(4, 4, 4); - INSERT INTO t2 VALUES(5, 5, 5); - - - CREATE TABLE dual(dummy); INSERT INTO dual(dummy) VALUES('X'); - CREATE TABLE t3(a TEXT,b TEXT,c TEXT,d TEXT,e TEXT,f TEXT); - CREATE INDEX t3x ON t3(b,c,d,e,f); - - SELECT a FROM t3 - WHERE (c,d) IN (SELECT 'c','d' FROM dual) - AND (a,b,e) IN (SELECT 'a','b','d' FROM dual); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INT,b INT); INSERT INTO t1 VALUES(1,2); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x INT,y INT); INSERT INTO t2 VALUES(3,4); - SELECT *,'x' FROM t1 LEFT JOIN t2 ON (a,b)=(x,y); - - - SELECT t1.*, t2.* FROM t2 RIGHT JOIN t1 ON (a,b)=(x,y); - - - SELECT t1.*, t2.* FROM t1 FULL JOIN t2 ON (a,b)=(x,y) - ORDER BY coalesce(a,x); - - - CREATE TABLE t12(x); - INSERT INTO t12 VALUES(2), (4); - - - SELECT 1 FROM t12 WHERE (1,x) BETWEEN (1,1) AND (3,3) - - - CREATE TABLE x1(a PRIMARY KEY, b); - CREATE TABLE x2(a INTEGER PRIMARY KEY, b); - - - CREATE TABLE t16a(a,b,c); - INSERT INTO t16a VALUES(1,2,3); - CREATE TABLE t16b(x); - INSERT INTO t16b(x) VALUES(1); - CREATE TRIGGER t16r AFTER UPDATE ON t16b BEGIN - UPDATE t16a SET (a,b,c)=(SELECT new.x,new.x+1,new.x+2); - END; - UPDATE t16b SET x=7; - SELECT * FROM t16a; - - - UPDATE t16b SET x=97; - SELECT * FROM t16a; - - - CREATE TABLE t16c(a, b, c, d, e); - INSERT INTO t16c VALUES(1, 'a', 'b', 'c', 'd'); - CREATE TRIGGER t16c1 AFTER INSERT ON t16c BEGIN - UPDATE t16c SET (c, d) = (SELECT 'A', 'B'), (e, b) = (SELECT 'C', 'D') - WHERE a = new.a-1; - END; - - SELECT * FROM t16c; - - - INSERT INTO t16c VALUES(2, 'w', 'x', 'y', 'z'); - SELECT * FROM t16c; - - - DROP TRIGGER t16c1; - PRAGMA recursive_triggers = 1; - INSERT INTO t16c VALUES(3, 'i', 'ii', 'iii', 'iv'); - CREATE TRIGGER t16c1 AFTER UPDATE ON t16c WHEN new.a>1 BEGIN - UPDATE t16c SET (e, d) = ( - SELECT b, c FROM t16c WHERE a = new.a-1 - ), (c, b) = ( - SELECT d, e FROM t16c WHERE a = new.a-1 - ) WHERE a = new.a-1; - END; - - UPDATE t16c SET a=a WHERE a=3; - SELECT * FROM t16c; - - - CREATE TABLE b1(a, b); - CREATE TABLE b2(x); - - - SELECT * FROM b2 CROSS JOIN b1 - WHERE b2.x=b1.a AND (b1.a, 2) - IN (VALUES(1, 2)); - - - CREATE TABLE b3 ( a, b, PRIMARY KEY (a, b) ); - CREATE TABLE b4 ( a ); - CREATE TABLE b5 ( a, b ); - INSERT INTO b3 VALUES (1, 1), (1, 2); - INSERT INTO b4 VALUES (1); - INSERT INTO b5 VALUES (1, 1), (1, 2); - - - SELECT * FROM b3 WHERE (SELECT b3.a, b3.b) IN ( SELECT a, b FROM b5 ) - - - SELECT * FROM b3 WHERE (VALUES(b3.a, b3.b)) IN ( SELECT a, b FROM b5 ); - - - SELECT * FROM b3 WHERE (b3.a, b3.b) IN ( SELECT a, b FROM b5 ); - - - SELECT * FROM b3 JOIN b4 ON b4.a = b3.a - WHERE (SELECT b3.a, b3.b) IN ( SELECT a, b FROM b5 ); - - - SELECT * FROM b3 JOIN b4 ON b4.a = b3.a - WHERE (VALUES(b3.a, b3.b)) IN ( SELECT a, b FROM b5 ); - - - SELECT * FROM b3 JOIN b4 ON b4.a = b3.a - WHERE (b3.a, b3.b) IN ( SELECT a, b FROM b5 ); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY,b); - INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3,33),(4,44); - SELECT * FROM t1 WHERE (a,b)>(0,0) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)>=(0,0) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)<(5,0) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)<=(5,0) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)>(3,0) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)>=(3,0) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)<(3,0) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)<=(3,0) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)>(3,32) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)>(3,33) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)>=(3,33) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)>=(3,34) ORDER BY a; - - - SELECT * FROM t1 WHERE (a,b)<(3,34) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)<(3,33) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)<=(3,33) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (a,b)<=(3,32) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (0,0)<(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (0,0)<=(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (5,0)>(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (5,0)>=(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (3,0)<(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (3,0)<=(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (3,0)>(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (3,0)>=(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (3,32)<(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (3,33)<(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (3,33)<=(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (3,34)<=(a,b) ORDER BY a; - - - SELECT * FROM t1 WHERE (3,34)>(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (3,33)>(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (3,33)>=(a,b) ORDER BY a DESC; - - - SELECT * FROM t1 WHERE (3,32)>=(a,b) ORDER BY a DESC; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a,b,PRIMARY KEY(b,b)); - INSERT INTO t1 VALUES(1,2),(3,4),(5,6); - SELECT * FROM t1 WHERE (a,b) IN (VALUES(1,2)); - - - SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 3,4); - SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 5,6); - SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 3,4); - SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 5,6); - SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 3,4); - SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 5,6); - SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 3,4); - SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 5,6); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(aa COLLATE NOCASE, bb); - INSERT INTO t0 VALUES('a', 'A'); - SELECT (+bb,1) >= (aa, 1), (aa,1)<=(+bb,1) FROM t0; - SELECT 2 FROM t0 WHERE (+bb,1) >= (aa,1); - SELECT 3 FROM t0 WHERE (aa,1) <= (+bb,1); - - - SELECT (SELECT +bb,1) >= (aa, 1), (aa,1)<=(SELECT +bb,1) FROM t0; - SELECT 2 FROM t0 WHERE (SELECT +bb,1) >= (aa,1); - SELECT 3 FROM t0 WHERE (aa,1) <= (SELECT +bb,1); - - - DROP TABLE t0; - CREATE TABLE t0(c0 TEXT PRIMARY KEY); - INSERT INTO t0(c0) VALUES (''); - SELECT (t0.c0, TRUE) > (CAST(0 AS REAL), FALSE) FROM t0; - SELECT 2 FROM t0 WHERE (t0.c0, TRUE) > (CAST('' AS REAL), FALSE); - - - DROP TABLE t0; - CREATE TABLE t0(c0 UNIQUE); - INSERT INTO t0(c0) VALUES('a'); - SELECT (t0.c0, 0) < ('B' COLLATE NOCASE, 0) FROM t0; - SELECT 2 FROM t0 WHERE (t0.c0, 0) < ('B' COLLATE NOCASE, 0); - - - SELECT ('B' COLLATE NOCASE, 0)> (t0.c0, 0) FROM t0; - SELECT 2 FROM t0 WHERE ('B' COLLATE NOCASE, 0)> (t0.c0, 0); - - - SELECT ('B', 0)> (t0.c0 COLLATE nocase, 0) FROM t0; - SELECT 2 FROM t0 WHERE ('B', 0)> (t0.c0 COLLATE nocase, 0); - - - SELECT (t0.c0 COLLATE nocase, 0) < ('B', 0) FROM t0; - SELECT 2 FROM t0 WHERE (t0.c0 COLLATE nocase, 0) < ('B', 0); - - - CREATE TABLE t0(c0); - CREATE TABLE t1(c1); - INSERT INTO t1(c1) VALUES (0); - SELECT (c0, x'') != (NULL, 0) FROM t1 LEFT JOIN t0; - - - SELECT 2 FROM t1 LEFT JOIN t0 ON (c0, x'') != (NULL, 0); - - - SELECT 21 FROM t0 RIGHT JOIN t1 ON (c0, x'') != (NULL, 0); - - - SELECT 3 FROM t1 LEFT JOIN t0 WHERE (c0, x'') != (NULL, 0); - - - SELECT 31 FROM t0 RIGHT JOIN t1 WHERE (c0, x'') != (NULL, 0); - - - CREATE TABLE t1(x, y, z); - CREATE TABLE t2(a, b); - - INSERT INTO t1 VALUES(1000, 2000, 3000); - INSERT INTO t2 VALUES(NULL, NULL); - - - UPDATE t2 SET (a,b)=( - SELECT max( t1.x ) OVER( PARTITION BY sum( (SELECT t1.y) ) ), 2 - ) - FROM t1; - - - SELECT * FROM t2 - - - CREATE TABLE t1(x INT PRIMARY KEY, y, z); - CREATE TABLE t2(a,b,c,d,e,PRIMARY KEY(a,b))WITHOUT ROWID; - - UPDATE t2 SET (d,d,a)=(SELECT EXISTS(SELECT 1 IN(SELECT max( 1 IN(SELECT x ORDER BY 1)) OVER(PARTITION BY sum((SELECT y FROM t1 UNION SELECT x ORDER BY 1)))INTERSECT SELECT EXISTS(SELECT 1 FROM t1 UNION SELECT x ORDER BY 1) ORDER BY 1) ORDERa)|9 AS blob, 2, 3) FROM t1 WHERE x= (1, 0) - SELECT c FROM t1 WHERE (a, b) > (1, 0) - - CREATE TABLE t2(a INTEGER, b INTEGER, c INTEGER, d INTEGER); - CREATE INDEX i2 ON t2(a, b, c); - - - SELECT d FROM t2 WHERE (a, b) > (2, 2); - - - SELECT d FROM t2 WHERE (a, b) >= (2, 2); - - - SELECT d FROM t2 WHERE a=1 AND (b, c) >= (1, 2); - - - SELECT d FROM t2 WHERE a=1 AND (b, c) > (1, 2); - - - CREATE TABLE t4(a, b, c); - INSERT INTO t4 VALUES(NULL, NULL, NULL); - INSERT INTO t4 VALUES(NULL, NULL, 0); - INSERT INTO t4 VALUES(NULL, NULL, 1); - INSERT INTO t4 VALUES(NULL, 0, NULL); - INSERT INTO t4 VALUES(NULL, 0, 0); - INSERT INTO t4 VALUES(NULL, 0, 1); - INSERT INTO t4 VALUES(NULL, 1, NULL); - INSERT INTO t4 VALUES(NULL, 1, 0); - INSERT INTO t4 VALUES(NULL, 1, 1); - - INSERT INTO t4 VALUES( 0, NULL, NULL); - INSERT INTO t4 VALUES( 0, NULL, 0); - INSERT INTO t4 VALUES( 0, NULL, 1); - INSERT INTO t4 VALUES( 0, 0, NULL); - INSERT INTO t4 VALUES( 0, 0, 0); - INSERT INTO t4 VALUES( 0, 0, 1); - INSERT INTO t4 VALUES( 0, 1, NULL); - INSERT INTO t4 VALUES( 0, 1, 0); - INSERT INTO t4 VALUES( 0, 1, 1); - - INSERT INTO t4 VALUES( 1, NULL, NULL); - INSERT INTO t4 VALUES( 1, NULL, 0); - INSERT INTO t4 VALUES( 1, NULL, 1); - INSERT INTO t4 VALUES( 1, 0, NULL); - INSERT INTO t4 VALUES( 1, 0, 0); - INSERT INTO t4 VALUES( 1, 0, 1); - INSERT INTO t4 VALUES( 1, 1, NULL); - INSERT INTO t4 VALUES( 1, 1, 0); - INSERT INTO t4 VALUES( 1, 1, 1); - - - CREATE TABLE r1(a TEXT, iB TEXT); - CREATE TABLE r2(x TEXT, zY INTEGER); - CREATE INDEX r1ab ON r1(a, iB); - - INSERT INTO r1 VALUES(35, 35); - INSERT INTO r2 VALUES(35, 36); - INSERT INTO r2 VALUES(35, 4); - INSERT INTO r2 VALUES(35, 35); - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue3.test b/libsql-wal/tests/assets/fixtures/rowvalue3.test deleted file mode 100644 index 6a95966c4d..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue3.test +++ /dev/null @@ -1,62 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE INDEX i1 ON t1(a, b); - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - INSERT INTO t1 VALUES(7, 8, 9); - - - CREATE TABLE z1(x, y, z); - CREATE TABLE kk(a, b); - - INSERT INTO z1 VALUES('a', 'b', 'c'); - INSERT INTO z1 VALUES('d', 'e', 'f'); - INSERT INTO z1 VALUES('g', 'h', 'i'); - - -- INSERT INTO kk VALUES('y', 'y'); - INSERT INTO kk VALUES('d', 'e'); - -- INSERT INTO kk VALUES('x', 'x'); - - - - CREATE TABLE c1(a, b, c, d); - INSERT INTO c1(rowid, a, b) VALUES(1, NULL, 1); - INSERT INTO c1(rowid, a, b) VALUES(2, 2, NULL); - INSERT INTO c1(rowid, a, b) VALUES(3, 2, 2); - INSERT INTO c1(rowid, a, b) VALUES(4, 3, 3); - - INSERT INTO c1(rowid, a, b, c, d) VALUES(101, 'a', 'b', 1, 1); - INSERT INTO c1(rowid, a, b, c, d) VALUES(102, 'a', 'b', 1, 2); - INSERT INTO c1(rowid, a, b, c, d) VALUES(103, 'a', 'b', 1, 3); - INSERT INTO c1(rowid, a, b, c, d) VALUES(104, 'a', 'b', 2, 1); - INSERT INTO c1(rowid, a, b, c, d) VALUES(105, 'a', 'b', 2, 2); - INSERT INTO c1(rowid, a, b, c, d) VALUES(106, 'a', 'b', 2, 3); - INSERT INTO c1(rowid, a, b, c, d) VALUES(107, 'a', 'b', 3, 1); - INSERT INTO c1(rowid, a, b, c, d) VALUES(108, 'a', 'b', 3, 2); - INSERT INTO c1(rowid, a, b, c, d) VALUES(109, 'a', 'b', 3, 3); - - - CREATE TABLE hh(a, b, c); - - INSERT INTO hh VALUES('a', 'a', 1); - INSERT INTO hh VALUES('a', 'b', 2); - INSERT INTO hh VALUES('b', 'a', 3); - INSERT INTO hh VALUES('b', 'b', 4); - - CREATE TABLE k1(x, y); - INSERT INTO k1 VALUES('a', 'a'); - INSERT INTO k1 VALUES('b', 'b'); - INSERT INTO k1 VALUES('a', 'b'); - INSERT INTO k1 VALUES('b', 'a'); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE T1(a TEXT); - INSERT INTO T1(a) VALUES ('aaa'); - CREATE TABLE T2(a TEXT PRIMARY KEY,n INT); - INSERT INTO T2(a, n) VALUES('aaa',0); - SELECT * FROM T2 - WHERE (a,n) IN (SELECT T1.a, V.n - FROM T1, (SELECT * FROM (SELECT 0 n) T3) V); - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue4.test b/libsql-wal/tests/assets/fixtures/rowvalue4.test deleted file mode 100644 index e511853766..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue4.test +++ /dev/null @@ -1,98 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE INDEX t1bac ON t1(b, a, c); - - - CREATE TABLE t2(a, b, c, d); - INSERT INTO t2 VALUES(1, 1, 1, 1); - INSERT INTO t2 VALUES(1, 1, 2, 2); - INSERT INTO t2 VALUES(1, 1, 3, 3); - INSERT INTO t2 VALUES(1, 2, 1, 4); - INSERT INTO t2 VALUES(1, 2, 2, 5); - INSERT INTO t2 VALUES(1, 2, 3, 6); - INSERT INTO t2 VALUES(1, 3, 1, 7); - INSERT INTO t2 VALUES(1, 3, 2, 8); - INSERT INTO t2 VALUES(1, 3, 3, 9); - - INSERT INTO t2 VALUES(2, 1, 1, 10); - INSERT INTO t2 VALUES(2, 1, 2, 11); - INSERT INTO t2 VALUES(2, 1, 3, 12); - INSERT INTO t2 VALUES(2, 2, 1, 13); - INSERT INTO t2 VALUES(2, 2, 2, 14); - INSERT INTO t2 VALUES(2, 2, 3, 15); - INSERT INTO t2 VALUES(2, 3, 1, 16); - INSERT INTO t2 VALUES(2, 3, 2, 17); - INSERT INTO t2 VALUES(2, 3, 3, 18); - - INSERT INTO t2 VALUES(3, 1, 1, 19); - INSERT INTO t2 VALUES(3, 1, 2, 20); - INSERT INTO t2 VALUES(3, 1, 3, 21); - INSERT INTO t2 VALUES(3, 2, 1, 22); - INSERT INTO t2 VALUES(3, 2, 2, 23); - INSERT INTO t2 VALUES(3, 2, 3, 24); - INSERT INTO t2 VALUES(3, 3, 1, 25); - INSERT INTO t2 VALUES(3, 3, 2, 26); - INSERT INTO t2 VALUES(3, 3, 3, 27); - - - CREATE TABLE c1(a, b, c, d); - INSERT INTO c1(a, b) VALUES(1, 'a'); - INSERT INTO c1(a, b) VALUES(1, 'b'); - INSERT INTO c1(a, b) VALUES(1, 'c'); - INSERT INTO c1(a, b) VALUES(1, 'd'); - INSERT INTO c1(a, b) VALUES(1, 'e'); - INSERT INTO c1(a, b) VALUES(1, 'f'); - INSERT INTO c1(a, b) VALUES(1, 'g'); - INSERT INTO c1(a, b) VALUES(1, 'h'); - INSERT INTO c1(a, b) VALUES(1, 'i'); - INSERT INTO c1(a, b) VALUES(1, 'j'); - INSERT INTO c1(a, b) VALUES(1, 'k'); - INSERT INTO c1(a, b) VALUES(1, 'l'); - INSERT INTO c1(a, b) VALUES(1, 'm'); - INSERT INTO c1(a, b) VALUES(1, 'n'); - INSERT INTO c1(a, b) VALUES(1, 'o'); - INSERT INTO c1(a, b) VALUES(1, 'p'); - INSERT INTO c1(a, b) VALUES(2, 'a'); - INSERT INTO c1(a, b) VALUES(2, 'b'); - INSERT INTO c1(a, b) VALUES(2, 'c'); - INSERT INTO c1(a, b) VALUES(2, 'd'); - INSERT INTO c1(a, b) VALUES(2, 'e'); - INSERT INTO c1(a, b) VALUES(2, 'f'); - INSERT INTO c1(a, b) VALUES(2, 'g'); - INSERT INTO c1(a, b) VALUES(2, 'h'); - - INSERT INTO c1(c, d) SELECT a, b FROM c1; - - CREATE INDEX c1ab ON c1(a, b); - CREATE INDEX c1cd ON c1(c, d); - ANALYZE; - - - CREATE TABLE d1(x, y); - CREATE TABLE d2(a, b, c); - CREATE INDEX d2ab ON d2(a, b); - CREATE INDEX d2c ON d2(c); - - WITH i(i) AS ( - VALUES(1) UNION ALL SELECT i+1 FROM i WHERE i<1000 - ) - INSERT INTO d2 SELECT i/100, i%100, i/100 FROM i; - ANALYZE; - - - CREATE TABLE e1(a, b, c, d, e); - CREATE INDEX e1ab ON e1(a, b); - CREATE INDEX e1cde ON e1(c, d, e); - - - CREATE TABLE f1(a, b, c); - CREATE INDEX f1ab ON f1(a, b); - - - CREATE TABLE c1(x, y); - CREATE TABLE c2(a, b, c); - CREATE INDEX c2ab ON c2(a, b); - CREATE INDEX c2c ON c2(c); - - CREATE TABLE c3(d); - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue5.test b/libsql-wal/tests/assets/fixtures/rowvalue5.test deleted file mode 100644 index 76d8cda39a..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue5.test +++ /dev/null @@ -1,3 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING tcl(vtab_command); - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue6.test b/libsql-wal/tests/assets/fixtures/rowvalue6.test deleted file mode 100644 index eee2d02250..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue6.test +++ /dev/null @@ -1,16 +0,0 @@ - - CREATE TABLE t1(a,b,c); - CREATE INDEX t1x1 ON t1(a,b); - INSERT INTO t1 VALUES(1,NULL,200); - - CREATE TABLE t2(x,y,z); - INSERT INTO t2 VALUES(1,NULL,55); - - SELECT c FROM t1 WHERE (a,b) IN (SELECT x,y FROM t2 WHERE z==55); - - - INSERT INTO t1 VALUES(2,3,400); - INSERT INTO t2 VALUES(2,3,55); - - SELECT c FROM t1 WHERE (a,b) IN (SELECT x,y FROM t2 WHERE z==55); - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue7.test b/libsql-wal/tests/assets/fixtures/rowvalue7.test deleted file mode 100644 index b6c7efe04d..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue7.test +++ /dev/null @@ -1,26 +0,0 @@ - - CREATE TABLE t1(a,b,c,d); - CREATE INDEX t1x ON t1(a,b); - INSERT INTO t1(a,b,c,d) VALUES(1,2,0,0),(3,4,0,0),(5,6,0,0); - CREATE TABLE t2(w,x,y,z); - CREATE INDEX t2x ON t2(w,x); - INSERT INTO t2(w,x,y,z) VALUES(1,2,11,22),(8,9,88,99),(3,5,33,55),(5,6,55,66); - - SELECT *,'|' FROM t1 ORDER BY a; - - - UPDATE t1 SET (c,d) = (SELECT y,z FROM t2 WHERE (w,x)=(a,b)); - SELECT *,'|' FROM t1 ORDER BY a; - - - UPDATE t1 SET (c,d) = (SELECT y,z FROM t2 WHERE w=a); - SELECT *,'|' FROM t1 ORDER BY a; - - - UPDATE t1 SET (c) = 99 WHERE a=3; - SELECT *,'|' FROM t1 ORDER BY a; - - - UPDATE t1 SET b = 8, (c,d) = (SELECT 123,456) WHERE a=3; - SELECT *,'|' FROM t1 ORDER BY a; - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue8.test b/libsql-wal/tests/assets/fixtures/rowvalue8.test deleted file mode 100644 index 95355c751f..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue8.test +++ /dev/null @@ -1,38 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d); - INSERT INTO t1(a,b,c,d) VALUES - (1,1,2,3), - (2,2,3,4), - (3,1,2,4), - (4,2,3,5), - (5,3,4,6), - (6,4,5,9); - SELECT a, CASE (b,c) WHEN (1,2) THEN 'aleph' - WHEN (2,3) THEN 'bet' - WHEN (3,4) THEN 'gimel' - ELSE '-' END, - '|' - FROM t1 - ORDER BY a; - - - SELECT a, CASE (b,c,d) WHEN (1,2,3) THEN 'aleph' - WHEN (2,3,4) THEN 'bet' - WHEN (3,4,6) THEN 'gimel' - ELSE '-' END, - '|' - FROM t1 - ORDER BY a; - - - CREATE TABLE t2(x INTEGER PRIMARY KEY, y); - INSERT INTO t2(x,y) VALUES(1,6),(2,5),(3,4),(4,3),(5,2),(6,1); - SELECT x, CASE (SELECT b,c FROM t1 WHERE a=y) - WHEN (1,2) THEN 'aleph' - WHEN (2,3) THEN 'bet' - WHEN (3,4) THEN 'gimel' - ELSE '-' END, - '|' - FROM t2 - ORDER BY +x; - diff --git a/libsql-wal/tests/assets/fixtures/rowvalue9.test b/libsql-wal/tests/assets/fixtures/rowvalue9.test deleted file mode 100644 index e718592305..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalue9.test +++ /dev/null @@ -1,191 +0,0 @@ - - CREATE TABLE a1(c, b INTEGER, a TEXT, PRIMARY KEY(a, b)); - - INSERT INTO a1 (rowid, c, b, a) VALUES(3, '0x03', 1, 1); - INSERT INTO a1 (rowid, c, b, a) VALUES(14, '0x0E', 2, 2); - INSERT INTO a1 (rowid, c, b, a) VALUES(15, '0x0F', 3, 3); - INSERT INTO a1 (rowid, c, b, a) VALUES(92, '0x5C', 4, 4); - - CREATE TABLE a2(x BLOB, y BLOB); - INSERT INTO a2(x, y) VALUES(1, 1); - INSERT INTO a2(x, y) VALUES(2, '2'); - INSERT INTO a2(x, y) VALUES('3', 3); - INSERT INTO a2(x, y) VALUES('4', '4'); - - - SELECT x, typeof(x), y, typeof(y) FROM a2 ORDER BY rowid - - - SELECT (SELECT rowid FROM a1 WHERE a=x AND b=y) FROM a2 - - - SELECT (SELECT rowid FROM a1 WHERE (a, b) = (x, y)) FROM a2 - - - SELECT a1.rowid FROM a1, a2 WHERE a=x AND b=y; - - - SELECT a1.rowid FROM a1, a2 WHERE (a, b) = (x, y) - - - SELECT a1.rowid FROM a1, a2 WHERE coalesce(NULL,x)=a AND coalesce(NULL,y)=b - - - SELECT a1.rowid FROM a1, a2 - WHERE (coalesce(NULL,x), coalesce(NULL,y)) = (a, b) - - - SELECT a1.rowid FROM a1, a2 WHERE +x=a AND +y=b - - - SELECT a1.rowid FROM a1, a2 WHERE (+x, +y) = (a, b) - - - SELECT (SELECT rowid FROM a1 WHERE a=+x AND b=+y) FROM a2 - - - SELECT (SELECT rowid FROM a1 WHERE (a, b) = (+x, +y)) FROM a2 - - - SELECT (SELECT rowid FROM a1 WHERE (+x, +y) = (a, b)) FROM a2 - - - SELECT a1.rowid FROM a1 WHERE (a, b) IN (SELECT x, y FROM a2) - - - SELECT a1.rowid FROM a1, a2 WHERE EXISTS ( - SELECT 1 FROM a1 WHERE a=x AND b=y - ) - - - CREATE TABLE b1(a TEXT); - CREATE TABLE b2(x BLOB); - INSERT INTO b1 VALUES(1); - INSERT INTO b2 VALUES(1); - - SELECT * FROM b1, b2 WHERE a=x; - SELECT * FROM b1 WHERE a IN (SELECT x FROM b2) - CREATE UNIQUE INDEX b1a ON b1(a); - SELECT * FROM b1 WHERE a IN (SELECT x FROM b2) - - CREATE TABLE c1(a INTEGER, b TEXT); - INSERT INTO c1 VALUES(1, 1); - CREATE TABLE c2(x BLOB, y BLOB); - INSERT INTO c2 VALUES(1, 1); - - - SELECT * FROM c1 WHERE (a, b) IN (SELECT x, y FROM c2) - - - CREATE UNIQUE INDEX c1ab ON c1(a, b); - SELECT * FROM c1 WHERE (a, b) IN (SELECT x, y FROM c2) - - - SELECT * FROM c1 WHERE (a, +b) IN (SELECT x, y FROM c2) - - - SELECT c1.rowid FROM c1 WHERE b = (SELECT y FROM c2); - - - SELECT c1.rowid FROM c1 WHERE (a, b) = (SELECT x, y FROM c2); - - - CREATE TABLE d1(a TEXT, b INTEGER, c NUMERIC); - CREATE TABLE d2(x BLOB, y BLOB); - - INSERT INTO d1 VALUES(1, 1, 1); - INSERT INTO d1 VALUES(2, 2, 2); - INSERT INTO d1 VALUES(3, 3, 3); - INSERT INTO d1 VALUES(4, 4, 4); - - INSERT INTO d2 VALUES (1, 1); - INSERT INTO d2 VALUES (2, '2'); - INSERT INTO d2 VALUES ('3', 3); - INSERT INTO d2 VALUES ('4', '4'); - - - CREATE TABLE e1(a TEXT, c NUMERIC); - CREATE TABLE e2(x BLOB, y BLOB); - - INSERT INTO e1 VALUES(2, 2); - - INSERT INTO e2 VALUES ('2', 2); - INSERT INTO e2 VALUES ('2', '2'); - INSERT INTO e2 VALUES ('2', '2.0'); - - CREATE INDEX e1c ON e1(c); - - - SELECT rowid FROM e1 WHERE (a, c) IN (SELECT x, y FROM e2); - - - SELECT rowid FROM e2 WHERE rowid IN (SELECT +c FROM e1); - - - SELECT rowid FROM e2 WHERE rowid IN (SELECT 0+c FROM e1); - - - CREATE TABLE f1(a, b); - CREATE TABLE f2(c, d); - CREATE TABLE f3(e, f); - - - SELECT * FROM f3 WHERE (e, f) IN ( - SELECT a, b FROM f1 UNION ALL SELECT c, d FROM f2 - ); - - - CREATE INDEX f3e ON f3(e); - SELECT * FROM f3 WHERE (e, f) IN ( - SELECT a, b FROM f1 UNION ALL SELECT c, d FROM f2 - ); - - - CREATE TABLE g1(a, b); - INSERT INTO g1 VALUES - (1, 1), (1, 2), (1, 3), (1, 'i'), (1, 'j'), - (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), - (1, 4), (1, 5); - - CREATE TABLE g2(x, y); - CREATE INDEX g2x ON g2(x); - - INSERT INTO g2 VALUES(1, 4); - INSERT INTO g2 VALUES(1, 5); - - - SELECT * FROM g2 WHERE (x, y) IN ( - SELECT a, b FROM g1 ORDER BY +a, +b LIMIT 10 - ); - - - SELECT * FROM g2 WHERE (x, y) IN ( - SELECT a, b FROM g1 ORDER BY a, b LIMIT 10 - ); - - - SELECT * FROM g2 WHERE (x, y) IN ( - SELECT a, b FROM g1 ORDER BY 1, 2 LIMIT 10 - ); - - - CREATE TABLE t1(a ,b FLOAT); - CREATE INDEX t1x1 ON t1(a,b,a,a,a,a,a,a,a,a,a,b); - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 1), (1, 2), (2, 2), (2, 3), (3, 3), (3, 4), (4, 4); - - - SELECT * FROM t1 WHERE (a, b) IN ( (3, 3), (2, 2) ); - - - CREATE INDEX i1 ON t1(a); - - - SELECT * FROM t1 WHERE (a, b) IN ( (3, 3), (2, 2) ); - - - CREATE INDEX i2 ON t1(b, a); - SELECT * FROM t1 WHERE (a, b) IN ( (3, 3), (2, 2) ); - diff --git a/libsql-wal/tests/assets/fixtures/rowvalueA.test b/libsql-wal/tests/assets/fixtures/rowvalueA.test deleted file mode 100644 index 9b38724108..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvalueA.test +++ /dev/null @@ -1,18 +0,0 @@ - - SELECT (1, 2) IN ( (3, 4), (5, 6), (1, 3) ); - - - SELECT (1, 2) IN ( (3, 4), (5, 6), (1, 2) ); - - - SELECT (1, 2) IN ( (3, 2) ); - - - SELECT (1, 2) IN ( (1, 2) ); - - - SELECT (1, 2) IN ( ); - - - SELECT (1, 2) NOT IN ( ); - diff --git a/libsql-wal/tests/assets/fixtures/rowvaluefault.test b/libsql-wal/tests/assets/fixtures/rowvaluefault.test deleted file mode 100644 index 8c932af76d..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvaluefault.test +++ /dev/null @@ -1,9 +0,0 @@ - - CREATE TABLE xyz(one, two, thr, fou); - INSERT INTO xyz VALUES('A', 'A', 'A', 1); - INSERT INTO xyz VALUES('B', 'B', 'B', 2); - INSERT INTO xyz VALUES('C', 'C', 'C', 3); - INSERT INTO xyz VALUES('D', 'D', 'D', 4); - - CREATE UNIQUE INDEX xyz_one_two ON xyz(one, two); - diff --git a/libsql-wal/tests/assets/fixtures/rowvaluevtab.test b/libsql-wal/tests/assets/fixtures/rowvaluevtab.test deleted file mode 100644 index a2b1883053..0000000000 --- a/libsql-wal/tests/assets/fixtures/rowvaluevtab.test +++ /dev/null @@ -1,48 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE INDEX t1b ON t1(b); - INSERT INTO t1 VALUES('one', 1, 1); - INSERT INTO t1 VALUES('two', 1, 2); - INSERT INTO t1 VALUES('three', 1, 3); - INSERT INTO t1 VALUES('four', 2, 1); - INSERT INTO t1 VALUES('five', 2, 2); - INSERT INTO t1 VALUES('six', 2, 3); - INSERT INTO t1 VALUES('seven', 3, 1); - INSERT INTO t1 VALUES('eight', 3, 2); - INSERT INTO t1 VALUES('nine', 3, 3); - - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000 - ) INSERT INTO t1 SELECT NULL, NULL, NULL FROM s; - CREATE VIRTUAL TABLE e1 USING echo(t1); - - - SELECT a FROM e1 WHERE (b, c) = (2, 2) - - - SELECT a FROM e1 WHERE (b, c) > (2, 2) - - - SELECT a FROM e1 WHERE (b, c) >= (2, 2) - - - SELECT a FROM e1 WHERE (b, c) BETWEEN (1, 2) AND (2, 3) - - - SELECT a FROM e1 WHERE (b, c) IN ( VALUES(2, 2) ) - - - CREATE TABLE t2(a, b, c); - CREATE INDEX t2b ON t2(b); - INSERT INTO t2 VALUES('one', 1, 1); - INSERT INTO t2 VALUES('two', 1, 2); - INSERT INTO t2 VALUES('three', 1, 3); - - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000 - ) INSERT INTO t2 SELECT NULL, NULL, NULL FROM s; - CREATE VIRTUAL TABLE e2 USING echo_v2(t2); - - - SELECT a FROM e2 WHERE (b, c) IN ( VALUES(1, 3) ) - diff --git a/libsql-wal/tests/assets/fixtures/rtree.test b/libsql-wal/tests/assets/fixtures/rtree.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/savepoint.test b/libsql-wal/tests/assets/fixtures/savepoint.test deleted file mode 100644 index 62bbee71d7..0000000000 --- a/libsql-wal/tests/assets/fixtures/savepoint.test +++ /dev/null @@ -1,13 +0,0 @@ - - BEGIN; - CREATE TABLE t6(a, b); - INSERT INTO t6 VALUES(1, 2); - SAVEPOINT one; - INSERT INTO t6 VALUES(3, 4); - ROLLBACK TO one; - SELECT * FROM t6; - ROLLBACK; - - - CREATE TABLE t6(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/savepoint2.test b/libsql-wal/tests/assets/fixtures/savepoint2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/savepoint4.test b/libsql-wal/tests/assets/fixtures/savepoint4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/savepoint5.test b/libsql-wal/tests/assets/fixtures/savepoint5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/savepoint6.test b/libsql-wal/tests/assets/fixtures/savepoint6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/savepoint7.test b/libsql-wal/tests/assets/fixtures/savepoint7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/savepointfault.test b/libsql-wal/tests/assets/fixtures/savepointfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/scanstatus.test b/libsql-wal/tests/assets/fixtures/scanstatus.test deleted file mode 100644 index 4c0dec2aab..0000000000 --- a/libsql-wal/tests/assets/fixtures/scanstatus.test +++ /dev/null @@ -1,158 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t2 VALUES('a', 'b'); - INSERT INTO t2 VALUES('c', 'd'); - INSERT INTO t2 VALUES('e', 'f'); - - SELECT count(*) FROM t1, t2; - SELECT count(*) FROM t1, t2; - - ANALYZE; - SELECT count(*) FROM t1, t2; - - ANALYZE - - SELECT count(*) FROM t1, t2 WHERE t2.rowid>1; - - - SELECT count(*) FROM t1, t2 WHERE t2.rowid>1; - - - CREATE TABLE x1(i INTEGER PRIMARY KEY, j); - INSERT INTO x1 VALUES(1, 'one'); - INSERT INTO x1 VALUES(2, 'two'); - INSERT INTO x1 VALUES(3, 'three'); - INSERT INTO x1 VALUES(4, 'four'); - CREATE INDEX x1j ON x1(j); - - SELECT * FROM x1 WHERE i=2; - - - SELECT * FROM x1 WHERE j='two' - - - SELECT * FROM x1 WHERE j<'two' - - - SELECT * FROM x1 WHERE j>='two' - - - SELECT * FROM x1 WHERE j BETWEEN 'three' AND 'two' - - - CREATE TABLE x2(i INTEGER, j, k); - INSERT INTO x2 SELECT i, j, i || ' ' || j FROM x1; - CREATE INDEX x2j ON x2(j); - CREATE INDEX x2ij ON x2(i, j); - SELECT * FROM x2 WHERE j BETWEEN 'three' AND 'two' - - - SELECT * FROM x2 WHERE i=1 AND j='two' - - - SELECT * FROM x2 WHERE i=5 AND j='two' - - - SELECT * FROM x2 WHERE i=3 AND j='three' - - - CREATE TABLE a1(a, b, c, d); - CREATE INDEX a1a ON a1(a); - CREATE INDEX a1bc ON a1(b, c); - - WITH d(x) AS (SELECT 1 UNION ALL SELECT x+1 AS n FROM d WHERE n<=100) - INSERT INTO a1 SELECT x, x, x, x FROM d; - - - SELECT d FROM a1 WHERE (a=4 OR b=13) - - - SELECT count(*) FROM a1 WHERE (a BETWEEN 4 AND 12) OR (b BETWEEN 40 AND 60) - - - SELECT count(*) FROM a1 AS x, a1 AS y - WHERE (x.a BETWEEN 4 AND 12) AND (y.b BETWEEN 1 AND 10) - - - SELECT count(*) FROM a1 WHERE a IN (1, 5, 10, 15); - - - SELECT count(*) FROM a1 WHERE rowid IN (1, 5, 10, 15); - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(x PRIMARY KEY, y, z); - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - SELECT * FROM t2 WHERE x BETWEEN 20 AND 40; - END; - WITH d(x) AS (SELECT 1 UNION ALL SELECT x+1 AS n FROM d WHERE n<=100) - INSERT INTO t2 SELECT x, x*2, x*3 FROM d; - - - CREATE TABLE p1(x PRIMARY KEY); - INSERT INTO p1 VALUES(1), (2), (3), (4); - CREATE TABLE c1(y REFERENCES p1); - INSERT INTO c1 VALUES(1), (2), (3); - PRAGMA foreign_keys=on; - - - CREATE TABLE t1(a PRIMARY KEY, b, c); - INSERT INTO t1 VALUES(0, 1, 'a'); - INSERT INTO t1 VALUES(1, 0, 'b'); - INSERT INTO t1 VALUES(2, 1, 'c'); - INSERT INTO t1 VALUES(3, 0, 'd'); - INSERT INTO t1 VALUES(4, 1, 'e'); - INSERT INTO t1 VALUES(5, 0, 'a'); - INSERT INTO t1 VALUES(6, 1, 'b'); - INSERT INTO t1 VALUES(7, 0, 'c'); - INSERT INTO t1 VALUES(8, 1, 'd'); - INSERT INTO t1 VALUES(9, 0, 'e'); - CREATE INDEX t1bc ON t1(b, c); - - CREATE TABLE t2(x, y); - CREATE INDEX t2xy ON t2(x, y); - WITH data(i, x, y) AS ( - SELECT 0, 0, tochar(0) - UNION ALL - SELECT i+1, (i+1)%2, tochar(i+1) FROM data WHERE i<500 - ) INSERT INTO t2 SELECT x, y FROM data; - - CREATE TABLE t3(x, y); - INSERT INTO t3 SELECT * FROM t2; - - ANALYZE; - - - SELECT count(*) FROM t1 WHERE a IN (SELECT b FROM t1 AS ii) - - - SELECT count(*) FROM t1 WHERE a IN (0, 1) - - - SELECT count(*) FROM t2 WHERE y = 'j'; - - - SELECT count(*) FROM t1, t2 WHERE y = c; - - - SELECT count(*) FROM t1, t3 WHERE y = c; - - - CREATE VIRTUAL TABLE ft1 USING fts4; - INSERT INTO ft1 VALUES('a d c f g h e i f c'); - INSERT INTO ft1 VALUES('g c h b g b f f f g'); - INSERT INTO ft1 VALUES('h h c c h f a e d d'); - INSERT INTO ft1 VALUES('e j i j i e b c f g'); - INSERT INTO ft1 VALUES('g f b g j c h a d f'); - INSERT INTO ft1 VALUES('j i a e g f a i a c'); - INSERT INTO ft1 VALUES('f d g g j j c a h g'); - INSERT INTO ft1 VALUES('b d h a d j j j b i'); - INSERT INTO ft1 VALUES('j e a b j e c b c i'); - INSERT INTO ft1 VALUES('a d e f b j j c g d'); - - - SELECT count(*) FROM ft1 WHERE ft1 MATCH 'd' - diff --git a/libsql-wal/tests/assets/fixtures/scanstatus2.test b/libsql-wal/tests/assets/fixtures/scanstatus2.test deleted file mode 100644 index 9c0123893f..0000000000 --- a/libsql-wal/tests/assets/fixtures/scanstatus2.test +++ /dev/null @@ -1,48 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t2 VALUES('a', 'b'); - INSERT INTO t2 VALUES('c', 'd'); - INSERT INTO t2 VALUES('e', 'f'); - - - CREATE VIRTUAL TABLE ft USING fts5(a); - INSERT INTO ft VALUES('abc'); - INSERT INTO ft VALUES('def'); - INSERT INTO ft VALUES('ghi'); - - - CREATE TABLE x1(a, b); - CREATE TABLE x2(c, d); - - WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000) - INSERT INTO x1 SELECT i, i FROM s; - INSERT INTO x2 SELECT a, b FROM x1; - - - CREATE TABLE rt1 (id INTEGER PRIMARY KEY, x1, x2); - CREATE TABLE rt2 (id, x1, x2); - - - CREATE TABLE t1(x, y); - CREATE TRIGGER tr1 AFTER DELETE ON t1 BEGIN - SELECT 1; - END; - INSERT INTO t1 VALUES(1, 2); - - - DELETE FROM t1 WHERE x=1; - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t1 VALUES(3, 'three'); - INSERT INTO t1 VALUES(4, 'four'); - INSERT INTO t1 VALUES(5, 'five'); - INSERT INTO t1 VALUES(6, 'six'); - INSERT INTO t1 VALUES(7, 'seven'); - INSERT INTO t1 VALUES(8, 'eight'); - diff --git a/libsql-wal/tests/assets/fixtures/schema.test b/libsql-wal/tests/assets/fixtures/schema.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/schema2.test b/libsql-wal/tests/assets/fixtures/schema2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/schema3.test b/libsql-wal/tests/assets/fixtures/schema3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/schema4.test b/libsql-wal/tests/assets/fixtures/schema4.test deleted file mode 100644 index eaf9c15929..0000000000 --- a/libsql-wal/tests/assets/fixtures/schema4.test +++ /dev/null @@ -1,116 +0,0 @@ - - CREATE TABLE log(x, a, b); - CREATE TABLE tbl(a, b); - - CREATE TABLE t1(a, b); - CREATE VIEW v1 AS SELECT * FROM tbl; - CREATE INDEX i1 ON tbl(a); - - - CREATE TRIGGER t1 AFTER INSERT ON tbl BEGIN - INSERT INTO log VALUES('after insert', new.a, new.b); - END; - CREATE TRIGGER v1 AFTER UPDATE ON tbl BEGIN - INSERT INTO log VALUES('after update', new.a, new.b); - END; - CREATE TRIGGER i1 AFTER DELETE ON tbl BEGIN - INSERT INTO log VALUES('after delete', old.a, old.b); - END; - - - INSERT INTO tbl VALUES(1, 2); - UPDATE tbl SET b=a+b, a=a+1; - DELETE FROM tbl; - - SELECT x, a, b FROM log; - - - DELETE FROM log; - - DROP INDEX i1; - DROP TABLE t1; - DROP VIEW v1; - - INSERT INTO tbl VALUES(1, 2); - UPDATE tbl SET b=a+b, a=a+1; - DELETE FROM tbl; - - SELECT x, a, b FROM log; - - - DELETE FROM log; - INSERT INTO tbl VALUES(1, 2); - UPDATE tbl SET b=a+b, a=a+1; - DELETE FROM tbl; - SELECT x, a, b FROM log; - - - CREATE TABLE t1(a, b); - CREATE VIEW v1 AS SELECT * FROM tbl; - CREATE INDEX i1 ON tbl(a); - - - DROP TABLE t1; - CREATE VIRTUAL TABLE t1 USING fts3; - - - DELETE FROM log; - DROP TABLE t1; - INSERT INTO tbl VALUES(1, 2); - UPDATE tbl SET b=a+b, a=a+1; - DELETE FROM tbl; - SELECT x, a, b FROM log; - - - CREATE TABLE log(x, a, b); - CREATE TABLE tbl(a, b); - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - - - CREATE TRIGGER t1 AFTER INSERT ON tbl BEGIN - INSERT INTO log VALUES('after insert', new.a, new.b); - END; - CREATE TRIGGER i1 AFTER DELETE ON tbl BEGIN - INSERT INTO log VALUES('after delete', old.a, old.b); - END; - - ALTER TABLE t1 RENAME TO t2 - - INSERT INTO tbl VALUES('a', 'b'); - DELETE FROM tbl; - SELECT * FROM log; - - - DELETE FROM log; - INSERT INTO tbl VALUES('c', 'd'); - DELETE FROM tbl; - SELECT * FROM log; - - - CREATE TEMP TRIGGER x1 AFTER UPDATE ON tbl BEGIN - INSERT INTO log VALUES('after update', new.a, new.b); - END; - - CREATE TEMP TABLE x1(x); - INSERT INTO x1 VALUES(123); - - - select sql from temp.sqlite_master WHERE type='table'; - - ALTER TABLE tbl RENAME TO tbl2 - - select sql from sqlite_temp_master WHERE type='table'; - - - DELETE FROM log; - INSERT INTO tbl2 VALUES('e', 'f'); - UPDATE tbl2 SET a='g', b='h'; - DELETE FROM tbl2; - SELECT * FROM log; - - - INSERT INTO x1 VALUES(456); - SELECT * FROM x1 - diff --git a/libsql-wal/tests/assets/fixtures/schema5.test b/libsql-wal/tests/assets/fixtures/schema5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/schema6.test b/libsql-wal/tests/assets/fixtures/schema6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/schemafault.test b/libsql-wal/tests/assets/fixtures/schemafault.test deleted file mode 100644 index 103a28b44d..0000000000 --- a/libsql-wal/tests/assets/fixtures/schemafault.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t2(aaa INTTT); - CREATE VIEW v2(xxx , yyy) AS SELECT aaa, aaa+1 FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/securedel.test b/libsql-wal/tests/assets/fixtures/securedel.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/securedel2.test b/libsql-wal/tests/assets/fixtures/securedel2.test deleted file mode 100644 index 2c6da94035..0000000000 --- a/libsql-wal/tests/assets/fixtures/securedel2.test +++ /dev/null @@ -1,5 +0,0 @@ - PRAGMA secure_delete = 0 - DELETE FROM t1 WHERE rowid = 1 - PRAGMA secure_delete = 1 - DELETE FROM t1 WHERE rowid = 1 - DELETE FROM t1 WHERE rowid>850 diff --git a/libsql-wal/tests/assets/fixtures/seekscan1.test b/libsql-wal/tests/assets/fixtures/seekscan1.test deleted file mode 100644 index 3c95554b62..0000000000 --- a/libsql-wal/tests/assets/fixtures/seekscan1.test +++ /dev/null @@ -1,31 +0,0 @@ - - CREATE TABLE t1(a TEXT, b INT, c INT NOT NULL, PRIMARY KEY(a,b,c)); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<1997) - INSERT INTO t1(a,b,c) SELECT printf('xyz%d',x/10),x/6,x FROM c; - INSERT INTO t1 VALUES('abc',234,6); - INSERT INTO t1 VALUES('abc',345,7); - ANALYZE; - - - SELECT a,b,c FROM t1 - WHERE b IN (234, 345) AND c BETWEEN 6 AND 6.5 AND a='abc' - ORDER BY a, b; - - - SELECT a,b,c FROM t1 - WHERE b IN (234, 345) AND c BETWEEN 6 AND 7 AND a='abc' - ORDER BY a, b; - - - SELECT a,b,c FROM t1 - WHERE b IN (234, 345) AND c >=6 AND a='abc' - ORDER BY a, b; - - - SELECT a,b,c FROM t1 - WHERE b IN (234, 345) AND c<=7 AND a='abc' - ORDER BY a, b; - - - SELECT a,b,c FROM t1 WHERE b IN (235, 345) AND c<=3 AND a='abc' ORDER BY a, b; - diff --git a/libsql-wal/tests/assets/fixtures/select1.test b/libsql-wal/tests/assets/fixtures/select1.test deleted file mode 100644 index 9c965e686e..0000000000 --- a/libsql-wal/tests/assets/fixtures/select1.test +++ /dev/null @@ -1,100 +0,0 @@ - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(x); INSERT INTO t1 VALUES(1); - CREATE TABLE t2(y,z); INSERT INTO t2 VALUES(2,3); - CREATE INDEX t2y ON t2(y); - SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z); - - - SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z LIMIT 4); - - - SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 - UNION ALL SELECT * FROM t2 WHERE y=3 ORDER BY y,z LIMIT 4); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(c); - CREATE TABLE t2(x PRIMARY KEY, y); - INSERT INTO t1(c) VALUES(123); - INSERT INTO t2(x) VALUES(123); - SELECT x FROM t2, t1 WHERE x BETWEEN c AND null OR x AND - x IN ((SELECT x FROM (SELECT x FROM t2, t1 - WHERE x BETWEEN (SELECT x FROM (SELECT x COLLATE rtrim - FROM t2, t1 WHERE x BETWEEN c AND null - OR x AND x IN (c)), t1 WHERE x BETWEEN c AND null - OR x AND x IN (c)) AND null - OR NOT EXISTS(SELECT -4.81 FROM t1, t2 WHERE x BETWEEN c AND null - OR x AND x IN ((SELECT x FROM (SELECT x FROM t2, t1 - WHERE x BETWEEN (SELECT x FROM (SELECT x BETWEEN c AND null - OR x AND x IN (c)), t1 WHERE x BETWEEN c AND null - OR x AND x IN (c)) AND null - OR x AND x IN (c)), t1 WHERE x BETWEEN c AND null - OR x AND x IN (c)))) AND x IN (c) - ), t1 WHERE x BETWEEN c AND null - OR x AND x IN (c))); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(c); - CREATE TABLE t2(x PRIMARY KEY, y); - INSERT INTO t1(c) VALUES(123); - INSERT INTO t2(x) VALUES(123); - SELECT x FROM t2, t1 WHERE x BETWEEN c AND (c+1) OR x AND - x IN ((SELECT x FROM (SELECT x FROM t2, t1 - WHERE x BETWEEN (SELECT x FROM (SELECT x COLLATE rtrim - FROM t2, t1 WHERE x BETWEEN c AND (c+1) - OR x AND x IN (c)), t1 WHERE x BETWEEN c AND (c+1) - OR x AND x IN (c)) AND (c+1) - OR NOT EXISTS(SELECT -4.81 FROM t1, t2 WHERE x BETWEEN c AND (c+1) - OR x AND x IN ((SELECT x FROM (SELECT x FROM t2, t1 - WHERE x BETWEEN (SELECT x FROM (SELECT x BETWEEN c AND (c+1) - OR x AND x IN (c)), t1 WHERE x BETWEEN c AND (c+1) - OR x AND x IN (c)) AND (c+1) - OR x AND x IN (c)), t1 WHERE x BETWEEN c AND (c+1) - OR x AND x IN (c)))) AND x IN (c) - ), t1 WHERE x BETWEEN c AND (c+1) - OR x AND x IN (c))); - - - SELECT 1 FROM t1 WHERE ( - SELECT 2 FROM t2 WHERE ( - SELECT 3 FROM ( - SELECT x FROM t2 WHERE x=c OR x=(SELECT x FROM (VALUES(0))) - ) WHERE x>c OR x=c - ) - ); - - - SELECT 1 FROM t1, t2 WHERE ( - SELECT 3 FROM ( - SELECT x FROM t2 WHERE x=c OR x=(SELECT x FROM (VALUES(0))) - ) WHERE x>c OR x=c - ); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - - - CREATE TABLE t1 ( - a INTEGER PRIMARY KEY, - b AS('Y') UNIQUE - ); - INSERT INTO t1(a) VALUES (10); - SELECT * FROM t1 JOIN t1 USING(a,b) - WHERE ((SELECT t1.a FROM t1 AS x GROUP BY b) AND b=0) - OR a = 10; - - - SELECT ifnull(a, max((SELECT 123))), count(a) FROM t1 ; - - - CREATE TABLE t1(a IMTEGES PRIMARY KEY,R); - CREATE TABLE t2(x UNIQUE); - CREATE VIEW v1a(z,y) AS SELECT x IS NULL, x FROM t2; - SELECT a,(+a)b,(+a)b,(+a)b,NOT EXISTS(SELECT null FROM t2),CASE z WHEN 487 THEN 992 WHEN 391 THEN 203 WHEN 10 THEN '?k=4 - - - SELECT count(*) FROM t1 HAVING log>=4 - - - SELECT count(*) FROM t1 HAVING log!=400 - - - CREATE TABLE t0(c0 REAL, c1 REAL GENERATED ALWAYS AS (c0)); - INSERT INTO t0(c0) VALUES (1); - SELECT * FROM t0 GROUP BY c0; - - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - SELECT max(t1.a), - (SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1) - FROM t1; - - - CREATE TABLE t1(a); - CREATE TABLE t2(x); - - - SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; - - - INSERT INTO t1 VALUES(1), (1), (2), (3); - SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; - - - INSERT INTO t2 VALUES(45); - SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; - - - INSERT INTO t2 VALUES(210); - SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; - - - INSERT INTO t2 VALUES(NULL); - SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; - - - DELETE FROM t2; - DELETE FROM t1; - INSERT INTO t1 VALUES('value'); - INSERT INTO t2 VALUES('hello'); - - - SELECT group_concat(x), m FROM t1 - LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; - - - SELECT group_concat(x), m, n FROM t1 - LEFT JOIN (SELECT x, 59 AS m, 60 AS n FROM t2) GROUP BY a; - diff --git a/libsql-wal/tests/assets/fixtures/select4.test b/libsql-wal/tests/assets/fixtures/select4.test deleted file mode 100644 index 8cc9d64a1a..0000000000 --- a/libsql-wal/tests/assets/fixtures/select4.test +++ /dev/null @@ -1,142 +0,0 @@ - - SELECT 123 AS x ORDER BY (SELECT x ORDER BY 1); - - - CREATE TABLE t14(a,b,c); - INSERT INTO t14 VALUES(1,2,3),(4,5,6); - SELECT * FROM t14 INTERSECT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); - - - SELECT * FROM t14 INTERSECT VALUES(1,2,3); - - - SELECT * FROM t14 - UNION VALUES(3,2,1),(2,3,1),(1,2,3),(7,8,9),(4,5,6) - UNION SELECT * FROM t14 ORDER BY 1, 2, 3 - - - SELECT * FROM t14 - UNION VALUES(3,2,1) - UNION SELECT * FROM t14 ORDER BY 1, 2, 3 - - - SELECT * FROM t14 EXCEPT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); - - - SELECT * FROM t14 EXCEPT VALUES(1,2,3) - - - SELECT * FROM t14 EXCEPT VALUES(1,2,3) EXCEPT VALUES(4,5,6) - - - SELECT * FROM t14 EXCEPT VALUES('a','b','c') EXCEPT VALUES(4,5,6) - - - SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); - - - SELECT (VALUES(1),(2),(3),(4)) - - - SELECT (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) - - - VALUES(1) UNION VALUES(2); - - - VALUES(1),(2),(3) EXCEPT VALUES(2); - - - VALUES(1),(2),(3) EXCEPT VALUES(1),(3); - - - SELECT * FROM (SELECT 123), (SELECT 456) ON likely(0 OR 1) OR 0; - - - VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 99; - - - VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 3; - - - DROP TABLE IF EXISTS tx; - CREATE TABLE tx(id INTEGER PRIMARY KEY, a, b); - INSERT INTO tx(a,b) VALUES(33,456); - INSERT INTO tx(a,b) VALUES(33,789); - - SELECT DISTINCT t0.id, t0.a, t0.b - FROM tx AS t0, tx AS t1 - WHERE t0.a=t1.a AND t1.a=33 AND t0.b=456 - UNION - SELECT DISTINCT t0.id, t0.a, t0.b - FROM tx AS t0, tx AS t1 - WHERE t0.a=t1.a AND t1.a=33 AND t0.b=789 - ORDER BY 1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, - PRIMARY KEY(a,b DESC)) WITHOUT ROWID; - - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t1(a,b,c,d) - SELECT x%10, x/10, x, printf('xyz%dabc',x) FROM c; - - SELECT t3.c FROM - (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 - JOIN t1 AS t3 - WHERE t2.a=t3.a AND t2.m=t3.b - ORDER BY t3.a; - - - SELECT t3.c FROM - (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 - CROSS JOIN t1 AS t3 - WHERE t2.a=t3.a AND t2.m=t3.b - ORDER BY t3.a; - - - SELECT t3.c FROM - (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 - LEFT JOIN t1 AS t3 - WHERE t2.a=t3.a AND t2.m=t3.b - ORDER BY t3.a; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a int, b int); - INSERT INTO t1 VALUES(1,2),(1,18),(2,19); - SELECT x, y FROM ( - SELECT 98 AS x, 99 AS y - UNION - SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a - ) AS w WHERE y>=20 - ORDER BY +x; - - - SELECT x, y FROM ( - SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a - UNION - SELECT 98 AS x, 99 AS y - ) AS w WHERE y>=20 - ORDER BY +x; - - - CREATE VIEW v0(v0) AS WITH v0 AS(SELECT 0 v0) SELECT(SELECT min(v0) OVER()) FROM v0 GROUP BY v0; - SELECT *FROM v0 v1 JOIN v0 USING(v0) WHERE datetime(v0) = (v0.v0)AND v0 = 10; - - - CREATE VIEW t1(aa) AS - WITH t2(bb) AS (SELECT 123) - SELECT (SELECT min(bb) OVER()) FROM t2 GROUP BY bb; - SELECT * FROM t1; - - - SELECT * FROM t1 AS z1 JOIN t1 AS z2 USING(aa) - WHERE abs(z1.aa)=z2.aa AND z1.aa=123; - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(99); - SELECT sum((SELECT 1 FROM (SELECT 2 WHERE x IS NULL) WHERE 0)) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/select5.test b/libsql-wal/tests/assets/fixtures/select5.test deleted file mode 100644 index a37d3f6ba9..0000000000 --- a/libsql-wal/tests/assets/fixtures/select5.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1(a INT, b INT); - INSERT INTO t1(a,b) VALUES(1,null),(null,null),(1,null); - CREATE UNIQUE INDEX t1b ON t1(abs(b)); - SELECT quote(a), quote(b), '|' FROM t1 GROUP BY a, abs(b); - diff --git a/libsql-wal/tests/assets/fixtures/select6.test b/libsql-wal/tests/assets/fixtures/select6.test deleted file mode 100644 index febb8172ef..0000000000 --- a/libsql-wal/tests/assets/fixtures/select6.test +++ /dev/null @@ -1,71 +0,0 @@ - - CREATE TABLE t(i,j,k); - CREATE TABLE j(l,m); - CREATE TABLE k(o); - - - SELECT * FROM (SELECT * FROM t), j; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(w INT, x INT); - INSERT INTO t1(w,x) - VALUES(1,10),(2,20),(3,30), - (2,21),(3,31), - (3,32); - CREATE INDEX t1wx ON t1(w,x); - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(w INT, y VARCHAR(8)); - INSERT INTO t2(w,y) VALUES(1,'one'),(2,'two'),(3,'three'),(4,'four'); - CREATE INDEX t2wy ON t2(w,y); - - SELECT cnt, xyz, (SELECT y FROM t2 WHERE w=cnt), '|' - FROM (SELECT count(*) AS cnt, w AS xyz FROM t1 GROUP BY 2) - ORDER BY cnt, xyz; - - - SELECT cnt, xyz, lower((SELECT y FROM t2 WHERE w=cnt)), '|' - FROM (SELECT count(*) AS cnt, w AS xyz FROM t1 GROUP BY 2) - ORDER BY cnt, xyz; - - - SELECT cnt, xyz, '|' - FROM (SELECT count(*) AS cnt, w AS xyz FROM t1 GROUP BY 2) - WHERE (SELECT y FROM t2 WHERE w=cnt)!='two' - ORDER BY cnt, xyz; - - - SELECT cnt, xyz, '|' - FROM (SELECT count(*) AS cnt, w AS xyz FROM t1 GROUP BY 2) - ORDER BY lower((SELECT y FROM t2 WHERE w=cnt)); - - - SELECT cnt, xyz, - CASE WHEN (SELECT y FROM t2 WHERE w=cnt)=='two' - THEN 'aaa' ELSE 'bbb' - END, '|' - FROM (SELECT count(*) AS cnt, w AS xyz FROM t1 GROUP BY 2) - ORDER BY +cnt; - - - DROP TABLE t1; - DROP TABLE t2; - CREATE TABLE t1(x); - CREATE TABLE t2(y, z); - SELECT ( SELECT y FROM t2 WHERE z = cnt ) - FROM ( SELECT count(*) AS cnt FROM t1 ); - - - DROP TABLE t1; - DROP TABLE t2; - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - CREATE TABLE t2(b); - INSERT INTO t2 VALUES(3); - SELECT * FROM ( - SELECT * FROM (SELECT * FROM t1 LIMIT 1) - UNION ALL - SELECT * from t2); - diff --git a/libsql-wal/tests/assets/fixtures/select7.test b/libsql-wal/tests/assets/fixtures/select7.test deleted file mode 100644 index c90db050d5..0000000000 --- a/libsql-wal/tests/assets/fixtures/select7.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t01(x, y); - CREATE TABLE t02(x, y); - diff --git a/libsql-wal/tests/assets/fixtures/select8.test b/libsql-wal/tests/assets/fixtures/select8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/select9.test b/libsql-wal/tests/assets/fixtures/select9.test deleted file mode 100644 index a042237b86..0000000000 --- a/libsql-wal/tests/assets/fixtures/select9.test +++ /dev/null @@ -1,13 +0,0 @@ - - CREATE TABLE t61(a); - CREATE TABLE t62(b); - INSERT INTO t61 VALUES(111); - INSERT INTO t62 VALUES(222); - SELECT a FROM t61 WHERE 0 UNION SELECT b FROM t62; - - - SELECT a FROM t61 WHERE 0 UNION ALL SELECT b FROM t62; - - - SELECT a FROM t61 UNION SELECT b FROM t62 WHERE 0; - diff --git a/libsql-wal/tests/assets/fixtures/selectA.test b/libsql-wal/tests/assets/fixtures/selectA.test deleted file mode 100644 index a0dbe80177..0000000000 --- a/libsql-wal/tests/assets/fixtures/selectA.test +++ /dev/null @@ -1,111 +0,0 @@ - - WITH RECURSIVE - xyz(n) AS ( - SELECT upper((SELECT x FROM ( - SELECT x,y,z FROM t2 - INTERSECT SELECT a,b,c FROM t3 - EXCEPT SELECT c,b,a FROM t1 - UNION SELECT a,b,c FROM t3 - INTERSECT SELECT a,b,c FROM t3 - EXCEPT SELECT c,b,a FROM t1 - UNION SELECT a,b,c FROM t3 - ORDER BY y COLLATE NOCASE DESC,x,z))) - UNION ALL - SELECT n || '+' FROM xyz WHERE length(n)<5 - ) - SELECT n FROM xyz ORDER BY +n; - - - CREATE TABLE t4(a, b); - CREATE TABLE t5(c, d); - - INSERT INTO t5 VALUES(1, 'x'); - INSERT INTO t5 VALUES(2, 'x'); - INSERT INTO t4 VALUES(3, 'x'); - INSERT INTO t4 VALUES(4, 'x'); - - CREATE INDEX i1 ON t4(a); - CREATE INDEX i2 ON t5(c); - - - SELECT c, d FROM t5 - UNION ALL - SELECT a, b FROM t4 WHERE f()==f() - ORDER BY 1,2 - - - CREATE TABLE t6(a, b); - CREATE TABLE t7(c, d); - - INSERT INTO t7 VALUES(2, 9); - INSERT INTO t6 VALUES(3, 0); - INSERT INTO t6 VALUES(4, 1); - INSERT INTO t7 VALUES(5, 6); - INSERT INTO t6 VALUES(6, 0); - INSERT INTO t7 VALUES(7, 6); - - CREATE INDEX i6 ON t6(a); - CREATE INDEX i7 ON t7(c); - - - SELECT c, f(d,c,d,c,d) FROM t7 - UNION ALL - SELECT a, b FROM t6 - ORDER BY 1,2 - - - CREATE TABLE t8(a, b); - CREATE TABLE t9(c, d); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a INTEGER); - CREATE TABLE t2(b TEXT); - INSERT INTO t2(b) VALUES('12345'); - SELECT * FROM (SELECT a FROM t1 UNION SELECT b FROM t2) WHERE a=a; - - - CREATE TABLE t1(c1); INSERT INTO t1 VALUES(12),(123),(1234),(NULL),('abc'); - CREATE TABLE t2(c2); INSERT INTO t2 VALUES(44),(55),(123); - CREATE TABLE t3(c3,c4); INSERT INTO t3 VALUES(66,1),(123,2),(77,3); - CREATE VIEW t4 AS SELECT c3 FROM t3; - CREATE VIEW t5 AS SELECT c3 FROM t3 ORDER BY c4; - - - SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t4) AND c1=123; - - - SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t5) AND c1=123; - - - CREATE TABLE a(b); - CREATE VIEW c(d) AS SELECT b FROM a ORDER BY b; - SELECT sum(d) OVER( PARTITION BY(SELECT 0 FROM c JOIN a WHERE b =(SELECT b INTERSECT SELECT d FROM c) AND b = 123)) FROM c; - - - CREATE TABLE x1(x); - CREATE TABLE t1(a, b, c, d); - CREATE INDEX t1a ON t1(a); - CREATE INDEX t1b ON t1(b); - - - SELECT 'ABCD' FROM t1 - WHERE (a=? OR b=?) - AND (0 OR (SELECT 'xyz' INTERSECT SELECT a ORDER BY 1)) - - - CREATE TABLE t1(a COLLATE nocase); - CREATE TABLE t2(b COLLATE nocase); - - INSERT INTO t1 VALUES('ABC'); - INSERT INTO t2 VALUES('abc'); - - - SELECT a FROM t1 INTERSECT SELECT b FROM t2; - - - SELECT * FROM ( - SELECT a FROM t1 INTERSECT SELECT b FROM t2 - ) WHERE a||'' = 'ABC'; - diff --git a/libsql-wal/tests/assets/fixtures/selectB.test b/libsql-wal/tests/assets/fixtures/selectB.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/selectC.test b/libsql-wal/tests/assets/fixtures/selectC.test deleted file mode 100644 index 18462c2fe5..0000000000 --- a/libsql-wal/tests/assets/fixtures/selectC.test +++ /dev/null @@ -1,39 +0,0 @@ - - create table t_distinct_bug (a, b, c); - insert into t_distinct_bug values ('1', '1', 'a'); - insert into t_distinct_bug values ('1', '2', 'b'); - insert into t_distinct_bug values ('1', '3', 'c'); - insert into t_distinct_bug values ('1', '1', 'd'); - insert into t_distinct_bug values ('1', '2', 'e'); - insert into t_distinct_bug values ('1', '3', 'f'); - - - select a from (select distinct a, b from t_distinct_bug) - - - CREATE VIEW v42b AS SELECT DISTINCT a, b FROM t_distinct_bug; - SELECT a FROM v42b; - - - select a, udf() from (select distinct a, b from t_distinct_bug) - - - CREATE TABLE x1(a); - CREATE TABLE x2(b); - CREATE TABLE x3(c); - CREATE VIEW vvv AS SELECT b FROM x2 ORDER BY 1; - - INSERT INTO x1 VALUES('a'), ('b'); - INSERT INTO x2 VALUES(22), (23), (25), (24), (21); - INSERT INTO x3 VALUES(302), (303), (301); - - - CREATE TABLE x4 AS SELECT b FROM vvv UNION ALL SELECT c from x3; - SELECT * FROM x4; - - - SELECT * FROM x1, x4 - - - SELECT * FROM x1, (SELECT b FROM vvv UNION ALL SELECT c from x3) ORDER BY 1,2; - diff --git a/libsql-wal/tests/assets/fixtures/selectD.test b/libsql-wal/tests/assets/fixtures/selectD.test deleted file mode 100644 index f994461341..0000000000 --- a/libsql-wal/tests/assets/fixtures/selectD.test +++ /dev/null @@ -1,13 +0,0 @@ - - CREATE TABLE t41(a INTEGER PRIMARY KEY, b INTEGER); - CREATE TABLE t42(d INTEGER PRIMARY KEY, e INTEGER); - CREATE TABLE t43(f INTEGER PRIMARY KEY, g INTEGER); - EXPLAIN QUERY PLAN - SELECT * - FROM t41 - LEFT JOIN (SELECT count(*) AS cnt, x1.d - FROM (t42 INNER JOIN t43 ON d=g) AS x1 - WHERE x1.d>5 - GROUP BY x1.d) AS x2 - ON t41.b=x2.d; - diff --git a/libsql-wal/tests/assets/fixtures/selectE.test b/libsql-wal/tests/assets/fixtures/selectE.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/selectF.test b/libsql-wal/tests/assets/fixtures/selectF.test deleted file mode 100644 index e3459ffa22..0000000000 --- a/libsql-wal/tests/assets/fixtures/selectF.test +++ /dev/null @@ -1,17 +0,0 @@ - - BEGIN TRANSACTION; - CREATE TABLE t1(a, b, c); - INSERT INTO "t1" VALUES(1,'one','I'); - CREATE TABLE t2(d, e, f); - INSERT INTO "t2" VALUES(5,'ten','XX'); - INSERT INTO "t2" VALUES(6,NULL,NULL); - - CREATE INDEX i1 ON t1(b, a); - COMMIT; - - - SELECT * FROM t2 - UNION ALL - SELECT * FROM t1 WHERE a<5 - ORDER BY 2, 1 - diff --git a/libsql-wal/tests/assets/fixtures/selectG.test b/libsql-wal/tests/assets/fixtures/selectG.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/selectH.test b/libsql-wal/tests/assets/fixtures/selectH.test deleted file mode 100644 index 1b7137fd96..0000000000 --- a/libsql-wal/tests/assets/fixtures/selectH.test +++ /dev/null @@ -1,81 +0,0 @@ - - CREATE TABLE t1( - c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, - c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, - c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, - c30, c31, c32, c33, c34, c35, c36, c37, c38, c39, - c40, c41, c42, c43, c44, c45, c46, c47, c48, c49, - c50, c51, c52, c53, c54, c55, c56, c57, c58, c59, - c60, c61, c62, c63, c64, c65 - ); - INSERT INTO t1 VALUES( - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65 - ); - CREATE INDEX t1c60 ON t1(c60); - - - SELECT DISTINCT c44 FROM ( - SELECT c0 AS a, *, counter(1) FROM t1 - UNION ALL - SELECT c1 AS a, *, counter(1) FROM t1 - ) WHERE c60=60; - - - SELECT a FROM ( - SELECT counter(1) AS cnt, c15 AS a, *, c62 AS b FROM t1 - UNION ALL - SELECT counter(1) AS cnt, c16 AS a, *, c61 AS b FROM t1 - ORDER BY b - ); - - - CREATE VIEW v1 AS - SELECT c16 AS a, *, counter(1) AS x FROM t1 - UNION ALL - SELECT c17 AS a, *, counter(1) AS x FROM t1 - UNION ALL - SELECT c18 AS a, *, counter(1) AS x FROM t1 - UNION ALL - SELECT c19 AS a, *, counter(1) AS x FROM t1; - SELECT count(*) FROM v1 WHERE c60=60; - - - SELECT count(a) FROM v1 WHERE c60=60; - - - SELECT a FROM v1 WHERE c60=60; - - - SELECT x FROM v1 WHERE c60=60; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - SELECT 1 FROM (SELECT DISTINCT name COLLATE rtrim FROM sqlite_schema - UNION ALL SELECT a FROM t1); - - - SELECT DISTINCT name COLLATE rtrim FROM sqlite_schema - UNION ALL - SELECT a FROM t1 - - - CREATE TABLE t1 (val1); - INSERT INTO t1 VALUES(4); - INSERT INTO t1 VALUES(5); - CREATE TABLE t2 (val2); - - - SELECT DISTINCT val1 FROM t1 UNION ALL SELECT val2 FROM t2; - - - SELECT count(1234) FROM ( - SELECT DISTINCT val1 FROM t1 UNION ALL SELECT val2 FROM t2 - ) - diff --git a/libsql-wal/tests/assets/fixtures/session.test b/libsql-wal/tests/assets/fixtures/session.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared.test b/libsql-wal/tests/assets/fixtures/shared.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared2.test b/libsql-wal/tests/assets/fixtures/shared2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared3.test b/libsql-wal/tests/assets/fixtures/shared3.test deleted file mode 100644 index a5c798027f..0000000000 --- a/libsql-wal/tests/assets/fixtures/shared3.test +++ /dev/null @@ -1,17 +0,0 @@ - - PRAGMA auto_vacuum = 2; - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(randomblob(500), randomblob(500)); - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - INSERT INTO t1 SELECT randomblob(500), randomblob(500) FROM t1; - - - BEGIN; - DELETE FROM t1 WHERE 1; - PRAGMA incremental_vacuum; - diff --git a/libsql-wal/tests/assets/fixtures/shared4.test b/libsql-wal/tests/assets/fixtures/shared4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared6.test b/libsql-wal/tests/assets/fixtures/shared6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared7.test b/libsql-wal/tests/assets/fixtures/shared7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared8.test b/libsql-wal/tests/assets/fixtures/shared8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared9.test b/libsql-wal/tests/assets/fixtures/shared9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sharedA.test b/libsql-wal/tests/assets/fixtures/sharedA.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sharedB.test b/libsql-wal/tests/assets/fixtures/sharedB.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shared_err.test b/libsql-wal/tests/assets/fixtures/shared_err.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sharedlock.test b/libsql-wal/tests/assets/fixtures/sharedlock.test deleted file mode 100644 index 66d731b4cb..0000000000 --- a/libsql-wal/tests/assets/fixtures/sharedlock.test +++ /dev/null @@ -1,6 +0,0 @@ - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x, y); - INSERT INTO t2 VALUES(1, 2); - INSERT INTO t2 VALUES(3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/shell1.test b/libsql-wal/tests/assets/fixtures/shell1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shell2.test b/libsql-wal/tests/assets/fixtures/shell2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shell3.test b/libsql-wal/tests/assets/fixtures/shell3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shell4.test b/libsql-wal/tests/assets/fixtures/shell4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shell5.test b/libsql-wal/tests/assets/fixtures/shell5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shell6.test b/libsql-wal/tests/assets/fixtures/shell6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shell7.test b/libsql-wal/tests/assets/fixtures/shell7.test deleted file mode 100644 index 508540cb0b..0000000000 --- a/libsql-wal/tests/assets/fixtures/shell7.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE f1(tn INTEGER PRIMARY KEY, x BLOB); - CREATE TABLE f2(tn INTEGER PRIMARY KEY, x BLOB); - - INSERT INTO f1 VALUES(1, X'01020304'); - INSERT INTO f1 VALUES(2, X'01000304'); - INSERT INTO f1 VALUES(3, randomblob(200)); - diff --git a/libsql-wal/tests/assets/fixtures/shell8.test b/libsql-wal/tests/assets/fixtures/shell8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shmlock.test b/libsql-wal/tests/assets/fixtures/shmlock.test deleted file mode 100644 index 4b96c86d0d..0000000000 --- a/libsql-wal/tests/assets/fixtures/shmlock.test +++ /dev/null @@ -1,5 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - diff --git a/libsql-wal/tests/assets/fixtures/shortread1.test b/libsql-wal/tests/assets/fixtures/shortread1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/shrink.test b/libsql-wal/tests/assets/fixtures/shrink.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sidedelete.test b/libsql-wal/tests/assets/fixtures/sidedelete.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/skipscan1.test b/libsql-wal/tests/assets/fixtures/skipscan1.test deleted file mode 100644 index ff21c20db7..0000000000 --- a/libsql-wal/tests/assets/fixtures/skipscan1.test +++ /dev/null @@ -1,332 +0,0 @@ - - CREATE TABLE t1(a TEXT, b INT, c INT, d INT); - CREATE INDEX t1abc ON t1(a,b,c); - INSERT INTO t1 VALUES('abc',123,4,5); - INSERT INTO t1 VALUES('abc',234,5,6); - INSERT INTO t1 VALUES('abc',234,6,7); - INSERT INTO t1 VALUES('abc',345,7,8); - INSERT INTO t1 VALUES('def',567,8,9); - INSERT INTO t1 VALUES('def',345,9,10); - INSERT INTO t1 VALUES('bcd',100,6,11); - - /* Fake the sqlite_stat1 table so that the query planner believes - ** the table contains thousands of rows and that the first few - ** columns are not selective. */ - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1 VALUES('t1','t1abc','10000 5000 2000 10'); - ANALYZE sqlite_master; - - - SELECT a,b,c,d,'|' FROM t1 WHERE b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE d<>99 AND b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE d<>99 AND b=345 ORDER BY a; - - - SELECT a,b,c,d,'|' FROM t1 WHERE d<>99 AND b=345 ORDER BY a DESC; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE d<>99 AND b=345 ORDER BY a DESC; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE d<>99 AND b=345 ORDER BY a DESC; - - - SELECT a,b,c,d,'|' FROM t1 WHERE c=6 ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE c=6 ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE c=6 ORDER BY a, b, c; - - - SELECT a,b,c,d,'|' FROM t1 WHERE c IN (6,7) ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE c IN (6,7) ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE c IN (6,7) ORDER BY a, b, c; - - - SELECT a,b,c,d,'|' FROM t1 WHERE c BETWEEN 6 AND 7 ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE c BETWEEN 6 AND 7 ORDER BY a, b, c; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE c BETWEEN 6 AND 7 ORDER BY a, b, c; - - - SELECT a,b,c,d,'|' FROM t1 WHERE b IN (234, 345) AND c BETWEEN 6 AND 7 - ORDER BY a, b; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE b IN (234, 345) AND c BETWEEN 6 AND 7 - ORDER BY a, b; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t1 WHERE b IN (234, 345) AND c BETWEEN 6 AND 7 - ORDER BY a, b; - - - CREATE TABLE t1j(x TEXT, y INTEGER); - INSERT INTO t1j VALUES('one',1),('six',6),('ninty-nine',99); - INSERT INTO sqlite_stat1 VALUES('t1j',null,'3'); - ANALYZE sqlite_master; - SELECT x, a, b, c, d, '|' FROM t1j, t1 WHERE c=y ORDER BY +a; - - - EXPLAIN QUERY PLAN - SELECT x, a, b, c, d, '|' FROM t1j, t1 WHERE c=y ORDER BY +a; - - - SELECT x, a, b, c, d, '|' FROM t1j LEFT JOIN t1 ON c=y ORDER BY +y, +a; - - - EXPLAIN QUERY PLAN - SELECT x, a, b, c, d, '|' FROM t1j LEFT JOIN t1 ON c=y ORDER BY +y, +a; - - - CREATE TABLE t2(a TEXT, b INT, c INT, d INT, - PRIMARY KEY(a,b,c)); - INSERT INTO t2 SELECT * FROM t1; - - /* Fake the sqlite_stat1 table so that the query planner believes - ** the table contains thousands of rows and that the first few - ** columns are not selective. */ - ANALYZE; - UPDATE sqlite_stat1 SET stat='10000 5000 2000 10' WHERE idx NOT NULL; - ANALYZE sqlite_master; - - - SELECT a,b,c,d,'|' FROM t2 WHERE d<>99 AND b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t2 WHERE d<>99 AND b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t2 WHERE d<>99 AND b=345 ORDER BY a; - - - CREATE TABLE t3(a TEXT, b INT, c INT, d INT, - PRIMARY KEY(a,b,c)) WITHOUT ROWID; - INSERT INTO t3 SELECT * FROM t1; - - /* Fake the sqlite_stat1 table so that the query planner believes - ** the table contains thousands of rows and that the first few - ** columns are not selective. */ - ANALYZE; - UPDATE sqlite_stat1 SET stat='10000 5000 2000 10' WHERE idx NOT NULL; - ANALYZE sqlite_master; - - - SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; - - - CREATE TABLE t4(a,b,c,d,e,f,g,h,i); - CREATE INDEX t4all ON t4(a,b,c,d,e,f,g,h); - INSERT INTO t4 VALUES(1,2,3,4,5,6,7,8,9); - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1 - VALUES('t4','t4all','655360 163840 40960 10240 2560 640 160 40 10'); - ANALYZE sqlite_master; - SELECT i FROM t4 WHERE a=1; - SELECT i FROM t4 WHERE b=2; - SELECT i FROM t4 WHERE c=3; - SELECT i FROM t4 WHERE d=4; - SELECT i FROM t4 WHERE e=5; - SELECT i FROM t4 WHERE f=6; - SELECT i FROM t4 WHERE g=7; - SELECT i FROM t4 WHERE h=8; - - - CREATE TABLE t5( - id INTEGER PRIMARY KEY, - loc TEXT, - lang INTEGER, - utype INTEGER, - xa INTEGER, - xd INTEGER, - xh INTEGER - ); - CREATE INDEX t5i1 on t5(loc, xh, xa, utype, lang); - CREATE INDEX t5i2 ON t5(xd,loc,utype,lang); - EXPLAIN QUERY PLAN - SELECT xh, loc FROM t5 WHERE loc >= 'M' AND loc < 'N'; - - - ANALYZE; - DELETE FROM sqlite_stat1; - DROP TABLE IF EXISTS sqlite_stat4; - INSERT INTO sqlite_stat1 VALUES('t5','t5i1','2702931 3 2 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('t5','t5i2','2702931 686 2 2 2'); - ANALYZE sqlite_master; - - - EXPLAIN QUERY PLAN - SELECT xh, loc FROM t5 WHERE loc >= 'M' AND loc < 'N'; - - - CREATE TABLE t1(a,b,c,d,e,f,g,h varchar(300)); - CREATE INDEX t1ab ON t1(a,b); - ANALYZE sqlite_master; - -- Only two distinct values for the skip-scan column. Skip-scan is not used. - INSERT INTO sqlite_stat1 VALUES('t1','t1ab','500000 250000 125000'); - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1; - - - -- Four distinct values for the skip-scan column. Skip-scan is used. - UPDATE sqlite_stat1 SET stat='500000 250000 62500'; - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1; - - - -- Two distinct values for the skip-scan column again. Skip-scan is not used. - UPDATE sqlite_stat1 SET stat='500000 125000 62500'; - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1; - - - UPDATE sqlite_stat1 SET stat='500000 125000 1 sz=100'; - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1; - - - UPDATE sqlite_stat1 SET stat='500000 125000 1 noskipscan sz=100'; - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1; - - - UPDATE sqlite_stat1 SET stat='500000 125000 1 sz=100 noskipscan'; - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x, y, PRIMARY KEY(x,y)) WITHOUT ROWID; - INSERT INTO t1(x,y) VALUES(1,'AB'); - INSERT INTO t1(x,y) VALUES(2,'CD'); - ANALYZE; - DROP TABLE IF EXISTS sqlite_stat4; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t1','t1','1000000 100 1'); - ANALYZE sqlite_master; - SELECT * FROM t1 - WHERE (y = 'AB' AND x <= 4) - OR (y = 'EF' AND x = 5); - - - EXPLAIN QUERY PLAN - SELECT * FROM t1 - WHERE (y = 'AB' AND x <= 4) - OR (y = 'EF' AND x = 5); - - - SELECT * FROM t1 - WHERE y = 'AB' OR (y = 'CD' AND x = 2) - ORDER BY +x; - - - CREATE TABLE t9a(a,b,c); - CREATE INDEX t9a_ab ON t9a(a,b); - CREATE TABLE t9b(x,y); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('t9a','t9a_ab','1000000 250000 1'); - ANALYZE sqlite_master; - EXPLAIN QUERY PLAN - SELECT * FROM t9a WHERE b IN (SELECT x FROM t9b WHERE y!=5); - - - EXPLAIN QUERY PLAN - SELECT * FROM t9a WHERE b IN (SELECT x FROM t9b WHERE y!=5); - - - CREATE TABLE t6(a TEXT, b INT, c INT, d INT); - CREATE INDEX t6abc ON t6(a,b,c); - INSERT INTO t6 VALUES('abc',123,4,5); - - ANALYZE; - DELETE FROM sqlite_stat1; - INSERT INTO sqlite_stat1 VALUES('t6','t6abc','10000 5000 2000 10'); - ANALYZE sqlite_master; - DELETE FROM t6; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t6 WHERE d<>99 AND b=345 ORDER BY a; - - - SELECT a,b,c,d,'|' FROM t6 WHERE d<>99 AND b=345 ORDER BY a; - - - EXPLAIN QUERY PLAN - SELECT a,b,c,d,'|' FROM t6 WHERE d<>99 AND b=345 ORDER BY a DESC; - - - SELECT a,b,c,d,'|' FROM t6 WHERE d<>99 AND b=345 ORDER BY a DESC; - - - CREATE TABLE t1 (c1, c2, c3, c4, PRIMARY KEY(c4, c3)); - INSERT INTO t1 VALUES(3,0,1,NULL); - INSERT INTO t1 VALUES(0,4,1,NULL); - INSERT INTO t1 VALUES(5,6,1,NULL); - INSERT INTO t1 VALUES(0,4,1,NULL); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('t1','sqlite_autoindex_t1_1','18 18 6'); - ANALYZE sqlite_master; - SELECT DISTINCT quote(c1), quote(c2), quote(c3), quote(c4), '|' - FROM t1 WHERE t1.c3 = 1; - - - CREATE TABLE t1(a,b INT); - INSERT INTO t1(a,b) VALUES(1,2),(3,3),(4,5); - CREATE UNIQUE INDEX i1 ON t1(b,b,a,a,a,a,a,b,a); - ANALYZE; - DROP TABLE IF EXISTS sqlite_stat4; - INSERT INTO sqlite_stat1 VALUES('t1','i1','30 30 30 2 2 2 2 2 2 2'); - ANALYZE sqlite_master; - - SELECT DISTINCT a - FROM t1 - WHERE a = b - AND a = 3 - AND b IN (1,3,2,4) - AND b >= 0 - AND a <= 10; - - - CREATE TABLE t1(a TEXT, UNIQUE(a,a,a)); - INSERT INTO t1 VALUES (hex(zeroblob(241))),(1),(2),(3); - ANALYZE; - SELECT max(a) FROM t1 WHERE a IN t1; - diff --git a/libsql-wal/tests/assets/fixtures/skipscan2.test b/libsql-wal/tests/assets/fixtures/skipscan2.test deleted file mode 100644 index 44b503f07e..0000000000 --- a/libsql-wal/tests/assets/fixtures/skipscan2.test +++ /dev/null @@ -1,139 +0,0 @@ - - CREATE TABLE people( - name TEXT PRIMARY KEY, - role TEXT NOT NULL, - height INT NOT NULL, -- in cm - CHECK( role IN ('student','teacher') ) - ); - CREATE INDEX people_idx1 ON people(role, height); - - - INSERT INTO people VALUES('Alice','student',156); - INSERT INTO people VALUES('Bob','student',161); - INSERT INTO people VALUES('Cindy','student',155); - INSERT INTO people VALUES('David','student',181); - INSERT INTO people VALUES('Emily','teacher',158); - INSERT INTO people VALUES('Fred','student',163); - INSERT INTO people VALUES('Ginny','student',169); - INSERT INTO people VALUES('Harold','student',172); - INSERT INTO people VALUES('Imma','student',179); - INSERT INTO people VALUES('Jack','student',181); - INSERT INTO people VALUES('Karen','student',163); - INSERT INTO people VALUES('Logan','student',177); - INSERT INTO people VALUES('Megan','teacher',159); - INSERT INTO people VALUES('Nathan','student',163); - INSERT INTO people VALUES('Olivia','student',161); - INSERT INTO people VALUES('Patrick','teacher',180); - INSERT INTO people VALUES('Quiana','student',182); - INSERT INTO people VALUES('Robert','student',159); - INSERT INTO people VALUES('Sally','student',166); - INSERT INTO people VALUES('Tom','student',171); - INSERT INTO people VALUES('Ursula','student',170); - INSERT INTO people VALUES('Vance','student',179); - INSERT INTO people VALUES('Willma','student',175); - INSERT INTO people VALUES('Xavier','teacher',185); - INSERT INTO people VALUES('Yvonne','student',149); - INSERT INTO people VALUES('Zach','student',170); - - - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - EXPLAIN QUERY PLAN - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - ANALYZE; - -- We do not have enough people above to actually force the use - -- of a skip-scan. So make a manual adjustment to the stat1 table - -- to make it seem like there are many more. - UPDATE sqlite_stat1 SET stat='10000 5000 20' WHERE idx='people_idx1'; - UPDATE sqlite_stat1 SET stat='10000 1' WHERE idx='sqlite_autoindex_people_1'; - ANALYZE sqlite_master; - - - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - EXPLAIN QUERY PLAN - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - SELECT name FROM people - WHERE role IN (SELECT DISTINCT role FROM people) - AND height>=180 ORDER BY +name; - - - SELECT name FROM people WHERE role='teacher' AND height>=180 - UNION ALL - SELECT name FROM people WHERE role='student' AND height>=180 - ORDER BY 1; - - - INSERT INTO people VALUES('Angie','student',166); - INSERT INTO people VALUES('Brad','student',176); - INSERT INTO people VALUES('Claire','student',168); - INSERT INTO people VALUES('Donald','student',162); - INSERT INTO people VALUES('Elaine','student',177); - INSERT INTO people VALUES('Frazier','student',159); - INSERT INTO people VALUES('Grace','student',179); - INSERT INTO people VALUES('Horace','student',166); - ANALYZE; - SELECT stat FROM sqlite_stat1 WHERE idx='people_idx1'; - - - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - EXPLAIN QUERY PLAN - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - INSERT INTO people VALUES('Ingrad','student',155); - INSERT INTO people VALUES('Jacob','student',179); - ANALYZE; - SELECT stat FROM sqlite_stat1 WHERE idx='people_idx1'; - - - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - EXPLAIN QUERY PLAN - SELECT name FROM people WHERE height>=180 ORDER BY +name; - - - CREATE TABLE peoplew( - name TEXT PRIMARY KEY, - role TEXT NOT NULL, - height INT NOT NULL, -- in cm - CHECK( role IN ('student','teacher') ) - ) WITHOUT ROWID; - CREATE INDEX peoplew_idx1 ON peoplew(role, height); - INSERT INTO peoplew(name,role,height) - SELECT name, role, height FROM people; - SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; - - - SELECT name FROM peoplew - WHERE role IN (SELECT DISTINCT role FROM peoplew) - AND height>=180 ORDER BY +name; - - - SELECT name FROM peoplew WHERE role='teacher' AND height>=180 - UNION ALL - SELECT name FROM peoplew WHERE role='student' AND height>=180 - ORDER BY 1; - - - ANALYZE; - - - SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; - - - EXPLAIN QUERY PLAN - SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; - - - CREATE TABLE t3(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID; - diff --git a/libsql-wal/tests/assets/fixtures/skipscan3.test b/libsql-wal/tests/assets/fixtures/skipscan3.test deleted file mode 100644 index ba6e5be494..0000000000 --- a/libsql-wal/tests/assets/fixtures/skipscan3.test +++ /dev/null @@ -1,40 +0,0 @@ - - CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,b,c)); - WITH RECURSIVE - c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t1(a,b,c,d) - SELECT 1, 1, x, printf('x%04d',x) FROM c; - ANALYZE; - - - EXPLAIN QUERY PLAN SELECT d FROM t1 WHERE +a=1 AND c=32; - - - SELECT d FROM t1 WHERE +a=1 AND c=32; - - - EXPLAIN QUERY PLAN SELECT d FROM t1 WHERE a=1 AND c=32; - - - SELECT d FROM t1 WHERE a=1 AND c=32; - - - CREATE TABLE t2(a,b,c,d,PRIMARY KEY(a,b,c)) WITHOUT ROWID; - WITH RECURSIVE - c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) - INSERT INTO t2(a,b,c,d) - SELECT 1, 1, x, printf('x%04d',x) FROM c; - ANALYZE; - - - EXPLAIN QUERY PLAN SELECT d FROM t2 WHERE +a=1 AND c=32; - - - SELECT d FROM t2 WHERE +a=1 AND c=32; - - - EXPLAIN QUERY PLAN SELECT d FROM t2 WHERE a=1 AND c=32; - - - SELECT d FROM t2 WHERE a=1 AND c=32; - diff --git a/libsql-wal/tests/assets/fixtures/skipscan5.test b/libsql-wal/tests/assets/fixtures/skipscan5.test deleted file mode 100644 index 9736b70a3e..0000000000 --- a/libsql-wal/tests/assets/fixtures/skipscan5.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(a INT, b INT, c INT); - CREATE INDEX i1 ON t1(a, b); - - - CREATE TABLE t3(a, b, c); - CREATE INDEX i3 ON t3(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/skipscan6.test b/libsql-wal/tests/assets/fixtures/skipscan6.test deleted file mode 100644 index f4de1393d0..0000000000 --- a/libsql-wal/tests/assets/fixtures/skipscan6.test +++ /dev/null @@ -1,131 +0,0 @@ - - CREATE TABLE t1( - aa int, - bb int, - cc int, - dd int, - ee int - ); - CREATE INDEX ix on t1(aa, bb, cc, dd DESC); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('t1','ix','2695116 1347558 264 18 2'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 196859 196859 32 1','0 15043 15043 92468 92499','0 19 286 81846 92499',X'0609010804031552977BD725BD28'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 14687 161 1 1','0 289067 299306 299457 299457','0 199 6772 273984 299457',X'060902020403013406314D67456415B819'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 19313 19308 22 1','0 325815 325815 343725 343746','0 261 9545 315009 343746',X'060902080403018A49B0A3AD1ED931'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 25047 9051 15 1','0 350443 350443 356590 356604','0 266 9795 325519 356604',X'06090208040301914C2DD2E91F93CF'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 42327 9906 7 1','0 376381 376381 380291 380297','0 268 10100 344232 380297',X'06090208040301934BF672511F7ED3'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 24513 2237 1 1','0 455150 467779 470015 470015','0 286 10880 425401 470015',X'06090202040301A703464A28F2611EF1EE'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 18730 18724 15 1','0 479663 479663 498271 498285','0 287 10998 450793 498285',X'06090208040301A8494AF3A41EC50C'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 119603 47125 1 1','0 572425 572425 598915 598915','0 404 14230 546497 598915',X'06090208040302474FD1929A03194F'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 1454 1454 1 1','0 898346 898346 898373 898373','0 952 31165 827562 898373',X'06090208040304FD53F6A2A2097F64'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 57138 7069 1 1','0 1122389 1122389 1129457 1129457','0 1967 46801 1045943 1129457',X'06090208040309884BC4C52F1F6EB7'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 285 11 1 1','0 1197683 1197824 1197831 1197831','0 2033 50990 1112280 1197831',X'06090202040309D80346503FE2A9038E4F'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 25365 9773 1 1','0 1301013 1301013 1310785 1310785','0 2561 58806 1217877 1310785',X'0609020804030C5F4C8F88AB0AF2A2'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 45180 7222 1 1','0 1326378 1326378 1333599 1333599','0 2562 59921 1240187 1333599',X'0609020804030C604CAB75490B0351'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 8537 41 1 1','0 1496959 1497288 1497289 1497289','0 3050 68246 1394126 1497289',X'0609020204030EA0057F527459B0257C4B'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 26139 26131 17 1','0 1507977 1507977 1520578 1520594','0 3074 69188 1416111 1520594',X'0609020804030EB95169453423D4EA'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 102894 29678 1 1','0 1537421 1550467 1564894 1564894','0 3109 69669 1459820 1564894',X'0609020204030EE3183652A6ED3006EBCB'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 319 3 1 1','0 1796728 1796746 1796747 1796747','0 3650 86468 1682243 1796747',X'0609020204031163033550D0C41018C28D'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 127 127 1 1','0 2096194 2096194 2096205 2096205','0 5145 106437 1951535 2096205',X'060902080403180F53BB1AF727EE50'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 66574 5252 1 1','0 2230524 2265961 2271212 2271212','0 5899 114976 2085829 2271212',X'0609020204031B8A05195009976D223B90'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 19440 19440 1 1','0 2391680 2391680 2395663 2395663','0 6718 123714 2184781 2395663',X'0609020804031F7452E00A7B07431A'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 18321 2177 1 1','0 2522928 2523231 2525407 2525407','0 7838 139084 2299958 2525407',X'06090201040324A7475231103B1AA7B8'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 22384 1361 1 1','0 2541249 2544834 2546194 2546194','0 7839 139428 2308416 2546194',X'06090202040324A8011652323D4B1AA9EB'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 18699 855 1 1','0 2563633 2578178 2579032 2579032','0 7840 139947 2321671 2579032',X'06090202040324A9077452323D7D1052C5'); - INSERT INTO sqlite_stat4 VALUES('t1','ix','17965 1579 1579 1 1','2677151 2690666 2690666 2692244 2692244','1 9870 153959 2418294 2692244',X'060102080403021B8A4FE1AB84032B35'); - ANALYZE sqlite_master; - - - EXPLAIN QUERY PLAN - SELECT COUNT(*) - FROM t1 - WHERE bb=21 - AND aa=1 - AND dd BETWEEN 1413833728 and 1413837331; - - - DROP INDEX ix; - CREATE INDEX good on t1(bb, aa, dd DESC); - CREATE INDEX bad on t1(aa, bb, cc, dd DESC); - DELETE FROM sqlite_stat1; - DELETE FROM sqlite_stat4; - INSERT INTO sqlite_stat1 VALUES('t1','good','2695116 299 264 2'); - INSERT INTO sqlite_stat1 VALUES('t1','bad','2695116 1347558 264 18 2'); - INSERT INTO sqlite_stat4 VALUES('t1','good','197030 196859 32 1','15086 15086 92511 92536','19 25 81644 92536',X'05010904031552977BD725BD22'); - INSERT INTO sqlite_stat4 VALUES('t1','good','14972 14687 1 1','289878 289878 299457 299457','199 244 267460 299457',X'050209040301344F7E569402C419'); - INSERT INTO sqlite_stat4 VALUES('t1','good','19600 19313 22 1','327127 327127 346222 346243','261 319 306884 346243',X'0502090403018A49503BC01EC577'); - INSERT INTO sqlite_stat4 VALUES('t1','good','25666 25047 15 1','352087 352087 372692 372706','266 327 325601 372706',X'050209040301914C2DD2E91F93CF'); - INSERT INTO sqlite_stat4 VALUES('t1','good','42392 42327 26 1','378657 378657 382547 382572','268 331 333529 382572',X'05020904030193533B2FE326ED48'); - INSERT INTO sqlite_stat4 VALUES('t1','good','24619 24513 11 1','457872 457872 461748 461758','286 358 399322 461758',X'050209040301A752B1557825EA7C'); - INSERT INTO sqlite_stat4 VALUES('t1','good','18969 18730 15 1','482491 482491 501105 501119','287 360 433605 501119',X'050209040301A8494AF3A41EC50C'); - INSERT INTO sqlite_stat4 VALUES('t1','good','119710 119603 1 1','576500 576500 598915 598915','404 505 519877 598915',X'05020904030247539A7A7912F617'); - INSERT INTO sqlite_stat4 VALUES('t1','good','11955 11946 1 1','889796 889796 898373 898373','938 1123 794694 898373',X'050209040304EF4DF9C4150BBB28'); - INSERT INTO sqlite_stat4 VALUES('t1','good','57197 57138 24 1','1129865 1129865 1151492 1151515','1967 2273 1027048 1151515',X'05020904030988533510BC26E20A'); - INSERT INTO sqlite_stat4 VALUES('t1','good','3609 3543 1 1','1196265 1196265 1197831 1197831','2002 2313 1070108 1197831',X'050209040309B050E95CD718D94D'); - INSERT INTO sqlite_stat4 VALUES('t1','good','25391 25365 13 1','1309378 1309378 1315567 1315579','2561 2936 1178358 1315579',X'05020904030C5F53DF9E13283570'); - INSERT INTO sqlite_stat4 VALUES('t1','good','45232 45180 17 1','1334769 1334769 1337946 1337962','2562 2938 1198998 1337962',X'05020904030C60541CACEE28BCAC'); - INSERT INTO sqlite_stat4 VALUES('t1','good','5496 5493 1 1','1495882 1495882 1497289 1497289','3043 3479 1348695 1497289',X'05020904030E99515C62AD0F0B34'); - INSERT INTO sqlite_stat4 VALUES('t1','good','26348 26139 17 1','1517381 1517381 1529990 1530006','3074 3519 1378320 1530006',X'05020904030EB95169453423D4EA'); - INSERT INTO sqlite_stat4 VALUES('t1','good','102927 102894 10 1','1547088 1547088 1649950 1649959','3109 3559 1494260 1649959',X'05020904030EE34D309F671FFA47'); - INSERT INTO sqlite_stat4 VALUES('t1','good','3602 3576 1 1','1793873 1793873 1796747 1796747','3601 4128 1630783 1796747',X'050209040311294FE88B432219B9'); - INSERT INTO sqlite_stat4 VALUES('t1','good','154 154 1 1','2096059 2096059 2096205 2096205','5037 5779 1893039 2096205',X'050209040317994EFF05A016DCED'); - INSERT INTO sqlite_stat4 VALUES('t1','good','68153 66574 60 1','2244039 2244039 2268892 2268951','5899 6749 2027553 2268951',X'05020904031B8A532DBC5A26D2BA'); - INSERT INTO sqlite_stat4 VALUES('t1','good','321 321 1 1','2395618 2395618 2395663 2395663','6609 7528 2118435 2395663',X'05020904031EFA54078EEE1E2D65'); - INSERT INTO sqlite_stat4 VALUES('t1','good','19449 19440 22 1','2407769 2407769 2426049 2426070','6718 7651 2146904 2426070',X'05020904031F7450E6118C2336BD'); - INSERT INTO sqlite_stat4 VALUES('t1','good','18383 18321 56 1','2539949 2539949 2551080 2551135','7838 8897 2245459 2551135',X'050209040324A752EA2E1E2642B2'); - INSERT INTO sqlite_stat4 VALUES('t1','good','22479 22384 60 1','2558332 2558332 2565233 2565292','7839 8899 2251202 2565292',X'050209040324A853926538279A5F'); - INSERT INTO sqlite_stat4 VALUES('t1','good','18771 18699 63 1','2580811 2580811 2596914 2596976','7840 8901 2263572 2596976',X'050209040324A9526C1DE9256E72'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 196859 196859 32 1','0 15043 15043 92468 92499','0 19 286 81846 92499',X'0609010804031552977BD725BD28'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 14687 161 1 1','0 289067 299306 299457 299457','0 199 6772 273984 299457',X'060902020403013406314D67456415B819'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 19313 19308 22 1','0 325815 325815 343725 343746','0 261 9545 315009 343746',X'060902080403018A49B0A3AD1ED931'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 25047 9051 15 1','0 350443 350443 356590 356604','0 266 9795 325519 356604',X'06090208040301914C2DD2E91F93CF'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 42327 9906 7 1','0 376381 376381 380291 380297','0 268 10100 344232 380297',X'06090208040301934BF672511F7ED3'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 24513 2237 1 1','0 455150 467779 470015 470015','0 286 10880 425401 470015',X'06090202040301A703464A28F2611EF1EE'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 18730 18724 15 1','0 479663 479663 498271 498285','0 287 10998 450793 498285',X'06090208040301A8494AF3A41EC50C'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 119603 47125 1 1','0 572425 572425 598915 598915','0 404 14230 546497 598915',X'06090208040302474FD1929A03194F'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 1454 1454 1 1','0 898346 898346 898373 898373','0 952 31165 827562 898373',X'06090208040304FD53F6A2A2097F64'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 57138 7069 1 1','0 1122389 1122389 1129457 1129457','0 1967 46801 1045943 1129457',X'06090208040309884BC4C52F1F6EB7'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 285 11 1 1','0 1197683 1197824 1197831 1197831','0 2033 50990 1112280 1197831',X'06090202040309D80346503FE2A9038E4F'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 25365 9773 1 1','0 1301013 1301013 1310785 1310785','0 2561 58806 1217877 1310785',X'0609020804030C5F4C8F88AB0AF2A2'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 45180 7222 1 1','0 1326378 1326378 1333599 1333599','0 2562 59921 1240187 1333599',X'0609020804030C604CAB75490B0351'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 8537 41 1 1','0 1496959 1497288 1497289 1497289','0 3050 68246 1394126 1497289',X'0609020204030EA0057F527459B0257C4B'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 26139 26131 17 1','0 1507977 1507977 1520578 1520594','0 3074 69188 1416111 1520594',X'0609020804030EB95169453423D4EA'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 102894 29678 1 1','0 1537421 1550467 1564894 1564894','0 3109 69669 1459820 1564894',X'0609020204030EE3183652A6ED3006EBCB'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 319 3 1 1','0 1796728 1796746 1796747 1796747','0 3650 86468 1682243 1796747',X'0609020204031163033550D0C41018C28D'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 127 127 1 1','0 2096194 2096194 2096205 2096205','0 5145 106437 1951535 2096205',X'060902080403180F53BB1AF727EE50'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 66574 5252 1 1','0 2230524 2265961 2271212 2271212','0 5899 114976 2085829 2271212',X'0609020204031B8A05195009976D223B90'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 19440 19440 1 1','0 2391680 2391680 2395663 2395663','0 6718 123714 2184781 2395663',X'0609020804031F7452E00A7B07431A'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 18321 2177 1 1','0 2522928 2523231 2525407 2525407','0 7838 139084 2299958 2525407',X'06090201040324A7475231103B1AA7B8'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 22384 1361 1 1','0 2541249 2544834 2546194 2546194','0 7839 139428 2308416 2546194',X'06090202040324A8011652323D4B1AA9EB'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 18699 855 1 1','0 2563633 2578178 2579032 2579032','0 7840 139947 2321671 2579032',X'06090202040324A9077452323D7D1052C5'); - INSERT INTO sqlite_stat4 VALUES('t1','bad','17965 1579 1579 1 1','2677151 2690666 2690666 2692244 2692244','1 9870 153959 2418294 2692244',X'060102080403021B8A4FE1AB84032B35'); - ANALYZE sqlite_master; - - - EXPLAIN QUERY PLAN - SELECT COUNT(*) - FROM t1 - WHERE bb=21 - AND aa=1 - AND dd BETWEEN 1413833728 and 1413837331; - - - CREATE TABLE t3(a, b, c, d); - CREATE INDEX t3_ba ON t3(b, a, c); - CREATE INDEX t3_a ON t3(a); - - WITH d(a, b) AS ( - SELECT 1, 1 - UNION ALL - SELECT a+1, (a+1) % 5 FROM d WHERE a<100 - ) - INSERT INTO t3 SELECT a, b, 'c', 'd' FROM d; - - CREATE TABLE t2(a, b, c, d); - CREATE INDEX t2_a ON t2(a); - CREATE INDEX t2_ba ON t2(b, a, c); - INSERT INTO t2 SELECT * FROM t3; - - ANALYZE; - SELECT * FROM sqlite_stat1; - diff --git a/libsql-wal/tests/assets/fixtures/snapshot.test b/libsql-wal/tests/assets/fixtures/snapshot.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/snapshot2.test b/libsql-wal/tests/assets/fixtures/snapshot2.test deleted file mode 100644 index 8df583431c..0000000000 --- a/libsql-wal/tests/assets/fixtures/snapshot2.test +++ /dev/null @@ -1,30 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - - SELECT * FROM t1 - SELECT * FROM t1 - - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - - - PRAGMA journal_mode = wal; - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES('a', 'b'); - INSERT INTO t1 VALUES('c', 'd'); - - - SELECT * FROM t1; - - - CREATE TABLE t2(x); - PRAGMA journal_mode = wal; - INSERT INTO t2 VALUES('abc'); - INSERT INTO t2 VALUES('def'); - INSERT INTO t2 VALUES('ghi'); - diff --git a/libsql-wal/tests/assets/fixtures/snapshot3.test b/libsql-wal/tests/assets/fixtures/snapshot3.test deleted file mode 100644 index 85a321a6d7..0000000000 --- a/libsql-wal/tests/assets/fixtures/snapshot3.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(y); - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - INSERT INTO t1 VALUES(3); - INSERT INTO t1 VALUES(4); - diff --git a/libsql-wal/tests/assets/fixtures/snapshot4.test b/libsql-wal/tests/assets/fixtures/snapshot4.test deleted file mode 100644 index 5d61ef9e66..0000000000 --- a/libsql-wal/tests/assets/fixtures/snapshot4.test +++ /dev/null @@ -1,10 +0,0 @@ - - PRAGMA cache_size = 10; - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, randomblob(400)); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 2 UNION ALL SELECT i+1 FROM s WHERE i<100 - ) - INSERT INTO t1 SELECT i, randomblob(400) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/snapshot_fault.test b/libsql-wal/tests/assets/fixtures/snapshot_fault.test deleted file mode 100644 index d6404140c8..0000000000 --- a/libsql-wal/tests/assets/fixtures/snapshot_fault.test +++ /dev/null @@ -1,22 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE t1(zzz); - INSERT INTO t1 VALUES('abc'); - INSERT INTO t1 VALUES('def'); - - - PRAGMA page_size = 512; - PRAGMA journal_mode = wal; - PRAGMA wal_autocheckpoint = 0; - CREATE TABLE t1(zzz); - INSERT INTO t1 VALUES(randomblob( 500 * 9500 )); - PRAGMA user_version = 211; - - - PRAGMA page_size = 512; - PRAGMA journal_mode = wal; - PRAGMA wal_autocheckpoint = 0; - CREATE TABLE t1(zzz); - INSERT INTO t1 VALUES(randomblob( 5000 )); - PRAGMA user_version = 211; - diff --git a/libsql-wal/tests/assets/fixtures/snapshot_up.test b/libsql-wal/tests/assets/fixtures/snapshot_up.test deleted file mode 100644 index c6de6d5da7..0000000000 --- a/libsql-wal/tests/assets/fixtures/snapshot_up.test +++ /dev/null @@ -1,22 +0,0 @@ - - CREATE TABLE t1(a, b, c); - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - INSERT INTO t1 VALUES(7, 8, 9); - - - BEGIN; - SELECT * FROM t1 - - - SELECT * FROM t1 - - - SELECT * FROM t1 - - - BEGIN; - SELECT * FROM t1 - - COMMIT diff --git a/libsql-wal/tests/assets/fixtures/soak.test b/libsql-wal/tests/assets/fixtures/soak.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/softheap1.test b/libsql-wal/tests/assets/fixtures/softheap1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sort.test b/libsql-wal/tests/assets/fixtures/sort.test deleted file mode 100644 index 8753da6e37..0000000000 --- a/libsql-wal/tests/assets/fixtures/sort.test +++ /dev/null @@ -1,36 +0,0 @@ - - CREATE TABLE t10(a, b); - - - SELECT a, b FROM t10 ORDER BY a; - - - PRAGMA cache_size = 5; - SELECT a, b FROM t10 ORDER BY a; - - - SELECT * FROM sqlite_master ORDER BY sql; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<50) - -- increase to 5000 for actual test data ----^^ - INSERT INTO t1(a,b,c) SELECT x, random()%5000, random()%5000 FROM c; - CREATE TABLE t2(d,e,f); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<500) - -- increase to 50000 for actual test data -----^^^ - INSERT INTO t2(d,e,f) SELECT - NULLIF(0, random()%2), random()%5000, random()%5000 - FROM c; - ANALYZE; - UPDATE sqlite_stat1 SET stat='50000' WHERE tbl='t2'; - UPDATE sqlite_stat1 SET stat='5000' WHERE tbl='t1'; - ANALYZE sqlite_schema; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 JOIN t2 - WHERE a IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) - AND a=CASE WHEN d IS NOT NULL THEN e ELSE f END - ORDER BY a; - diff --git a/libsql-wal/tests/assets/fixtures/sort2.test b/libsql-wal/tests/assets/fixtures/sort2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sort3.test b/libsql-wal/tests/assets/fixtures/sort3.test deleted file mode 100644 index f1f0143af0..0000000000 --- a/libsql-wal/tests/assets/fixtures/sort3.test +++ /dev/null @@ -1,24 +0,0 @@ - - PRAGMA cache_size = 5; - CREATE TABLE t11(a, b); - INSERT INTO t11 VALUES(randomblob(5000), NULL); - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --2 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --3 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --4 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --5 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --6 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --7 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --8 - INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --9 - UPDATE t11 SET b = cksum(a); - - - PRAGMA cache_size = 20000; - WITH r(x,y) AS ( - SELECT 1, randomblob(1000) - UNION ALL - SELECT x+1, randomblob(1000) FROM r - LIMIT 2200000 - ) - SELECT count(*), sum(length(y)) FROM r GROUP BY (x%5); - diff --git a/libsql-wal/tests/assets/fixtures/sort4.test b/libsql-wal/tests/assets/fixtures/sort4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sort5.test b/libsql-wal/tests/assets/fixtures/sort5.test deleted file mode 100644 index c8a01c1c6f..0000000000 --- a/libsql-wal/tests/assets/fixtures/sort5.test +++ /dev/null @@ -1,8 +0,0 @@ - - PRAGMA mmap_size = 10000000; - PRAGMA cache_size = 10; - CREATE TABLE t1(a, b); - - - CREATE INDEX i1 ON t1(b); - diff --git a/libsql-wal/tests/assets/fixtures/sorterref.test b/libsql-wal/tests/assets/fixtures/sorterref.test deleted file mode 100644 index 8aa6fcd4d6..0000000000 --- a/libsql-wal/tests/assets/fixtures/sorterref.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - ALTER TABLE t1 ADD COLUMN d DEFAULT 'string'; - INSERT INTO t1 VALUES(7, 8, 9, 'text'); - - - SELECT * FROM t1 ORDER BY b; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d, PRIMARY KEY(c)) WITHOUT ROWID; - - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(2, 3); - INSERT INTO t1 VALUES(3, 4); - - INSERT INTO t2 VALUES(1, 'one'); - INSERT INTO t2 VALUES(3, 'three'); - - - SELECT * FROM t1 LEFT JOIN t2 ON (a=c) ORDER BY b; - diff --git a/libsql-wal/tests/assets/fixtures/sortfault.test b/libsql-wal/tests/assets/fixtures/sortfault.test deleted file mode 100644 index 877ba98574..0000000000 --- a/libsql-wal/tests/assets/fixtures/sortfault.test +++ /dev/null @@ -1,12 +0,0 @@ - - PRAGMA cache_size = 5; - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, 2, 3); - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES($a, $b, $c); - INSERT INTO t1 VALUES($c, $b, $a); - diff --git a/libsql-wal/tests/assets/fixtures/speed1.test b/libsql-wal/tests/assets/fixtures/speed1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/speed1p.test b/libsql-wal/tests/assets/fixtures/speed1p.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/speed2.test b/libsql-wal/tests/assets/fixtures/speed2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/speed3.test b/libsql-wal/tests/assets/fixtures/speed3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/speed4.test b/libsql-wal/tests/assets/fixtures/speed4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/speed4p.test b/libsql-wal/tests/assets/fixtures/speed4p.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/spellfix.test b/libsql-wal/tests/assets/fixtures/spellfix.test deleted file mode 100644 index 7d9cd0a5f9..0000000000 --- a/libsql-wal/tests/assets/fixtures/spellfix.test +++ /dev/null @@ -1,111 +0,0 @@ - - SELECT next_char('re','vocab','w'); - - - SELECT next_char('re','(SELECT w AS x FROM vocab)','x'); - - - SELECT next_char('r','vocab','w'); - - - SELECT next_char('','vocab','w'); - - - CREATE TABLE vocab2(w TEXT); - CREATE INDEX vocab2w ON vocab2(w COLLATE nocase); - INSERT INTO vocab2 VALUES('abc'), ('ABD'), ('aBe'), ('AbF'); - SELECT next_char('ab', 'vocab2', 'w', null, 'nocase'); - - - SELECT next_char('ab','vocab2','w',null,null); - - - SELECT next_char('AB','vocab2','w',null,'NOCASE'); - - - SELECT next_char('ab','vocab2','w',null,'binary'); - - - SELECT rowid FROM t1 WHERE word='rabbit'; - - - UPDATE t1 SET rowid=2000 WHERE word='rabbit'; - SELECT rowid FROM t1 WHERE word='rabbit'; - - - INSERT INTO t1(rowid, word) VALUES(3000,'melody'); - SELECT rowid, word, matchlen FROM t1 WHERE word MATCH 'melotti' - ORDER BY score LIMIT 3; - - - CREATE VIRTUAL TABLE t2 USING spellfix1; - INSERT INTO t2 (word, soundslike) VALUES('school', 'skuul'); - INSERT INTO t2 (word, soundslike) VALUES('psalm', 'sarm'); - SELECT word, matchlen FROM t2 WHERE word MATCH 'sar*' LIMIT 5; - - - SELECT word, matchlen FROM t2 WHERE word MATCH 'skol*' LIMIT 5; - - - CREATE TABLE costs(iLang, cFrom, cTo, iCost); - INSERT INTO costs VALUES(0, 'a', 'e', 1); - INSERT INTO costs VALUES(0, 'e', 'i', 1); - INSERT INTO costs VALUES(0, 'i', 'o', 1); - INSERT INTO costs VALUES(0, 'o', 'u', 1); - INSERT INTO costs VALUES(0, 'u', 'a', 1); - CREATE VIRTUAL TABLE t3 USING spellfix1(edit_cost_table=costs); - - - INSERT INTO t3(command) VALUES('edit_cost_table=NULL'); - - - CREATE TABLE costs2(iLang, cFrom, cTo, iCost); - INSERT INTO costs2 VALUES(0, 'a', 'o', 1); - INSERT INTO costs2 VALUES(0, 'e', 'o', 4); - INSERT INTO costs2 VALUES(0, 'i', 'o', 8); - INSERT INTO costs2 VALUES(0, 'u', 'o', 16); - INSERT INTO t3(command) VALUES('edit_cost_table="costs2"'); - - - SELECT word FROM t3 WHERE rowid = 10; - - - SELECT word, distance FROM t3 WHERE rowid = 10; - - - SELECT word, distance FROM t3 WHERE rowid = 10 AND word MATCH 'kiiner'; - - - CREATE VIRTUAL TABLE t4 USING spellfix1; - PRAGMA table_info = t4; - - - INSERT INTO t4(rowid, word) VALUES(1, 'Archilles'); - INSERT INTO t4(rowid, word) VALUES(2, 'Pluto'); - INSERT INTO t4(rowid, word) VALUES(3, 'Atrides'); - INSERT OR REPLACE INTO t4(rowid, word) VALUES(2, 'Apollo'); - SELECT rowid, word FROM t4; - - - INSERT OR IGNORE INTO t4(rowid, word) VALUES(3, 'Zeus'); - SELECT rowid, word FROM t4; - - - UPDATE OR REPLACE t4 SET rowid=3 WHERE rowid=1; - SELECT rowid, word FROM t4; - - - UPDATE OR IGNORE t4 SET rowid=3 WHERE rowid=2; - SELECT rowid, word FROM t4; - - - DELETE FROM t4; - INSERT INTO t4(rowid, word) VALUES(10, 'Agamemnon'); - INSERT INTO t4(rowid, word) VALUES(20, 'Patroclus'); - INSERT INTO t4(rowid, word) VALUES(30, 'Chryses'); - - CREATE TABLE t5(i, w); - INSERT INTO t5 VALUES(5, 'Poseidon'); - INSERT INTO t5 VALUES(20, 'Chronos'); - INSERT INTO t5 VALUES(30, 'Hera'); - diff --git a/libsql-wal/tests/assets/fixtures/spellfix2.test b/libsql-wal/tests/assets/fixtures/spellfix2.test deleted file mode 100644 index 892ccb4b31..0000000000 --- a/libsql-wal/tests/assets/fixtures/spellfix2.test +++ /dev/null @@ -1,39 +0,0 @@ - - CREATE VIRTUAL TABLE demo USING spellfix1; - INSERT INTO demo(word) VALUES ('amsterdam'); - INSERT INTO demo(word) VALUES ('amsterdammetje'); - INSERT INTO demo(word) VALUES ('amsterdamania'); - INSERT INTO demo(word) VALUES ('amsterdamweg'); - INSERT INTO demo(word) VALUES ('amsterdamsestraat'); - INSERT INTO demo(word) VALUES ('amsterdamlaan'); - - - SELECT word, distance, matchlen FROM demo - WHERE word MATCH 'amstedam*' AND top=3 - ORDER BY +word; - - - SELECT word, distance, matchlen FROM demo WHERE - word MATCH 'amstedam*' AND top=3 AND distance <= 100 - ORDER BY +word; - - - SELECT word, distance, matchlen FROM demo WHERE - word MATCH 'amstedam*' AND distance <= 100 - ORDER BY +word; - - - SELECT count(*) FROM demo WHERE word MATCH 'amstedam*' AND distance <= 100; - SELECT count(*) FROM demo - WHERE word MATCH 'amstedam*' AND distance <= 100 AND top=20; - - - SELECT word, distance, matchlen FROM demo - WHERE word MATCH 'amstedam*' AND distance <= 100 - ORDER BY distance, word; - - - SELECT word, distance, matchlen FROM demo - WHERE word MATCH 'amstedam*' AND distance <= 100 AND top=20 - ORDER BY distance, word; - diff --git a/libsql-wal/tests/assets/fixtures/spellfix3.test b/libsql-wal/tests/assets/fixtures/spellfix3.test deleted file mode 100644 index e0f0d0ed1b..0000000000 --- a/libsql-wal/tests/assets/fixtures/spellfix3.test +++ /dev/null @@ -1,30 +0,0 @@ - - SELECT spellfix1_scriptcode('And God said, “Let there be light”'); - - - SELECT spellfix1_scriptcode('Бог сказал: "Да будет свет"'); - - - SELECT spellfix1_scriptcode('και ειπεν ο θεος γενηθητω φως και εγενετο φως'); - - - SELECT spellfix1_scriptcode('וַיֹּ֥אמֶר אֱלֹהִ֖ים יְהִ֣י א֑וֹר וַֽיְהִי־אֽוֹר׃'); - - - SELECT spellfix1_scriptcode('فِي ذَلِكَ الوَقتِ، قالَ اللهُ: لِيَكُنْ نُورٌ. فَصَارَ نُورٌ.'); - - - SELECT spellfix1_scriptcode('+3.14159'); - - - SELECT spellfix1_scriptcode('And God said: "Да будет свет"'); - - - SELECT spellfix1_scriptcode('+3.14159 light'); - - - SELECT spellfix1_scriptcode('+3.14159 свет'); - - - SELECT spellfix1_scriptcode('וַיֹּ֥אמֶר +3.14159'); - diff --git a/libsql-wal/tests/assets/fixtures/spellfix4.test b/libsql-wal/tests/assets/fixtures/spellfix4.test deleted file mode 100644 index 7be36e9834..0000000000 --- a/libsql-wal/tests/assets/fixtures/spellfix4.test +++ /dev/null @@ -1,327 +0,0 @@ - - CREATE TABLE cost1(iLang, cFrom, cTo, iCost); - INSERT INTO cost1 VALUES - (0, '', '?', 97), - (0, '?', '', 98), - (0, '?', '?', 99), - (0, 'm', 'n', 50), - (0, 'n', 'm', 50) - ; - SELECT editdist3('cost1'); - SELECT editdist3('anchor','amchor'); - - - SELECT editdist3('anchor','anchoxr'); - - - SELECT editdist3('anchor','xanchor'); - - - SELECT editdist3('anchor','anchorx'); - - - SELECT editdist3('anchor','anchr'); - - - SELECT editdist3('anchor','ancho'); - - - SELECT editdist3('anchor','nchor'); - - - SELECT editdist3('anchor','anchur'); - - - SELECT editdist3('anchor','onchor'); - - - SELECT editdist3('anchor','anchot'); - - - SELECT editdist3('anchor','omchor'); - - - INSERT INTO cost1 VALUES - (0, 'a', 'ä', 5), - (0, 'ss', 'ß', 8) - ; - SELECT editdist3('cost1'); - SELECT editdist3('strasse','straße'); - SELECT editdist3('straße','strasse'); - - - SELECT editdist3('baume','bäume'); - - - SELECT editdist3('baum','bäume'); - - - INSERT INTO cost1 VALUES - (0, 'ä', 'a', 5), - (0, 'ß', 'ss', 8) - ; - SELECT editdist3('cost1'); - SELECT editdist3('strasse','straße'); - SELECT editdist3('straße','strasse'); - - - DELETE FROM cost1; - INSERT INTO cost1 VALUES - (0, '', '?', 97), - (0, '?', '', 98), - (0, '?', '?', 99), - (0, 'a', 'e', 50), - (0, 'a', 'i', 70), - (0, 'a', 'o', 75), - (0, 'a', 'u', 81), - (0, 'e', 'a', 50), - (0, 'e', 'i', 52), - (0, 'e', 'o', 72), - (0, 'e', 'u', 82), - (0, 'i', 'a', 70), - (0, 'i', 'e', 52), - (0, 'i', 'o', 75), - (0, 'i', 'u', 83), - (0, 'o', 'a', 75), - (0, 'o', 'e', 72), - (0, 'o', 'i', 75), - (0, 'o', 'u', 40), - (0, 'u', 'a', 81), - (0, 'u', 'e', 82), - (0, 'u', 'i', 83), - (0, 'u', 'o', 40), - (0, 'm', 'n', 45), - (0, 'n', 'm', 45) - ; - CREATE TABLE words(x TEXT); - INSERT INTO words VALUES - ('abraham'), - ('action'), - ('africa'), - ('aladdin'), - ('alert'), - ('alien'), - ('amazon'), - ('analog'), - ('animal'), - ('apollo'), - ('archive'), - ('arnold'), - ('aspirin'), - ('august'), - ('average'), - ('bahama'), - ('bambino'), - ('barcode'), - ('bazooka'), - ('belgium'), - ('between'), - ('biology'), - ('blonde'), - ('border'), - ('brave'), - ('british'), - ('bucket'), - ('button'), - ('caesar'), - ('camilla'), - ('cannon'), - ('caramel'), - ('carpet'), - ('catalog'), - ('century'), - ('chaos'), - ('chef'), - ('china'), - ('circus'), - ('classic'), - ('clinic'), - ('coconut'), - ('combine'), - ('complex'), - ('congo'), - ('convert'), - ('cosmos'), - ('crack'), - ('crown'), - ('cyclone'), - ('deal'), - ('delete'), - ('denver'), - ('detail'), - ('diana'), - ('direct'), - ('dolby'), - ('double'), - ('dublin'), - ('echo'), - ('edition'), - ('electra'), - ('emotion'), - ('enjoy'), - ('escape'), - ('everest'), - ('exile'), - ('express'), - ('family'), - ('ferrari'), - ('filter'), - ('fish'), - ('florida'), - ('ford'), - ('forum'), - ('frank'), - ('frozen'), - ('gallery'), - ('garlic'), - ('geneva'), - ('gibson'), - ('gloria'), - ('gordon'), - ('gravity'), - ('ground'), - ('habitat'), - ('harlem'), - ('hazard'), - ('herbert'), - ('hobby'), - ('house'), - ('icon'), - ('immune'), - ('india'), - ('inside'), - ('isotope'), - ('jamaica'), - ('jazz'), - ('joker'), - ('juliet'), - ('jupiter'), - ('kevin'), - ('korea'), - ('latin'), - ('legal'), - ('lexicon'), - ('limbo'), - ('lithium'), - ('logo'), - ('lucas'), - ('madrid'), - ('major'), - ('manual'), - ('mars'), - ('maximum'), - ('medical'), - ('mental'), - ('meter'), - ('miguel'), - ('mimosa'), - ('miranda'), - ('modern'), - ('money'), - ('morgan'), - ('motor'), - ('mystic'), - ('nebula'), - ('network'), - ('nice'), - ('nitro'), - ('norway'), - ('nurse'), - ('octavia'), - ('olympic'), - ('opus'), - ('orient'), - ('othello'), - ('pacific'), - ('panama'), - ('paper'), - ('parking'), - ('pasta'), - ('paul'), - ('people'), - ('permit'), - ('phrase'), - ('pilgrim'), - ('planet'), - ('pocket'), - ('police'), - ('popular'), - ('prefer'), - ('presto'), - ('private'), - ('project'), - ('proxy'), - ('python'), - ('quota'), - ('rainbow'), - ('raymond'), - ('region'), - ('report'), - ('reward'), - ('risk'), - ('robot'), - ('rose'), - ('russian'), - ('sailor'), - ('salt'), - ('saturn'), - ('scorpio'), - ('second'), - ('seminar'), - ('shadow'), - ('shave'), - ('shock'), - ('silence'), - ('sinatra'), - ('sleep'), - ('social'), - ('sonata'), - ('spain'), - ('sphere'), - ('spray'), - ('state'), - ('stone'), - ('strong'), - ('sugar'), - ('supreme'), - ('swing'), - ('talent'), - ('telecom'), - ('thermos'), - ('tina'), - ('tommy'), - ('torso'), - ('trade'), - ('trick'), - ('tropic'), - ('turtle'), - ('uniform'), - ('user'), - ('vega'), - ('vertigo'), - ('village'), - ('visible'), - ('vocal'), - ('voyage'), - ('weekend'), - ('winter'), - ('year'), - ('zipper') - ; - SELECT editdist3('cost1'); - - - SELECT editdist3(a.x,b.x), a.x, b.x - FROM words a, words b - WHERE a.x5000; - - - SELECT * FROM sqlite_stmt WHERE NOT busy; - diff --git a/libsql-wal/tests/assets/fixtures/strict1.test b/libsql-wal/tests/assets/fixtures/strict1.test deleted file mode 100644 index 39b0e12f72..0000000000 --- a/libsql-wal/tests/assets/fixtures/strict1.test +++ /dev/null @@ -1,64 +0,0 @@ - - CREATE TABLE t1( - a INT, - b INTEGER, - c BLOB, - d TEXT, - e REAL - ) STRICT; - - - SELECT strict FROM pragma_table_list('t1'); - - - INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null); - SELECT a, b, '|' FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(c) VALUES(x'313233'), (NULL); - SELECT typeof(c), c FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(d) VALUES('xyz'),(4),(5.5),(NULL); - SELECT typeof(d), d FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(e) VALUES(1),(2.5),('3'),('4.5'),(6.0),(NULL); - SELECT typeof(e), e FROM t1; - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4( - a INT AS (b*2) VIRTUAL, - b INT AS (c*2) STORED, - c INT PRIMARY KEY - ) STRICT; - INSERT INTO t4(c) VALUES(1); - SELECT * FROM t4; - - - CREATE TABLE csv_import_table ( - "debit" TEXT, - "credit" TEXT - ); - INSERT INTO csv_import_table VALUES ('', '250.00'); - CREATE TABLE IF NOT EXISTS transactions ( - debit REAL, - credit REAL, - amount REAL GENERATED ALWAYS AS (ifnull(credit, 0.0) - ifnull(debit, 0.0)) - ) STRICT; - INSERT INTO transactions - SELECT - nullif(debit, '') AS debit, - nullif(credit, '') AS credit - FROM csv_import_table; - SELECT * FROM transactions; - - - CREATE TABLE t1(x REAL, y REAL AS (x)) STRICT; - INSERT INTO t1 VALUES(5),(4611686018427387904); - SELECT *, '|' FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/strict2.test b/libsql-wal/tests/assets/fixtures/strict2.test deleted file mode 100644 index 5f158f22c6..0000000000 --- a/libsql-wal/tests/assets/fixtures/strict2.test +++ /dev/null @@ -1,126 +0,0 @@ - - CREATE TABLE t1( - a INT, - b INTEGER, - c TEXT, - d REAL, - e BLOB - ) STRICT; - CREATE TABLE t1nn( - a INT NOT NULL, - b INTEGER NOT NULL, - c TEXT NOT NULL, - d REAL NOT NULL, - e BLOB NOT NULL - ) STRICT; - CREATE TABLE t2(a,b,c,d,e); - INSERT INTO t1(a,b,c,d,e) VALUES(1,1,'one',1.0,x'b1'),(2,2,'two',2.25,x'b2b2b2'); - PRAGMA writable_schema=on; - UPDATE sqlite_schema SET rootpage=(SELECT rootpage FROM sqlite_schema WHERE name='t1'); - - - PRAGMA quick_check('t1'); - - - UPDATE t2 SET a=2.5 WHERE b=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET a='xyz' WHERE b=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET a=x'445566' WHERE b=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET a=2.5 WHERE b=2; - PRAGMA quick_check('t1nn'); - - - UPDATE t2 SET a='xyz' WHERE b=2; - PRAGMA quick_check('t1nn'); - - - UPDATE t2 SET a=x'445566' WHERE b=2; - PRAGMA quick_check('t1nn'); - - - UPDATE t2 SET a=2 WHERE b=2; - UPDATE t2 SET b=2.5 WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET b='two' WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET b=x'b0b1b2b3b4' WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET b=NULL WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET b=2.5 WHERE a=2; - PRAGMA quick_check('t1nn'); - - - UPDATE t2 SET b=NULL WHERE a=2; - PRAGMA quick_check('t1nn'); - - - UPDATE t2 SET b=2 WHERE a=2; - UPDATE t2 SET c=9 WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET c=9.5 WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET c=x'b0b1b2b3b4' WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET c='two' WHERE a=2; - UPDATE t2 SET d=9 WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET d='nine' WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET d=x'b0b1b2b3b4' WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET d=2.5 WHERE a=2; - UPDATE t2 SET e=9 WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET e=9.5 WHERE a=2; - PRAGMA quick_check('t1'); - - - UPDATE t2 SET e='hello' WHERE a=2; - PRAGMA quick_check('t1'); - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INT, b ANY) STRICT; - INSERT INTO t2(a,b) VALUES(1,2),(3,4.5),(5,'six'),(7,x'8888'),(9,NULL); - PRAGMA integrity_check(t2); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(id ANY PRIMARY KEY, x TEXT); - INSERT INTO t1 VALUES(1,2),('three','four'),(x'5555','six'),(NULL,'eight'); - PRAGMA writable_schema=ON; - UPDATE sqlite_schema SET sql=(sql||'STRICT') WHERE name='t1'; - PRAGMA writable_schema=RESET; - PRAGMA integrity_check(t1); - diff --git a/libsql-wal/tests/assets/fixtures/subjournal.test b/libsql-wal/tests/assets/fixtures/subjournal.test deleted file mode 100644 index 714300f1ee..0000000000 --- a/libsql-wal/tests/assets/fixtures/subjournal.test +++ /dev/null @@ -1,33 +0,0 @@ - - PRAGMA temp_store = memory; - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(1, 2, 3); - - - BEGIN; - INSERT INTO t1 VALUES(4, 5, 6); - SAVEPOINT one; - INSERT INTO t1 VALUES(7, 8, 9); - ROLLBACK TO one; - SELECT * FROM t1; - - - COMMIT; - - - PRAGMA cache_size = 5; - CREATE TABLE t2(a BLOB); - CREATE INDEX i2 ON t2(a); - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 - ) INSERT INTO t2 SELECT randomblob(500) FROM s; - - - BEGIN; - UPDATE t2 SET a=randomblob(499); - SAVEPOINT two; - UPDATE t2 SET a=randomblob(498); - ROLLBACK TO two; - COMMIT; - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/subquery.test b/libsql-wal/tests/assets/fixtures/subquery.test deleted file mode 100644 index fa93c630a8..0000000000 --- a/libsql-wal/tests/assets/fixtures/subquery.test +++ /dev/null @@ -1,30 +0,0 @@ - - CREATE TABLE t8(a TEXT, b INT); - SELECT (SELECT 0 FROM (SELECT * FROM t1)) AS x WHERE x; - SELECT (SELECT 0 FROM (SELECT * FROM (SELECT 0))) AS x WHERE x; - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1),(1),(1); - SELECT (SELECT DISTINCT x FROM t1 ORDER BY +x LIMIT 1 OFFSET 100) FROM t1; - - - SELECT (SELECT DISTINCT x FROM t1 ORDER BY +x LIMIT 1 OFFSET 0) FROM t1; - - - INSERT INTO t1 VALUES(2); - SELECT (SELECT DISTINCT x FROM t1 ORDER BY +x LIMIT 1 OFFSET 1) FROM t1; - - - SELECT (SELECT DISTINCT x FROM t1 ORDER BY +x LIMIT 1 OFFSET 2) FROM t1; - - - CREATE TABLE t1(aa TEXT, bb INT, cc TEXT); - CREATE INDEX x11 on t1(bb); - CREATE INDEX x12 on t1(aa); - CREATE TABLE t2(aa TEXT, xx INT); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES('t1', 'x11', '156789 28'); - INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES('t1', 'x12', '156789 1'); - ANALYZE sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/subquery2.test b/libsql-wal/tests/assets/fixtures/subquery2.test deleted file mode 100644 index 1fbed9e850..0000000000 --- a/libsql-wal/tests/assets/fixtures/subquery2.test +++ /dev/null @@ -1,72 +0,0 @@ - - CREATE TABLE t4(a, b); - CREATE TABLE t5(a, b); - INSERT INTO t5 VALUES(3, 5); - - INSERT INTO t4 VALUES(1, 1); - INSERT INTO t4 VALUES(2, 3); - INSERT INTO t4 VALUES(3, 6); - INSERT INTO t4 VALUES(4, 10); - INSERT INTO t4 VALUES(5, 15); - - - SELECT * - FROM (SELECT * FROM t4 ORDER BY a LIMIT -1 OFFSET 1) - LIMIT (SELECT a FROM t5) - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1 (id INTEGER PRIMARY KEY, data TEXT); - INSERT INTO t1(id,data) VALUES(9,'nine-a'); - INSERT INTO t1(id,data) VALUES(10,'ten-a'); - INSERT INTO t1(id,data) VALUES(11,'eleven-a'); - CREATE TABLE t2 (id INTEGER PRIMARY KEY, data TEXT); - INSERT INTO t2(id,data) VALUES(9,'nine-b'); - INSERT INTO t2(id,data) VALUES(10,'ten-b'); - INSERT INTO t2(id,data) VALUES(11,'eleven-b'); - - SELECT id FROM ( - SELECT id,data FROM ( - SELECT * FROM t1 UNION ALL SELECT * FROM t2 - ) - WHERE id=10 ORDER BY data - ); - - - SELECT data FROM ( - SELECT 'dummy', data FROM ( - SELECT data FROM t1 UNION ALL SELECT data FROM t1 - ) ORDER BY data - ); - - - DROP TABLE IF EXISTS t3; - DROP TABLE IF EXISTS t4; - CREATE TABLE t3(id INTEGER, data TEXT); - CREATE TABLE t4(id INTEGER, data TEXT); - INSERT INTO t3 VALUES(4, 'a'),(2,'c'); - INSERT INTO t4 VALUES(3, 'b'),(1,'d'); - - SELECT data, id FROM ( - SELECT id, data FROM ( - SELECT * FROM t3 UNION ALL SELECT * FROM t4 - ) ORDER BY data - ); - - - CREATE TABLE t6(x); - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('ALFKI'); - INSERT INTO t1 VALUES('ANATR'); - - CREATE TABLE t2(y, z); - CREATE INDEX t2y ON t2 (y); - INSERT INTO t2 VALUES('ANATR', '1997-08-08 00:00:00'); - INSERT INTO t2 VALUES('ALFKI', '1997-08-25 00:00:00'); - - - SELECT ( SELECT y FROM t2 WHERE x = y ORDER BY y, z) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/subselect.test b/libsql-wal/tests/assets/fixtures/subselect.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/substr.test b/libsql-wal/tests/assets/fixtures/substr.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/subtype1.test b/libsql-wal/tests/assets/fixtures/subtype1.test deleted file mode 100644 index a3f685231e..0000000000 --- a/libsql-wal/tests/assets/fixtures/subtype1.test +++ /dev/null @@ -1,43 +0,0 @@ - - SELECT test_getsubtype('hello'); - - - SELECT test_getsubtype(test_setsubtype('hello',123)); - - - SELECT typeof(test_setsubtype('hello',123)); - - - SELECT test_setsubtype('hello',123); - - - CREATE TABLE t1(a); INSERT INTO t1 VALUES ('x'); - CREATE VIEW t2(b) AS SELECT json(TRUE); - CREATE TABLE t3(b); INSERT INTO t3 VALUES(json(TRUE)); - - - SELECT * FROM t3, t1 WHERE NOT json_quote(b); - - - SELECT * FROM t2, t1 WHERE NOT json_quote(b); - - - WITH t4(a) AS MATERIALIZED (SELECT json(1)) SELECT subtype(a) FROM t4; - - - WITH t4(a) AS NOT MATERIALIZED (SELECT json(1)) SELECT subtype(a) FROM t4; - - - CREATE TABLE t0(c0); - INSERT INTO t0 VALUES ('1'); - CREATE VIEW v0(c0) AS SELECT CASE WHEN 1 THEN json_patch('1', '1') END - FROM t0 GROUP BY t0.c0; - SELECT * FROM v0 WHERE json_quote(v0.c0) != '1'; - - - SELECT *, json_quote(y) FROM (SELECT +json('1') AS y); - - - SELECT *, json_quote(y) FROM (SELECT +json('1') AS y) - WHERE json_quote(y)='"1"'; - diff --git a/libsql-wal/tests/assets/fixtures/superlock.test b/libsql-wal/tests/assets/fixtures/superlock.test deleted file mode 100644 index 0cb836051c..0000000000 --- a/libsql-wal/tests/assets/fixtures/superlock.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - PRAGMA journal_mode = DELETE; - - - INSERT INTO t1 VALUES(3, 4); - PRAGMA journal_mode = WAL; - - INSERT INTO t1 VALUES(3, 4) - PRAGMA wal_checkpoint - - ATTACH 'test.db2' AS aux; - PRAGMA aux.journal_mode = wal; - CREATE TABLE aux.t2(x, y); - INSERT INTO aux.t2 VALUES('a', 'b'); - PRAGMA schema_version = 450; - DETACH aux; - - PRAGMA main.journal_mode = wal; - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/swarmvtab.test b/libsql-wal/tests/assets/fixtures/swarmvtab.test deleted file mode 100644 index 800cbc244c..0000000000 --- a/libsql-wal/tests/assets/fixtures/swarmvtab.test +++ /dev/null @@ -1,32 +0,0 @@ - - CREATE TABLE t0(a INTEGER PRIMARY KEY, b TEXT); - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<400) - INSERT INTO t0 SELECT i, hex(randomblob(50)) FROM s; - - CREATE TABLE dir(f, t, imin, imax); - - - DROP TABLE s1; - - - CREATE VIRTUAL TABLE temp.s1 USING swarmvtab('SELECT * FROM dir'); - SELECT count(*) FROM s1 WHERE rowid<50; - - - SELECT count(*) FROM s1 a, s1 b, s1 c - WHERE a.rowid=b.rowid AND b.rowid=c.rowid; - - - ATTACH 'test.db1' AS aux; - CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b); - INSERT INTO aux.t1 VALUES(1, NULL); - INSERT INTO aux.t1 VALUES(2, NULL); - INSERT INTO aux.t1 VALUES(9, NULL); - DETACH aux; - CREATE VIRTUAL TABLE temp.xyz USING swarmvtab( - 'VALUES - (''test.db1'', ''t1'', 1, 10), - (''test.db2'', ''t1'', 11, 20) - ', 'fetch_db' - ); - diff --git a/libsql-wal/tests/assets/fixtures/swarmvtab2.test b/libsql-wal/tests/assets/fixtures/swarmvtab2.test deleted file mode 100644 index c460892e38..0000000000 --- a/libsql-wal/tests/assets/fixtures/swarmvtab2.test +++ /dev/null @@ -1,17 +0,0 @@ - - CREATE TABLE t1(filename, tablename, istart, iend); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<99) - INSERT INTO t1 SELECT printf('test%03d.db',x),'t2',x*1000,x*1000+999 FROM c; - CREATE VIRTUAL TABLE temp.v1 USING swarmvtab( - 'SELECT * FROM t1', 'create_database' - ); - - - SELECT b FROM v1 WHERE a=3875; - - - SELECT b FROM v1 WHERE a BETWEEN 3999 AND 4000 ORDER BY a; - - - SELECT b FROM v1 WHERE a>=99998; - diff --git a/libsql-wal/tests/assets/fixtures/swarmvtab3.test b/libsql-wal/tests/assets/fixtures/swarmvtab3.test deleted file mode 100644 index 1123cfd844..0000000000 --- a/libsql-wal/tests/assets/fixtures/swarmvtab3.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TEMP TABLE swarm(id, tbl, minval, maxval); - - - DROP TABLE IF EXISTS swarm; - CREATE TEMP TABLE swarm(file, tbl, minval, maxval, ctx); - diff --git a/libsql-wal/tests/assets/fixtures/swarmvtabfault.test b/libsql-wal/tests/assets/fixtures/swarmvtabfault.test deleted file mode 100644 index 099192196b..0000000000 --- a/libsql-wal/tests/assets/fixtures/swarmvtabfault.test +++ /dev/null @@ -1,8 +0,0 @@ - - ATTACH 'test.db1' AS aux; - CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b); - INSERT INTO aux.t1 VALUES(1, NULL); - INSERT INTO aux.t1 VALUES(2, NULL); - INSERT INTO aux.t1 VALUES(9, NULL); - DETACH aux; - diff --git a/libsql-wal/tests/assets/fixtures/symlink.test b/libsql-wal/tests/assets/fixtures/symlink.test deleted file mode 100644 index 4803b48775..0000000000 --- a/libsql-wal/tests/assets/fixtures/symlink.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE t1(x, y); - - - CREATE TABLE xyz(x, y, z); - INSERT INTO xyz VALUES(1, 2, 3); - diff --git a/libsql-wal/tests/assets/fixtures/symlink2.test b/libsql-wal/tests/assets/fixtures/symlink2.test deleted file mode 100644 index 758bde7ca8..0000000000 --- a/libsql-wal/tests/assets/fixtures/symlink2.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1,9999); - diff --git a/libsql-wal/tests/assets/fixtures/sync.test b/libsql-wal/tests/assets/fixtures/sync.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/sync2.test b/libsql-wal/tests/assets/fixtures/sync2.test deleted file mode 100644 index aba7596aaf..0000000000 --- a/libsql-wal/tests/assets/fixtures/sync2.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - - PRAGMA journal_mode = delete - PRAGMA journal_mode = wal - PRAGMA journal_mode = delete diff --git a/libsql-wal/tests/assets/fixtures/syscall.test b/libsql-wal/tests/assets/fixtures/syscall.test deleted file mode 100644 index 7ec4817149..0000000000 --- a/libsql-wal/tests/assets/fixtures/syscall.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t2(x, y); - INSERT INTO t2 VALUES(3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/sysfault.test b/libsql-wal/tests/assets/fixtures/sysfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tabfunc01.test b/libsql-wal/tests/assets/fixtures/tabfunc01.test deleted file mode 100644 index a0d87e2e14..0000000000 --- a/libsql-wal/tests/assets/fixtures/tabfunc01.test +++ /dev/null @@ -1,79 +0,0 @@ - - SELECT *, '|' FROM generate_series WHERE start=1 AND stop=9 AND step=2; - - - PRAGMA table_xinfo(generate_series); - - - SELECT *, '|' FROM generate_series(0) LIMIT 5; - - - SELECT * FROM generate_series(1,9,2); - - - SELECT * FROM generate_series(1,9); - - - SELECT * FROM generate_series(1,10) WHERE step=3; - - - SELECT * FROM generate_series(0,32,5) ORDER BY rowid DESC; - - - SELECT rowid, * FROM generate_series(0,32,5) ORDER BY value DESC; - - - SELECT rowid, * FROM generate_series(0,32,5) ORDER BY +value DESC; - - - CREATE VIEW v1(a,b) AS VALUES(1,2),(3,4); - SELECT * FROM v1; - - - CREATE VIEW v2(x) AS SELECT value FROM generate_series(1,5); - SELECT * FROM v2; - - - CREATE TABLE t0(x); - INSERT INTO t0(x) VALUES(123),(456),(789); - SELECT * FROM t0 ORDER BY x; - - - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES(2),(3); - SELECT *, '|' FROM t1, generate_series(1,x) ORDER BY 1, 2 - - - SELECT *, '|' FROM (SELECT x FROM t1) AS y, generate_series(1,y.x) - ORDER BY 1, 2; - - - SELECT * FROM generate_series(0) LIMIT 5; - - - SELECT DISTINCT value FROM generate_series(1,x), t1 ORDER BY 1; - - - SELECT * FROM main.generate_series(1,4) - - - SELECT * FROM temp.generate_series(1,4) - - - ATTACH ':memory:' AS aux1; - CREATE TABLE aux1.t1(a,b,c); - SELECT * FROM aux1.generate_series(1,4) - - - SELECT * FROM (generate_series(1,5,2)) AS x LIMIT 10; - - - SELECT * FROM generate_series WHERE start IN (1,7) AND stop=20 AND step=10 - ORDER BY +1; - - - CREATE TABLE t600(a INTEGER PRIMARY KEY, b TEXT); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) - INSERT INTO t600(a,b) SELECT x, printf('(%03d)',x) FROM c; - SELECT b FROM t600 WHERE a IN generate_series(2,52,10); - diff --git a/libsql-wal/tests/assets/fixtures/table.test b/libsql-wal/tests/assets/fixtures/table.test deleted file mode 100644 index 3d43e42b9d..0000000000 --- a/libsql-wal/tests/assets/fixtures/table.test +++ /dev/null @@ -1,31 +0,0 @@ - - CREATE TABLE t16(x DEFAULT(max(1))); - INSERT INTO t16(x) VALUES(123); - SELECT rowid, x FROM t16; - - - DROP TABLE t16; - CREATE TABLE t16(x DEFAULT(abs(1))); - INSERT INTO t16(rowid) VALUES(4); - SELECT rowid, x FROM t16; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a TEXT); - INSERT INTO t1(a) VALUES(1),(2); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x TEXT, y TEXT); - INSERT INTO t2(x,y) VALUES(3,4); - DROP TABLE IF EXISTS t3; - CREATE TABLE t3 AS - SELECT a AS p, coalesce(y,a) AS q FROM t1 LEFT JOIN t2 ON a=x; - SELECT p, q, '|' FROM t3 ORDER BY p; - - - COMMIT; - PRAGMA integrity_check; - - - CREATE TABLE t19 AS SELECT * FROM sqlite_master; - SELECT name FROM t19 ORDER BY name; - diff --git a/libsql-wal/tests/assets/fixtures/tableapi.test b/libsql-wal/tests/assets/fixtures/tableapi.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tableopts.test b/libsql-wal/tests/assets/fixtures/tableopts.test deleted file mode 100644 index 85e9eb97fc..0000000000 --- a/libsql-wal/tests/assets/fixtures/tableopts.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE TABLE t1(a, b, c, PRIMARY KEY(a,b)) WITHOUT rowid; - INSERT INTO t1 VALUES(1,2,3),(2,3,4); - SELECT c FROM t1 WHERE a IN (1,2) ORDER BY b; - - - VACUUM; - SELECT c FROM t1 WHERE a IN (1,2) ORDER BY b; - - - CREATE TABLE without(x INTEGER PRIMARY KEY, without TEXT); - INSERT INTO without VALUES(1, 'xyzzy'), (2, 'fizzle'); - SELECT * FROM without WHERE without='xyzzy'; - diff --git a/libsql-wal/tests/assets/fixtures/tclsqlite.test b/libsql-wal/tests/assets/fixtures/tclsqlite.test deleted file mode 100644 index e7948df0b9..0000000000 --- a/libsql-wal/tests/assets/fixtures/tclsqlite.test +++ /dev/null @@ -1,53 +0,0 @@ - - CREATE TABLE t6(x); - INSERT INTO t6 VALUES(1); - - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,2),(2,NULL),(3,'xyz'); - - - SELECT quote( add_i(2, 3) ); - SELECT quote( add_r(2, 3) ); - SELECT quote( add_t(2, 3) ); - SELECT quote( add_b(2, 3) ); - SELECT quote( add_a(2, 3) ); - - - SELECT quote( add_i(2.2, 3.3) ); - SELECT quote( add_r(2.2, 3.3) ); - SELECT quote( add_t(2.2, 3.3) ); - SELECT quote( add_b(2.2, 3.3) ); - SELECT quote( add_a(2.2, 3.3) ); - - - SELECT quote( ret_i(2.5) ); - SELECT quote( ret_r(2.5) ); - SELECT quote( ret_t(2.5) ); - SELECT quote( ret_b(2.5) ); - SELECT quote( ret_a(2.5) ); - - - SELECT quote( ret_i('2.5') ); - SELECT quote( ret_r('2.5') ); - SELECT quote( ret_t('2.5') ); - SELECT quote( ret_b('2.5') ); - SELECT quote( ret_a('2.5') ); - - - SELECT quote( ret_i('abc') ); - SELECT quote( ret_r('abc') ); - SELECT quote( ret_t('abc') ); - SELECT quote( ret_b('abc') ); - SELECT quote( ret_a('abc') ); - - - SELECT quote( ret_i(X'616263') ); - SELECT quote( ret_r(X'616263') ); - SELECT quote( ret_t(X'616263') ); - SELECT quote( ret_b(X'616263') ); - SELECT quote( ret_a(X'616263') ); - - - SELECT typeof($mno); - diff --git a/libsql-wal/tests/assets/fixtures/tempdb.test b/libsql-wal/tests/assets/fixtures/tempdb.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tempdb2.test b/libsql-wal/tests/assets/fixtures/tempdb2.test deleted file mode 100644 index 084d959c6b..0000000000 --- a/libsql-wal/tests/assets/fixtures/tempdb2.test +++ /dev/null @@ -1,42 +0,0 @@ - - PRAGMA page_size=1024; - PRAGMA cache_size=50; - - BEGIN; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, int2str(1)); - INSERT INTO t1 VALUES(2, int2str(1)); - INSERT INTO t1 VALUES(3, int2str(1)); - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b); - WITH c(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100 ) - INSERT INTO t2 SELECT x, int2str(x) FROM c; - COMMIT; - - PRAGMA lock_status; - - - UPDATE t1 SET b=int2str(2); - SELECT b=int2str(2) FROM t1 - - - BEGIN; - DELETE FROM t1; - UPDATE t2 SET b=int2str(a+1); - ROLLBACK; - - - SELECT b=int2str(2) FROM t1 - - - PRAGMA cache_size = -100; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - WITH c(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100 ) - INSERT INTO t1 SELECT x, int2str(x) FROM c; - - - INSERT INTO t1 VALUES(10001, int2str(1001) || int2str(1001) || int2str(1001)); - - - SELECT b FROM t1 WHERE a = 10001; - diff --git a/libsql-wal/tests/assets/fixtures/tempfault.test b/libsql-wal/tests/assets/fixtures/tempfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/temptable.test b/libsql-wal/tests/assets/fixtures/temptable.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/temptable2.test b/libsql-wal/tests/assets/fixtures/temptable2.test deleted file mode 100644 index b4159ce2b0..0000000000 --- a/libsql-wal/tests/assets/fixtures/temptable2.test +++ /dev/null @@ -1,172 +0,0 @@ - - CREATE TEMP TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - - - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100000 ) - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM X; - - - PRAGMA temp.integrity_check; - - - CREATE TEMP TABLE t2(a, b); - INSERT INTO t2 VALUES(1, 2); - - - BEGIN; - INSERT INTO t2 VALUES(3, 4); - SELECT * FROM t2; - - - ROLLBACK; - SELECT * FROM t2; - - - PRAGMA main.cache_size = 10; - PRAGMA temp.cache_size = 10; - - CREATE TEMP TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 ) - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x; - - SELECT count(*) FROM t1; - - - BEGIN; - UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0; - ROLLBACK; - - - SELECT count(*) FROM t1; - - PRAGMA temp.integrity_check - - BEGIN; - UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0; - SAVEPOINT abc; - UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==1; - ROLLBACK TO abc; - UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==2; - COMMIT; - - PRAGMA temp.integrity_check - - PRAGMA main.cache_size = 10; - PRAGMA temp.cache_size = 10; - - CREATE TEMP TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<10 ) - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x; - - SELECT count(*) FROM t1; - PRAGMA temp.page_count; - - - BEGIN; - UPDATE t1 SET b=randomblob(100); - ROLLBACK; - - - CREATE TEMP TABLE t2(a, b); - CREATE INDEX i2 ON t2(a, b); - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x; - - SELECT count(*) FROM t2; - SELECT count(*) FROM t1; - - PRAGMA temp.integrity_check - - PRAGMA main.cache_size = 10; - PRAGMA temp.cache_size = 10; - - CREATE TEMP TABLE t2(a, b); - CREATE INDEX i2 ON t2(a, b); - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x; - - CREATE TEMP TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - INSERT INTO t1 VALUES(1, 2); - - - BEGIN; - UPDATE t1 SET a=2; - UPDATE t2 SET a=randomblob(100); - SELECT count(*) FROM t1; - ROLLBACK; - - - UPDATE t2 SET a=randomblob(100); - - SELECT * FROM t1; - - PRAGMA temp.integrity_check - - PRAGMA main.cache_size = 10; - PRAGMA temp.cache_size = 10; - - CREATE TEMP TABLE t1(x); - INSERT INTO t1 VALUES('one'); - - CREATE TEMP TABLE t2(a, b); - CREATE INDEX i2 ON t2(a, b); - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x; - - - UPDATE t1 SET x='two'; -- step 1 - BEGIN; - UPDATE t2 SET a=randomblob(100); -- step 2 - SELECT * FROM t1; -- step 3 - ROLLBACK; -- step 4 - - SELECT count(*) FROM t2; - SELECT * FROM t1; - - - PRAGMA auto_vacuum=INCREMENTAL; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(zeroblob(900)); - INSERT INTO t1 VALUES(zeroblob(900)); - INSERT INTO t1 SELECT x FROM t1; - INSERT INTO t1 SELECT x FROM t1; - INSERT INTO t1 SELECT x FROM t1; - INSERT INTO t1 SELECT x FROM t1; - BEGIN; - DELETE FROM t1 WHERE rowid%2; - PRAGMA incremental_vacuum(4); - ROLLBACK; - PRAGMA integrity_check; - - - PRAGMA auto_vacuum = OFF; - CREATE TABLE t2(a, b); - CREATE INDEX i2 ON t2(a, b); - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<20 ) - INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2; - PRAGMA page_count; - - - PRAGMA cache_size = 50; - PRAGMA page_size = 1024; - CREATE TABLE t1(a, b, PRIMARY KEY(a)) WITHOUT ROWID; - CREATE INDEX i1 ON t1(a); - CREATE TABLE t2(x, y); - INSERT INTO t2 VALUES(1, 2); - - - BEGIN; - WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) - INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x; - COMMIT; - INSERT INTO t2 VALUES(3, 4); - - PRAGMA mmap_size = 512000 - SELECT * FROM t2 - PRAGMA integrity_check diff --git a/libsql-wal/tests/assets/fixtures/temptable3.test b/libsql-wal/tests/assets/fixtures/temptable3.test deleted file mode 100644 index 2d86d40947..0000000000 --- a/libsql-wal/tests/assets/fixtures/temptable3.test +++ /dev/null @@ -1,19 +0,0 @@ - - PRAGMA cache_size = 1; - PRAGMA page_size = 1024; - PRAGMA auto_vacuum = 2; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES( randomblob(800) ); - INSERT INTO t1 VALUES( randomblob(800) ); - CREATE TABLE t2(x); - PRAGMA integrity_check; - - - PRAGMA cache_size = 1; - PRAGMA auto_vacuum = 2; - CREATE TABLE t1(x); - CREATE TABLE t2(x UNIQUE); - INSERT INTO t2 VALUES(1), (2), (3); - DROP TABLE t1; - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/temptrigger.test b/libsql-wal/tests/assets/fixtures/temptrigger.test deleted file mode 100644 index 4042644bce..0000000000 --- a/libsql-wal/tests/assets/fixtures/temptrigger.test +++ /dev/null @@ -1,28 +0,0 @@ - - CREATE TABLE t1(x); - CREATE TEMP TRIGGER tr1 BEFORE INSERT ON t1 BEGIN - SELECT 1,2,3; - END; - - - CREATE TEMP TABLE t1(x); - - - CREATE TABLE t1(x); - CREATE TEMP TRIGGER tr1 BEFORE INSERT ON t1 BEGIN SELECT 1,2,3; END; - - - SELECT * FROM sqlite_master; - SELECT * FROM temp.sqlite_master; - - - CREATE TABLE t1(x); - CREATE TEMP TRIGGER tr1 BEFORE INSERT ON t1 BEGIN - SELECT raise(ABORT, 'error'); - END; - ATTACH 'test.db2' AS aux; - - - SELECT type,name,tbl_name,sql FROM aux.sqlite_master; - INSERT INTO aux.t1 VALUES(1,2,3); - diff --git a/libsql-wal/tests/assets/fixtures/thread001.test b/libsql-wal/tests/assets/fixtures/thread001.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread002.test b/libsql-wal/tests/assets/fixtures/thread002.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread003.test b/libsql-wal/tests/assets/fixtures/thread003.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread004.test b/libsql-wal/tests/assets/fixtures/thread004.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread005.test b/libsql-wal/tests/assets/fixtures/thread005.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread1.test b/libsql-wal/tests/assets/fixtures/thread1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread2.test b/libsql-wal/tests/assets/fixtures/thread2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/thread3.test b/libsql-wal/tests/assets/fixtures/thread3.test deleted file mode 100644 index 8dddaec86c..0000000000 --- a/libsql-wal/tests/assets/fixtures/thread3.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(a, b); - PRAGMA journal_mode = DELETE; - diff --git a/libsql-wal/tests/assets/fixtures/timediff1.test b/libsql-wal/tests/assets/fixtures/timediff1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-02a8e81d44.test b/libsql-wal/tests/assets/fixtures/tkt-02a8e81d44.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-18458b1a.test b/libsql-wal/tests/assets/fixtures/tkt-18458b1a.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-26ff0c2d1e.test b/libsql-wal/tests/assets/fixtures/tkt-26ff0c2d1e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-2a5629202f.test b/libsql-wal/tests/assets/fixtures/tkt-2a5629202f.test deleted file mode 100644 index 8eb4ae1b37..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-2a5629202f.test +++ /dev/null @@ -1,24 +0,0 @@ - - CREATE TABLE t8(b TEXT, c TEXT); - INSERT INTO t8 VALUES('a', 'one'); - INSERT INTO t8 VALUES('b', 'two'); - INSERT INTO t8 VALUES(NULL, 'three'); - INSERT INTO t8 VALUES(NULL, 'four'); - - - SELECT coalesce(b, 'null') || '/' || c FROM t8 x ORDER BY x.b, x.c - - - CREATE UNIQUE INDEX i1 ON t8(b); - SELECT coalesce(b, 'null') || '/' || c FROM t8 x ORDER BY x.b, x.c - - - DROP INDEX i1; - CREATE UNIQUE INDEX i1 ON t8(b, c); - SELECT coalesce(b, 'null') || '/' || c FROM t8 x ORDER BY x.b, x.c - - - CREATE TABLE t2(a, b NOT NULL, c); - CREATE UNIQUE INDEX t2ab ON t2(a, b); - CREATE UNIQUE INDEX t2ba ON t2(b, a); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-2d1a5c67d.test b/libsql-wal/tests/assets/fixtures/tkt-2d1a5c67d.test deleted file mode 100644 index 248ad68386..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-2d1a5c67d.test +++ /dev/null @@ -1,19 +0,0 @@ - - PRAGMA cache_size = 10; - CREATE TABLE t3(a INTEGER PRIMARY KEY, b); - CREATE TABLE t4(a); - - - INSERT INTO t3 VALUES(NULL, randomblob(500)); - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 2 - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 4 - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 8 - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 16 - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 32 - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 64 - INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 128 - - - BEGIN; - INSERT INTO t4 VALUES('xyz'); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-2ea2425d34.test b/libsql-wal/tests/assets/fixtures/tkt-2ea2425d34.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-31338dca7e.test b/libsql-wal/tests/assets/fixtures/tkt-31338dca7e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-313723c356.test b/libsql-wal/tests/assets/fixtures/tkt-313723c356.test deleted file mode 100644 index 897798206c..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-313723c356.test +++ /dev/null @@ -1,11 +0,0 @@ - - PRAGMA page_size = 1024; - PRAGMA journal_mode = WAL; - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - INSERT INTO t1 VALUES(randomblob(400), randomblob(400)); - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1; - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1; - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1; - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-385a5b56b9.test b/libsql-wal/tests/assets/fixtures/tkt-385a5b56b9.test deleted file mode 100644 index cd5f3c4e89..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-385a5b56b9.test +++ /dev/null @@ -1,14 +0,0 @@ - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, NULL); - INSERT INTO t1 VALUES(2, NULL); - INSERT INTO t1 VALUES(1, NULL); - - SELECT DISTINCT x, y FROM t1 ; - CREATE UNIQUE INDEX i1 ON t1(x, y) ; - SELECT DISTINCT x, y FROM t1 ; - - CREATE TABLE t2(x, y NOT NULL); - CREATE UNIQUE INDEX t2x ON t2(x); - CREATE UNIQUE INDEX t2y ON t2(y); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-38cb5df375.test b/libsql-wal/tests/assets/fixtures/tkt-38cb5df375.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-3998683a16.test b/libsql-wal/tests/assets/fixtures/tkt-3998683a16.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-3a77c9714e.test b/libsql-wal/tests/assets/fixtures/tkt-3a77c9714e.test deleted file mode 100644 index cb3de3268c..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-3a77c9714e.test +++ /dev/null @@ -1,53 +0,0 @@ - - CREATE TABLE t1(t1_id INTEGER PRIMARY KEY, t1_title TEXT); - CREATE TABLE t2(t2_id INTEGER PRIMARY KEY, t2_title TEXT); - CREATE TABLE t3(t3_id INTEGER PRIMARY KEY, t3_title TEXT); - - INSERT INTO t1 (t1_id, t1_title) VALUES (888, 'ABCDEF'); - INSERT INTO t2 (t2_id, t2_title) VALUES (999, 'ABCDEF'); - INSERT INTO t3 (t3_id, t3_title) VALUES (999, 'ABCDEF'); - - - SELECT t1_title, t2_title - FROM t1 LEFT JOIN t2 - WHERE - t2_id = (SELECT t3_id FROM - ( SELECT t3_id FROM t3 WHERE t3_title=t1_title LIMIT 500 ) - ) - - - CREATE TABLE [Beginnings] ( - [Id] INTEGER PRIMARY KEY AUTOINCREMENT,[Title] TEXT, [EndingId] INTEGER - ); - CREATE TABLE [Endings] (Id INT,Title TEXT,EndingId INT); - INSERT INTO Beginnings (Id, Title, EndingId) VALUES (1, 'FACTOR', 18); - INSERT INTO Beginnings (Id, Title, EndingId) VALUES (2, 'SWIMM', 18); - INSERT INTO Endings (Id, Title, EndingId) VALUES (1, 'ING', 18); - - - SELECT - SrcWord, Beginnings.Title - FROM - (SELECT 'FACTORING' AS SrcWord UNION SELECT 'SWIMMING' AS SrcWord ) - LEFT JOIN - Beginnings - WHERE Beginnings.Id= ( - SELECT BeginningId FROM ( - SELECT SrcWord, B.Id as BeginningId, B.Title || E.Title As Connected - FROM Beginnings B LEFT JOIN Endings E ON B.EndingId=E.EndingId - WHERE Connected=SrcWord LIMIT 1 - ) - ) - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(i INT PRIMARY KEY, a, b); - INSERT INTO t1 VALUES(NULL,'one','i'); - CREATE INDEX i1a ON t1(a); - CREATE INDEX i1b ON t1(b); - SELECT (SELECT 1 - FROM (SELECT 1 FROM t1 WHERE a=1 OR b='i') - WHERE a='o' - OR b IN (SELECT a=('b' IN (SELECT 'a')))) - FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-3fe897352e.test b/libsql-wal/tests/assets/fixtures/tkt-3fe897352e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-4a03edc4c8.test b/libsql-wal/tests/assets/fixtures/tkt-4a03edc4c8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-4c86b126f2.test b/libsql-wal/tests/assets/fixtures/tkt-4c86b126f2.test deleted file mode 100644 index db07448e44..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-4c86b126f2.test +++ /dev/null @@ -1,24 +0,0 @@ - - CREATE TABLE nodes( - local_relpath TEXT PRIMARY KEY, - moved_to TEXT - ); - INSERT INTO nodes VALUES('A',NULL); - INSERT INTO nodes VALUES('A/B',NULL); - INSERT INTO nodes VALUES('',NULL); - INSERT INTO nodes VALUES('A/B/C-move',NULL); - INSERT INTO nodes VALUES('A/B/C','A/B/C-move'); - INSERT INTO nodes VALUES('A/B-move',NULL); - INSERT INTO nodes VALUES('A/B-move/C-move',NULL); - INSERT INTO nodes VALUES('A/B-move/C','x'); - SELECT local_relpath, moved_to - FROM nodes - WHERE (local_relpath = 'A/B' OR - ((local_relpath > 'A/B/') AND (local_relpath < 'A/B0'))) - AND moved_to IS NOT NULL; - - - CREATE TABLE t1(x TEXT UNIQUE, y TEXT UNIQUE, z); - INSERT INTO t1 VALUES('ghi','jkl','y'); - SELECT * FROM t1 WHERE (x='ghi' OR y='jkl') AND z IS NOT NULL; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-4dd95f6943.test b/libsql-wal/tests/assets/fixtures/tkt-4dd95f6943.test deleted file mode 100644 index 315cbc3eb4..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-4dd95f6943.test +++ /dev/null @@ -1,26 +0,0 @@ - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES (3), (4), (2), (1), (5), (6); - - - CREATE TABLE t2(x, y); - INSERT INTO t2 VALUES (5, 3), (5, 4), (5, 2), (5, 1), (5, 5), (5, 6); - INSERT INTO t2 VALUES (1, 3), (1, 4), (1, 2), (1, 1), (1, 5), (1, 6); - INSERT INTO t2 VALUES (3, 3), (3, 4), (3, 2), (3, 1), (3, 5), (3, 6); - INSERT INTO t2 VALUES (2, 3), (2, 4), (2, 2), (2, 1), (2, 5), (2, 6); - INSERT INTO t2 VALUES (4, 3), (4, 4), (4, 2), (4, 1), (4, 5), (4, 6); - INSERT INTO t2 VALUES (6, 3), (6, 4), (6, 2), (6, 1), (6, 5), (6, 6); - - CREATE TABLE t3(a, b); - INSERT INTO t3 VALUES (2, 2), (4, 4), (5, 5); - CREATE UNIQUE INDEX t3i1 ON t3(a ASC); - CREATE UNIQUE INDEX t3i2 ON t3(b DESC); - - - CREATE TABLE t7(x); - INSERT INTO t7 VALUES (1), (2), (3); - CREATE INDEX i7 ON t7(x); - - CREATE TABLE t8(y); - INSERT INTO t8 VALUES (1), (2), (3); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-4ef7e3cfca.test b/libsql-wal/tests/assets/fixtures/tkt-4ef7e3cfca.test deleted file mode 100644 index b193c81052..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-4ef7e3cfca.test +++ /dev/null @@ -1,36 +0,0 @@ - - CREATE TABLE w(a); - CREATE TABLE x(a); - CREATE TABLE y(a); - CREATE TABLE z(a); - - INSERT INTO x(a) VALUES(5); - INSERT INTO y(a) VALUES(10); - - CREATE TRIGGER t AFTER INSERT ON w BEGIN - INSERT INTO z - SELECT (SELECT x.a + y.a FROM y) FROM x; - END; - INSERT INTO w VALUES('incorrect'); - - - SELECT * FROM z; - - - CREATE TABLE w(a); - CREATE TABLE x(b); - CREATE TABLE y(a); - CREATE TABLE z(a); - - INSERT INTO x(b) VALUES(5); - INSERT INTO y(a) VALUES(10); - - CREATE TRIGGER t AFTER INSERT ON w BEGIN - INSERT INTO z - SELECT (SELECT x.b + y.a FROM y) FROM x; - END; - INSERT INTO w VALUES('assert'); - - - SELECT * FROM z; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-54844eea3f.test b/libsql-wal/tests/assets/fixtures/tkt-54844eea3f.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-5d863f876e.test b/libsql-wal/tests/assets/fixtures/tkt-5d863f876e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-5e10420e8d.test b/libsql-wal/tests/assets/fixtures/tkt-5e10420e8d.test deleted file mode 100644 index 3049c6b02b..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-5e10420e8d.test +++ /dev/null @@ -1,26 +0,0 @@ - - PRAGMA page_size = 1024; - PRAGMA auto_vacuum = incremental; - - CREATE TABLE t1(x); - CREATE TABLE t2(x); - CREATE TABLE t3(x); - - - INSERT INTO t3 VALUES(randomblob(131572)); - INSERT INTO t1 VALUES(randomblob(1500)); - INSERT INTO t2 VALUES(randomblob(131572)); - - DELETE FROM t3; - DELETE FROM t2; - DELETE FROM t1; - - - PRAGMA incremental_vacuum(248) - - - PRAGMA incremental_vacuum(1) - - - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-5ee23731f.test b/libsql-wal/tests/assets/fixtures/tkt-5ee23731f.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-6bfb98dfc0.test b/libsql-wal/tests/assets/fixtures/tkt-6bfb98dfc0.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-752e1646fc.test b/libsql-wal/tests/assets/fixtures/tkt-752e1646fc.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-78e04e52ea.test b/libsql-wal/tests/assets/fixtures/tkt-78e04e52ea.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-7a31705a7e6.test b/libsql-wal/tests/assets/fixtures/tkt-7a31705a7e6.test deleted file mode 100644 index ac34b14754..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-7a31705a7e6.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t1 (a INTEGER PRIMARY KEY); - CREATE TABLE t2 (a INTEGER PRIMARY KEY, b INTEGER); - CREATE TABLE t2x (b INTEGER PRIMARY KEY); - SELECT t1.a FROM ((t1 JOIN t2 ON t1.a=t2.a) AS x JOIN t2x ON x.b=t2x.b) as y; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-7bbfb7d442.test b/libsql-wal/tests/assets/fixtures/tkt-7bbfb7d442.test deleted file mode 100644 index f89db5dc19..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-7bbfb7d442.test +++ /dev/null @@ -1,117 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t1 VALUES(3, 'three'); - - CREATE TABLE t2(c, d); - INSERT INTO t2 VALUES('one', 'I'); - INSERT INTO t2 VALUES('two', 'II'); - INSERT INTO t2 VALUES('three', 'III'); - - CREATE TABLE t3(t3_a PRIMARY KEY, t3_d); - CREATE TRIGGER t3t AFTER INSERT ON t3 WHEN new.t3_d IS NULL BEGIN - UPDATE t3 SET t3_d = ( - SELECT d FROM - (SELECT * FROM t2 WHERE (new.t3_a%2)=(rowid%2) LIMIT 10), - (SELECT * FROM t1 WHERE (new.t3_a%2)=(rowid%2) LIMIT 10) - WHERE a = new.t3_a AND b = c - ) WHERE t3_a = new.t3_a; - END; - - - INSERT INTO t3(t3_a) VALUES(1); - INSERT INTO t3(t3_a) VALUES(2); - INSERT INTO t3(t3_a) VALUES(3); - SELECT * FROM t3; - - DELETE FROM t3 - - INSERT INTO t3(t3_a) SELECT 1 UNION SELECT 2 UNION SELECT 3; - SELECT * FROM t3; - - - CREATE TABLE InventoryControl ( - InventoryControlId INTEGER PRIMARY KEY AUTOINCREMENT, - SKU INTEGER NOT NULL, - Variant INTEGER NOT NULL DEFAULT 0, - ControlDate DATE NOT NULL, - ControlState INTEGER NOT NULL DEFAULT -1, - DeliveredQty VARCHAR(30) - ); - - CREATE TRIGGER TGR_InventoryControl_AfterInsert - AFTER INSERT ON InventoryControl - FOR EACH ROW WHEN NEW.ControlState=-1 BEGIN - - INSERT OR REPLACE INTO InventoryControl( - InventoryControlId,SKU,Variant,ControlDate,ControlState,DeliveredQty - ) SELECT - T1.InventoryControlId AS InventoryControlId, - T1.SKU AS SKU, - T1.Variant AS Variant, - T1.ControlDate AS ControlDate, - 1 AS ControlState, - COALESCE(T2.DeliveredQty,0) AS DeliveredQty - FROM ( - SELECT - NEW.InventoryControlId AS InventoryControlId, - II.SKU AS SKU, - II.Variant AS Variant, - COALESCE(LastClosedIC.ControlDate,NEW.ControlDate) AS ControlDate - FROM - InventoryItem II - LEFT JOIN - InventoryControl LastClosedIC - ON LastClosedIC.InventoryControlId IN ( SELECT 99999 ) - WHERE - II.SKU=NEW.SKU AND - II.Variant=NEW.Variant - ) T1 - LEFT JOIN ( - SELECT - TD.SKU AS SKU, - TD.Variant AS Variant, - 10 AS DeliveredQty - FROM - TransactionDetail TD - WHERE - TD.SKU=NEW.SKU AND - TD.Variant=NEW.Variant - ) T2 - ON T2.SKU=T1.SKU AND - T2.Variant=T1.Variant; - END; - - CREATE TABLE InventoryItem ( - SKU INTEGER NOT NULL, - Variant INTEGER NOT NULL DEFAULT 0, - DeptCode INTEGER NOT NULL, - GroupCode INTEGER NOT NULL, - ItemDescription VARCHAR(120) NOT NULL, - PRIMARY KEY(SKU, Variant) - ); - - INSERT INTO InventoryItem VALUES(220,0,1,170,'Scoth Tampon Recurer'); - INSERT INTO InventoryItem VALUES(31,0,1,110,'Fromage'); - - CREATE TABLE TransactionDetail ( - TransactionId INTEGER NOT NULL, - SKU INTEGER NOT NULL, - Variant INTEGER NOT NULL DEFAULT 0, - PRIMARY KEY(TransactionId, SKU, Variant) - ); - INSERT INTO TransactionDetail(TransactionId, SKU, Variant) VALUES(44, 31, 0); - - - INSERT INTO InventoryControl(SKU, Variant, ControlDate) SELECT - II.SKU AS SKU, II.Variant AS Variant, '2011-08-30' AS ControlDate - FROM InventoryItem II; - - - SELECT SKU, DeliveredQty FROM InventoryControl WHERE SKU=31 - - - SELECT CASE WHEN DeliveredQty=10 THEN 'TEST PASSED!' ELSE 'TEST FAILED!' END - FROM InventoryControl WHERE SKU=31; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-80ba201079.test b/libsql-wal/tests/assets/fixtures/tkt-80ba201079.test deleted file mode 100644 index 2fc6147362..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-80ba201079.test +++ /dev/null @@ -1,39 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE INDEX i1 ON t1(a); - CREATE INDEX i2 ON t1(b); - CREATE TABLE t2(d, e); - - INSERT INTO t1 VALUES('A', 'B', 'C'); - INSERT INTO t2 VALUES('D', 'E'); - - - SELECT * FROM t1, t2 WHERE - (a='A' AND d='E') OR - (b='B' AND c IN ('C', 'D', 'E')) - - - SELECT * FROM t1, t2 WHERE - (a='A' AND d='E') OR - (b='B' AND c IN (SELECT c FROM t1)) - - - SELECT * FROM t1, t2 WHERE - (a='A' AND d='E') OR - (b='B' AND c IN (SELECT 'B' UNION SELECT 'C' UNION SELECT 'D')) - - - SELECT * FROM t1, t2 WHERE - (b='B' AND c IN ('C', 'D', 'E')) OR - (a='A' AND d='E') - - - SELECT * FROM t1, t2 WHERE - (b='B' AND c IN (SELECT c FROM t1)) OR - (a='A' AND d='E') - - - SELECT * FROM t1, t2 WHERE - (b='B' AND c IN (SELECT 'B' UNION SELECT 'C' UNION SELECT 'D')) OR - (a='A' AND d='E') - diff --git a/libsql-wal/tests/assets/fixtures/tkt-80e031a00f.test b/libsql-wal/tests/assets/fixtures/tkt-80e031a00f.test deleted file mode 100644 index 57c028f47d..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-80e031a00f.test +++ /dev/null @@ -1,126 +0,0 @@ -SELECT 1 IN () -SELECT 1 IN (2) -SELECT 1 IN (2,3,4,5,6,7,8,9) -SELECT 1 NOT IN () -SELECT 1 NOT IN (2) -SELECT 1 NOT IN (2,3,4,5,6,7,8,9) -SELECT null IN () -SELECT null NOT IN () - - CREATE TABLE t1(x); - SELECT 1 IN t1; - -SELECT 1 NOT IN t1 -SELECT null IN t1 -SELECT null NOT IN t1 - - CREATE TABLE t2(y INTEGER PRIMARY KEY); - SELECT 1 IN t2; - -SELECT 1 NOT IN t2 -SELECT null IN t2 -SELECT null NOT IN t2 - - CREATE TABLE t3(z INT UNIQUE); - SELECT 1 IN t3; - -SELECT 1 NOT IN t3 -SELECT null IN t3 -SELECT null NOT IN t3 -SELECT 1 IN (SELECT x+y FROM t1, t2) -SELECT 1 NOT IN (SELECT x+y FROM t1,t2) -SELECT null IN (SELECT x+y FROM t1,t2) -SELECT null NOT IN (SELECT x+y FROM t1,t2) -SELECT 1.23 IN () -SELECT 1.23 NOT IN () -SELECT 1.23 IN t1 -SELECT 1.23 NOT IN t1 -SELECT 'hello' IN () -SELECT 'hello' NOT IN () -SELECT 'hello' IN t1 -SELECT 'hello' NOT IN t1 -SELECT x'303132' IN () -SELECT x'303132' NOT IN () -SELECT x'303132' IN t1 -SELECT x'303132' NOT IN t1 -SELECT 1 IN (2,3,4) -SELECT 1 NOT IN (2,3,4) -SELECT 'a' IN ('b','c','d') -SELECT 'a' NOT IN ('b','c','d') -SELECT 1 NOT IN t4 -SELECT 1 IN t5 -SELECT 1 NOT IN t5 -SELECT 1 IN t6 -SELECT 1 NOT IN t6 -SELECT 'a' IN t7 -SELECT 'a' NOT IN t7 -SELECT 'a' IN t8 -SELECT 'a' NOT IN t8 -SELECT 2 IN (2,3,4,null) -SELECT 3 NOT IN (2,3,4,null) -SELECT 4 IN (2,3,4) -SELECT 2 NOT IN (2,3,4) -SELECT 'b' IN ('b','c','d') -SELECT 'c' NOT IN ('b','c','d') -SELECT 'd' IN ('b','c',null,'d') -SELECT 'b' NOT IN (null,'b','c','d') -SELECT 2 IN t4 -SELECT 3 NOT IN t4 -SELECT 4 IN t4n -SELECT 2 NOT IN t4n -SELECT 2 IN t5 -SELECT 3 NOT IN t5 -SELECT 2 IN t6 -SELECT 3 NOT IN t6 -SELECT 4 IN t6n -SELECT 2 NOT IN t6n -SELECT 'b' IN t7 -SELECT 'c' NOT IN t7 -SELECT 'c' IN t7n -SELECT 'd' NOT IN t7n -SELECT 'b' IN t8 -SELECT 'c' NOT IN t8 -SELECT 'c' IN t8n -SELECT 'd' NOT IN t8n -SELECT 'a' IN (NULL,'a') -SELECT 'a' IN (NULL,'b') -SELECT 'a' NOT IN (NULL,'a') -SELECT 'a' NOT IN (NULL,'b') -SELECT 1 IN (2,3,4,null) -SELECT 1 NOT IN (2,3,4,null) -SELECT 'a' IN ('b','c',null,'d') -SELECT 'a' NOT IN (null,'b','c','d') -SELECT 1 IN t4n -SELECT 5 NOT IN t4n -SELECT 6 IN t6n -SELECT 7 NOT IN t6n -SELECT 'a' IN t7n -SELECT 'e' NOT IN t7n -SELECT 'f' IN t8n -SELECT 'g' NOT IN t8n -SELECT null IN (2,3,4,null) -SELECT null NOT IN (2,3,4,null) -SELECT null IN (2,3,4) -SELECT null NOT IN (2,3,4) -SELECT null IN ('b','c','d') -SELECT null NOT IN ('b','c','d') -SELECT null IN ('b','c',null,'d') -SELECT null NOT IN (null,'b','c','d') -SELECT null IN t4 -SELECT null NOT IN t4 -SELECT null IN t4n -SELECT null NOT IN t4n -SELECT null IN t5 -SELECT null NOT IN t5 -SELECT null IN t6 -SELECT null NOT IN t6 -SELECT null IN t6n -SELECT null NOT IN t6n -SELECT null IN t7 -SELECT null NOT IN t7 -SELECT null IN t7n -SELECT null NOT IN t7n -SELECT null IN t8 -SELECT null NOT IN t8 -SELECT null IN t8n -SELECT null NOT IN t8n diff --git a/libsql-wal/tests/assets/fixtures/tkt-8454a207b9.test b/libsql-wal/tests/assets/fixtures/tkt-8454a207b9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-868145d012.test b/libsql-wal/tests/assets/fixtures/tkt-868145d012.test deleted file mode 100644 index d796c416b0..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-868145d012.test +++ /dev/null @@ -1,44 +0,0 @@ - - CREATE TABLE p ( - id INTEGER PRIMARY KEY, - uid VARCHAR(36), - t INTEGER - ); - - CREATE TABLE pa ( - id INTEGER PRIMARY KEY, - a_uid VARCHAR(36) - ); - - CREATE TABLE a ( - id INTEGER PRIMARY KEY, - uid VARCHAR(36), - t INTEGER - ); - - INSERT INTO pa VALUES(1,'1234'); - INSERT INTO pa VALUES(2,'2345'); - INSERT INTO p VALUES(3,'1234',97); - INSERT INTO p VALUES(4,'1234',98); - INSERT INTO a VALUES(5,'1234',98); - INSERT INTO a VALUES(6,'1234',99); - - - SELECT DISTINCT pa.id, p.id, a.id - FROM - pa - LEFT JOIN p ON p.uid='1234' - LEFT JOIN a ON a.uid=pa.a_uid - WHERE - a.t=p.t - ; - - - SELECT DISTINCT pa.id, p.id, a.id - FROM - pa - LEFT JOIN p ON p.uid='1234' - LEFT JOIN a ON a.uid=pa.a_uid AND a.t=p.t - ORDER BY 1, 2, 3 - ; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-8c63ff0ec.test b/libsql-wal/tests/assets/fixtures/tkt-8c63ff0ec.test deleted file mode 100644 index 307fd33e55..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-8c63ff0ec.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d, e); - INSERT INTO t1 VALUES(1,20,30,40,50),(3,60,70,80,90); - CREATE TABLE t2(x INTEGER PRIMARY KEY); - INSERT INTO t2 VALUES(2); - CREATE TABLE t3(z); - INSERT INTO t3 VALUES(2),(2),(2),(2); - - SELECT a, b+c FROM t1 - UNION ALL - SELECT x, 5 FROM t2 JOIN t3 ON z=x WHERE x=2 - ORDER BY a; - - - SELECT a, b+c+d FROM t1 - UNION ALL - SELECT x, 5 FROM t2 JOIN t3 ON z=x WHERE x=2 - ORDER BY a; - - - SELECT a, b+c+d+e FROM t1 - UNION ALL - SELECT x, 5 FROM t2 JOIN t3 ON z=x WHERE x=2 - ORDER BY a; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-91e2e8ba6f.test b/libsql-wal/tests/assets/fixtures/tkt-91e2e8ba6f.test deleted file mode 100644 index ddbdd1572c..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-91e2e8ba6f.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(x INTEGER, y REAL); - INSERT INTO t1 VALUES(11, 11); - - - SELECT x/10, y/10 FROM t1; - - - SELECT x/10, y/10 FROM (SELECT * FROM t1); - - - SELECT x/10, y/10 FROM (SELECT * FROM t1 LIMIT 5 OFFSET 0); - - - SELECT x/10, y/10 FROM (SELECT * FROM t1 LIMIT 5 OFFSET 0) LIMIT 5 OFFSET 0; - - - SELECT a.x/10, a.y/10 FROM - (SELECT * FROM t1 LIMIT 5 OFFSET 0) AS a, t1 AS b WHERE a.x = b.x - LIMIT 5 OFFSET 0; - - - CREATE VIEW v1 AS SELECT * FROM t1 LIMIT 5; - SELECT a.x/10, a.y/10 FROM v1 AS a, t1 AS b WHERE a.x = b.x LIMIT 5 OFFSET 0; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-94c04eaadb.test b/libsql-wal/tests/assets/fixtures/tkt-94c04eaadb.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-99378177930f87bd.test b/libsql-wal/tests/assets/fixtures/tkt-99378177930f87bd.test deleted file mode 100644 index c503d427dd..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-99378177930f87bd.test +++ /dev/null @@ -1,129 +0,0 @@ - - CREATE TABLE t1(a INT, b TEXT, c INT, d INT); - INSERT INTO t1(a,b,c,d) VALUES - (1, '{"x":1 - - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY a; - - - EXPLAIN - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY a; - - - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY +a; - - - EXPLAIN - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY +a; - - - DROP INDEX t1x; - CREATE INDEX t1x ON t1(a, d, b->>'x', c); - - - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY a; - - - EXPLAIN - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY a; - - - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY a; - - - EXPLAIN - SELECT a, - SUM(1) AS t1, - SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, - SUM(c) AS t3, - SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 - FROM t1 - WHERE d BETWEEN 0 and 10 - GROUP BY a; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INT); - CREATE INDEX i1 ON t1(a,a=a); - INSERT INTO t1 VALUES(1),(2),(3),(4); - SELECT * FROM t1 NATURAL JOIN t1 - WHERE a==1 - OR ( - (SELECT avg( - (SELECT sum((SELECT 1 FROM t1 NATURAL RIGHT JOIN t1 WHERE a=a)))) AS xyz - ) - AND a==2 - ); - - - DROP INDEX i1; - SELECT * FROM t1 NATURAL JOIN t1 - WHERE a==1 - OR ( - (SELECT avg( - (SELECT sum((SELECT 1 FROM t1 NATURAL RIGHT JOIN t1 WHERE a=a)))) AS xyz - ) - AND a==2 - ); - - - DROP TABLE t1; - CREATE TABLE t0(w); - INSERT INTO t0(w) VALUES(1); - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES(1); - CREATE INDEX t1x ON t1(x > 0); - CREATE VIEW t2(y) AS SELECT avg(w) FROM t0 GROUP BY w>1; - CREATE VIEW t3(z) AS SELECT count(*) FROM t2 WHERE y BETWEEN 0 and 0; - SELECT count(*) FROM t1 NOT INDEXED WHERE (SELECT z FROM t3); - SELECT count(*) FROM t1 INDEXED BY t1x WHERE (SELECT z FROM t3); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-9a8b09f8e6.test b/libsql-wal/tests/assets/fixtures/tkt-9a8b09f8e6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-9d68c883.test b/libsql-wal/tests/assets/fixtures/tkt-9d68c883.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-9f2eb3abac.test b/libsql-wal/tests/assets/fixtures/tkt-9f2eb3abac.test deleted file mode 100644 index 4abfd0a1e0..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-9f2eb3abac.test +++ /dev/null @@ -1,44 +0,0 @@ - - CREATE TABLE t1(a,b,c,d,e, PRIMARY KEY(a,b,c,d,e)); - SELECT * FROM t1 WHERE a=12 AND b=23 AND c=42 AND d=18 AND e=1; - - - CREATE TABLE "a" ( - "b" integer NOT NULL, - "c" integer NOT NULL, - PRIMARY KEY ("b", "c") - ); - - CREATE TABLE "d" ( - "e" integer NOT NULL, - "g" integer NOT NULL, - "f" integer NOT NULL, - "h" integer NOT NULL, - "i" character(10) NOT NULL, - "j" int, - PRIMARY KEY ("e", "g", "f", "h") - ); - - CREATE TABLE "d_to_a" ( - "f_e" integer NOT NULL, - "f_g" integer NOT NULL, - "f_f" integer NOT NULL, - "f_h" integer NOT NULL, - "t_b" integer NOT NULL, - "t_c" integer NOT NULL, - "r" character NOT NULL, - "s" integer, - PRIMARY KEY ("f_e", "f_g", "f_f", "f_h", "t_b", "t_c") - ); - - INSERT INTO d (g, e, h, f, j, i) VALUES ( 1, 1, 1, 1, 1, 1 ); - INSERT INTO a (b, c) VALUES ( 1, 1 ); - INSERT INTO d_to_a VALUES (1, 1, 1, 1, 1, 1, 1, 1); - - DELETE FROM d_to_a - WHERE f_g = 1 AND f_e = 1 AND f_h = 1 AND f_f = 1 AND t_b = 1 AND t_c = 1; - - SELECT * FROM d_to_a; - - CREATE TABLE t1(a,b,c,d,e, PRIMARY KEY(a,b,c,d,e)) - CREATE TABLE t2(x) diff --git a/libsql-wal/tests/assets/fixtures/tkt-a7b7803e.test b/libsql-wal/tests/assets/fixtures/tkt-a7b7803e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-a7debbe0.test b/libsql-wal/tests/assets/fixtures/tkt-a7debbe0.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-a8a0d2996a.test b/libsql-wal/tests/assets/fixtures/tkt-a8a0d2996a.test deleted file mode 100644 index 0463ef664a..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-a8a0d2996a.test +++ /dev/null @@ -1,70 +0,0 @@ - - CREATE TABLE t(x,y); - INSERT INTO t VALUES('1','1'); - SELECT typeof(x), typeof(y) FROM t WHERE 1=x+0 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x-0 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x*1 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x/1 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x%4 AND y=='1'; - - - UPDATE t SET x='1xyzzy'; - SELECT typeof(x), typeof(y) FROM t WHERE 1=x+0 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x-0 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x*1 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x/1 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x%4 AND y=='1'; - - - UPDATE t SET x='1.0'; - SELECT typeof(x), typeof(y) FROM t WHERE 1=x+0 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x-0 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x*1 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x/1 AND y=='1'; - - - SELECT typeof(x), typeof(y) FROM t WHERE 1=x%4 AND y=='1'; - - - SELECT 1+1.; - - - SELECT '1.23e64'/'1.0000e+62'; - - - SELECT '100x'+'-2y'; - - - SELECT '100x'+'4.5y'; - - - SELECT '-9223372036854775807x'-'1x'; - - - SELECT '9223372036854775806x'+'1x'; - - - SELECT '1234x'/'10y', '1234x'/'10.y', '1234x'/'1e1y'; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-b1d3a2e531.test b/libsql-wal/tests/assets/fixtures/tkt-b1d3a2e531.test deleted file mode 100644 index a408eae766..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-b1d3a2e531.test +++ /dev/null @@ -1,66 +0,0 @@ - PRAGMA foreign_keys = ON - - CREATE TABLE pp(x PRIMARY KEY); - CREATE TABLE cc(y REFERENCES pp DEFERRABLE INITIALLY DEFERRED); - INSERT INTO pp VALUES('abc'); - INSERT INTO cc VALUES('abc'); - - - BEGIN; - DROP TABLE pp; - DROP TABLE cc; - COMMIT; - - - CREATE TABLE pp(x PRIMARY KEY); - CREATE TABLE cc(y REFERENCES pp DEFERRABLE INITIALLY DEFERRED); - INSERT INTO pp VALUES('abc'); - INSERT INTO cc VALUES('abc'); - - - BEGIN; - DROP TABLE cc; - DROP TABLE pp; - COMMIT; - - - CREATE TABLE pp(x PRIMARY KEY); - CREATE TABLE cc( - y INTEGER PRIMARY KEY REFERENCES pp DEFERRABLE INITIALLY DEFERRED - ); - INSERT INTO pp VALUES(5); - INSERT INTO cc VALUES(5); - - - BEGIN; - DROP TABLE pp; - DROP TABLE cc; - COMMIT; - - - CREATE TABLE pp(x PRIMARY KEY); - CREATE TABLE cc( - y INTEGER PRIMARY KEY REFERENCES pp DEFERRABLE INITIALLY DEFERRED - ); - INSERT INTO pp VALUES(5); - INSERT INTO cc VALUES(5); - - - BEGIN; - DROP TABLE cc; - DROP TABLE pp; - COMMIT; - - - CREATE TABLE pp1(x PRIMARY KEY); - CREATE TABLE cc1(y REFERENCES pp1 DEFERRABLE INITIALLY DEFERRED); - - CREATE TABLE pp2(x PRIMARY KEY); - CREATE TABLE cc2(y REFERENCES pp1 DEFERRABLE INITIALLY DEFERRED); - - INSERT INTO pp1 VALUES(2200); - INSERT INTO cc1 VALUES(NULL); - - INSERT INTO pp2 VALUES(2200); - INSERT INTO cc2 VALUES(2200); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-b351d95f9.test b/libsql-wal/tests/assets/fixtures/tkt-b351d95f9.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-b72787b1.test b/libsql-wal/tests/assets/fixtures/tkt-b72787b1.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-b75a9ca6b0.test b/libsql-wal/tests/assets/fixtures/tkt-b75a9ca6b0.test deleted file mode 100644 index ddcf4d0297..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-b75a9ca6b0.test +++ /dev/null @@ -1,9 +0,0 @@ - - CREATE TABLE t1 (x, y); - INSERT INTO t1 VALUES (1, 3); - INSERT INTO t1 VALUES (2, 2); - INSERT INTO t1 VALUES (3, 1); - - - CREATE INDEX i1 ON t1(x, y); - diff --git a/libsql-wal/tests/assets/fixtures/tkt-ba7cbfaedc.test b/libsql-wal/tests/assets/fixtures/tkt-ba7cbfaedc.test deleted file mode 100644 index 7d4099e87c..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-ba7cbfaedc.test +++ /dev/null @@ -1,21 +0,0 @@ - - CREATE TABLE t1 (x, y); - INSERT INTO t1 VALUES (3, 'a'); - INSERT INTO t1 VALUES (1, 'a'); - INSERT INTO t1 VALUES (2, 'b'); - INSERT INTO t1 VALUES (2, 'a'); - INSERT INTO t1 VALUES (3, 'b'); - INSERT INTO t1 VALUES (1, 'b'); - - - CREATE INDEX i1 ON t1(x, y); - - - drop table if exists t1; - create table t1(id int); - insert into t1(id) values(1),(2),(3),(4),(5); - create index t1_idx_id on t1(id asc); - select * from t1 group by id order by id; - select * from t1 group by id order by id asc; - select * from t1 group by id order by id desc; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-bd484a090c.test b/libsql-wal/tests/assets/fixtures/tkt-bd484a090c.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-bdc6bbbb38.test b/libsql-wal/tests/assets/fixtures/tkt-bdc6bbbb38.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-c48d99d690.test b/libsql-wal/tests/assets/fixtures/tkt-c48d99d690.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-c694113d5.test b/libsql-wal/tests/assets/fixtures/tkt-c694113d5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-cbd054fa6b.test b/libsql-wal/tests/assets/fixtures/tkt-cbd054fa6b.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-d11f09d36e.test b/libsql-wal/tests/assets/fixtures/tkt-d11f09d36e.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-d635236375.test b/libsql-wal/tests/assets/fixtures/tkt-d635236375.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-d82e3f3721.test b/libsql-wal/tests/assets/fixtures/tkt-d82e3f3721.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-f3e5abed55.test b/libsql-wal/tests/assets/fixtures/tkt-f3e5abed55.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-f67b41381a.test b/libsql-wal/tests/assets/fixtures/tkt-f67b41381a.test deleted file mode 100644 index 23e404cae6..0000000000 --- a/libsql-wal/tests/assets/fixtures/tkt-f67b41381a.test +++ /dev/null @@ -1,8 +0,0 @@ - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1); - ALTER TABLE t1 ADD COLUMN b DEFAULT 2; - CREATE TABLE t2(a, b); - INSERT INTO t2 SELECT * FROM t1; - SELECT * FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/tkt-f777251dc7a.test b/libsql-wal/tests/assets/fixtures/tkt-f777251dc7a.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-f7b4edec.test b/libsql-wal/tests/assets/fixtures/tkt-f7b4edec.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-f973c7ac31.test b/libsql-wal/tests/assets/fixtures/tkt-f973c7ac31.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-fa7bf5ec.test b/libsql-wal/tests/assets/fixtures/tkt-fa7bf5ec.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-fc62af4523.test b/libsql-wal/tests/assets/fixtures/tkt-fc62af4523.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt-fc7bd6358f.test b/libsql-wal/tests/assets/fixtures/tkt-fc7bd6358f.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1435.test b/libsql-wal/tests/assets/fixtures/tkt1435.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1443.test b/libsql-wal/tests/assets/fixtures/tkt1443.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1444.test b/libsql-wal/tests/assets/fixtures/tkt1444.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1449.test b/libsql-wal/tests/assets/fixtures/tkt1449.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1473.test b/libsql-wal/tests/assets/fixtures/tkt1473.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1501.test b/libsql-wal/tests/assets/fixtures/tkt1501.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1512.test b/libsql-wal/tests/assets/fixtures/tkt1512.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1514.test b/libsql-wal/tests/assets/fixtures/tkt1514.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1536.test b/libsql-wal/tests/assets/fixtures/tkt1536.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1537.test b/libsql-wal/tests/assets/fixtures/tkt1537.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1567.test b/libsql-wal/tests/assets/fixtures/tkt1567.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1644.test b/libsql-wal/tests/assets/fixtures/tkt1644.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1667.test b/libsql-wal/tests/assets/fixtures/tkt1667.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt1873.test b/libsql-wal/tests/assets/fixtures/tkt1873.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2141.test b/libsql-wal/tests/assets/fixtures/tkt2141.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2192.test b/libsql-wal/tests/assets/fixtures/tkt2192.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2213.test b/libsql-wal/tests/assets/fixtures/tkt2213.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2251.test b/libsql-wal/tests/assets/fixtures/tkt2251.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2285.test b/libsql-wal/tests/assets/fixtures/tkt2285.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2332.test b/libsql-wal/tests/assets/fixtures/tkt2332.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2339.test b/libsql-wal/tests/assets/fixtures/tkt2339.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2391.test b/libsql-wal/tests/assets/fixtures/tkt2391.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2409.test b/libsql-wal/tests/assets/fixtures/tkt2409.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2450.test b/libsql-wal/tests/assets/fixtures/tkt2450.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2565.test b/libsql-wal/tests/assets/fixtures/tkt2565.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2640.test b/libsql-wal/tests/assets/fixtures/tkt2640.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2643.test b/libsql-wal/tests/assets/fixtures/tkt2643.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2686.test b/libsql-wal/tests/assets/fixtures/tkt2686.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2767.test b/libsql-wal/tests/assets/fixtures/tkt2767.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2817.test b/libsql-wal/tests/assets/fixtures/tkt2817.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2820.test b/libsql-wal/tests/assets/fixtures/tkt2820.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2822.test b/libsql-wal/tests/assets/fixtures/tkt2822.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2832.test b/libsql-wal/tests/assets/fixtures/tkt2832.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2854.test b/libsql-wal/tests/assets/fixtures/tkt2854.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2920.test b/libsql-wal/tests/assets/fixtures/tkt2920.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2927.test b/libsql-wal/tests/assets/fixtures/tkt2927.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt2942.test b/libsql-wal/tests/assets/fixtures/tkt2942.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3080.test b/libsql-wal/tests/assets/fixtures/tkt3080.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3093.test b/libsql-wal/tests/assets/fixtures/tkt3093.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3121.test b/libsql-wal/tests/assets/fixtures/tkt3121.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3201.test b/libsql-wal/tests/assets/fixtures/tkt3201.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3292.test b/libsql-wal/tests/assets/fixtures/tkt3292.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3298.test b/libsql-wal/tests/assets/fixtures/tkt3298.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3334.test b/libsql-wal/tests/assets/fixtures/tkt3334.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3346.test b/libsql-wal/tests/assets/fixtures/tkt3346.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3357.test b/libsql-wal/tests/assets/fixtures/tkt3357.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3419.test b/libsql-wal/tests/assets/fixtures/tkt3419.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3424.test b/libsql-wal/tests/assets/fixtures/tkt3424.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3442.test b/libsql-wal/tests/assets/fixtures/tkt3442.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3457.test b/libsql-wal/tests/assets/fixtures/tkt3457.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3461.test b/libsql-wal/tests/assets/fixtures/tkt3461.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3493.test b/libsql-wal/tests/assets/fixtures/tkt3493.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3508.test b/libsql-wal/tests/assets/fixtures/tkt3508.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3522.test b/libsql-wal/tests/assets/fixtures/tkt3522.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3527.test b/libsql-wal/tests/assets/fixtures/tkt3527.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3541.test b/libsql-wal/tests/assets/fixtures/tkt3541.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3554.test b/libsql-wal/tests/assets/fixtures/tkt3554.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3581.test b/libsql-wal/tests/assets/fixtures/tkt3581.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt35xx.test b/libsql-wal/tests/assets/fixtures/tkt35xx.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3630.test b/libsql-wal/tests/assets/fixtures/tkt3630.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3718.test b/libsql-wal/tests/assets/fixtures/tkt3718.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3731.test b/libsql-wal/tests/assets/fixtures/tkt3731.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3757.test b/libsql-wal/tests/assets/fixtures/tkt3757.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3761.test b/libsql-wal/tests/assets/fixtures/tkt3761.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3762.test b/libsql-wal/tests/assets/fixtures/tkt3762.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3773.test b/libsql-wal/tests/assets/fixtures/tkt3773.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3791.test b/libsql-wal/tests/assets/fixtures/tkt3791.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3793.test b/libsql-wal/tests/assets/fixtures/tkt3793.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3810.test b/libsql-wal/tests/assets/fixtures/tkt3810.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3824.test b/libsql-wal/tests/assets/fixtures/tkt3824.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3832.test b/libsql-wal/tests/assets/fixtures/tkt3832.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3838.test b/libsql-wal/tests/assets/fixtures/tkt3838.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3841.test b/libsql-wal/tests/assets/fixtures/tkt3841.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3871.test b/libsql-wal/tests/assets/fixtures/tkt3871.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3879.test b/libsql-wal/tests/assets/fixtures/tkt3879.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3911.test b/libsql-wal/tests/assets/fixtures/tkt3911.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3918.test b/libsql-wal/tests/assets/fixtures/tkt3918.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3922.test b/libsql-wal/tests/assets/fixtures/tkt3922.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3929.test b/libsql-wal/tests/assets/fixtures/tkt3929.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3935.test b/libsql-wal/tests/assets/fixtures/tkt3935.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3992.test b/libsql-wal/tests/assets/fixtures/tkt3992.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt3997.test b/libsql-wal/tests/assets/fixtures/tkt3997.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tkt4018.test b/libsql-wal/tests/assets/fixtures/tkt4018.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tokenize.test b/libsql-wal/tests/assets/fixtures/tokenize.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/tpch01.test b/libsql-wal/tests/assets/fixtures/tpch01.test deleted file mode 100644 index 295e9d5f8b..0000000000 --- a/libsql-wal/tests/assets/fixtures/tpch01.test +++ /dev/null @@ -1,107 +0,0 @@ - - CREATE TABLE NATION ( N_NATIONKEY INTEGER NOT NULL, - N_NAME CHAR(25) NOT NULL, - N_REGIONKEY INTEGER NOT NULL, - N_COMMENT VARCHAR(152)); - CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL, - R_NAME CHAR(25) NOT NULL, - R_COMMENT VARCHAR(152)); - CREATE TABLE PART ( P_PARTKEY INTEGER NOT NULL, - P_NAME VARCHAR(55) NOT NULL, - P_MFGR CHAR(25) NOT NULL, - P_BRAND CHAR(10) NOT NULL, - P_TYPE VARCHAR(25) NOT NULL, - P_SIZE INTEGER NOT NULL, - P_CONTAINER CHAR(10) NOT NULL, - P_RETAILPRICE DECIMAL(15,2) NOT NULL, - P_COMMENT VARCHAR(23) NOT NULL ); - CREATE TABLE SUPPLIER ( S_SUPPKEY INTEGER NOT NULL, - S_NAME CHAR(25) NOT NULL, - S_ADDRESS VARCHAR(40) NOT NULL, - S_NATIONKEY INTEGER NOT NULL, - S_PHONE CHAR(15) NOT NULL, - S_ACCTBAL DECIMAL(15,2) NOT NULL, - S_COMMENT VARCHAR(101) NOT NULL); - CREATE TABLE PARTSUPP ( PS_PARTKEY INTEGER NOT NULL, - PS_SUPPKEY INTEGER NOT NULL, - PS_AVAILQTY INTEGER NOT NULL, - PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, - PS_COMMENT VARCHAR(199) NOT NULL ); - CREATE TABLE CUSTOMER ( C_CUSTKEY INTEGER NOT NULL, - C_NAME VARCHAR(25) NOT NULL, - C_ADDRESS VARCHAR(40) NOT NULL, - C_NATIONKEY INTEGER NOT NULL, - C_PHONE CHAR(15) NOT NULL, - C_ACCTBAL DECIMAL(15,2) NOT NULL, - C_MKTSEGMENT CHAR(10) NOT NULL, - C_COMMENT VARCHAR(117) NOT NULL); - CREATE TABLE ORDERS ( O_ORDERKEY INTEGER NOT NULL, - O_CUSTKEY INTEGER NOT NULL, - O_ORDERSTATUS CHAR(1) NOT NULL, - O_TOTALPRICE DECIMAL(15,2) NOT NULL, - O_ORDERDATE DATE NOT NULL, - O_ORDERPRIORITY CHAR(15) NOT NULL, - O_CLERK CHAR(15) NOT NULL, - O_SHIPPRIORITY INTEGER NOT NULL, - O_COMMENT VARCHAR(79) NOT NULL); - CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL, - L_PARTKEY INTEGER NOT NULL, - L_SUPPKEY INTEGER NOT NULL, - L_LINENUMBER INTEGER NOT NULL, - L_QUANTITY DECIMAL(15,2) NOT NULL, - L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, - L_DISCOUNT DECIMAL(15,2) NOT NULL, - L_TAX DECIMAL(15,2) NOT NULL, - L_RETURNFLAG CHAR(1) NOT NULL, - L_LINESTATUS CHAR(1) NOT NULL, - L_SHIPDATE DATE NOT NULL, - L_COMMITDATE DATE NOT NULL, - L_RECEIPTDATE DATE NOT NULL, - L_SHIPINSTRUCT CHAR(25) NOT NULL, - L_SHIPMODE CHAR(10) NOT NULL, - L_COMMENT VARCHAR(44) NOT NULL); - CREATE INDEX npki on nation(N_NATIONKEY); - CREATE INDEX rpki on region(R_REGIONKEY); - CREATE INDEX ppki on part(P_PARTKEY); - CREATE INDEX spki on supplier(S_SUPPKEY); - CREATE INDEX pspki on partsupp(PS_PARTKEY, PS_SUPPKEY); - CREATE INDEX cpki on customer(C_CUSTKEY); - CREATE INDEX opki on orders(O_ORDERKEY); - CREATE INDEX lpki on lineitem(L_ORDERKEY, L_LINENUMBER); - CREATE INDEX nrki on nation(n_regionkey); - CREATE INDEX snki on supplier(s_nationkey); - CREATE INDEX cnki on customer(c_nationkey); - CREATE INDEX ocki on orders(O_CUSTKEY); - CREATE INDEX odi on orders(O_ORDERDATE); - CREATE INDEX lpki2 on lineitem(L_PARTKEY); - CREATE INDEX lski on lineitem(L_SUPPKEY); - CREATE INDEX lsdi on lineitem(L_SHIPDATE); - CREATE INDEX lcdi on lineitem(L_COMMITDATE); - CREATE INDEX lrdi on lineitem(L_RECEIPTDATE); - CREATE INDEX bootleg_nni on nation(N_NAME); - CREATE INDEX bootleg_psi on part(p_size); - CREATE INDEX bootleg_pti on part(p_type); - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('LINEITEM','lrdi','600572 236'); - INSERT INTO sqlite_stat1 VALUES('LINEITEM','lcdi','600572 244'); - INSERT INTO sqlite_stat1 VALUES('LINEITEM','lsdi','600572 238'); - INSERT INTO sqlite_stat1 VALUES('LINEITEM','lski','600572 601'); - INSERT INTO sqlite_stat1 VALUES('LINEITEM','lpki2','600572 31'); - INSERT INTO sqlite_stat1 VALUES('LINEITEM','lpki','600572 5 1'); - INSERT INTO sqlite_stat1 VALUES('ORDERS','odi','150000 63'); - INSERT INTO sqlite_stat1 VALUES('ORDERS','ocki','150000 15'); - INSERT INTO sqlite_stat1 VALUES('ORDERS','opki','150000 1'); - INSERT INTO sqlite_stat1 VALUES('CUSTOMER','cnki','15000 600'); - INSERT INTO sqlite_stat1 VALUES('CUSTOMER','cpki','15000 1'); - INSERT INTO sqlite_stat1 VALUES('PARTSUPP','pspki','80000 4 1'); - INSERT INTO sqlite_stat1 VALUES('SUPPLIER','snki','1000 40'); - INSERT INTO sqlite_stat1 VALUES('SUPPLIER','spki','1000 1'); - INSERT INTO sqlite_stat1 VALUES('PART','bootleg_pti','20000 134'); - INSERT INTO sqlite_stat1 VALUES('PART','bootleg_psi','20000 400'); - INSERT INTO sqlite_stat1 VALUES('PART','ppki','20000 1'); - INSERT INTO sqlite_stat1 VALUES('REGION','rpki','5 1'); - INSERT INTO sqlite_stat1 VALUES('NATION','bootleg_nni','25 1'); - INSERT INTO sqlite_stat1 VALUES('NATION','nrki','25 5'); - INSERT INTO sqlite_stat1 VALUES('NATION','npki','25 1'); - ANALYZE sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/trace.test b/libsql-wal/tests/assets/fixtures/trace.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trace2.test b/libsql-wal/tests/assets/fixtures/trace2.test deleted file mode 100644 index 9efe6058ef..0000000000 --- a/libsql-wal/tests/assets/fixtures/trace2.test +++ /dev/null @@ -1,5 +0,0 @@ - - CREATE VIRTUAL TABLE x1 USING fts4; - INSERT INTO x1 VALUES('Cloudy, with a high near 16'); - INSERT INTO x1 VALUES('Wind chill values as low as -13'); - diff --git a/libsql-wal/tests/assets/fixtures/trace3.test b/libsql-wal/tests/assets/fixtures/trace3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trans.test b/libsql-wal/tests/assets/fixtures/trans.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trans2.test b/libsql-wal/tests/assets/fixtures/trans2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trans3.test b/libsql-wal/tests/assets/fixtures/trans3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/transitive1.test b/libsql-wal/tests/assets/fixtures/transitive1.test deleted file mode 100644 index 86af10df7b..0000000000 --- a/libsql-wal/tests/assets/fixtures/transitive1.test +++ /dev/null @@ -1,371 +0,0 @@ - - CREATE TABLE t1(a TEXT, b TEXT, c TEXT COLLATE NOCASE); - INSERT INTO t1 VALUES('abc','abc','Abc'); - INSERT INTO t1 VALUES('def','def','def'); - INSERT INTO t1 VALUES('ghi','ghi','GHI'); - CREATE INDEX t1a1 ON t1(a); - CREATE INDEX t1a2 ON t1(a COLLATE nocase); - - SELECT * FROM t1 WHERE a=b AND c=b AND c='DEF'; - - - SELECT * FROM t1 WHERE a=b AND c=b AND c>='DEF' ORDER BY +a; - - - SELECT * FROM t1 WHERE a=b AND c=b AND c<='DEF' ORDER BY +a; - - - CREATE TABLE t2(a INTEGER, b INTEGER, c TEXT); - INSERT INTO t2 VALUES(100,100,100); - INSERT INTO t2 VALUES(20,20,20); - INSERT INTO t2 VALUES(3,3,3); - - SELECT * FROM t2 WHERE a=b AND c=b AND c=20; - - - SELECT * FROM t2 WHERE a=b AND c=b AND c>=20 ORDER BY +a; - - - SELECT * FROM t2 WHERE a=b AND c=b AND c<=20 ORDER BY +a; - - - CREATE TABLE t301(w INTEGER PRIMARY KEY, x); - CREATE TABLE t302(y INTEGER UNIQUE, z); - INSERT INTO t301 VALUES(1,2),(3,4),(5,6); - INSERT INTO t302 VALUES(1,3),(3,6),(5,7); - SELECT * - FROM t301 CROSS JOIN t302 - WHERE w=y AND y IS NOT NULL - ORDER BY +w; - - - SELECT * - FROM t301 CROSS JOIN t302 - WHERE w=y AND y IS NOT NULL - ORDER BY w; - - - SELECT * - FROM t301 CROSS JOIN t302 - WHERE w IS y AND y IS NOT NULL - ORDER BY w; - - - SELECT * - FROM t301 CROSS JOIN t302 ON w=y - WHERE y>1 - ORDER BY +w - - - SELECT * - FROM t301 CROSS JOIN t302 ON w=y - WHERE y>1 - ORDER BY w - - - SELECT * - FROM t301 CROSS JOIN t302 ON w=y - WHERE y>1 - ORDER BY w DESC - - - SELECT * - FROM t301 CROSS JOIN t302 ON w=y - WHERE y BETWEEN 2 AND 4; - - - SELECT * - FROM t301 CROSS JOIN t302 ON w=y - WHERE y BETWEEN 1 AND 4 - ORDER BY w; - - - SELECT * - FROM t301 CROSS JOIN t302 ON w=y - WHERE y BETWEEN 1 AND 4 - ORDER BY w DESC; - - - CREATE TABLE t401(a); - CREATE TABLE t402(b); - CREATE TABLE t403(c INTEGER PRIMARY KEY); - INSERT INTO t401 VALUES(1); - INSERT INTO t403 VALUES(1); - SELECT '1-row' FROM t401 LEFT JOIN t402 ON b=a JOIN t403 ON c=a; - - - SELECT '1-row' FROM t401 LEFT JOIN t402 ON b IS a JOIN t403 ON c=a; - - - SELECT '1-row' FROM t401 LEFT JOIN t402 ON b=a JOIN t403 ON c IS a; - - - SELECT '1-row' FROM t401 LEFT JOIN t402 ON b IS a JOIN t403 ON c IS a; - - - CREATE TABLE bookmark ( idBookmark integer primary key, idFile integer, timeInSeconds double, totalTimeInSeconds double, thumbNailImage text, player text, playerState text, type integer); - CREATE TABLE path ( idPath integer primary key, strPath text, strContent text, strScraper text, strHash text, scanRecursive integer, useFolderNames bool, strSettings text, noUpdate bool, exclude bool, dateAdded text); - INSERT INTO "path" VALUES(1,'/tmp/tvshows/','tvshows','metadata.tvdb.com','989B1CE5680A14F5F86123F751169B49',0,0,'',0,0,NULL); - INSERT INTO "path" VALUES(2,'/tmp/tvshows/The.Big.Bang.Theory/','','','85E1DAAB2F5FF6EAE8AEDF1B5C882D1E',NULL,NULL,NULL,NULL,NULL,'2013-10-23 18:58:43'); - CREATE TABLE files ( idFile integer primary key, idPath integer, strFilename text, playCount integer, lastPlayed text, dateAdded text); - INSERT INTO "files" VALUES(1,2,'The.Big.Bang.Theory.S01E01.WEB-DL.AAC2.0.H264.mkv',NULL,NULL,'2013-10-23 18:57:36'); - CREATE TABLE tvshow ( idShow integer primary key,c00 text,c01 text,c02 text,c03 text,c04 text,c05 text,c06 text,c07 text,c08 text,c09 text,c10 text,c11 text,c12 text,c13 text,c14 text,c15 text,c16 text,c17 text,c18 text,c19 text,c20 text,c21 text,c22 text,c23 text); - INSERT INTO "tvshow" VALUES(1,'The Big Bang Theory','Leonard Hofstadter and Sheldon Cooper are brilliant physicists, the kind of "beautiful minds" that understand how the universe works. But none of that genius helps them interact with people, especially women. All this begins to change when a free-spirited beauty named Penny moves in next door. Sheldon, Leonard''s roommate, is quite content spending his nights playing Klingon Boggle with their socially dysfunctional friends, fellow CalTech scientists Howard Wolowitz and Raj Koothrappali. However, Leonard sees in Penny a whole new universe of possibilities... including love.','','','9.200000','2007-09-24','http://thetvdb.com/banners/graphical/80379-g13.jpghttp://thetvdb.com/banners/graphical/80379-g23.jpghttp://thetvdb.com/banners/graphical/80379-g18.jpghttp://thetvdb.com/banners/graphical/80379-g17.jpghttp:// - thetvdb.com/banners/graphical/80379-g6.jpghttp://thetvdb.com/banners/graphical/80379-g5.jpghttp://thetvdb.com/banners/graphical/80379-g2.jpghttp://thetvdb.com/banners/graphical/80379-g11.jpghttp://thetvdb.com/banners/graphical/80379-g12.jpghttp://thetvdb.com/banners/graphical/80379-g19.jpghttp://thetvdb.com/banners/graphical/80379-g3.jpghttp://thetvdb.com/banners/graphical/80379-g4.jpghttp://thetvdb.com/banners/graphical/80379-g15.jpghttp://thetvdb.com/banners/graphical/80379-g.jpghttp://thetvdb.com/banners/graphical/80379-g22.jpghttp://thetvdb.com/banners/graphical/80379-g7.jpghttp://thetvdb.com/banners/graphical/80379-g10.jpghttp://thetvdb.com/banners/graphical/80379-g24.jpghttp://thetvdb.com/banners/graphical/80379-g8.jpghttp://thetvdb.com/banners/graphical/80379-g9.jpghttp://thetvdb.com/banners/graphical/80379-g14.jpghttp://thetvdb.com/banners/graphical/80379-g16.jpghttp://thetvdb.com/banners/graphical/80379-g21.jpghttp://thetvdb.com/banners/text/80379-4.jpghttp://thetvdb.com/banners/text/80379-2.jpghttp://thetvdb.com/banners/text/80379-3.jpghttp://thetvdb.com/banners/text/80379-5.jpghttp://thetvdb.com/banners/seasons/80379-6-8.jpghttp://thetvdb.com/banners/seasons/80379-0-4.jpghttp://thetvdb.com/banners/seasons/80379-1-12.jpghttp://thetvdb.com/banners/seasons/80379-3-9.jpghttp://thetvdb.com/banners/seasons/80379-2-11.jpghttp://thetvdb.com/banners/seasons/80379-5-9.jpghttp://thetvdb.com/banners/seasons/80379-4-8.jpghttp://thetvdb.com/banners/seasons/80379-7-3.jpghttp://thetvdb.com/banners/seasons/80379-3-4.jpghttp://thetvdb.com/banners/seasons/80379-4-5.jpghttp://thetvdb.com/banners/seasons/80379-2-9.jpghttp://thetvdb.com/banners/seasons/80379-0-2.jpghttp://thetvdb.com/banners/seasons/80379-6-6.jpghttp://thetvdb.com/banners/seasons/80379-4-4.jpghttp://thetvdb.com/banners/seasons/80379-6-2.jpghttp://thetvdb.com/banners/seasons/80379-1-9.jpghttp://thetvdb.com/banners/seasons/80379-6-4.jpghttp://thetvdb.com/banners/seasons/80379-1.jpghttp://thetvdb.com/banners/seasons/80379-3.jpghttp://thetvdb.com/banners/seasons/80379-4-2.jpghttp://thetvdb.com/banners/seasons/80379-5-7.jpghttp://thetvdb.com/banners/seasons/80379-2-10.jpghttp://thetvdb.com/banners/seasons/80379-6-5.jpghttp://thetvdb.com/banners/seasons/80379-1-5.jpghttp://thetvdb.com/banners/seasons/80379-5-4.jpghttp://thetvdb.com/banners/seasons/80379-4.jpghttp://thetvdb.com/banners/seasons/80379-6-3.jpghttp://thetvdb.com/banners/seasons/80379-5.jpghttp://thetvdb.com/banners/seasons/80379-3-6.jpghttp://thetvdb.com/banners/seasons/80379-2.jpghttp://thetvdb.com/banners/seasons/80379-7.jpghttp://thetvdb.com/banners/seasons/80379- - 1-7.jpghttp://thetvdb.com/banners/seasons/80379-5-2.jpghttp://thetvdb.com/banners/seasons/80379-5-3.jpghttp://thetvdb.com/banners/seasons/80379-7-2.jpghttp://thetvdb.com/banners/seasons/80379-1-2.jpghttp://thetvdb.com/banners/seasons/80379-2-5.jpghttp://thetvdb.com/banners/seasons/80379-4-3.jpghttp://thetvdb.com/banners/seasons/80379-5-5.jpghttp://thetvdb.com/banners/seasons/80379-0.jpghttp://thetvdb.com/banners/seasons/80379-3-5.jpghttp://thetvdb.com/banners/ - seasons/80379-1-6.jpghttp://thetvdb.com/banners/seasons/80379-2-3.jpghttp://thetvdb.com/banners/seasons/80379-2-8.jpghttp://thetvdb.com/banners/seasons/80379-6-7.jpghttp://thetvdb.com/banners/seasons/80379-5-8.jpghttp://thetvdb.com/banners/seasons/80379-4-7.jpghttp://thetvdb.com/banners/seasons/80379-2-6.jpghttp://thetvdb.com/banners/seasons/80379-3-8.jpghttp://thetvdb.com/banners/seasons/80379-1-11.jpghttp://thetvdb.com/banners/seasons/80379-1-10.jpghttp:// - thetvdb.com/banners/seasons/80379-1-8.jpghttp://thetvdb.com/banners/seasons/80379-3-7.jpghttp://thetvdb.com/banners/seasons/80379-2-4.jpghttp://thetvdb.com/banners/seasons/80379-1-3.jpghttp://thetvdb.com/banners/seasons/80379-1-4.jpghttp://thetvdb.com/banners/seasons/80379-3-3.jpghttp://thetvdb.com/banners/seasons/80379-2-7.jpghttp://thetvdb.com/banners/seasons/80379-6.jpghttp://thetvdb.com/banners/seasons/80379-2-2.jpghttp://thetvdb.com/banners/seasons/80379-5-6.jpghttp://thetvdb.com/banners/seasons/80379-3-2.jpghttp://thetvdb.com/banners/seasons/80379-4-6.jpghttp://thetvdb.com/banners/seasonswide/80379-5.jpghttp://thetvdb.com/banners/seasonswide/80379-3-2.jpghttp://thetvdb.com/banners/seasonswide/80379-1-2.jpghttp://thetvdb.com/banners/seasonswide/80379-2-2.jpghttp://thetvdb.com/banners/seasonswide/80379-4-2.jpghttp://thetvdb.com/banners/seasonswide/80379-0.jpghttp://thetvdb.com/banners/seasonswide/80379-0-2.jpghttp://thetvdb.com/banners/seasonswide/80379-1.jpghttp://thetvdb.com/banners/seasonswide/80379-2.jpghttp://thetvdb.com/banners/seasonswide/80379-4.jpghttp://thetvdb.com/banners/seasonswide/80379-3.jpghttp://thetvdb.com/banners/posters/80379-22.jpghttp://thetvdb.com/banners/posters/80379-18.jpghttp://thetvdb.com/banners/posters/80379-13.jpghttp://thetvdb.com/banners/posters/80379-10.jpghttp://thetvdb.com/banners/posters/80379-16.jpghttp://thetvdb.com/banners/posters/80379-1.jpghttp://thetvdb.com/banners/posters/80379-9.jpghttp://thetvdb.com/banners/posters/80379-2.jpghttp://thetvdb.com/banners/posters/80379-19.jpghttp://thetvdb.com/banners/posters/80379-8.jpghttp://thetvdb.com/banners/posters/80379-4.jpghttp://thetvdb.com/banners/posters/80379-20.jpghttp://thetvdb.com/banners/posters/80379-23.jpghttp://thetvdb.com/banners/posters/80379-7.jpghttp://thetvdb.com/banners/posters/80379-3.jpghttp://thetvdb.com/banners/posters/80379-12.jpghttp://thetvdb.com/banners/posters/80379-11.jpghttp://thetvdb.com/banners/posters/80379-15.jpghttp://thetvdb.com/banners/posters/80379-21.jpghttp://thetvdb.com/banners/posters/80379-14.jpghttp://thetvdb.com/banners/posters/80379-17.jpghttp://thetvdb.com/banners/posters/80379-6.jpghttp://thetvdb.com/banners/posters/80379-5.jpghttp://thetvdb.com/banners/posters/80379-22.jpghttp://thetvdb.com/banners/posters/80379-18.jpghttp://thetvdb.com/banners/posters/80379-13.jpghttp://thetvdb.com/banners/posters/80379-10.jpghttp://thetvdb.com/banners/posters/80379-16.jpghttp://thetvdb.com/banners/posters/80379-1.jpghttp://thetvdb.com/banners/posters/80379-9.jpghttp://thetvdb.com/banners/posters/80379-2.jpghttp://thetvdb.com/banners/posters/80379-19.jpghttp://thetvdb.com/banners/posters/80379-8.jpghttp://thetvdb.com/banners/posters/80379-4.jpghttp://thetvdb.com/banners/posters/80379-20.jpghttp://thetvdb.com/banners/posters/80379-23.jpghttp://thetvdb.com/banners/posters/80379-7.jpghttp://thetvdb.com/banners/posters/80379-3.jpghttp://thetvdb.com/banners/posters/80379-12.jpghttp://thetvdb.com/banners/posters/80379-11.jpghttp://thetvdb.com/banners/posters/80379-15.jpghttp://thetvdb.com/banners/posters/80379-21.jpghttp://thetvdb.com/banners/posters/80379-14.jpghttp://thetvdb.com/banners/posters/80379-17.jpghttp://thetvdb.com/banners/posters/80379-6.jpghttp://thetvdb.com/banners/posters/80379-5.jpg','','Comedy','','http://thetvdb.com/api/1D62F2F90030C444/series/80379/all/en.zip','fanart/original/80379-2.jpgfanart/original/80379-34.jpgfanart/original/80379- - 4.jpgfanart/original/80379-42.jpgfanart/original/80379-37.jpgfanart/original/80379-14.jpgfanart/original/80379-16.jpgfanart/original/80379-1.jpgfanart/original/80379-35.jpgfanart/original/80379-40.jpgfanart/original/80379-31.jpgfanart/original/80379-29.jpgfanart/original/80379-11.jpgfanart/original/80379-24.jpgfanart/original/80379-30.jpgfanart/original/80379-19.jpgfanart/original/80379-9.jpgfanart/original/80379-13.jpgfanart/original/80379-45.jpgfanart/original/80379-33.jpgfanart/original/80379-10.jpgfanart/original/80379-23.jpgfanart/original/80379-12.jpgfanart/original/80379-5.jpgfanart/original/80379-26.jpgfanart/original/80379-27.jpgfanart/original/80379-32.jpgfanart/original/80379-3.jpgfanart/original/80379-25.jpgfanart/original/80379-7.jpgfanart/original/80379-21.jpgfanart/original/80379-28.jpgfanart/original/80379-36.jpgfanart/original/80379-38.jpgfanart/original/80379-20.jpgfanart/original/80379-17.jpgfanart/original/80379-43.jpgfanart/original/80379-22.jpgfanart/original/80379-15.jpgfanart/original/80379-18.jpgfanart/original/80379-6.jpgfanart/original/80379-8.jpgfanart/original/80379-41.jpgfanart/original/80379-44.jpgfanart/original/80379-39.jpg','80379','TV-PG','CBS','','/tmp/tvshows/The.Big.Bang.Theory/','1',NULL,NULL,NULL,NULL,NULL,NULL); - CREATE TABLE episode ( idEpisode integer primary key, idFile integer,c00 text,c01 text,c02 text,c03 text,c04 text,c05 text,c06 text,c07 text,c08 text,c09 text,c10 text,c11 text,c12 varchar(24),c13 varchar(24),c14 text,c15 text,c16 text,c17 varchar(24),c18 text,c19 text,c20 text,c21 text,c22 text,c23 text, idShow integer); - INSERT INTO "episode" VALUES(1,1,'Pilot','Brilliant physicist roommates Leonard and Sheldon meet their new neighbor Penny, who begins showing them that as much as they know about science, they know little about actual living.','','7.700000','Chuck Lorre / Bill Prady','2007-09-24','http://thetvdb.com/banners/episodes/80379/332484.jpg','',NULL,'1800','James Burrows','','1','1','','-1','-1','-1','/tmp/tvshows/The.Big.Bang.Theory/The.Big.Bang.Theory.S01E01.WEB-DL.AAC2.0.H264.mkv','2','332484',NULL,NULL,NULL,1); - CREATE TABLE tvshowlinkpath (idShow integer, idPath integer); - INSERT INTO "tvshowlinkpath" VALUES(1,2); - CREATE TABLE seasons ( idSeason integer primary key, idShow integer, season integer); - INSERT INTO "seasons" VALUES(1,1,-1); - INSERT INTO "seasons" VALUES(2,1,0); - INSERT INTO "seasons" VALUES(3,1,1); - INSERT INTO "seasons" VALUES(4,1,2); - INSERT INTO "seasons" VALUES(5,1,3); - INSERT INTO "seasons" VALUES(6,1,4); - INSERT INTO "seasons" VALUES(7,1,5); - INSERT INTO "seasons" VALUES(8,1,6); - INSERT INTO "seasons" VALUES(9,1,7); - CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT); - INSERT INTO "art" VALUES(1,1,'actor','thumb','http://thetvdb.com/banners/actors/73597.jpg'); - INSERT INTO "art" VALUES(2,2,'actor','thumb','http://thetvdb.com/banners/actors/73596.jpg'); - INSERT INTO "art" VALUES(3,3,'actor','thumb','http://thetvdb.com/banners/actors/73595.jpg'); - INSERT INTO "art" VALUES(4,4,'actor','thumb','http://thetvdb.com/banners/actors/73599.jpg'); - INSERT INTO "art" VALUES(5,5,'actor','thumb','http://thetvdb.com/banners/actors/73598.jpg'); - INSERT INTO "art" VALUES(6,6,'actor','thumb','http://thetvdb.com/banners/actors/283158.jpg'); - INSERT INTO "art" VALUES(7,7,'actor','thumb','http://thetvdb.com/banners/actors/283157.jpg'); - INSERT INTO "art" VALUES(8,8,'actor','thumb','http://thetvdb.com/banners/actors/91271.jpg'); - INSERT INTO "art" VALUES(9,9,'actor','thumb','http://thetvdb.com/banners/actors/294178.jpg'); - INSERT INTO "art" VALUES(10,10,'actor','thumb','http://thetvdb.com/banners/actors/283159.jpg'); - INSERT INTO "art" VALUES(11,1,'tvshow','banner','http://thetvdb.com/banners/graphical/80379-g13.jpg'); - INSERT INTO "art" VALUES(12,1,'tvshow','fanart','http://thetvdb.com/banners/fanart/original/80379-2.jpg'); - INSERT INTO "art" VALUES(13,1,'tvshow','poster','http://thetvdb.com/banners/posters/80379-22.jpg'); - INSERT INTO "art" VALUES(14,1,'season','poster','http://thetvdb.com/banners/posters/80379-22.jpg'); - INSERT INTO "art" VALUES(15,2,'season','banner','http://thetvdb.com/banners/seasonswide/80379-0.jpg'); - INSERT INTO "art" VALUES(16,2,'season','poster','http://thetvdb.com/banners/seasons/80379-0-4.jpg'); - INSERT INTO "art" VALUES(17,3,'season','banner','http://thetvdb.com/banners/seasonswide/80379-1-2.jpg'); - INSERT INTO "art" VALUES(18,3,'season','poster','http://thetvdb.com/banners/seasons/80379-1-12.jpg'); - INSERT INTO "art" VALUES(19,4,'season','banner','http://thetvdb.com/banners/seasonswide/80379-2-2.jpg'); - INSERT INTO "art" VALUES(20,4,'season','poster','http://thetvdb.com/banners/seasons/80379-2-11.jpg'); - INSERT INTO "art" VALUES(21,5,'season','banner','http://thetvdb.com/banners/seasonswide/80379-3-2.jpg'); - INSERT INTO "art" VALUES(22,5,'season','poster','http://thetvdb.com/banners/seasons/80379-3-9.jpg'); - INSERT INTO "art" VALUES(23,6,'season','banner','http://thetvdb.com/banners/seasonswide/80379-4-2.jpg'); - INSERT INTO "art" VALUES(24,6,'season','poster','http://thetvdb.com/banners/seasons/80379-4-8.jpg'); - INSERT INTO "art" VALUES(25,7,'season','banner','http://thetvdb.com/banners/seasonswide/80379-5.jpg'); - INSERT INTO "art" VALUES(26,7,'season','poster','http://thetvdb.com/banners/seasons/80379-5-9.jpg'); - INSERT INTO "art" VALUES(27,8,'season','poster','http://thetvdb.com/banners/seasons/80379-6-8.jpg'); - INSERT INTO "art" VALUES(28,9,'season','poster','http://thetvdb.com/banners/seasons/80379-7-3.jpg'); - INSERT INTO "art" VALUES(29,1,'episode','thumb','http://thetvdb.com/banners/episodes/80379/332484.jpg'); - CREATE INDEX ix_bookmark ON bookmark (idFile, type); - CREATE INDEX ix_path ON path ( strPath ); - CREATE INDEX ix_files ON files ( idPath, strFilename ); - CREATE UNIQUE INDEX ix_episode_file_1 on episode (idEpisode, idFile); - CREATE UNIQUE INDEX id_episode_file_2 on episode (idFile, idEpisode); - CREATE INDEX ix_episode_season_episode on episode (c12, c13); - CREATE INDEX ix_episode_bookmark on episode (c17); - CREATE INDEX ix_episode_show1 on episode(idEpisode,idShow); - CREATE INDEX ix_episode_show2 on episode(idShow,idEpisode); - CREATE UNIQUE INDEX ix_tvshowlinkpath_1 ON tvshowlinkpath ( idShow, idPath ); - CREATE UNIQUE INDEX ix_tvshowlinkpath_2 ON tvshowlinkpath ( idPath, idShow ); - CREATE INDEX ixEpisodeBasePath ON episode ( c19 ); - CREATE INDEX ixTVShowBasePath on tvshow ( c17 ); - CREATE INDEX ix_seasons ON seasons (idShow, season); - CREATE INDEX ix_art ON art(media_id, media_type, type); - CREATE VIEW episodeview - AS - SELECT episode.*, - files.strfilename AS strFileName, - path.strpath AS strPath, - files.playcount AS playCount, - files.lastplayed AS lastPlayed, - files.dateadded AS dateAdded, - tvshow.c00 AS strTitle, - tvshow.c14 AS strStudio, - tvshow.c05 AS premiered, - tvshow.c13 AS mpaa, - tvshow.c16 AS strShowPath, - bookmark.timeinseconds AS resumeTimeInSeconds, - bookmark.totaltimeinseconds AS totalTimeInSeconds, - seasons.idseason AS idSeason - FROM episode - JOIN files - ON files.idfile = episode.idfile - JOIN tvshow - ON tvshow.idshow = episode.idshow - LEFT JOIN seasons - ON seasons.idshow = episode.idshow - AND seasons.season = episode.c12 - JOIN path - ON files.idpath = path.idpath - LEFT JOIN bookmark - ON bookmark.idfile = episode.idfile - AND bookmark.type = 1; - CREATE VIEW tvshowview - AS - SELECT tvshow.*, - path.strpath AS strPath, - path.dateadded AS dateAdded, - Max(files.lastplayed) AS lastPlayed, - NULLIF(Count(episode.c12), 0) AS totalCount, - Count(files.playcount) AS watchedcount, - NULLIF(Count(DISTINCT( episode.c12 )), 0) AS totalSeasons - FROM tvshow - LEFT JOIN tvshowlinkpath - ON tvshowlinkpath.idshow = tvshow.idshow - LEFT JOIN path - ON path.idpath = tvshowlinkpath.idpath - LEFT JOIN episode - ON episode.idshow = tvshow.idshow - LEFT JOIN files - ON files.idfile = episode.idfile - GROUP BY tvshow.idshow; - SELECT - episodeview.c12, - path.strPath, - tvshowview.c00, - tvshowview.c01, - tvshowview.c05, - tvshowview.c08, - tvshowview.c14, - tvshowview.c13, - seasons.idSeason, - count(1), - count(files.playCount) - FROM episodeview - JOIN tvshowview ON tvshowview.idShow = episodeview.idShow - JOIN seasons ON (seasons.idShow = tvshowview.idShow - AND seasons.season = episodeview.c12) - JOIN files ON files.idFile = episodeview.idFile - JOIN tvshowlinkpath ON tvshowlinkpath.idShow = tvshowview.idShow - JOIN path ON path.idPath = tvshowlinkpath.idPath - WHERE tvshowview.idShow = 1 - GROUP BY episodeview.c12; - - - CREATE TABLE x(i INTEGER PRIMARY KEY, y TEXT); - INSERT INTO x VALUES(10, '10'); - SELECT * FROM x WHERE x.y>='1' AND x.y<'2' AND x.i=x.y; - - - CREATE TABLE t1(x TEXT); - CREATE TABLE t2(y TEXT); - INSERT INTO t1 VALUES('abc'); - INSERT INTO t2 VALUES('ABC'); - SELECT * FROM t1 CROSS JOIN t2 WHERE (x=y COLLATE nocase) AND y='ABC'; - - - CREATE TABLE t3(i INTEGER PRIMARY KEY, t TEXT); - INSERT INTO t3 VALUES(10, '10'); - SELECT * FROM t3 WHERE i=t AND t = '10 '; - - - CREATE TABLE u1(x TEXT, y INTEGER, z TEXT); - CREATE INDEX i1 ON u1(x); - INSERT INTO u1 VALUES('00013', 13, '013'); - SELECT * FROM u1 WHERE x=y AND y=z AND z='013'; - - - CREATE TABLE b1(x, y); - INSERT INTO b1 VALUES('abc', 'ABC'); - CREATE INDEX b1x ON b1(x); - SELECT * FROM b1 WHERE (x=y COLLATE nocase) AND y='ABC'; - - - CREATE TABLE c1(x, y COLLATE nocase, z); - INSERT INTO c1 VALUES('ABC', 'ABC', 'abc'); - SELECT * FROM c1 WHERE x=y AND y=z AND z='abc'; - - - CREATE INDEX c1x ON c1(x); - SELECT * FROM c1 WHERE x=y AND y=z AND z='abc'; - - - EXPLAIN QUERY PLAN - SELECT * FROM c1 WHERE x=y AND y=z AND z='abc'; - - - SELECT * FROM c1 WHERE x=y AND z=y AND z='abc'; - - - EXPLAIN QUERY PLAN - SELECT * FROM c1 WHERE x=y AND z=y AND z='abc'; - - - CREATE TABLE t0(a0 INT, b1 INT); - CREATE INDEX t0b1 ON t0(b1); - CREATE TABLE t1(w,x,y,z3 INT); - INSERT INTO t0(a0, b1) VALUES (0,1); - INSERT INTO t1(w,x,y,z3) VALUES (7,8,9,1); - - - SELECT ALL * FROM t0,t1 WHERE b1=z3 AND a0=z3; - - - SELECT ALL * FROM t0,t1 WHERE likely(b1=z3) AND a0=z3; - - - DROP TABLE t0; - DROP TABLE t1; - CREATE TABLE t0(c0 INT, c1 INT UNIQUE); - CREATE TABLE t1(c0 INT); - INSERT INTO t0(c0, c1) VALUES (0, 1); - INSERT INTO t1(c0) VALUES (1); - SELECT ALL * FROM t1 NATURAL JOIN t0 WHERE (t1.c0=t0.c1); - SELECT ALL * FROM t1 NATURAL JOIN t0 WHERE (likely(t1.c0=t0.c1)); - SELECT ALL * FROM t1,t0 WHERE (likely(t1.c0=t0.c1) AND t1.c0=t0.c0); - - - CREATE TABLE t1(a INT PRIMARY KEY); - INSERT INTO t1(a) VALUES(1),(2),(3); - CREATE TABLE t2(x INTEGER PRIMARY KEY,y INT); - INSERT INTO t2(y) VALUES(2),(3); - - - SELECT * FROM t1 CROSS JOIN t2 WHERE t2.y=t1.a AND t1.a=t2.x - - - SELECT * FROM t1 CROSS JOIN t2 WHERE likely(t2.y=t1.a) AND unlikely(t1.a=t2.x) - - - CREATE TABLE t1(a INT); - INSERT INTO t1 VALUES(0),(3); - CREATE TABLE t2(b INT UNIQUE, c INT); - INSERT INTO t2 VALUES(1,4) ,(0,5); - SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE c=a AND b IS a); - SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE a=c AND a IS b); - SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE a=c AND b IS a); - SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE c=a AND a IS b); - - - CREATE TABLE t3(a INTEGER PRIMARY KEY,b); - INSERT INTO t3(a,b) VALUES(1,2),(5,5),(7,11); - SELECT * FROM t3 WHERE a=b AND a='5'; - - - SELECT * FROM t3 WHERE a=b AND a='4'; - - - SELECT * FROM t3 WHERE a=b AND a='7'; - - - SELECT * FROM t3 WHERE a=b AND a='5x'; - diff --git a/libsql-wal/tests/assets/fixtures/trigger1.test b/libsql-wal/tests/assets/fixtures/trigger1.test deleted file mode 100644 index cac3d4f940..0000000000 --- a/libsql-wal/tests/assets/fixtures/trigger1.test +++ /dev/null @@ -1,81 +0,0 @@ - - CREATE TABLE t17a(ii INT); - CREATE TABLE t17b(tt TEXT PRIMARY KEY, ss); - CREATE TRIGGER t17a_ai AFTER INSERT ON t17a BEGIN - INSERT INTO t17b(tt) VALUES(new.ii); - END; - CREATE TRIGGER t17b_ai AFTER INSERT ON t17b BEGIN - UPDATE t17b SET ss = 4; - END; - INSERT INTO t17a(ii) VALUES('1'); - PRAGMA integrity_check; - - - CREATE TABLE t18(a PRIMARY KEY,b,c); - INSERT INTO t18(a,b,c) VALUES(1,2,3); - CREATE TRIGGER t18r1 BEFORE UPDATE ON t18 BEGIN - UPDATE t18 SET b=1000 WHERE a=old.a; - END; - UPDATE t18 SET c=b WHERE a=1; - SELECT * FROM t18; - - - DELETE FROM t18; - INSERT INTO t18(a,b,c) VALUES(1,2,3); - UPDATE t18 SET c=b, b=b+1 WHERE a=1; - SELECT * FROM t18; - - - CREATE TABLE t19(a INT PRIMARY KEY, b, c)WITHOUT ROWID; - INSERT INTO t19(a,b,c) VALUES(1,2,3); - CREATE TRIGGER t19r3 BEFORE UPDATE ON t19 BEGIN SELECT new.b; END; - UPDATE t19 SET c=b WHERE a=1; - SELECT * FROM t19; - - - DELETE FROM t19; - INSERT INTO t19(a,b,c) VALUES(1,2,3); - UPDATE t19 SET c=CASE WHEN b=2 THEN b ELSE b+99 END WHERE a=1; - SELECT * FROM t19; - - - CREATE TABLE t20_1(x); - ATTACH ':memory:' AS aux; - CREATE TABLE aux.t20_2(y); - CREATE TABLE aux.t20_3(z); - CREATE TEMP TRIGGER r20_3 AFTER INSERT ON t20_2 BEGIN UPDATE t20_3 SET z=z+1; END; - DETACH aux; - DROP TRIGGER r20_3; - - - PRAGMA recursive_triggers = true; - CREATE TABLE t0(a, b, c UNIQUE); - CREATE UNIQUE INDEX i0 ON t0(b) WHERE a; - CREATE TRIGGER tr0 AFTER DELETE ON t0 BEGIN - DELETE FROM t0; - END; - INSERT INTO t0(a,b,c) VALUES(0,0,9),(1,1,1); - REPLACE INTO t0(a,b,c) VALUES(2,0,9); - SELECT * FROM t0; - - - CREATE TABLE t1( - a INTEGER PRIMARY KEY, - b DOUBLE - ); - CREATE TRIGGER x AFTER UPDATE ON t1 BEGIN - SELECT sum(b)OVER(ORDER BY (SELECT b FROM t1 AS x - WHERE b IN (t1.a,127,t1.b) - GROUP BY b)) - FROM t1 - GROUP BY a; - END; - CREATE TEMP TRIGGER x BEFORE INSERT ON t1 BEGIN - UPDATE t1 - SET b=randomblob(10) - WHERE b >= 'E' - AND a < (SELECT a FROM t1 WHERE a<22 GROUP BY b); - END; - INSERT INTO t1(b) VALUES('Y'),('X'),('Z'); - SELECT a, CASE WHEN typeof(b)='text' THEN quote(b) ELSE '' END, '|' FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/trigger2.test b/libsql-wal/tests/assets/fixtures/trigger2.test deleted file mode 100644 index 020faed93f..0000000000 --- a/libsql-wal/tests/assets/fixtures/trigger2.test +++ /dev/null @@ -1,16 +0,0 @@ - - CREATE TABLE t1(a,b,c,d); - CREATE VIEW v2(a,b,c,d) AS SELECT * FROM t1; - CREATE TRIGGER v2ins INSTEAD OF INSERT ON v2 BEGIN - INSERT INTO t1(a,b,c,d) VALUES(new.a, new.b, new.c, new.d); - END; - INSERT INTO v2(a,d) VALUES(11,14); - SELECT * FROM t1; - - - CREATE TABLE t1(a INT PRIMARY KEY, b, c REAL, d, e); - CREATE TABLE t2(a INT, b, c REAL, d, e, PRIMARY KEY(a,b)) WITHOUT ROWID; - CREATE UNIQUE INDEX t2c ON t2(c); - CREATE UNIQUE INDEX t2d ON t2(d); - CREATE UNIQUE INDEX t2e ON t2(e); - diff --git a/libsql-wal/tests/assets/fixtures/trigger3.test b/libsql-wal/tests/assets/fixtures/trigger3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trigger4.test b/libsql-wal/tests/assets/fixtures/trigger4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trigger5.test b/libsql-wal/tests/assets/fixtures/trigger5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trigger6.test b/libsql-wal/tests/assets/fixtures/trigger6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trigger7.test b/libsql-wal/tests/assets/fixtures/trigger7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trigger8.test b/libsql-wal/tests/assets/fixtures/trigger8.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/trigger9.test b/libsql-wal/tests/assets/fixtures/trigger9.test deleted file mode 100644 index bd7dc860b9..0000000000 --- a/libsql-wal/tests/assets/fixtures/trigger9.test +++ /dev/null @@ -1,19 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE log(x); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - CREATE VIEW v1 AS SELECT a, b FROM t1; - - CREATE TRIGGER tr1 INSTEAD OF DELETE ON v1 BEGIN - INSERT INTO log VALUES('delete'); - END; - - CREATE TRIGGER tr2 INSTEAD OF UPDATE ON v1 BEGIN - INSERT INTO log VALUES('update'); - END; - - CREATE TRIGGER tr3 INSTEAD OF INSERT ON v1 BEGIN - INSERT INTO log VALUES('insert'); - END; - diff --git a/libsql-wal/tests/assets/fixtures/triggerA.test b/libsql-wal/tests/assets/fixtures/triggerA.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/triggerB.test b/libsql-wal/tests/assets/fixtures/triggerB.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/triggerC.test b/libsql-wal/tests/assets/fixtures/triggerC.test deleted file mode 100644 index 97437cb63a..0000000000 --- a/libsql-wal/tests/assets/fixtures/triggerC.test +++ /dev/null @@ -1,55 +0,0 @@ - - PRAGMA recursive_triggers = ON; - CREATE TABLE t12(a, b); - INSERT INTO t12 VALUES(1, 2); - CREATE TRIGGER tr12 AFTER UPDATE ON t12 BEGIN - UPDATE t12 SET a=new.a+1, b=new.b+1; - END; - - - PRAGMA recursive_triggers = 1; - CREATE TABLE node( - id int not null primary key, - pid int not null default 0 references node, - key varchar not null, - path varchar default '', - unique(pid, key) - ); - CREATE TRIGGER node_delete_referencing AFTER DELETE ON "node" - BEGIN - DELETE FROM "node" WHERE pid = old."id"; - END; - - - INSERT INTO node(id, pid, key) VALUES(9, 0, 'test'); - INSERT INTO node(id, pid, key) VALUES(90, 9, 'test1'); - INSERT INTO node(id, pid, key) VALUES(900, 90, 'test2'); - DELETE FROM node WHERE id=9; - SELECT * FROM node; - - - CREATE TABLE x1 (x); - - CREATE TABLE x2 (a, b); - CREATE TABLE '"x2"'(a, b); - - INSERT INTO x2 VALUES(1, 2); - INSERT INTO x2 VALUES(3, 4); - INSERT INTO '"x2"' SELECT * FROM x2; - - CREATE TRIGGER x1ai AFTER INSERT ON x1 BEGIN - INSERT INTO """x2""" VALUES('x', 'y'); - DELETE FROM """x2""" WHERE a=1; - UPDATE """x2""" SET b = 11 WHERE a = 3; - END; - - INSERT INTO x1 VALUES('go!'); - - SELECT * FROM x2; - SELECT * FROM """x2"""; - - CREATE TABLE xyz(x INTEGER PRIMARY KEY, y, z); - CREATE TRIGGER xyz_tr BEFORE INSERT ON xyz BEGIN - SELECT new.x; - END; - diff --git a/libsql-wal/tests/assets/fixtures/triggerD.test b/libsql-wal/tests/assets/fixtures/triggerD.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/triggerE.test b/libsql-wal/tests/assets/fixtures/triggerE.test deleted file mode 100644 index d686f5d4c8..0000000000 --- a/libsql-wal/tests/assets/fixtures/triggerE.test +++ /dev/null @@ -1,44 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - CREATE TABLE t3(e, f); - - -# ATTACH 'test.db2' AS aux; -# CREATE TABLE aux.t4(x); -# INSERT INTO aux.t4 VALUES(5); -# -# CREATE TRIGGER tr1 AFTER INSERT ON t1 WHEN new.a IN (SELECT x FROM aux.t4) -# BEGIN -# SELECT 1; -# END; -# - INSERT INTO t1 VALUES(1,1); - INSERT INTO t1 VALUES(5,5); - - PRAGMA writable_schema = 1; - INSERT INTO sqlite_master VALUES('trigger', 'tr1', 't1', 0, - 'CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO t2 VALUES(?1, ?2); - END' - ); - - INSERT INTO sqlite_master VALUES('trigger', 'tr2', 't3', 0, - 'CREATE TRIGGER tr2 AFTER INSERT ON t3 WHEN ?1 IS NULL BEGIN - UPDATE t2 SET c=d WHERE c IS ?2; - END' - ); - - - INSERT INTO t1 VALUES(1, 2); - SELECT * FROM t2; - - SELECT * FROM t1 - - DELETE FROM t2; - INSERT INTO t2 VALUES('x', 'y'); - INSERT INTO t2 VALUES(NULL, 'z'); - INSERT INTO t3 VALUES(1, 2); - SELECT * FROM t3; - SELECT * FROM t2; - diff --git a/libsql-wal/tests/assets/fixtures/triggerF.test b/libsql-wal/tests/assets/fixtures/triggerF.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/triggerG.test b/libsql-wal/tests/assets/fixtures/triggerG.test deleted file mode 100644 index 45dd60397d..0000000000 --- a/libsql-wal/tests/assets/fixtures/triggerG.test +++ /dev/null @@ -1,55 +0,0 @@ - - PRAGMA recursive_triggers = 1; - - CREATE TABLE t1(a); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1(a) VALUES(0),(2),(3),(8),(9); - CREATE TABLE t2(b); - CREATE TABLE t3(c); - - CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN - INSERT INTO t3 SELECT new.c+1 WHERE new.c<5; - INSERT INTO t2 SELECT new.c*100+a FROM t1 WHERE a IN (1, 2, 3, 4); - END; - - INSERT INTO t3 VALUES(2); - SELECT c FROM t3 ORDER BY c;; - - - SELECT b FROM t2 ORDER BY b; - - - DELETE FROM t1; - INSERT INTO t1(a) VALUES(0),(2),(3),(8),(9); - DELETE FROM t2; - DELETE FROM t3; - DROP TRIGGER tr; - CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN - INSERT INTO t3 SELECT new.c+1 WHERE new.c<5; - INSERT INTO t2 SELECT new.c*10000+xx.a*100+yy.a - FROM t1 AS xx, t1 AS yy - WHERE xx.a IN (1,2,3,4) - AND yy.a IN (2,3,4,5); - END; - - INSERT INTO t3 VALUES(2); - SELECT b FROM t2 ORDER BY b; - - - CREATE TABLE t4(x); - CREATE TRIGGER tr4 AFTER INSERT ON t4 BEGIN - SELECT 0x2147483648e0e0099 AS y WHERE y; - END; - - - CREATE VIEW v0(a) AS SELECT 1234; - CREATE TRIGGER t0001 INSTEAD OF DELETE ON v0 BEGIN - SELECT old.a; - END; - - - SELECT a FROM v0; - - - DELETE FROM v0; - diff --git a/libsql-wal/tests/assets/fixtures/triggerupfrom.test b/libsql-wal/tests/assets/fixtures/triggerupfrom.test deleted file mode 100644 index 4c22e784fe..0000000000 --- a/libsql-wal/tests/assets/fixtures/triggerupfrom.test +++ /dev/null @@ -1,95 +0,0 @@ - - CREATE TABLE map(k, v); - INSERT INTO map VALUES(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'); - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - - CREATE TRIGGER tr AFTER INSERT ON t1 BEGIN - UPDATE t1 SET c = v FROM map WHERE k=new.a AND a=new.a; - END; - - - INSERT INTO t1(a) VALUES(1); - - - SELECT a, c FROM t1 ORDER BY a; - - - INSERT INTO t1(a) VALUES(2), (3), (4), (5); - SELECT a, c FROM t1 ORDER BY a; - - - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t3(x, y); - INSERT INTO aux.t3 VALUES('x', 'y'); - - - CREATE TEMP TRIGGER tr2 AFTER INSERT ON t1 BEGIN - UPDATE t1 SET b = y FROM aux.t3 WHERE a=new.a; - END; - INSERT INTO t1(a) VALUES(10), (20); - SELECT * FROM t1; - - - CREATE TABLE link(f, t); - INSERT INTO link VALUES(5, 2), (20, 10), (2, 1); - CREATE TRIGGER tr3 BEFORE DELETE ON t1 BEGIN - UPDATE t1 SET b=coalesce(old.b,old.c) FROM main.link WHERE a=t AND old.a=f; - END; - DELETE FROM t1 WHERE a=2; - SELECT * FROM t1; - - - CREATE TABLE mmm(x, y); - INSERT INTO mmm VALUES(1, 'one'); - INSERT INTO mmm VALUES(2, 'two'); - INSERT INTO mmm VALUES(3, 'three'); - - ATTACH 'test.db2' AS aux; - CREATE TABLE aux.t1(a, b); - CREATE TABLE aux.mmm(x, y); - INSERT INTO aux.mmm VALUES(1, 'ONE'); - INSERT INTO aux.mmm VALUES(2, 'TWO'); - INSERT INTO aux.mmm VALUES(3, 'THREE'); - - CREATE TRIGGER aux.ttt AFTER INSERT ON t1 BEGIN - UPDATE t1 SET b=y FROM mmm WHERE x=new.a AND a=new.a; - END; - - INSERT INTO t1(a) VALUES (2); - SELECT * FROM t1; - - - CREATE TABLE t1(k, a, b); - INSERT INTO t1 VALUES('a', 1, 'one'); - INSERT INTO t1 VALUES('b', 2, 'two'); - INSERT INTO t1 VALUES('c', 3, 'three'); - INSERT INTO t1 VALUES('d', 4, 'four'); - - CREATE TABLE log(x); - CREATE VIEW v1 AS SELECT k, a, b AS __hidden__b FROM t1; - CREATE TRIGGER tr1 INSTEAD OF UPDATE ON v1 BEGIN - INSERT INTO log VALUES( - '('||old.a||','||old.__hidden__b||')->('||new.a||','||new.__hidden__b||')' - ); - END; - - - SELECT * FROM v1 - - - SELECT * FROM v1 - - - UPDATE v1 SET a='xyz' WHERE k IN ('a', 'c'); - SELECT * FROM log; - DELETE FROM log; - - - CREATE TABLE map(k, v); - INSERT INTO map VALUES('b', 'twelve'); - INSERT INTO map VALUES('d', 'fourteen'); - UPDATE v1 SET a=map.v FROM map WHERE v1.k=map.k; - SELECT * FROM log; - DELETE FROM log; - diff --git a/libsql-wal/tests/assets/fixtures/trustschema1.test b/libsql-wal/tests/assets/fixtures/trustschema1.test deleted file mode 100644 index 2001ca4a79..0000000000 --- a/libsql-wal/tests/assets/fixtures/trustschema1.test +++ /dev/null @@ -1,116 +0,0 @@ - - PRAGMA trusted_schema=OFF; - - - PRAGMA trusted_schema=OFF; - CREATE TEMP TABLE temp1(a,b AS (f3(a+1))); - INSERT INTO temp1(a) VALUES(100),(900); - SELECT * FROM temp1; - - - SELECT * FROM t2; - - - PRAGMA trusted_schema=OFF; - CREATE TEMP TABLE temp2(a, b, CHECK(f3(b)==b)); - INSERT INTO temp2(a,b) VALUES(1,2),('x','y'); - SELECT * FROM temp2; - - - CREATE TEMP TABLE temp3(a, b DEFAULT(f3(31))); - INSERT INTO temp3(a) VALUES(22); - SELECT * FROM temp3; - - - CREATE TABLE t4(a,b,c); - INSERT INTO t4 VALUES(1,2,3),('a','b','c'),(4,'d',0); - SELECT * FROM t4; - CREATE TEMP TABLE temp4(a,b,c); - INSERT INTO temp4 SELECT * FROM t4; - - - CREATE INDEX t4a ON t4(a) WHERE f1(c); - SELECT a FROM t4 WHERE f1(c) ORDER BY a; - - - PRAGMA trusted_schema=ON; - CREATE INDEX t4b ON t4(b) WHERE f2(c); - SELECT b FROM t4 WHERE f2(c) ORDER BY b; - - - PRAGMA trusted_schema=OFF; - CREATE INDEX temp4a ON temp4(a) WHERE f3(c); - SELECT a FROM temp4 WHERE f2(c) ORDER BY a; - - - CREATE TABLE t5(a,b,c); - INSERT INTO t5 VALUES(1,2,3),(4,5,6),(7,0,-3); - SELECT * FROM t5; - CREATE TEMP TABLE temp5(a,b,c); - INSERT INTO temp5 SELECT * FROM t5; - - - CREATE INDEX t5x1 ON t5(a+f1(b)); - SELECT * FROM t5 INDEXED BY t5x1 WHERE a+f1(b)=3; - - - PRAGMA trusted_schema=ON; - CREATE INDEX t5x2 ON t5(b+f2(c)); - SELECT * FROM t5 INDEXED BY t5x2 WHERE b+f2(c)=11; - - - PRAGMA trusted_schema=OFF; - CREATE INDEX temp5x1 ON temp5(a+f3(b)); - SELECT * FROM temp5 INDEXED BY temp5x1 WHERE a+f3(b)=7; - - - CREATE TABLE t1(a,b,c); - INSERT INTO t1 VALUES(1,2,3),(100,50,75),(-11,22,-33); - CREATE VIEW v1a AS SELECT f3(a+b) FROM t1; - SELECT f3(a+b) FROM t1; - - - DROP VIEW v1a; - CREATE TEMP VIEW v1a AS SELECT f3(a+b) FROM t1; - SELECT * FROM v1a; - - - CREATE VIEW v1b AS SELECT f2(b+c) FROM t1; - SELECT f2(b+c) FROM t1; - - - DROP VIEW v1b; - CREATE TEMP VIEW v1b AS SELECT f2(b+c) FROM t1; - SELECT * FROM v1b; - - - DELETE FROM t1; - CREATE TABLE t2(x); - CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN - INSERT INTO t2(x) SELECT f3(new.a); - END; - - - SELECT * FROM t1; - SELECT * FROM t2; - - - DROP TRIGGER r1; - CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN - INSERT INTO t2(x) SELECT f2(new.a)+100; - END; - PRAGMA trusted_schema=ON; - INSERT INTO t1 VALUES(7,6,5); - SELECT * FROM t1, t2; - - - SELECT * FROM t1; - SELECT * FROM t2; - - - PRAGMA trusted_schema=OFF; - CREATE VIEW test41(x) AS SELECT json_extract('{"a":123 - - PRAGMA trusted_schema=ON; - SELECT * FROM test41; - diff --git a/libsql-wal/tests/assets/fixtures/types.test b/libsql-wal/tests/assets/fixtures/types.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/types2.test b/libsql-wal/tests/assets/fixtures/types2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/types3.test b/libsql-wal/tests/assets/fixtures/types3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/unhex.test b/libsql-wal/tests/assets/fixtures/unhex.test deleted file mode 100644 index 2086a103b6..0000000000 --- a/libsql-wal/tests/assets/fixtures/unhex.test +++ /dev/null @@ -1,9 +0,0 @@ - - SELECT typeof( unhex('') ), length( unhex('') ); - - - SELECT typeof( unhex(' ', ' -') ), length( unhex('-', ' -') ); - - SELECT typeof(unhex(NULL)) - SELECT typeof(unhex(NULL, ' ')) - SELECT typeof(unhex('1234', NULL)) diff --git a/libsql-wal/tests/assets/fixtures/unionall.test b/libsql-wal/tests/assets/fixtures/unionall.test deleted file mode 100644 index f87fa26896..0000000000 --- a/libsql-wal/tests/assets/fixtures/unionall.test +++ /dev/null @@ -1,289 +0,0 @@ - - CREATE TABLE t1_a(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE t1_b(c INTEGER PRIMARY KEY, d TEXT); - CREATE TABLE t1_c(e INTEGER PRIMARY KEY, f TEXT); - - INSERT INTO t1_a VALUES(1, 'one'), (4, 'four'); - INSERT INTO t1_b VALUES(2, 'two'), (5, 'five'); - INSERT INTO t1_c VALUES(3, 'three'), (6, 'six'); - - CREATE VIEW t1 AS - SELECT a, b FROM t1_a UNION ALL - SELECT c, d FROM t1_b UNION ALL - SELECT e, f FROM t1_c; - - CREATE TABLE i1(x); - INSERT INTO i1 VALUES(2), (5), (6), (1); - - - SELECT a, b FROM ( - SELECT a, b FROM t1_a UNION ALL - SELECT c, d FROM t1_b UNION ALL - SELECT e, f FROM t1_c - ) ORDER BY a - - - SELECT a, b FROM t1 ORDER BY a - - - SELECT a, b FROM i1, t1 WHERE a=x ORDER BY a - - - CREATE TABLE t0(c0 INT); - INSERT INTO t0 VALUES(0); - CREATE TABLE t1_a(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1_a VALUES(1,'one'); - CREATE TABLE t1_b(c INTEGER PRIMARY KEY, d TEXT); - INSERT INTO t1_b VALUES(2,'two'); - CREATE VIEW t1 AS SELECT a, b FROM t1_a UNION ALL SELECT c, c FROM t1_b; - SELECT * FROM (SELECT t1.a, t1.b AS b, t0.c0 FROM t0, t1); - - - SELECT * FROM (SELECT t1.a, t1.b AS b, t0.c0 FROM t0, t1) WHERE b=2; - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(1, 'ONE'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t1 VALUES(2, 'TWO'); - INSERT INTO t1 VALUES(3, 'three'); - INSERT INTO t1 VALUES(3, 'THREE'); - - - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<3 - ) - SELECT * FROM ( - SELECT 0 AS i UNION ALL SELECT i FROM s UNION ALL SELECT 0 - ), t1 WHERE x=i; - - - CREATE TABLE t2_a(k INTEGER PRIMARY KEY, v TEXT); - CREATE TABLE t2_b(k INTEGER PRIMARY KEY, v TEXT); - - CREATE VIEW t2 AS - SELECT * FROM t2_a - UNION ALL - SELECT * FROM t2_b; - - CREATE TRIGGER t2_insert INSTEAD OF INSERT ON t2 BEGIN - INSERT INTO t2_a SELECT new.k, new.v WHERE (new.k%2)==0; - INSERT INTO t2_b SELECT new.k, new.v WHERE (new.k%2)==1; - END; - - INSERT INTO t2 VALUES(5, 'v'), (4, 'iv'), (3, 'iii'), (2, 'ii'); - - - SELECT * FROM t1, t2 WHERE x=k; - - - SELECT * FROM t1 LEFT JOIN t2 ON (x=k); - - - SELECT x1.*, x2.* FROM t2 AS x1, t2 AS x2 WHERE x1.k=x2.k+1 - - - SELECT * FROM t1, t2 WHERE x=k ORDER BY y; - - - SELECT * FROM t1, t2 WHERE x=k ORDER BY y||''; - - - SELECT * FROM t1, t2 WHERE x=k ORDER BY v - - - SELECT * FROM t1, t2 WHERE x=k ORDER BY v||'' - - - SELECT * FROM t1, t2 WHERE x=k ORDER BY k,v||'' - - - SELECT * FROM t1, t2 ORDER BY +k - - - SELECT * FROM t1, t2 ORDER BY k - - - CREATE TABLE t1(c INTEGER PRIMARY KEY, d TEXT); - INSERT INTO t1 VALUES(1,2); - CREATE TABLE t3_a(k INTEGER PRIMARY KEY, v TEXT); - INSERT INTO t3_a VALUES(2,'ii'); - CREATE TABLE t3_b(k INTEGER PRIMARY KEY, v TEXT); - CREATE VIEW t3 AS - SELECT * FROM t3_a - UNION ALL - SELECT * FROM t3_b; - - - SELECT * FROM t1, t3 ORDER BY k; - - - - CREATE TABLE t1_a(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1_a VALUES(123, 't1_a'); - CREATE TABLE t1_b(c INTEGER PRIMARY KEY, d TEXT); - - CREATE VIEW t1 AS - SELECT a, b FROM t1_a - UNION ALL - SELECT c, d FROM t1_b; - - CREATE TABLE t3_a(k INTEGER PRIMARY KEY, v TEXT); - INSERT INTO t3_a VALUES(456, 't3_a'); - CREATE TABLE t3_b(k INTEGER PRIMARY KEY, v TEXT); - - CREATE VIEW t3 AS - SELECT * FROM t3_a - UNION ALL - SELECT * FROM t3_b; - - - SELECT * FROM t1, t3 ORDER BY k; - - - SELECT * FROM (SELECT * FROM t1, t3) ORDER BY k; - - - SELECT * FROM (SELECT * FROM t1, t3), ( - SELECT max(a) OVER () FROM t1 - UNION ALL - SELECT min(a) OVER () FROM t1 - ) - ORDER BY k; - - - SELECT * FROM (SELECT * FROM t1, t3), ( - SELECT group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a), - group_concat(a) OVER (ORDER BY a) - FROM t1 - ) - ORDER BY k; - - - SELECT * FROM (SELECT * FROM t1, t3) AS o, ( - SELECT * FROM t1 LEFT JOIN t3 ON a=k - ); - - - CREATE TABLE t1_a(a INTEGER PRIMARY KEY, b TEXT); - INSERT INTO t1_a VALUES(1,'one'); - INSERT INTO t1_a VALUES(0,NULL); - CREATE TABLE t1_b(c INTEGER PRIMARY KEY, d TEXT); - INSERT INTO t1_b VALUES(2,'two'); - INSERT INTO t1_b VALUES(5,'five'); - CREATE TABLE t1_c(e INTEGER PRIMARY KEY, f TEXT); - INSERT INTO t1_c VALUES(3,'three'); - INSERT INTO t1_c VALUES(6,'six'); - CREATE TABLE t2(k,v); - INSERT INTO t2 VALUES(5,'v'); - INSERT INTO t2 VALUES(4,'iv'); - INSERT INTO t2 VALUES(3,'iii'); - INSERT INTO t2 VALUES(2,'ii'); - CREATE TABLE t3_a(k INTEGER PRIMARY KEY, v TEXT); - INSERT INTO t3_a VALUES(2,'ii'); - INSERT INTO t3_a VALUES(4,'iv'); - CREATE TABLE t3_b(k INTEG5R PRIMARY KEY, v TEXT); - INSERT INTO t3_b VALUES(NULL,'iii'); - INSERT INTO t3_b VALUES(NULL,'v'); - CREATE VIEW t1 AS - SELECT a, b FROM t1_a UNION ALL - SELECT c, d FROM t1_b UNION ALL - SELECT e, f FROM t1_c; - CREATE VIEW t3 AS - SELECT * FROM t3_a - UNION ALL - SELECT * FROM t3_b; - CREATE TRIGGER t3_insert INSTEAD OF INSERT ON t3 BEGIN - INSERT INTO t3_a SELECT new.k, new.v WHERE (new.k%2)==0; - INSERT INTO t3_b SELECT new.k, new.v WHERE (new.k%2)==1; - END; - - - SELECT *, '+' FROM t1 LEFT JOIN t2 ON (a NOT IN(SELECT v FROM t1, t3 WHERE a=k)=NOT EXISTS(SELECT 1 FROM t1 LEFT JOIN t3 ON (a=k))); - - - SELECT *, '+' FROM t1 LEFT JOIN t3 ON (a NOT IN(SELECT v FROM t1 LEFT JOIN t2 ON (a=k))=k); - - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,2); - CREATE TABLE t2(a,b); - INSERT INTO t2 VALUES(3,4); - - CREATE TABLE t3(a,b); - INSERT INTO t3 VALUES(5,6); - CREATE TABLE t4(a,b); - INSERT INTO t4 VALUES(7,8); - - CREATE TABLE t5(a,b); - INSERT INTO t5 VALUES(9,10); - - - WITH x(c) AS ( - SELECT 1000 FROM t1 UNION ALL SELECT 800 FROM t2 - ), - y(d) AS ( - SELECT 100 FROM t3 UNION ALL SELECT 400 FROM t4 - ) - SELECT * FROM t5, x, y; - - - WITH c1(x) AS (VALUES(0) UNION ALL SELECT 100+x FROM c1 WHERE x<100 UNION ALL SELECT 1+x FROM c1 WHERE x<1) - SELECT x, y, '|' - FROM c1 AS x1, (SELECT x+1 AS y FROM c1 WHERE x<1 UNION ALL SELECT 1+x FROM c1 WHERE 1'0',t1; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b=2; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b=2.0; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b='2'; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b=2; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b=2.0; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b='2'; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b=2; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b=2.0; - - - SELECT * FROM (SELECT t1.a, t1.b, t0.c0 AS c, v0.c0 AS d FROM t0 LEFT JOIN v0 ON v0.c0>'0',t1) WHERE b='2'; - diff --git a/libsql-wal/tests/assets/fixtures/unionall2.test b/libsql-wal/tests/assets/fixtures/unionall2.test deleted file mode 100644 index a3548ee879..0000000000 --- a/libsql-wal/tests/assets/fixtures/unionall2.test +++ /dev/null @@ -1,31 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE TABLE t2(c, d); - - CREATE VIEW v1 AS SELECT * FROM t1, t2; - CREATE VIEW v2 AS SELECT * FROM t1, t2; - - CREATE VIEW vA AS - SELECT * FROM v1, ( - SELECT * FROM t1 LEFT JOIN t2 ON (a=c) - ) - UNION ALL - SELECT * FROM v1, v2 - - - SELECT 1 FROM vA, vA, vA, vA, vA, vA, vA, vA, vA, vA - - - CREATE TABLE y1(a INTEGER, b); - CREATE TABLE y2(c INTEGER, d); - - CREATE TABLE x3_a(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE x3_b(c INTEGER PRIMARY KEY, d TEXT); - - - - SELECT * FROM y1 CROSS JOIN y2 WHERE y1.a=y2.c AND y2.c IN ( - SELECT a FROM x3_a UNION ALL - SELECT c FROM x3_b ORDER BY 1 - ) - diff --git a/libsql-wal/tests/assets/fixtures/unionallfault.test b/libsql-wal/tests/assets/fixtures/unionallfault.test deleted file mode 100644 index 48162e0903..0000000000 --- a/libsql-wal/tests/assets/fixtures/unionallfault.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(x,y,z); - CREATE TABLE t3(x,y,z); - diff --git a/libsql-wal/tests/assets/fixtures/unionvtab.test b/libsql-wal/tests/assets/fixtures/unionvtab.test deleted file mode 100644 index 9b335ebb8a..0000000000 --- a/libsql-wal/tests/assets/fixtures/unionvtab.test +++ /dev/null @@ -1,245 +0,0 @@ - - ATTACH 'test.db2' AS aux; - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE t2(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE aux.t3(a INTEGER PRIMARY KEY, b TEXT); - - - INSERT INTO t1 VALUES(1, 'one'), (2, 'two'), (3, 'three'); - INSERT INTO t2 VALUES(10, 'ten'), (11, 'eleven'), (12, 'twelve'); - INSERT INTO t3 VALUES(20, 'twenty'), (21, 'twenty-one'), (22, 'twenty-two'); - - - CREATE VIRTUAL TABLE temp.uuu USING unionvtab( - "VALUES(NULL, 't1', 1, 9), ('main', 't2', 10, 19), ('aux', 't3', 20, 29)" - ); - SELECT * FROM uuu; - - - PRAGMA table_info(uuu); - - - SELECT * FROM uuu WHERE rowid = 3; - SELECT * FROM uuu WHERE rowid = 11; - - - SELECT * FROM uuu WHERE rowid IN (12, 10, 2); - - - SELECT * FROM uuu WHERE rowid BETWEEN 3 AND 11; - - - SELECT * FROM uuu WHERE rowid BETWEEN 11 AND 15; - - - SELECT * FROM uuu WHERE rowid BETWEEN -46 AND 1500; - - - CREATE TABLE src(db, tbl, min, max); - INSERT INTO src VALUES(NULL, 't1', 1, 9); - INSERT INTO src VALUES('main', 't2', 10, 19); - INSERT INTO src VALUES('aux', 't3', 20, 29); - CREATE VIRTUAL TABLE temp.opp USING unionvtab(src); - SELECT * FROM opp; - - - CREATE VIRTUAL TABLE temp.qll USING unionvtab( - 'SELECT * FROM src WHERE db!=''xyz''' - ); - SELECT * FROM qll WHERE rowid BETWEEN 10 AND 21; - - - CREATE TABLE wr1(a, b, c PRIMARY KEY) WITHOUT ROWID; - CREATE VIEW v1 AS SELECT * FROM t1; - CREATE VIEW v2 AS SELECT _rowid_, * FROM t1; - - CREATE TABLE wr2(a, _rowid_ INTEGER, c PRIMARY KEY) WITHOUT ROWID; - CREATE TABLE wr3(a, b, _rowid_ PRIMARY KEY) WITHOUT ROWID; - - - CREATE TABLE x1(a BLOB, b); - CREATE TABLE x2(a BLOB, b); - CREATE TEMP TABLE x3(a BLOB, b); - - CREATE TABLE aux.y1(one, two, three INTEGER PRIMARY KEY); - CREATE TEMP TABLE y2(one, two, three INTEGER PRIMARY KEY); - CREATE TABLE y3(one, two, three INTEGER PRIMARY KEY); - - - CREATE TABLE tbl1(a INTEGER PRIMARY KEY, b); - CREATE TABLE tbl2(a INTEGER PRIMARY KEY, b); - CREATE TABLE tbl3(a INTEGER PRIMARY KEY, b); - - WITH ss(ii) AS ( SELECT 1 UNION ALL SELECT ii+1 FROM ss WHERE ii<100 ) - INSERT INTO tbl1 SELECT ii, '1.' || ii FROM ss; - - WITH ss(ii) AS ( SELECT 1 UNION ALL SELECT ii+1 FROM ss WHERE ii<100 ) - INSERT INTO tbl2 SELECT ii, '2.' || ii FROM ss; - - WITH ss(ii) AS ( SELECT 1 UNION ALL SELECT ii+1 FROM ss WHERE ii<100 ) - INSERT INTO tbl3 SELECT ii, '3.' || ii FROM ss; - - CREATE VIRTUAL TABLE temp.uu USING unionvtab( - "VALUES(NULL,'tbl2', 26, 74), (NULL,'tbl3', 75, 100), (NULL,'tbl1', 1, 25)" - ); - - - SELECT * FROM uu WHERE rowid = 10; - - - SELECT * FROM uu WHERE rowid = 25; - - SELECT count(*) FROM uu WHERE rowid <= 24 - SELECT count(*) FROM uu WHERE rowid <= 25 - SELECT count(*) FROM uu WHERE rowid <= 26 - SELECT count(*) FROM uu WHERE rowid <= 73 - SELECT count(*) FROM uu WHERE rowid <= 74 - SELECT count(*) FROM uu WHERE rowid <= 75 - SELECT count(*) FROM uu WHERE rowid <= 99 - SELECT count(*) FROM uu WHERE rowid <= 100 - SELECT count(*) FROM uu WHERE rowid <= 101 - SELECT count(*) FROM uu WHERE rowid < 25 - SELECT count(*) FROM uu WHERE rowid < 26 - SELECT count(*) FROM uu WHERE rowid < 27 - SELECT count(*) FROM uu WHERE rowid < 73 - SELECT count(*) FROM uu WHERE rowid < 74 - SELECT count(*) FROM uu WHERE rowid < 75 - SELECT count(*) FROM uu WHERE rowid < 76 - SELECT count(*) FROM uu WHERE rowid < 99 - SELECT count(*) FROM uu WHERE rowid < 100 - SELECT count(*) FROM uu WHERE rowid < 101 - SELECT count(*) FROM uu WHERE rowid > 24 - SELECT count(*) FROM uu WHERE rowid > 25 - SELECT count(*) FROM uu WHERE rowid > 26 - SELECT count(*) FROM uu WHERE rowid > 27 - SELECT count(*) FROM uu WHERE rowid > 73 - SELECT count(*) FROM uu WHERE rowid > 74 - SELECT count(*) FROM uu WHERE rowid > 75 - SELECT count(*) FROM uu WHERE rowid > 76 - SELECT count(*) FROM uu WHERE rowid > 99 - SELECT count(*) FROM uu WHERE rowid > 100 - SELECT count(*) FROM uu WHERE rowid > 101 - SELECT count(*) FROM uu WHERE rowid >= 24 - SELECT count(*) FROM uu WHERE rowid >= 25 - SELECT count(*) FROM uu WHERE rowid >= 26 - SELECT count(*) FROM uu WHERE rowid >= 27 - SELECT count(*) FROM uu WHERE rowid >= 73 - SELECT count(*) FROM uu WHERE rowid >= 74 - SELECT count(*) FROM uu WHERE rowid >= 75 - SELECT count(*) FROM uu WHERE rowid >= 76 - SELECT count(*) FROM uu WHERE rowid >= 99 - SELECT count(*) FROM uu WHERE rowid >= 100 - SELECT count(*) FROM uu WHERE rowid >= 101 - SELECT count(*) FROM uu WHERE rowid >= $S - SELECT count(*) FROM uu WHERE rowid > $S - SELECT count(*) FROM uu WHERE rowid <= $S - SELECT count(*) FROM uu WHERE rowid < $S - SELECT count(*) FROM uu WHERE rowid >= $L - SELECT count(*) FROM uu WHERE rowid > $L - SELECT count(*) FROM uu WHERE rowid <= $L - SELECT count(*) FROM uu WHERE rowid < $L - SELECT count(*) FROM uu WHERE a < 25 - SELECT count(*) FROM uu WHERE a < 26 - SELECT count(*) FROM uu WHERE a < 27 - SELECT count(*) FROM uu WHERE a < 73 - SELECT count(*) FROM uu WHERE a < 74 - SELECT count(*) FROM uu WHERE a < 75 - SELECT count(*) FROM uu WHERE a < 76 - SELECT count(*) FROM uu WHERE a < 99 - SELECT count(*) FROM uu WHERE a < 100 - SELECT count(*) FROM uu WHERE a < 101 - - CREATE TABLE s1(k INTEGER PRIMARY KEY, v); - INSERT INTO s1 VALUES($S, 'one'); - INSERT INTO s1 VALUES($S+1, 'two'); - INSERT INTO s1 VALUES($S+2, 'three'); - - CREATE TABLE l1(k INTEGER PRIMARY KEY, v); - INSERT INTO l1 VALUES($L, 'six'); - INSERT INTO l1 VALUES($L-1, 'five'); - INSERT INTO l1 VALUES($L-2, 'four'); - - CREATE VIRTUAL TABLE temp.sl USING unionvtab( - "SELECT NULL, 'l1', 0, 9223372036854775807 - UNION ALL - SELECT NULL, 's1', -9223372036854775808, -1" - ); - - - SELECT * FROM sl; - - - SELECT * FROM sl WHERE rowid>-9223372036854775808 - - - SELECT * FROM sl WHERE rowid>=-9223372036854775808 - - - SELECT * FROM sl WHERE rowid<=-9223372036854775808 - - - SELECT * FROM sl WHERE rowid<-9223372036854775808 - - - SELECT * FROM sl WHERE rowid<9223372036854775807 - - - SELECT * FROM sl WHERE rowid<=9223372036854775807 - - - SELECT * FROM sl WHERE rowid>=9223372036854775807 - - - SELECT * FROM sl WHERE rowid>9223372036854775807 - - - CREATE TABLE c0(one, two INTEGER PRIMARY KEY); - CREATE TABLE c1(one, two INTEGER PRIMARY KEY); - CREATE TABLE c2(one, two INTEGER PRIMARY KEY); - CREATE TABLE c3(one, two INTEGER PRIMARY KEY); - CREATE TABLE c4(one, two INTEGER PRIMARY KEY); - CREATE TABLE c5(one, two INTEGER PRIMARY KEY); - CREATE TABLE c6(one, two INTEGER PRIMARY KEY); - CREATE TABLE c7(one, two INTEGER PRIMARY KEY); - CREATE TABLE c8(one, two INTEGER PRIMARY KEY); - CREATE TABLE c9(one, two INTEGER PRIMARY KEY); - - INSERT INTO c0 VALUES('zero', 0); - INSERT INTO c1 VALUES('one', 1); - INSERT INTO c2 VALUES('two', 2); - INSERT INTO c3 VALUES('three', 3); - INSERT INTO c4 VALUES('four', 4); - INSERT INTO c5 VALUES('five', 5); - INSERT INTO c6 VALUES('six', 6); - INSERT INTO c7 VALUES('seven', 7); - INSERT INTO c8 VALUES('eight', 8); - INSERT INTO c9 VALUES('nine', 9); - - CREATE VIRTUAL TABLE temp.cc USING unionvtab([ - SELECT 'main', 'c9', 9, 9 UNION ALL - SELECT 'main', 'c8', 8, 8 UNION ALL - SELECT 'main', 'c7', 7, 7 UNION ALL - SELECT 'main', 'c6', 6, 6 UNION ALL - SELECT 'main', 'c5', 5, 5 UNION ALL - SELECT 'main', 'c4', 4, 4 UNION ALL - SELECT 'main', 'c3', 3, 3 UNION ALL - SELECT 'main', 'c2', 2, 2 UNION ALL - SELECT 'main', 'c1', 1, 1 UNION ALL - SELECT 'main', 'c0', 0, 0 - ]); - - SELECT sum(two) FROM cc; - - - SELECT one FROM cc WHERE one>='seven' - - - SELECT y.one FROM cc AS x, cc AS y WHERE x.one=y.one AND x.rowid>5 - - - SELECT cc.one FROM c4, cc WHERE cc.rowid>c4.rowid - - - SELECT * FROM cc WHERE two LIKE '6' - diff --git a/libsql-wal/tests/assets/fixtures/unionvtabfault.test b/libsql-wal/tests/assets/fixtures/unionvtabfault.test deleted file mode 100644 index 2af8c90cf9..0000000000 --- a/libsql-wal/tests/assets/fixtures/unionvtabfault.test +++ /dev/null @@ -1,10 +0,0 @@ - - ATTACH 'test.db2' AS aux; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE t2(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE aux.t3(a INTEGER PRIMARY KEY, b TEXT); - - INSERT INTO t1 VALUES(1, 'one'), (2, 'two'), (3, 'three'); - INSERT INTO t2 VALUES(10, 'ten'), (11, 'eleven'), (12, 'twelve'); - INSERT INTO t3 VALUES(20, 'twenty'), (21, 'twenty-one'), (22, 'twenty-two'); - diff --git a/libsql-wal/tests/assets/fixtures/unique.test b/libsql-wal/tests/assets/fixtures/unique.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/unique2.test b/libsql-wal/tests/assets/fixtures/unique2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/unixexcl.test b/libsql-wal/tests/assets/fixtures/unixexcl.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/unordered.test b/libsql-wal/tests/assets/fixtures/unordered.test deleted file mode 100644 index fbf8d54f85..0000000000 --- a/libsql-wal/tests/assets/fixtures/unordered.test +++ /dev/null @@ -1,13 +0,0 @@ - - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a); - INSERT INTO t1 VALUES(1, 'xxx'); - INSERT INTO t1 SELECT a+1, b FROM t1; - INSERT INTO t1 SELECT a+2, b FROM t1; - INSERT INTO t1 SELECT a+4, b FROM t1; - INSERT INTO t1 SELECT a+8, b FROM t1; - INSERT INTO t1 SELECT a+16, b FROM t1; - INSERT INTO t1 SELECT a+32, b FROM t1; - INSERT INTO t1 SELECT a+64, b FROM t1; - ANALYZE; - diff --git a/libsql-wal/tests/assets/fixtures/update.test b/libsql-wal/tests/assets/fixtures/update.test deleted file mode 100644 index 6eee07eb0c..0000000000 --- a/libsql-wal/tests/assets/fixtures/update.test +++ /dev/null @@ -1,89 +0,0 @@ - - CREATE TABLE t15(a INTEGER PRIMARY KEY, b); - INSERT INTO t15(a,b) VALUES(10,'abc'),(20,'def'),(30,'ghi'); - ALTER TABLE t15 ADD COLUMN c; - CREATE INDEX t15c ON t15(c); - INSERT INTO t15(a,b) - VALUES(5,'zyx'),(15,'wvu'),(25,'tsr'),(35,'qpo'); - UPDATE t15 SET c=printf('y%d',a) WHERE c IS NULL; - SELECT a,b,c,'|' FROM t15 ORDER BY a; - - - CREATE TABLE t16(a INTEGER PRIMARY KEY ON CONFLICT REPLACE, b UNIQUE); - INSERT INTO t16(a,b) VALUES(1,2),(3,4),(5,6); - UPDATE t16 SET a=a; - SELECT * FROM t16 ORDER BY +a; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x,y); - INSERT INTO t1(x) VALUES(1); - CREATE INDEX t1x1 ON t1(1) WHERE 3; - UPDATE t1 SET x=2, y=3 WHERE 3; - SELECT * FROM t1; - - - PRAGMA encoding = 'UTF16'; - CREATE TABLE t0(c0 REAL, c1); - INSERT INTO t0(c0,c1) VALUES('xyz',11),('uvw',22); - CREATE INDEX i0 ON t0(c1) WHERE c0 GLOB 3; - CREATE INDEX i1 ON t0(c0,c1) WHERE typeof(c0)='text' AND typeof(c1)='integer'; - UPDATE t0 SET c1=345; - SELECT * FROM t0; - - - PRAGMA encoding = 'utf16'; - CREATE TABLE t0(c0 TEXT); - CREATE INDEX i0 ON t0(0 LIKE COALESCE(c0, 0)); - INSERT INTO t0(c0) VALUES (0), (0); - SELECT * FROM t0; - - - CREATE TABLE t1( - a TEXT, - b INTEGER PRIMARY KEY UNIQUE - ); - INSERT INTO t1 VALUES(1,2); - UPDATE t1 SET a = quote(b) WHERE b>=2; - SELECT * FROM t1; - - - PRAGMA recursive_triggers = true; - CREATE TABLE t1(a UNIQUE ON CONFLICT REPLACE, b); - INSERT INTO t1(a,b) VALUES(4,12),(9,13); - CREATE INDEX i0 ON t1(b); - CREATE TRIGGER tr0 DELETE ON t1 BEGIN - UPDATE t1 SET b = a; - END; - PRAGMA integrity_check; - - - PRAGMA integrity_check; - - - CREATE TABLE t1 (vkey INTEGER, c5 INTEGER); - INSERT INTO t1 VALUES(3,NULL),(6,-54); - - - BEGIN; - UPDATE t1 SET vkey = 100 WHERE c5 is null; - SELECT * FROM t1 ORDER BY vkey, c5; - ROLLBACK; - - - BEGIN; - UPDATE t1 SET vkey = 100 WHERE NOT (-10*(select min(vkey) from t1) >= c5); - SELECT * FROM t1 ORDER BY vkey, c5; - ROLLBACK; - - - BEGIN; - UPDATE t1 SET vkey = 100 WHERE c5 is null OR NOT (-10*(select min(vkey) from t1) >= c5); - SELECT * FROM t1 ORDER BY vkey, c5; - ROLLBACK; - - - DROP TABLE t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); - CREATE TABLE t2(d INT); - diff --git a/libsql-wal/tests/assets/fixtures/update2.test b/libsql-wal/tests/assets/fixtures/update2.test deleted file mode 100644 index 3de60630b7..0000000000 --- a/libsql-wal/tests/assets/fixtures/update2.test +++ /dev/null @@ -1,78 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - CREATE TABLE t2(a INTEGER PRIMARY KEY, b); - WITH s(i) AS ( SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<500 ) - INSERT INTO t1(b) SELECT char((i % 26) + 65) FROM s; - INSERT INTO t2 SELECT * FROM t1; - - - UPDATE t1 SET b = repeat(b, 100) - - - SELECT * FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1(a INT PRIMARY KEY, b) WITHOUT ROWID; - WITH s(i) AS ( SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<$nrow ) - INSERT INTO t1(a, b) SELECT i+1, char((i % 26) + 65) FROM s; - - - UPDATE t1 SET b = repeat(b, 100) - - - SELECT * FROM t1; - - - CREATE TABLE t3(a PRIMARY KEY, b, c); - CREATE INDEX t3i ON t3(b); - - UPDATE t3 SET c=1 WHERE b=? - UPDATE t3 SET c=1 WHERE rowid=? - - CREATE TABLE t4(a PRIMARY KEY, b, c) WITHOUT ROWID; - CREATE INDEX t4c ON t4(c); - INSERT INTO t4 VALUES(1, 2, 3); - INSERT INTO t4 VALUES(2, 3, 4); - - - UPDATE t4 SET c=c+2 WHERE c>2; - SELECT a, c FROM t4 ORDER BY a; - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c); - CREATE INDEX x1c ON x1(b, c); - INSERT INTO x1 VALUES(1, 'a', 1); - INSERT INTO x1 VALUES(2, 'a', 2); - INSERT INTO x1 VALUES(3, 'a', 3); - - - UPDATE x1 SET c=c+1 WHERE b='a'; - - - SELECT * FROM x1; - - - CREATE TABLE d1(a,b); - CREATE INDEX d1b ON d1(a); - CREATE INDEX d1c ON d1(b); - INSERT INTO d1 VALUES(1,2); - - - UPDATE d1 SET a = a+2 WHERE a>0 OR b>0; - - - SELECT * FROM d1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x,y); - CREATE UNIQUE INDEX t1x1 ON t1(x) WHERE x IS NOT NULL; - INSERT INTO t1(x) VALUES(NULL),(NULL); - CREATE INDEX t1x2 ON t1(y); - SELECT quote(x), quote(y), '|' FROM t1; - - - UPDATE OR REPLACE t1 SET x=1; - SELECT quote(x), quote(y), '|' FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/upfrom1.test b/libsql-wal/tests/assets/fixtures/upfrom1.test deleted file mode 100644 index 5fa31e5946..0000000000 --- a/libsql-wal/tests/assets/fixtures/upfrom1.test +++ /dev/null @@ -1,146 +0,0 @@ - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER) WITHOUT ROWID; - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(4, 5, 6); - INSERT INTO t2 VALUES(7, 8, 9); - - DROP TABLE IF EXISTS chng; - CREATE TABLE chng(a INTEGER, b INTEGER, c INTEGER); - INSERT INTO chng VALUES(1, 100, 1000); - INSERT INTO chng VALUES(7, 700, 7000); - - - SELECT * FROM t2; - - - UPDATE t2 SET b = chng.b, c = chng.c FROM chng WHERE chng.a = t2.a; - SELECT * FROM t2 ORDER BY a; - - - DELETE FROM t2; - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(4, 5, 6); - INSERT INTO t2 VALUES(7, 8, 9); - - - UPDATE t2 SET (b, c) = (SELECT b, c FROM chng WHERE a=t2.a) - WHERE a IN (SELECT a FROM chng); - SELECT * FROM t2 ORDER BY a; - - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT) WITHOUT ROWID; - INSERT INTO t3 VALUES(1, 1, 'one'); - INSERT INTO t3 VALUES(2, 2, 'two'); - INSERT INTO t3 VALUES(3, 3, 'three'); - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(x TEXT); - INSERT INTO t4 VALUES('five'); - - SELECT * FROM t3 ORDER BY a; - - - UPDATE t3 SET c=x FROM t4; - SELECT * FROM t3 ORDER BY a; - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER) ; - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(4, 5, 6); - INSERT INTO t2 VALUES(7, 8, 9); - - DROP TABLE IF EXISTS chng; - CREATE TABLE chng(a INTEGER, b INTEGER, c INTEGER); - INSERT INTO chng VALUES(1, 100, 1000); - INSERT INTO chng VALUES(7, 700, 7000); - - - SELECT * FROM t2; - - - UPDATE t2 SET b = chng.b, c = chng.c FROM chng WHERE chng.a = t2.a; - SELECT * FROM t2 ORDER BY a; - - - DELETE FROM t2; - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(4, 5, 6); - INSERT INTO t2 VALUES(7, 8, 9); - - - UPDATE t2 SET (b, c) = (SELECT b, c FROM chng WHERE a=t2.a) - WHERE a IN (SELECT a FROM chng); - SELECT * FROM t2 ORDER BY a; - - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT) ; - INSERT INTO t3 VALUES(1, 1, 'one'); - INSERT INTO t3 VALUES(2, 2, 'two'); - INSERT INTO t3 VALUES(3, 3, 'three'); - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(x TEXT); - INSERT INTO t4 VALUES('five'); - - SELECT * FROM t3 ORDER BY a; - - - UPDATE t3 SET c=x FROM t4; - SELECT * FROM t3 ORDER BY a; - - - DROP TABLE IF EXISTS t5; - DROP TABLE IF EXISTS m1; - DROP TABLE IF EXISTS m2; - CREATE TABLE t5(a INTEGER PRIMARY KEY, b TEXT, c TEXT); - CREATE TABLE m1(x INTEGER PRIMARY KEY, y TEXT); - CREATE TABLE m2(u INTEGER PRIMARY KEY, v TEXT); - - INSERT INTO t5 VALUES(1, 'one', 'ONE'); - INSERT INTO t5 VALUES(2, 'two', 'TWO'); - INSERT INTO t5 VALUES(3, 'three', 'THREE'); - INSERT INTO t5 VALUES(4, 'four', 'FOUR'); - - INSERT INTO m1 VALUES(1, 'i'); - INSERT INTO m1 VALUES(2, 'ii'); - INSERT INTO m1 VALUES(3, 'iii'); - - INSERT INTO m2 VALUES(1, 'I'); - INSERT INTO m2 VALUES(3, 'II'); - INSERT INTO m2 VALUES(4, 'III'); - - - UPDATE t5 SET b=y, c=v FROM m1 LEFT JOIN m2 ON (x=u) WHERE x=a; - SELECT * FROM t5 ORDER BY a; - - - CREATE TABLE t0(a); - CREATE TABLE t1(b); - UPDATE t1 SET b=sum(a) FROM t0; - SELECT * FROM t0, t1; - - - CREATE TABLE t1(x INT); INSERT INTO t1 VALUES(1); - CREATE TABLE t2(y INT); INSERT INTO t2 VALUES(2); - WITH t1 AS (SELECT y+100 AS x FROM t2) - UPDATE t1 SET x=(SELECT x FROM t1); - SELECT x, y FROM t1, t2; - - - WITH t1 AS (SELECT y+100 AS x FROM t2) - UPDATE t1 SET x=x+y FROM t2; - SELECT x, y FROM t1, t2; - - - CREATE TABLE t1(a); - INSERT INTO t1(a) VALUES(5); - CREATE VIEW t2 AS SELECT a FROM t1 UNION ALL SELECT a FROM t1; - CREATE TABLE t3(b,c); - INSERT INTO t3(b,c) VALUES(1,2); - UPDATE t3 SET (c,b) = (SELECT 3,4) FROM t1, t2; - SELECT * FROM t3; - diff --git a/libsql-wal/tests/assets/fixtures/upfrom2.test b/libsql-wal/tests/assets/fixtures/upfrom2.test deleted file mode 100644 index 5dd9c1589b..0000000000 --- a/libsql-wal/tests/assets/fixtures/upfrom2.test +++ /dev/null @@ -1,54 +0,0 @@ - - CREATE TABLE data(x, y, z); - CREATE VIEW t1 AS SELECT * FROM data; - CREATE TRIGGER t1_insert INSTEAD OF INSERT ON t1 BEGIN - INSERT INTO data VALUES(new.x, new.y, new.z); - END; - CREATE TRIGGER t1_update INSTEAD OF UPDATE ON t1 BEGIN - INSERT INTO log VALUES(old.z || '->' || new.z); - END; - - CREATE TABLE log(t TEXT); - - INSERT INTO t1 VALUES(1, 'i', 'one'); - INSERT INTO t1 VALUES(2, 'ii', 'two'); - INSERT INTO t1 VALUES(3, 'iii', 'three'); - INSERT INTO t1 VALUES(4, 'iv', 'four'); - - - WITH input(k, v) AS ( - VALUES(3, 'thirty'), (1, 'ten') - ) - UPDATE t1 SET z=v FROM input WHERE x=k; - - - CREATE TABLE x1(a, b, c); - CREATE TABLE x2(a, b, c); - - - CREATE TABLE t1(a); - - - UPDATE t1 SET a = 1 FROM ( - SELECT * FROM t1 - ) - - - UPDATE t1 SET a = 1 FROM ( - SELECT * FROM t1 UNION ALL SELECT * FROM t1 - ) - - - CREATE TABLE t1(a); - INSERT INTO t1(a) VALUES(11),(22),(33),(44),(55); - CREATE VIEW t2(b,c) AS SELECT a, COUNT(*) OVER () FROM t1; - CREATE TABLE t3(x,y); - CREATE TRIGGER t2r1 INSTEAD OF UPDATE ON t2 BEGIN - INSERT INTO t3(x,y) VALUES(new.b,new.c); - END; - SELECT * FROM t2; - - - UPDATE t2 SET c=t1.a FROM t1 WHERE t2.b=t1.a; - SELECT * FROM t3; - diff --git a/libsql-wal/tests/assets/fixtures/upfrom3.test b/libsql-wal/tests/assets/fixtures/upfrom3.test deleted file mode 100644 index d6fe0df5d1..0000000000 --- a/libsql-wal/tests/assets/fixtures/upfrom3.test +++ /dev/null @@ -1,26 +0,0 @@ - - CREATE TABLE u1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; - INSERT INTO u1 VALUES(0, 0, 0); - INSERT INTO u1 VALUES(1, 0, 1); - INSERT INTO u1 VALUES(2, 1, 0); - INSERT INTO u1 VALUES(3, 1, 1); - - - CREATE TABLE map(f, t); - INSERT INTO map VALUES(0, 10); - INSERT INTO map VALUES(1, 11); - UPDATE u1 SET c=t FROM map WHERE c=f; - SELECT * FROM u1 ORDER BY a; - - - UPDATE u1 SET b=t FROM map WHERE b=f; - SELECT * FROM u1 ORDER BY a; - - - CREATE TABLE map2(o1, o2, n1, n2); - INSERT INTO map2 VALUES - (10, 10, 50, 50), (10, 11, 50, 60), - (11, 10, 60, 50), (11, 11, 60, 60); - UPDATE u1 SET b=n1, c=n2 FROM map2 WHERE b=o1 AND c=o2; - SELECT * FROM u1 ORDER BY a; - diff --git a/libsql-wal/tests/assets/fixtures/upfrom4.test b/libsql-wal/tests/assets/fixtures/upfrom4.test deleted file mode 100644 index 2e41f411cf..0000000000 --- a/libsql-wal/tests/assets/fixtures/upfrom4.test +++ /dev/null @@ -1,97 +0,0 @@ - - DROP TABLE IF EXISTS t5; - DROP TABLE IF EXISTS m1; - DROP TABLE IF EXISTS m2; - CREATE TABLE t5(a INTEGER PRIMARY KEY, b TEXT, c TEXT); - CREATE TABLE m1(x INTEGER PRIMARY KEY, y TEXT); - CREATE TABLE m2(u INTEGER PRIMARY KEY, v TEXT); - - INSERT INTO t5 VALUES(1, 'one', 'ONE'); - INSERT INTO t5 VALUES(2, 'two', 'TWO'); - INSERT INTO t5 VALUES(3, 'three', 'THREE'); - INSERT INTO t5 VALUES(4, 'four', 'FOUR'); - - INSERT INTO m1 VALUES(1, 'i'); - INSERT INTO m1 VALUES(2, 'ii'); - INSERT INTO m1 VALUES(3, 'iii'); - - INSERT INTO m2 VALUES(1, 'I'); - INSERT INTO m2 VALUES(3, 'II'); - INSERT INTO m2 VALUES(4, 'III'); - SELECT * FROM t5; - - - BEGIN; - UPDATE t5 SET b=y, c=v FROM m1 LEFT JOIN m2 ON (x=u) WHERE x=a; - SELECT * FROM t5 ORDER BY a; - ROLLBACK; - - - BEGIN; - UPDATE t5 SET b=y, c=v FROM m2 RIGHT JOIN m1 ON (x=u) WHERE x=a; - SELECT * FROM t5 ORDER BY a; - ROLLBACK; - - - CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT); - INSERT INTO t1(a) VALUES(1),(2),(8),(19); - CREATE TABLE c1(x INTEGER PRIMARY KEY, b INT); - INSERT INTO c1(x,b) VALUES(1,1),(8,8),(17,17),(NULL,NULL); - CREATE TABLE c2(x INT,c INT); - INSERT INTO c2(x,c) VALUES(2,2),(8,8),(NULL,NULL); - CREATE TABLE dual(dummy TEXT); - INSERT INTO dual VALUES('X'); - - - BEGIN; - SELECT * FROM t1 ORDER BY a; - UPDATE t1 SET b=c1.b, c=c2.c - FROM dual, c1 NATURAL RIGHT JOIN c2 - WHERE x=a; - SELECT * FROM t1 ORDER BY a; - ROLLBACK; - - - CREATE TABLE t2(x); - CREATE TRIGGER AFTER INSERT ON t2 BEGIN - UPDATE t1 SET b=c1.b, c=c2.c - FROM dual, c1 NATURAL RIGHT JOIN c2 - WHERE x=a; - END; - - - BEGIN; - SELECT * FROM t1 ORDER BY a; - INSERT INTO t2(x) VALUES(1); - SELECT * FROM t1 ORDER BY a; - ROLLBACK; - - - CREATE TABLE t2(x,y,z PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t2 VALUES(89,-89,6); - CREATE TABLE t1(a INT,b TEXT,c TEXT,d REAL) STRICT; - INSERT INTO t1 VALUES(1,'xyz','def',4.5); - CREATE TRIGGER t1tr BEFORE UPDATE ON t1 BEGIN - INSERT INTO t1(a,b) VALUES(1000,'uvw'); - UPDATE t1 SET b=NULL FROM (SELECT CAST(a AS varchar) FROM t1 ORDER BY b) NATURAL LEFT FULL JOIN t1 AS text; - END; - UPDATE t1 SET b=b|100; - SELECT * FROM t1 ORDER BY a; - - - CREATE TABLE t1(abc INT, def INT); - INSERT INTO t1 VALUES(0,0); - INSERT INTO t1 VALUES(0,0); - INSERT INTO t1 VALUES(0,0); - CREATE TABLE dual(dummy TEXT); - INSERT INTO dual(dummy) VALUES('X'); - - - UPDATE t1 - SET (abc, def)=(SELECT x, 123) - FROM dual LEFT JOIN (SELECT 789 AS 'x' FROM dual) AS d2 - LIMIT 2 - - - SELECT * FROM t1 - diff --git a/libsql-wal/tests/assets/fixtures/upfromfault.test b/libsql-wal/tests/assets/fixtures/upfromfault.test deleted file mode 100644 index d737ccdbdd..0000000000 --- a/libsql-wal/tests/assets/fixtures/upfromfault.test +++ /dev/null @@ -1,13 +0,0 @@ - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(x, y, z); - - - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - UPDATE t1 SET a=x FROM t2 WHERE c=z; - END; - - INSERT INTO t2 VALUES(1, 1, 1); - INSERT INTO t2 VALUES(2, 2, 2); - INSERT INTO t2 VALUES(3, 3, 3); - diff --git a/libsql-wal/tests/assets/fixtures/upsert1.test b/libsql-wal/tests/assets/fixtures/upsert1.test deleted file mode 100644 index dc5f24f6be..0000000000 --- a/libsql-wal/tests/assets/fixtures/upsert1.test +++ /dev/null @@ -1,159 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c DEFAULT 0); - CREATE UNIQUE INDEX t1x1 ON t1(b); - INSERT INTO t1(a,b) VALUES(1,2) ON CONFLICT DO NOTHING; - INSERT INTO t1(a,b) VALUES(1,99),(99,2) ON CONFLICT DO NOTHING; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b) VALUES(2,3) ON CONFLICT(a) DO NOTHING; - INSERT INTO t1(a,b) VALUES(2,99) ON CONFLICT(a) DO NOTHING; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b) VALUES(3,4) ON CONFLICT(b) DO NOTHING; - INSERT INTO t1(a,b) VALUES(99,4) ON CONFLICT(b) DO NOTHING; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b COLLATE binary) DO NOTHING; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b) VALUES(1,2),(3,2),(4,20),(5,20) - ON CONFLICT(b) WHERE b>10 DO NOTHING; - SELECT *, 'x' FROM t1 ORDER BY b, a; - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a TEXT UNIQUE, b INT DEFAULT 1); - INSERT INTO t2(a) VALUES('one'),('two'),('three'); - PRAGMA count_changes=ON; - INSERT INTO t2(a) VALUES('one'),('one'),('three'),('four') - ON CONFLICT(a) DO UPDATE SET b=b+1; - - - PRAGMA count_changes=OFF; - SELECT a, b FROM t2 ORDER BY a; - - - DROP TABLE t1; - CREATE TABLE t1(x INTEGER PRIMARY KEY, y INT UNIQUE); - INSERT INTO t1(x,y) SELECT 1,2 WHERE true - ON CONFLICT(x) DO UPDATE SET y=max(t1.y,excluded.y) AND true; - SELECT * FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1(b UNIQUE, a INT PRIMARY KEY) WITHOUT ROWID; - INSERT OR IGNORE INTO t1(a) VALUES('1') ON CONFLICT(a) DO NOTHING; - PRAGMA integrity_check; - - - DELETE FROM t1; - INSERT OR IGNORE INTO t1(a) VALUES('1'),(1) ON CONFLICT(a) DO NOTHING; - PRAGMA integrity_check; - - - DROP TABLE t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT, d INT, e INT); - CREATE UNIQUE INDEX t1b ON t1(b); - CREATE UNIQUE INDEX t1e ON t1(e); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(e) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(a) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(b) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1(a INT, b INT, c INT, d INT, e INT); - CREATE UNIQUE INDEX t1a ON t1(a); - CREATE UNIQUE INDEX t1b ON t1(b); - CREATE UNIQUE INDEX t1e ON t1(e); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(e) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(a) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(b) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, d INT, e INT) WITHOUT ROWID; - CREATE UNIQUE INDEX t1a ON t1(a); - CREATE UNIQUE INDEX t1b ON t1(b); - CREATE UNIQUE INDEX t1e ON t1(e); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(e) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(a) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); - INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5) - ON CONFLICT(b) DO UPDATE SET c=excluded.c; - SELECT * FROM t1; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 REAL UNIQUE, c1); - CREATE UNIQUE INDEX test800i0 ON t0(0 || c1); - INSERT INTO t0(c0, c1) VALUES (1, 2), (2, 1); - INSERT INTO t0(c0) VALUES (1) ON CONFLICT(c0) DO UPDATE SET c1=excluded.c0; - PRAGMA integrity_check; - REINDEX; - - - CREATE VIEW t1(a) AS SELECT 1; - CREATE TRIGGER t1r1 INSTEAD OF INSERT ON t1 BEGIN - SELECT 2; - END; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY ON CONFLICT REPLACE, b UNIQUE); - INSERT INTO t1(b) VALUES(22); - INSERT INTO t1 VALUES(2,22) ON CONFLICT (b) DO NOTHING; - SELECT * FROM t1; - - - CREATE TABLE t1(a INT, b INT); - CREATE UNIQUE INDEX t1x ON t1(b+3); - diff --git a/libsql-wal/tests/assets/fixtures/upsert2.test b/libsql-wal/tests/assets/fixtures/upsert2.test deleted file mode 100644 index f497904a6c..0000000000 --- a/libsql-wal/tests/assets/fixtures/upsert2.test +++ /dev/null @@ -1,124 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b int, c DEFAULT 0); - INSERT INTO t1(a,b) VALUES(1,2),(3,4); - INSERT INTO t1(a,b) VALUES(1,8),(2,11),(3,1) - ON CONFLICT(a) DO UPDATE SET b=excluded.b, c=c+1 WHERE t1.b4.5 - - - SELECT rhs FROM qpvtab - WHERE cn='a' - AND 'quokka' < a - - - SELECT rhs FROM qpvtab - WHERE cn='a' - AND a IS NULL - - - SELECT rhs FROM qpvtab - WHERE cn='a' - AND a GLOB x'0123' - - - SELECT typeof(rhs) FROM qpvtab WHERE cn='a' AND a=format('abc'); - - - SELECT typeof(rhs) FROM qpvtab WHERE cn='a' AND a=?2 - diff --git a/libsql-wal/tests/assets/fixtures/wal.test b/libsql-wal/tests/assets/fixtures/wal.test deleted file mode 100644 index 552ef92d74..0000000000 --- a/libsql-wal/tests/assets/fixtures/wal.test +++ /dev/null @@ -1,11 +0,0 @@ - - PRAGMA auto_vacuum = 2; - PRAGMA journal_mode = WAL; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(5000)); - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/wal2.test b/libsql-wal/tests/assets/fixtures/wal2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/wal3.test b/libsql-wal/tests/assets/fixtures/wal3.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/wal4.test b/libsql-wal/tests/assets/fixtures/wal4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/wal5.test b/libsql-wal/tests/assets/fixtures/wal5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/wal6.test b/libsql-wal/tests/assets/fixtures/wal6.test deleted file mode 100644 index 807d0589e3..0000000000 --- a/libsql-wal/tests/assets/fixtures/wal6.test +++ /dev/null @@ -1,32 +0,0 @@ - - PRAGMA journal_mode = WAL; - CREATE TABLE t1(a PRIMARY KEY, b TEXT); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - BEGIN; - SELECT * FROM t1; - - - SELECT * FROM t1; - COMMIT; - INSERT INTO t1 VALUES('x', 'x') - - DELETE FROM t1 - DELETE FROM t1 - - PRAGMA journal_mode = WAL; - CREATE TABLE ab(a PRIMARY KEY, b); - - - PRAGMA page_size = 1024; - PRAGMA journal_mode = wal; - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - PRAGMA wal_checkpoint = truncate; - - - PRAGMA journal_mode = wal; - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/wal64k.test b/libsql-wal/tests/assets/fixtures/wal64k.test deleted file mode 100644 index 8d0bce1377..0000000000 --- a/libsql-wal/tests/assets/fixtures/wal64k.test +++ /dev/null @@ -1,13 +0,0 @@ - - PRAGMA journal_mode = WAL; - CREATE TABLE t1(x); - CREATE INDEX i1 ON t1(x); - - - PRAGMA page_size=512; - PRAGMA journal_mode=WAL; - CREATE TABLE t1(a,b); - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<8200) - INSERT INTO t1(a,b) SELECT x, zeroblob(300) FROM c; - PRAGMA integrity_check; - diff --git a/libsql-wal/tests/assets/fixtures/wal7.test b/libsql-wal/tests/assets/fixtures/wal7.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/wal8.test b/libsql-wal/tests/assets/fixtures/wal8.test deleted file mode 100644 index 54dd1a9625..0000000000 --- a/libsql-wal/tests/assets/fixtures/wal8.test +++ /dev/null @@ -1,4 +0,0 @@ - - PRAGMA page_size = 4096; - SELECT name FROM sqlite_master; - diff --git a/libsql-wal/tests/assets/fixtures/wal9.test b/libsql-wal/tests/assets/fixtures/wal9.test deleted file mode 100644 index 1105bf669b..0000000000 --- a/libsql-wal/tests/assets/fixtures/wal9.test +++ /dev/null @@ -1,30 +0,0 @@ - - PRAGMA page_size = 1024; - PRAGMA journal_mode = WAL; - PRAGMA wal_autocheckpoint = 0; - CREATE TABLE t(x); - - - BEGIN; - INSERT INTO t VALUES(randomblob(100)); - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - - INSERT INTO t SELECT randomblob(100) FROM t; - INSERT INTO t SELECT randomblob(100) FROM t; - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/walbak.test b/libsql-wal/tests/assets/fixtures/walbak.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walbig.test b/libsql-wal/tests/assets/fixtures/walbig.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walblock.test b/libsql-wal/tests/assets/fixtures/walblock.test deleted file mode 100644 index 57cb3dfe05..0000000000 --- a/libsql-wal/tests/assets/fixtures/walblock.test +++ /dev/null @@ -1,12 +0,0 @@ - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES(7, 8); - - - BEGIN; - INSERT INTO t1 VALUES(9, 10); - diff --git a/libsql-wal/tests/assets/fixtures/walcksum.test b/libsql-wal/tests/assets/fixtures/walcksum.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walcrash.test b/libsql-wal/tests/assets/fixtures/walcrash.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walcrash2.test b/libsql-wal/tests/assets/fixtures/walcrash2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walcrash3.test b/libsql-wal/tests/assets/fixtures/walcrash3.test deleted file mode 100644 index 0bc903b6ae..0000000000 --- a/libsql-wal/tests/assets/fixtures/walcrash3.test +++ /dev/null @@ -1,9 +0,0 @@ - - PRAGMA page_size = 1024; - PRAGMA journal_mode = WAL; - PRAGMA wal_autocheckpoint = 128; - PRAGMA journal_size_limit = 16384; - - CREATE TABLE t1(a BLOB, b BLOB, UNIQUE(a, b)); - INSERT INTO t1 VALUES(randomblob(10), randomblob(1000)); - diff --git a/libsql-wal/tests/assets/fixtures/walcrash4.test b/libsql-wal/tests/assets/fixtures/walcrash4.test deleted file mode 100644 index 9125fb342d..0000000000 --- a/libsql-wal/tests/assets/fixtures/walcrash4.test +++ /dev/null @@ -1,6 +0,0 @@ - - PRAGMA autovacuum = 0; - PRAGMA page_size = 1024; - PRAGMA journal_mode = wal; - PRAGMA main.synchronous = full; - diff --git a/libsql-wal/tests/assets/fixtures/walfault.test b/libsql-wal/tests/assets/fixtures/walfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walfault2.test b/libsql-wal/tests/assets/fixtures/walfault2.test deleted file mode 100644 index 727ead8a24..0000000000 --- a/libsql-wal/tests/assets/fixtures/walfault2.test +++ /dev/null @@ -1,18 +0,0 @@ - - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(a, b); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30 - ) - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; - - - PRAGMA auto_vacuum = 0; - CREATE TABLE t1(a, b); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30 - ) - INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/walhook.test b/libsql-wal/tests/assets/fixtures/walhook.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walmode.test b/libsql-wal/tests/assets/fixtures/walmode.test deleted file mode 100644 index 2cb4095f2b..0000000000 --- a/libsql-wal/tests/assets/fixtures/walmode.test +++ /dev/null @@ -1,24 +0,0 @@ - - CREATE TABLE t1(a, b); - PRAGMA journal_mode = WAL; - ATTACH 'test.db2' AS two; - CREATE TABLE two.t2(a, b); - - PRAGMA main.journal_mode - PRAGMA two.journal_mode - PRAGMA two.journal_mode = DELETE - INSERT INTO t1 DEFAULT VALUES - PRAGMA main.journal_mode - PRAGMA journal_mode - PRAGMA journal_mode = WAL - ATTACH 'test.db2' AS two - PRAGMA main.journal_mode - PRAGMA two.journal_mode - INSERT INTO two.t2 DEFAULT VALUES - PRAGMA two.journal_mode - PRAGMA journal_mode = DELETE - PRAGMA main.journal_mode - PRAGMA two.journal_mode - PRAGMA journal_mode = WAL - PRAGMA main.journal_mode - PRAGMA two.journal_mode diff --git a/libsql-wal/tests/assets/fixtures/walnoshm.test b/libsql-wal/tests/assets/fixtures/walnoshm.test deleted file mode 100644 index 8f203302b6..0000000000 --- a/libsql-wal/tests/assets/fixtures/walnoshm.test +++ /dev/null @@ -1,33 +0,0 @@ - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - - - PRAGMA journal_mode = WAL; - SELECT * FROM t1; - - - PRAGMA journal_mode = WAL; - SELECT * FROM t1; - - INSERT INTO t1 VALUES(3, 4) - - - - PRAGMA journal_mode = delete; - - - - - SELECT * FROM t1; - - - CREATE TABLE t2(x, y); - INSERT INTO t2 VALUES('a', 'b'); - INSERT INTO t2 VALUES('c', 'd'); - - - PRAGMA journal_mode = WAL; - INSERT INTO t2 VALUES('e', 'f'); - INSERT INTO t2 VALUES('g', 'h'); - diff --git a/libsql-wal/tests/assets/fixtures/waloverwrite.test b/libsql-wal/tests/assets/fixtures/waloverwrite.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walpersist.test b/libsql-wal/tests/assets/fixtures/walpersist.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walprotocol.test b/libsql-wal/tests/assets/fixtures/walprotocol.test deleted file mode 100644 index d9ec81f759..0000000000 --- a/libsql-wal/tests/assets/fixtures/walprotocol.test +++ /dev/null @@ -1,5 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE x(y); - INSERT INTO x VALUES('z'); - diff --git a/libsql-wal/tests/assets/fixtures/walprotocol2.test b/libsql-wal/tests/assets/fixtures/walprotocol2.test deleted file mode 100644 index fd5e0b4fbe..0000000000 --- a/libsql-wal/tests/assets/fixtures/walprotocol2.test +++ /dev/null @@ -1,12 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE x(y); - INSERT INTO x VALUES('z'); - - - SELECT * FROM x; - - - SELECT * FROM x; - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/walro.test b/libsql-wal/tests/assets/fixtures/walro.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walro2.test b/libsql-wal/tests/assets/fixtures/walro2.test deleted file mode 100644 index 566f9a1092..0000000000 --- a/libsql-wal/tests/assets/fixtures/walro2.test +++ /dev/null @@ -1,4 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE t1(x); - diff --git a/libsql-wal/tests/assets/fixtures/walrofault.test b/libsql-wal/tests/assets/fixtures/walrofault.test deleted file mode 100644 index 9ed9a9584c..0000000000 --- a/libsql-wal/tests/assets/fixtures/walrofault.test +++ /dev/null @@ -1,13 +0,0 @@ - - CREATE TABLE t1(b); - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES('hello'); - INSERT INTO t1 VALUES('world'); - INSERT INTO t1 VALUES('!'); - INSERT INTO t1 VALUES('world'); - INSERT INTO t1 VALUES('hello'); - PRAGMA cache_size = 10; - BEGIN; - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<30 ) - INSERT INTO t1(b) SELECT randomblob(800) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/walseh1.test b/libsql-wal/tests/assets/fixtures/walseh1.test deleted file mode 100644 index 84d964ef86..0000000000 --- a/libsql-wal/tests/assets/fixtures/walseh1.test +++ /dev/null @@ -1,6 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/walsetlk.test b/libsql-wal/tests/assets/fixtures/walsetlk.test deleted file mode 100644 index f64bda6aac..0000000000 --- a/libsql-wal/tests/assets/fixtures/walsetlk.test +++ /dev/null @@ -1,19 +0,0 @@ - - CREATE TABLE t1(x, y); - PRAGMA journal_mode = wal; - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t1 VALUES(7, 8); - - - BEGIN; - INSERT INTO t1 VALUES(9, 10); - - COMMIT - - PRAGMA journal_mode = wal; - CREATE TABLE x1(x, y); - BEGIN; - INSERT INTO x1 VALUES(1, 2); - diff --git a/libsql-wal/tests/assets/fixtures/walshared.test b/libsql-wal/tests/assets/fixtures/walshared.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walslow.test b/libsql-wal/tests/assets/fixtures/walslow.test deleted file mode 100644 index f8de1c3058..0000000000 --- a/libsql-wal/tests/assets/fixtures/walslow.test +++ /dev/null @@ -1,7 +0,0 @@ - - PRAGMA journal_mode = wal; - CREATE TABLE t1(x, y); - INSERT INTO "t1" VALUES('A',0); - CREATE TABLE t2(x, y); - INSERT INTO "t2" VALUES('B',2); - diff --git a/libsql-wal/tests/assets/fixtures/walthread.test b/libsql-wal/tests/assets/fixtures/walthread.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/walvfs.test b/libsql-wal/tests/assets/fixtures/walvfs.test deleted file mode 100644 index 95ff38afab..0000000000 --- a/libsql-wal/tests/assets/fixtures/walvfs.test +++ /dev/null @@ -1,87 +0,0 @@ - - PRAGMA auto_vacuum = 0; - PRAGMA journal_mode = wal; - PRAGMA synchronous = normal; - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); - INSERT INTO t1 VALUES(7, 8, 9); - - - PRAGMA synchronous = normal; - INSERT INTO t1 VALUES(13, 14, 15); - INSERT INTO t1 VALUES(16, 17, 18); - - - PRAGMA journal_size_limit = 10000; - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 - ) - INSERT INTO t1 SELECT randomblob(750) FROM s; - - - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 - ) - INSERT INTO t1 SELECT randomblob(750) FROM s; - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 - ) - INSERT INTO t1 SELECT randomblob(750) FROM s; - - - SELECT count(*) FROM t1 - - - SELECT count(*) FROM t1 - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 - ) - INSERT INTO t1 SELECT randomblob(750) FROM s; - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( - SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 - ) - INSERT INTO t1 SELECT randomblob(750) FROM s; - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 ) - INSERT INTO t1 SELECT randomblob(75) FROM s; - - SELECT count(*) FROM t1 - - SELECT count(*) FROM t1 - - - PRAGMA auto_vacuum = 0; - PRAGMA page_size = 1024; - CREATE TABLE t1(x); - PRAGMA journal_mode = wal; - WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 ) - INSERT INTO t1 SELECT randomblob(75) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/where.test b/libsql-wal/tests/assets/fixtures/where.test deleted file mode 100644 index 2bc8bd46fd..0000000000 --- a/libsql-wal/tests/assets/fixtures/where.test +++ /dev/null @@ -1,180 +0,0 @@ - - CREATE TABLE t181(a); - CREATE TABLE t182(b,c); - INSERT INTO t181 VALUES(1); - SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL; - - - SELECT DISTINCT a FROM t182 RIGHT JOIN t181 ON a=b ORDER BY c IS NULL; - - - SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c; - - - SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c; - - - SELECT DISTINCT a FROM t182 RIGHT JOIN t181 ON a=b ORDER BY c; - - - INSERT INTO t181 VALUES(1),(1),(1),(1); - SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c; - - - SELECT DISTINCT a FROM t182 RIGHT JOIN t181 ON a=b ORDER BY +c; - - - INSERT INTO t181 VALUES(2); - SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL, +a; - - - INSERT INTO t181 VALUES(2); - SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +a, +c IS NULL; - - - CREATE TABLE t191(a INT UNIQUE NOT NULL, b INT UNIQUE NOT NULL,c,d); - CREATE INDEX t191a ON t1(a); - CREATE INDEX t191b ON t1(b); - CREATE TABLE t192(x INTEGER PRIMARY KEY,y INT, z INT); - - EXPLAIN QUERY PLAN - SELECT t191.rowid FROM t192, t191 WHERE (a=y OR b=y) AND x=?1; - - - CREATE TABLE t201(x); - CREATE TABLE t202(y, z); - INSERT INTO t201 VALUES('key'); - INSERT INTO t202 VALUES('key', -1); - CREATE INDEX t202i ON t202(y, ifnull(z, 0)); - SELECT count(*) FROM t201 LEFT JOIN t202 ON (x=y) WHERE ifnull(z, 0) >=0; - - - CREATE TABLE t12(a, b, c); - CREATE TABLE t13(x); - CREATE INDEX t12ab ON t12(b, a); - CREATE INDEX t12ac ON t12(c, a); - - INSERT INTO t12 VALUES(4, 0, 1); - INSERT INTO t12 VALUES(4, 1, 0); - INSERT INTO t12 VALUES(5, 0, 1); - INSERT INTO t12 VALUES(5, 1, 0); - - INSERT INTO t13 VALUES(1), (2), (3), (4); - - - SELECT * FROM t12 WHERE - a = (SELECT * FROM (SELECT count(*) FROM t13 LIMIT 5) ORDER BY 1 LIMIT 10) - AND (b=1 OR c=1); - - - CREATE TABLE t1(a INT); - CREATE INDEX t1a ON t1(a); - INSERT INTO t1(a) VALUES(NULL),(NULL),(42),(NULL),(NULL); - CREATE TABLE t2(dummy INT); - SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL; - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a INTEGER PRIMARY KEY); - INSERT INTO t1(a) VALUES(1),(2),(3); - CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); - INSERT INTO t2(y) VALUES(2),(3); - SELECT * FROM t1, t2 WHERE a=y AND y=3; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t1 VALUES(3, 'three'); - INSERT INTO t1 VALUES(4, 'four'); - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - CREATE UNIQUE INDEX i1 ON t1(c); - INSERT INTO t1 VALUES(1, 'one', 'i'); - INSERT INTO t1 VALUES(2, 'two', 'ii'); - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c); - CREATE UNIQUE INDEX i2 ON t2(c); - INSERT INTO t2 VALUES(1, 'one', 'i'); - INSERT INTO t2 VALUES(2, 'two', 'ii'); - INSERT INTO t2 VALUES(3, 'three', 'iii'); - - PRAGMA writable_schema = 1; - UPDATE sqlite_schema SET rootpage = ( - SELECT rootpage FROM sqlite_schema WHERE name = 'i2' - ) WHERE name = 'i1'; - - - CREATE TABLE t1(a PRIMARY KEY, b, c) WITHOUT ROWID; - CREATE UNIQUE INDEX i1 ON t1(c); - INSERT INTO t1 VALUES(1, 'one', 'i'); - INSERT INTO t1 VALUES(2, 'two', 'ii'); - - CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c); - CREATE UNIQUE INDEX i2 ON t2(c); - INSERT INTO t2 VALUES(1, 'one', 'i'); - INSERT INTO t2 VALUES(2, 'two', 'ii'); - INSERT INTO t2 VALUES(3, 'three', 'iii'); - - PRAGMA writable_schema = 1; - UPDATE sqlite_schema SET rootpage = ( - SELECT rootpage FROM sqlite_schema WHERE name = 'i2' - ) WHERE name = 'i1'; - - - CREATE TABLE t0(c0 INTEGER PRIMARY KEY, c1 TEXT); - INSERT INTO t0(c0, c1) VALUES (1, 'a'); - CREATE TABLE t1(c0 INT PRIMARY KEY, c1 TEXT); - INSERT INTO t1(c0, c1) VALUES (1, 'a'); - SELECT * FROM t0 WHERE '-1' BETWEEN 0 AND t0.c0; - - - SELECT * FROM t1 WHERE '-1' BETWEEN 0 AND t1.c0; - - - SELECT * FROM t0 WHERE '-1'>=0 AND '-1'<=t0.c0; - - - SELECT * FROM t1 WHERE '-1'>=0 AND '-1'<=t1.c0; - - - SELECT '-1' BETWEEN 0 AND t0.c0 FROM t0; - - - SELECT '-1' BETWEEN 0 AND t1.c0 FROM t1; - - - SELECT '-1'>=0 AND '-1'<=t0.c0 FROM t0; - - - SELECT '-1'>=0 AND '-1'<=t1.c0 FROM t1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY); - INSERT INTO t1(a) VALUES(9223372036854775807); - SELECT 1 FROM t1 WHERE a>=(9223372036854775807+1); - - - SELECT a>=9223372036854775807+1 FROM t1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); - CREATE INDEX t1b ON t1(b,b,b,b,b,b,b,b,b,b,b,b,b); - INSERT INTO t1(a,b) VALUES(1,1),(15,2),(19,5); - UPDATE t1 SET b=999 WHERE a IN (SELECT 15) AND b IN (1,2); - SELECT * FROM t1; - - - SELECT DISTINCT 'xyz' FROM pragma_cache_size - WHERE rowid OR abs(0) - ORDER BY - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1; - diff --git a/libsql-wal/tests/assets/fixtures/where2.test b/libsql-wal/tests/assets/fixtures/where2.test deleted file mode 100644 index f970a12019..0000000000 --- a/libsql-wal/tests/assets/fixtures/where2.test +++ /dev/null @@ -1,37 +0,0 @@ - - -- random() is not optimized out - EXPLAIN SELECT * FROM x1, x2 WHERE x=1 ORDER BY random(); - - - -- random() is not optimized out - EXPLAIN SELECT * FROM x1, x2 WHERE x=1 ORDER BY random(); - - - -- other constant functions are optimized out - EXPLAIN SELECT * FROM x1, x2 WHERE x=1 ORDER BY abs(5); - - - -- other constant functions are optimized out - EXPLAIN SELECT * FROM x1, x2 WHERE x=1 ORDER BY abs(5); - - - CREATE TABLE t12(x INTEGER PRIMARY KEY, y INT, z CHAR(100)); - CREATE INDEX t12y ON t12(y); - EXPLAIN QUERY PLAN - SELECT a.x, b.x - FROM t12 AS a JOIN t12 AS b ON a.y=b.x - WHERE (b.x=$abc OR b.y=$abc); - - - CREATE TABLE t13(a,b); - CREATE INDEX t13a ON t13(a); - INSERT INTO t13 VALUES(4,5); - SELECT * FROM t13 WHERE (1=2 AND a=3) OR a=4; - - - CREATE TABLE t14a(x INTEGER PRIMARY KEY); - INSERT INTO t14a(x) VALUES(1),(2),(3),(4); - CREATE TABLE t14b(y INTEGER PRIMARY KEY); - INSERT INTO t14b(y) VALUES(1); - SELECT x FROM t14a WHERE x NOT IN (SELECT x FROM t14b); - diff --git a/libsql-wal/tests/assets/fixtures/where3.test b/libsql-wal/tests/assets/fixtures/where3.test deleted file mode 100644 index 3f0a6a2d29..0000000000 --- a/libsql-wal/tests/assets/fixtures/where3.test +++ /dev/null @@ -1,59 +0,0 @@ - - CREATE TABLE t301(a INTEGER PRIMARY KEY,b,c); - CREATE INDEX t301c ON t301(c); - INSERT INTO t301 VALUES(1,2,3); - INSERT INTO t301 VALUES(2,2,3); - CREATE TABLE t302(x, y); - INSERT INTO t302 VALUES(4,5); - ANALYZE; - - - SELECT * FROM t301 WHERE c=3 AND a IS NULL; - - - SELECT * FROM t301 WHERE c=3 AND a IS NOT NULL; - - - CREATE TABLE t400(a INTEGER PRIMARY KEY, b, c); - CREATE TABLE t401(p INTEGER PRIMARY KEY, q, r); - CREATE TABLE t402(x INTEGER PRIMARY KEY, y, z); - EXPLAIN QUERY PLAN - SELECT * FROM t400, t401, t402 WHERE t402.z GLOB 'abc*'; - - - EXPLAIN QUERY PLAN - SELECT * FROM t400, t401, t402 WHERE t401.r GLOB 'abc*'; - - - EXPLAIN QUERY PLAN - SELECT * FROM t400, t401, t402 WHERE t400.c GLOB 'abc*'; - - - CREATE TABLE aaa (id INTEGER PRIMARY KEY, type INTEGER, - fk INTEGER DEFAULT NULL, parent INTEGER, - position INTEGER, title LONGVARCHAR, - keyword_id INTEGER, folder_type TEXT, - dateAdded INTEGER, lastModified INTEGER); - CREATE INDEX aaa_111 ON aaa (fk, type); - CREATE INDEX aaa_222 ON aaa (parent, position); - CREATE INDEX aaa_333 ON aaa (fk, lastModified); - CREATE TABLE bbb (id INTEGER PRIMARY KEY, type INTEGER, - fk INTEGER DEFAULT NULL, parent INTEGER, - position INTEGER, title LONGVARCHAR, - keyword_id INTEGER, folder_type TEXT, - dateAdded INTEGER, lastModified INTEGER); - CREATE INDEX bbb_111 ON bbb (fk, type); - CREATE INDEX bbb_222 ON bbb (parent, position); - CREATE INDEX bbb_333 ON bbb (fk, lastModified); - - - CREATE TABLE t71(x1 INTEGER PRIMARY KEY, y1); - CREATE TABLE t72(x2 INTEGER PRIMARY KEY, y2); - CREATE TABLE t73(x3, y3); - CREATE TABLE t74(x4, y4); - INSERT INTO t71 VALUES(123,234); - INSERT INTO t72 VALUES(234,345); - INSERT INTO t73 VALUES(123,234); - INSERT INTO t74 VALUES(234,345); - INSERT INTO t74 VALUES(234,678); - diff --git a/libsql-wal/tests/assets/fixtures/where4.test b/libsql-wal/tests/assets/fixtures/where4.test deleted file mode 100644 index b2e09355ac..0000000000 --- a/libsql-wal/tests/assets/fixtures/where4.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE u9(a UNIQUE, b); - INSERT INTO u9 VALUES(NULL, 1); - INSERT INTO u9 VALUES(NULL, 2); - - SELECT * FROM u9 WHERE a IS NULL - SELECT * FROM u9 WHERE a IS $null diff --git a/libsql-wal/tests/assets/fixtures/where5.test b/libsql-wal/tests/assets/fixtures/where5.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/where6.test b/libsql-wal/tests/assets/fixtures/where6.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/where7.test b/libsql-wal/tests/assets/fixtures/where7.test deleted file mode 100644 index 839b991480..0000000000 --- a/libsql-wal/tests/assets/fixtures/where7.test +++ /dev/null @@ -1,59 +0,0 @@ - - CREATE TABLE t(a); - CREATE INDEX ta ON t(a); - INSERT INTO t(a) VALUES(1),(2); - SELECT * FROM t ORDER BY a; - SELECT * FROM t WHERE a<2 OR a<3 ORDER BY a; - PRAGMA count_changes=ON; - DELETE FROM t WHERE a<2 OR a<3; - SELECT * FROM t; - PRAGMA count_changes=OFF; - DROP TABLE t; - - - CREATE TABLE t(a); - CREATE INDEX ta ON t(a); - INSERT INTO t(a) VALUES(1),(2); - SELECT * FROM t ORDER BY a; - SELECT * FROM t WHERE a<2 OR a<3 ORDER BY a; - PRAGMA count_changes=ON; - DELETE FROM t WHERE a<2 OR a<3; - SELECT * FROM t; - PRAGMA count_changes=OFF; - DROP TABLE t; - - - CREATE TABLE t301 ( - c8 INTEGER PRIMARY KEY, - c6 INTEGER, - c4 INTEGER, - c7 INTEGER, - FOREIGN KEY (c4) REFERENCES series(c4) - ); - CREATE INDEX t301_c6 on t301(c6); - CREATE INDEX t301_c4 on t301(c4); - CREATE INDEX t301_c7 on t301(c7); - - CREATE TABLE t302 ( - c1 INTEGER PRIMARY KEY, - c8 INTEGER, - c5 INTEGER, - c3 INTEGER, - c2 INTEGER, - c4 INTEGER, - FOREIGN KEY (c8) REFERENCES t301(c8) - ); - CREATE INDEX t302_c3 on t302(c3); - CREATE INDEX t302_c8_c3 on t302(c8, c3); - CREATE INDEX t302_c5 on t302(c5); - - - CREATE TABLE t0(w); - INSERT INTO t0(w) VALUES(1); - CREATE TABLE t1(x INT, y INT PRIMARY KEY, z); - INSERT INTO t1 VALUES(0,111,222); - CREATE INDEX t1zxy ON t1(z,x,y); - SELECT y FROM t1 - WHERE (z=222 OR y=111) - AND (false OR EXISTS(SELECT 1 FROM t0 WHERE t1.y)); - diff --git a/libsql-wal/tests/assets/fixtures/where8.test b/libsql-wal/tests/assets/fixtures/where8.test deleted file mode 100644 index 2002171f39..0000000000 --- a/libsql-wal/tests/assets/fixtures/where8.test +++ /dev/null @@ -1,6 +0,0 @@ - - CREATE TABLE t600(a PRIMARY KEY, b) WITHOUT rowid; - CREATE INDEX t600b ON t600(b); - INSERT INTO t600 VALUES('state','screen'),('exact','dolphin'),('green','mercury'); - SELECT a, b, '|' FROM t600 WHERE a=='state' OR b='mercury' ORDER BY +a; - diff --git a/libsql-wal/tests/assets/fixtures/where9.test b/libsql-wal/tests/assets/fixtures/where9.test deleted file mode 100644 index 175ec31975..0000000000 --- a/libsql-wal/tests/assets/fixtures/where9.test +++ /dev/null @@ -1,9 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); - CREATE TABLE t2_a(k INTEGER PRIMARY KEY, v TEXT); - CREATE TABLE t2_b(k INTEGER PRIMARY KEY, v TEXT); - CREATE VIEW t2 AS SELECT * FROM t2_a UNION ALL SELECT * FROM t2_b; - SELECT 1 FROM t1 JOIN t1 USING(a) - WHERE (a=1) - OR (a=2 AND (SELECT 4 FROM t2,(SELECT 5 FROM t1 ORDER BY a) WHERE a)); - diff --git a/libsql-wal/tests/assets/fixtures/whereA.test b/libsql-wal/tests/assets/fixtures/whereA.test deleted file mode 100644 index 2010cb9cfd..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereA.test +++ /dev/null @@ -1,24 +0,0 @@ - - SELECT * FROM t1 WHERE b=2 AND a IS NULL; - - - SELECT * FROM t1 WHERE b=2 AND a IS NOT NULL; - - - PRAGMA reverse_unordered_selects=on; - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,2); - CREATE INDEX t1b ON t1(b); - SELECT a FROM t1 WHERE b=-99 OR b>1; - - - CREATE TABLE t1(a, b); - CREATE INDEX t1aa ON t1(a,a); - INSERT INTO t1 VALUES(1,2); - ANALYZE; - UPDATE sqlite_stat1 SET stat='27 3 3' WHERE idx='t1aa'; - ANALYZE sqlite_schema; - PRAGMA reverse_unordered_selects (1) ; - SELECT a FROM t1 WHERE a=1 OR a=2; - diff --git a/libsql-wal/tests/assets/fixtures/whereB.test b/libsql-wal/tests/assets/fixtures/whereB.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/whereC.test b/libsql-wal/tests/assets/fixtures/whereC.test deleted file mode 100644 index f73b4528e1..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereC.test +++ /dev/null @@ -1,29 +0,0 @@ - - CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b INTEGER); - - INSERT INTO t1 VALUES(1, 1, 1); - INSERT INTO t1 VALUES(2, 1, 1); - INSERT INTO t1 VALUES(3, 1, 2); - INSERT INTO t1 VALUES(4, 1, 2); - INSERT INTO t1 VALUES(5, 1, 2); - INSERT INTO t1 VALUES(6, 1, 3); - INSERT INTO t1 VALUES(7, 1, 3); - - INSERT INTO t1 VALUES(8, 2, 1); - INSERT INTO t1 VALUES(9, 2, 1); - INSERT INTO t1 VALUES(10, 2, 2); - INSERT INTO t1 VALUES(11, 2, 2); - INSERT INTO t1 VALUES(12, 2, 2); - INSERT INTO t1 VALUES(13, 2, 3); - INSERT INTO t1 VALUES(14, 2, 3); - - INSERT INTO t1 VALUES(15, 2, 1); - INSERT INTO t1 VALUES(16, 2, 1); - INSERT INTO t1 VALUES(17, 2, 2); - INSERT INTO t1 VALUES(18, 2, 2); - INSERT INTO t1 VALUES(19, 2, 2); - INSERT INTO t1 VALUES(20, 2, 3); - INSERT INTO t1 VALUES(21, 2, 3); - - CREATE INDEX i1 ON t1(a, b); - diff --git a/libsql-wal/tests/assets/fixtures/whereD.test b/libsql-wal/tests/assets/fixtures/whereD.test deleted file mode 100644 index 5941b55afe..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereD.test +++ /dev/null @@ -1,235 +0,0 @@ - - CREATE TABLE t(i,j,k,m,n); - CREATE INDEX ijk ON t(i,j,k); - CREATE INDEX jmn ON t(j,m,n); - - INSERT INTO t VALUES(3, 3, 'three', 3, 'tres'); - INSERT INTO t VALUES(2, 2, 'two', 2, 'dos'); - INSERT INTO t VALUES(1, 1, 'one', 1, 'uno'); - INSERT INTO t VALUES(4, 4, 'four', 4, 'cuatro'); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (+i=2 AND j=2); - - - SELECT n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2); - - - SELECT k, n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (i=3 AND j=3); - - - SELECT n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (i=3 AND j=3); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (j=2 AND m=2); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (j=3 AND m=3); - - - SELECT n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (j=3 AND m=3); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (j=2 AND m=2) OR (i=3 AND j=3); - - - SELECT n FROM t WHERE (i=1 AND j=1) OR (j=2 AND m=2) OR (i=3 AND j=3); - - - SELECT k FROM t WHERE (j=1 AND m=1) OR (i=2 AND j=2) OR (i=3 AND j=3); - - - SELECT k FROM t WHERE (i=1 AND j=1) OR (j=2 AND i=2) OR (i=3 AND j=3); - - - SELECT k FROM t WHERE (i=1 AND j=2) OR (i=2 AND j=1) OR (i=3 AND j=4); - - - SELECT k FROM t WHERE (i=1 AND (j=1 or j=2)) OR (i=3 AND j=3); - - - CREATE TABLE t1(a,b,c,d); - CREATE INDEX t1b ON t1(b); - CREATE INDEX t1c ON t1(c); - CREATE INDEX t1d ON t1(d); - CREATE TABLE t2(x,y); - CREATE INDEX t2y ON t2(y); - - INSERT INTO t1 VALUES(1,2,3,4); - INSERT INTO t1 VALUES(5,6,7,8); - INSERT INTO t2 VALUES(1,2); - INSERT INTO t2 VALUES(2,7); - INSERT INTO t2 VALUES(3,4); - - - SELECT a, x FROM t1 JOIN t2 ON +y=d OR x=7 ORDER BY a, x; - - - SELECT a, x FROM t1 JOIN t2 ON y=d OR x=7 ORDER BY a, x; - - - CREATE TABLE t3(a, b, c); - CREATE UNIQUE INDEX i3 ON t3(a, b); - INSERT INTO t3 VALUES(1, 'one', 'i'); - INSERT INTO t3 VALUES(3, 'three', 'iii'); - INSERT INTO t3 VALUES(6, 'six', 'vi'); - INSERT INTO t3 VALUES(2, 'two', 'ii'); - INSERT INTO t3 VALUES(4, 'four', 'iv'); - INSERT INTO t3 VALUES(5, 'five', 'v'); - - CREATE TABLE t4(x PRIMARY KEY, y); - INSERT INTO t4 VALUES('a', 'one'); - INSERT INTO t4 VALUES('b', 'two'); - - - CREATE TABLE t44(a INTEGER, b INTEGER); - INSERT INTO t44 VALUES(1,2); - INSERT INTO t44 VALUES(3,4); - SELECT * - FROM t44 AS x - LEFT JOIN (SELECT a AS c, b AS d FROM t44) AS y ON a=c - WHERE d=4 OR d IS NULL; - - - SELECT * - FROM t44 AS x - LEFT JOIN (SELECT a AS c, b AS d FROM t44) AS y ON a=c - WHERE d=4 OR d IS NULL - ORDER BY a; - - - CREATE TABLE t46(c INTEGER, d INTEGER); - INSERT INTO t46 SELECT a, b FROM t44; - SELECT * FROM t44 LEFT JOIN t46 ON a=c - WHERE d=4 OR d IS NULL; - - - SELECT * FROM t44 LEFT JOIN t46 ON a=c - WHERE d=4 OR d IS NULL - ORDER BY a; - - - DROP TABLE IF EXISTS t; - CREATE TABLE t(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17); - CREATE INDEX tc0 ON t(c0); - CREATE INDEX tc1 ON t(c1); - CREATE INDEX tc2 ON t(c2); - CREATE INDEX tc3 ON t(c3); - CREATE INDEX tc4 ON t(c4); - CREATE INDEX tc5 ON t(c5); - CREATE INDEX tc6 ON t(c6); - CREATE INDEX tc7 ON t(c7); - CREATE INDEX tc8 ON t(c8); - CREATE INDEX tc9 ON t(c9); - CREATE INDEX tc10 ON t(c10); - CREATE INDEX tc11 ON t(c11); - CREATE INDEX tc12 ON t(c12); - CREATE INDEX tc13 ON t(c13); - CREATE INDEX tc14 ON t(c14); - CREATE INDEX tc15 ON t(c15); - CREATE INDEX tc16 ON t(c16); - CREATE INDEX tc17 ON t(c17); - - INSERT INTO t(c0, c16) VALUES (1,1); - - SELECT * FROM t WHERE - c0=1 or c1=1 or c2=1 or c3=1 or - c4=1 or c5=1 or c6=1 or c7=1 or - c8=1 or c9=1 or c10=1 or c11=1 or - c12=1 or c13=1 or c14=1 or c15=1 or - c16=1 or c17=1; - - - DELETE FROM t; - INSERT INTO t(c0,c17) VALUES(1,1); - SELECT * FROM t WHERE - c0=1 or c1=1 or c2=1 or c3=1 or - c4=1 or c5=1 or c6=1 or c7=1 or - c8=1 or c9=1 or c10=1 or c11=1 or - c12=1 or c13=1 or c14=1 or c15=1 or - c16=1 or c17=1; - - - DELETE FROM t; - INSERT INTO t(c0,c15) VALUES(1,1); - SELECT * FROM t WHERE - c0=1 or c1=1 or c2=1 or c3=1 or - c4=1 or c5=1 or c6=1 or c7=1 or - c8=1 or c9=1 or c10=1 or c11=1 or - c12=1 or c13=1 or c14=1 or c15=1 or - c16=1 or c17=1; - - - CREATE TABLE x1(a, b, c, d, e); - CREATE INDEX x1a ON x1(a); - CREATE INDEX x1bc ON x1(b, c); - CREATE INDEX x1cd ON x1(c, d); - - INSERT INTO x1 VALUES(1, 2, 3, 4, 'A'); - INSERT INTO x1 VALUES(5, 6, 7, 8, 'B'); - INSERT INTO x1 VALUES(9, 10, 11, 12, 'C'); - INSERT INTO x1 VALUES(13, 14, 15, 16, 'D'); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a UNIQUE, b UNIQUE); - INSERT INTO t1(a,b) VALUES(null,2); - CREATE VIEW t2 AS SELECT * FROM t1 WHERE b<10 OR a<7 ORDER BY b; - SELECT t1.* FROM t1 LEFT JOIN t2 ON abs(t1.a)=abs(t2.b); - - - CREATE TABLE y1(a, b); - CREATE TABLE y2(x, y); - CREATE INDEX y2xy ON y2(x, y); - INSERT INTO y1 VALUES(1, 1); - INSERT INTO y2 VALUES(3, 3); - - - SELECT * FROM y1 LEFT JOIN y2 ON ((x=1 AND y=b) OR (x=2 AND y=b)) - - - CREATE TABLE foo (Id INTEGER PRIMARY KEY, fa INTEGER, fb INTEGER); - CREATE TABLE bar (Id INTEGER PRIMARY KEY, ba INTEGER, bb INTEGER); - - INSERT INTO foo VALUES(1, 1, 1); - INSERT INTO foo VALUES(2, 1, 2); - INSERT INTO foo VALUES(3, 1, 3); - INSERT INTO foo VALUES(4, 1, 4); - INSERT INTO foo VALUES(5, 1, 5); - INSERT INTO foo VALUES(6, 1, 6); - INSERT INTO foo VALUES(7, 1, 7); - INSERT INTO foo VALUES(8, 1, 8); - INSERT INTO foo VALUES(9, 1, 9); - - INSERT INTO bar VALUES(NULL, 1, 1); - INSERT INTO bar VALUES(NULL, 2, 2); - INSERT INTO bar VALUES(NULL, 3, 3); - INSERT INTO bar VALUES(NULL, 1, 4); - INSERT INTO bar VALUES(NULL, 2, 5); - INSERT INTO bar VALUES(NULL, 3, 6); - INSERT INTO bar VALUES(NULL, 1, 7); - INSERT INTO bar VALUES(NULL, 2, 8); - INSERT INTO bar VALUES(NULL, 3, 9); - - - SELECT - bar.Id, bar.ba, bar.bb, foo.fb - FROM foo LEFT JOIN bar - ON (bar.ba = 1 AND bar.bb = foo.fb) - OR (bar.ba = 5 AND bar.bb = foo.fb); - - - CREATE INDEX idx_bar ON bar(ba, bb); - SELECT - bar.Id, bar.ba, bar.bb, foo.fb - FROM foo LEFT JOIN bar - ON (bar.ba = 1 AND bar.bb = foo.fb) - OR (bar.ba = 5 AND bar.bb = foo.fb); - diff --git a/libsql-wal/tests/assets/fixtures/whereE.test b/libsql-wal/tests/assets/fixtures/whereE.test deleted file mode 100644 index 1c61ce7e3b..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereE.test +++ /dev/null @@ -1,40 +0,0 @@ - - CREATE TABLE t1(a,b); - INSERT INTO t1 VALUES(1,10), (2,20), (3,30), (2,22), (3, 33); - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - INSERT INTO t1 SELECT * FROM t1; - ALTER TABLE t1 ADD COLUMN c; - UPDATE t1 SET c=a*rowid+10000; - CREATE INDEX t1ab ON t1(a,b); - - CREATE TABLE t2(x,y); - INSERT INTO t2 VALUES(4,44),(5,55),(6,66),(7,77); - INSERT INTO t2 SELECT x+4, (x+4)*11 FROM t2; - INSERT INTO t2 SELECT x+8, (x+8)*11 FROM t2; - INSERT INTO t2 SELECT x+16, (x+16)*11 FROM t2; - INSERT INTO t2 SELECT x+32, (x+32)*11 FROM t2; - INSERT INTO t2 SELECT x+64, (x+32)*11 FROM t2; - ALTER TABLE t2 ADD COLUMN z; - UPDATE t2 SET z=2; - CREATE UNIQUE INDEX t2zx ON t2(z,x); - - EXPLAIN QUERY PLAN SELECT x FROM t1, t2 WHERE a=z AND c=x; - - - EXPLAIN QUERY PLAN SELECT x FROM t2, t1 WHERE a=z AND c=x; - - - ANALYZE; - EXPLAIN QUERY PLAN SELECT x FROM t1, t2 WHERE a=z AND c=x; - - - EXPLAIN QUERY PLAN SELECT x FROM t2, t1 WHERE a=z AND c=x; - diff --git a/libsql-wal/tests/assets/fixtures/whereG.test b/libsql-wal/tests/assets/fixtures/whereG.test deleted file mode 100644 index 01736c4b80..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereG.test +++ /dev/null @@ -1,204 +0,0 @@ - - CREATE TABLE composer( - cid INTEGER PRIMARY KEY, - cname TEXT - ); - CREATE TABLE album( - aid INTEGER PRIMARY KEY, - aname TEXT - ); - CREATE TABLE track( - tid INTEGER PRIMARY KEY, - cid INTEGER REFERENCES composer, - aid INTEGER REFERENCES album, - title TEXT - ); - CREATE INDEX track_i1 ON track(cid); - CREATE INDEX track_i2 ON track(aid); - INSERT INTO composer VALUES(1, 'W. A. Mozart'); - INSERT INTO composer VALUES(2, 'Beethoven'); - INSERT INTO composer VALUES(3, 'Thomas Tallis'); - INSERT INTO composer VALUES(4, 'Joseph Hayden'); - INSERT INTO composer VALUES(5, 'Thomas Weelkes'); - INSERT INTO composer VALUES(6, 'J. S. Bach'); - INSERT INTO composer VALUES(7, 'Orlando Gibbons'); - INSERT INTO composer VALUES(8, 'Josquin des Prés'); - INSERT INTO composer VALUES(9, 'Byrd'); - INSERT INTO composer VALUES(10, 'Francis Poulenc'); - INSERT INTO composer VALUES(11, 'Mendelsshon'); - INSERT INTO composer VALUES(12, 'Zoltán Kodály'); - INSERT INTO composer VALUES(13, 'Handel'); - INSERT INTO album VALUES(100, 'Kodály: Missa Brevis'); - INSERT INTO album VALUES(101, 'Messiah'); - INSERT INTO album VALUES(102, 'Missa Brevis in D-, K.65'); - INSERT INTO album VALUES(103, 'The complete English anthems'); - INSERT INTO album VALUES(104, 'Mass in B Minor, BWV 232'); - INSERT INTO track VALUES(10005, 12, 100, 'Sanctus'); - INSERT INTO track VALUES(10007, 12, 100, 'Agnus Dei'); - INSERT INTO track VALUES(10115, 13, 101, 'Surely He Hath Borne Our Griefs'); - INSERT INTO track VALUES(10129, 13, 101, 'Since By Man Came Death'); - INSERT INTO track VALUES(10206, 1, 102, 'Agnus Dei'); - INSERT INTO track VALUES(10301, 3, 103, 'If Ye Love Me'); - INSERT INTO track VALUES(10402, 6, 104, 'Domine Deus'); - INSERT INTO track VALUES(10403, 6, 104, 'Qui tollis'); - - - SELECT DISTINCT aname - FROM album, composer, track - WHERE unlikely(cname LIKE '%bach%') - AND composer.cid=track.cid - AND album.aid=track.aid; - - - SELECT DISTINCT aname - FROM album, composer, track - WHERE likelihood(cname LIKE '%bach%', 0.5) - AND composer.cid=track.cid - AND album.aid=track.aid; - - - SELECT DISTINCT aname - FROM album, composer, track - WHERE cname LIKE '%bach%' - AND composer.cid=track.cid - AND album.aid=track.aid; - - - SELECT DISTINCT aname - FROM album, composer, track - WHERE cname LIKE '%bach%' - AND unlikely(composer.cid=track.cid) - AND unlikely(album.aid=track.aid); - - - CREATE TABLE a(a1 PRIMARY KEY, a2); - CREATE TABLE b(b1 PRIMARY KEY, b2); - - - CREATE TABLE t4(x); - INSERT INTO t4 VALUES('right'),('wrong'); - SELECT DISTINCT x - FROM (SELECT x FROM t4 GROUP BY x) - WHERE x='right' - ORDER BY x; - - - CREATE TABLE t1(a, b, c); - CREATE INDEX i1 ON t1(a, b); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(i int, x, y, z); - INSERT INTO t1 VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3), (4,4,4,4); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(i int, bool char); - INSERT INTO t2 VALUES(1,'T'), (2,'F'); - SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.i=t2.i AND bool='T'; - SELECT count(*) FROM t1 LEFT JOIN t2 ON likely(t1.i=t2.i) AND bool='T'; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a, b, PRIMARY KEY(a,b)); - INSERT INTO t1 VALUES(9,1),(1,2); - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x, y, PRIMARY KEY(x,y)); - INSERT INTO t2 VALUES(3,3),(4,4); - SELECT likely(a), x FROM t1, t2 ORDER BY 1, 2; - - - SELECT unlikely(a), x FROM t1, t2 ORDER BY 1, 2; - - - SELECT likelihood(a,0.5), x FROM t1, t2 ORDER BY 1, 2; - - - SELECT coalesce(a,a), x FROM t1, t2 ORDER BY 1, 2; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0 (c0); - INSERT INTO t0(c0) VALUES ('a'); - SELECT LIKELY(t0.rowid) <= '0' FROM t0; - - - SELECT * FROM t0 WHERE LIKELY(t0.rowid) <= '0'; - - - SELECT (t0.rowid) <= '0' FROM t0; - - - SELECT * FROM t0 WHERE (t0.rowid) <= '0'; - - - SELECT unlikely(t0.rowid) <= '0', likelihood(t0.rowid,0.5) <= '0' FROM t0; - - - SELECT * FROM t0 WHERE unlikely(t0.rowid) <= '0'; - - - SELECT * FROM t0 WHERE likelihood(t0.rowid, 0.5) <= '0'; - - - SELECT unlikely(t0.rowid <= '0'), - likely(t0.rowid <= '0'), - likelihood(t0.rowid <= '0',0.5) - FROM t0; - - - SELECT * FROM t0 WHERE unlikely(t0.rowid <= '0'); - - - SELECT * FROM t0 WHERE likelihood(t0.rowid <= '0', 0.5); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a, b FLOAT); - INSERT INTO t1(a) VALUES(''),(NULL),('X'),(NULL); - SELECT coalesce(max(quote(a)),10) FROM t1 GROUP BY a; - - - CREATE TABLE a(b TEXT); INSERT INTO a VALUES(0),(4),(9); - CREATE TABLE c(d NUM); - CREATE VIEW f(g, h) AS SELECT b, 0 FROM a UNION SELECT d, d FROM c; - SELECT g = g FROM f GROUP BY h; - - - CREATE TABLE t1(x PRIMARY KEY, y); - INSERT INTO t1 VALUES('AAA', 'BBB'); - - CREATE TABLE t2(z); - INSERT INTO t2 VALUES('t2'); - - CREATE TABLE t3(x PRIMARY KEY, y); - INSERT INTO t3 VALUES('AAA', 'AAA'); - - - SELECT * FROM t1 JOIN t2 ON unlikely(x=y) AND y='AAA' - - - SELECT * FROM t1 JOIN t2 ON likely(x=y) AND y='AAA' - - - SELECT * FROM t1 JOIN t2 ON x=y AND y='AAA' - - - SELECT * FROM t3 JOIN t2 ON unlikely(x=y) AND y='AAA' - - - SELECT * FROM t3 JOIN t2 ON likely(x=y) AND y='AAA' - - - SELECT * FROM t3 JOIN t2 ON x=y AND y='AAA' - - - CREATE TABLE t1(a REAL); - INSERT INTO t1(a) VALUES(123); - CREATE INDEX t1x1 ON t1(likely(a)); - SELECT typeof(likely(a)) FROM t1 NOT INDEXED; - SELECT typeof(likely(a)) FROM t1 INDEXED BY t1x1; - - - CREATE INDEX t1x2 ON t1(abs(a)); - SELECT typeof(abs(a)) FROM t1 NOT INDEXED; - SELECT typeof(abs(a)) FROM t1 INDEXED BY t1x2; - diff --git a/libsql-wal/tests/assets/fixtures/whereH.test b/libsql-wal/tests/assets/fixtures/whereH.test deleted file mode 100644 index 9e2425fe75..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereH.test +++ /dev/null @@ -1,45 +0,0 @@ - - CREATE TABLE t1(a,b,c,d); - CREATE INDEX t1abc ON t1(a,b,c); - CREATE INDEX t1bc ON t1(b,c); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d); - CREATE INDEX t1bc ON t1(b,c); - CREATE INDEX t1abc ON t1(a,b,c); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e); - CREATE INDEX t1cd ON t1(c,d); - CREATE INDEX t1bcd ON t1(b,c,d); - CREATE INDEX t1abcd ON t1(a,b,c,d); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e); - CREATE INDEX t1cd ON t1(c,d); - CREATE INDEX t1abcd ON t1(a,b,c,d); - CREATE INDEX t1bcd ON t1(b,c,d); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e); - CREATE INDEX t1bcd ON t1(b,c,d); - CREATE INDEX t1cd ON t1(c,d); - CREATE INDEX t1abcd ON t1(a,b,c,d); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e); - CREATE INDEX t1bcd ON t1(b,c,d); - CREATE INDEX t1abcd ON t1(a,b,c,d); - CREATE INDEX t1cd ON t1(c,d); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e); - CREATE INDEX t1abcd ON t1(a,b,c,d); - CREATE INDEX t1bcd ON t1(b,c,d); - CREATE INDEX t1cd ON t1(c,d); - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e); - CREATE INDEX t1abcd ON t1(a,b,c,d); - CREATE INDEX t1cd ON t1(c,d); - CREATE INDEX t1bcd ON t1(b,c,d); diff --git a/libsql-wal/tests/assets/fixtures/whereI.test b/libsql-wal/tests/assets/fixtures/whereI.test deleted file mode 100644 index 5e5ac043ba..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereI.test +++ /dev/null @@ -1,43 +0,0 @@ - - CREATE TABLE t1(a, b, c, PRIMARY KEY(a)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1, 'a', 'z'); - INSERT INTO t1 VALUES(2, 'b', 'y'); - INSERT INTO t1 VALUES(3, 'c', 'x'); - INSERT INTO t1 VALUES(4, 'd', 'w'); - CREATE INDEX i1 ON t1(b); - CREATE INDEX i2 ON t1(c); - - - SELECT a FROM t1 WHERE b='b' OR c='x' - - - SELECT a FROM t1 WHERE b='a' OR c='z' - - - CREATE TABLE t2(a, b, c, PRIMARY KEY(a)) WITHOUT ROWID; - INSERT INTO t2 VALUES('i', 'a', 'z'); - INSERT INTO t2 VALUES('ii', 'b', 'y'); - INSERT INTO t2 VALUES('iii', 'c', 'x'); - INSERT INTO t2 VALUES('iv', 'd', 'w'); - CREATE INDEX i3 ON t2(b); - CREATE INDEX i4 ON t2(c); - - - SELECT a FROM t2 WHERE b='b' OR c='x' - - - SELECT a FROM t2 WHERE b='a' OR c='z' - - - CREATE TABLE t3(a, b, c, d, PRIMARY KEY(c, b)) WITHOUT ROWID; - - INSERT INTO t3 VALUES('f', 1, 1, 'o'); - INSERT INTO t3 VALUES('o', 2, 1, 't'); - INSERT INTO t3 VALUES('t', 1, 2, 't'); - INSERT INTO t3 VALUES('t', 2, 2, 'f'); - - CREATE INDEX t3i1 ON t3(d); - CREATE INDEX t3i2 ON t3(a); - - SELECT c||'.'||b FROM t3 WHERE a='t' OR d='t' - diff --git a/libsql-wal/tests/assets/fixtures/whereJ.test b/libsql-wal/tests/assets/fixtures/whereJ.test deleted file mode 100644 index a873f1436a..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereJ.test +++ /dev/null @@ -1,559 +0,0 @@ - - CREATE TABLE tx1 ( - est, - cid, - sid, - fid, - aid, - edate, - rstat, - ftype, - cx, - fyear, - fp, - acode, - a1, - curx, - tdate, - gstat, - trgtpx, - effdate, - adate, - ytime, - mstat - ); - CREATE INDEX ix0 on tx1(a1,curx,aid,cid,sid,ftype,fp,fyear DESC,edate DESC,fid); - CREATE INDEX ix1 on tx1(a1,curx,aid,ftype,fp,fyear DESC,fid,edate DESC,cid,sid); - CREATE INDEX ix2 on tx1(a1,curx,cid,sid,ftype,fp,fyear DESC,edate DESC,aid,fid); - CREATE INDEX ix3 on tx1(a1,curx,fid,ftype,fp,fyear DESC,cid,sid,aid,edate DESC); - CREATE INDEX ix4 on tx1(a1,curx,ftype,cid,sid,aid,edate DESC,fid,fp,fyear DESC); - CREATE INDEX ix5 on tx1(a1,curx,ftype,aid,fid,cid,sid,edate DESC,fp,fyear DESC); - CREATE INDEX ix6 on tx1(ftype,fp,fyear DESC,cid,sid,edate DESC,a1,fid,aid,curx,est,rstat,cx,acode,tdate,gstat,trgtpx,effdate,adate,ytime,mstat); - CREATE INDEX ix7 on tx1(cid,a1,curx,sid,ftype,est,fid,aid,edate,rstat,cx,fyear,fp,acode,tdate,gstat,trgtpx,effdate,adate,ytime,mstat); - CREATE INDEX ix8 on tx1(cid,sid,edate DESC,aid,est); - CREATE INDEX ix9 on tx1(aid,edate DESC,a1,curx); - - - ANALYZE sqlite_master; - DELETE FROM sqlite_stat1; - DELETE FROM sqlite_stat4; - INSERT INTO sqlite_stat1 VALUES('tx1','ix9','11680827 289 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix8','11680827 286 250 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix7','11680827 286 194 98 88 83 18 7 6 2 2 2 2 2 2 2 2 2 2 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix6','11680827 5840414 5840414 5840414 240 212 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix5','11680827 5840414 2920207 1668690 114 90 8 8 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix4','11680827 5840414 2920207 1668690 92 83 9 2 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix3','11680827 5840414 2920207 2048 1835 1835 1835 12 11 8 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix2','11680827 5840414 2920207 98 88 83 83 83 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix1','11680827 5840414 2920207 117 114 114 114 90 2 2 2'); - INSERT INTO sqlite_stat1 VALUES('tx1','ix0','11680827 5840414 2920207 117 9 9 9 9 9 2 2'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','6736 21 21 21 1','29210 29404 29404 29404 29424','44 12184 13020 13079 29424',X'06030409080416C1150133512800B01FCA'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','6658 24 21 21 1','452220 453273 453276 453276 453296','622 226258 235279 236774 453296',X'06030409080416F34501332ADC00AA1BD3'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','820 2 2 2 1','1297771 1297869 1297869 1297869 1297869','1964 681724 711020 715822 1297869',X'06030409080317875501332C6C55AF4D'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','26985 2216 2216 2216 1','1797607 1797782 1797782 1797782 1799997','3162 970307 1008879 1016089 1799997',X'0603040809041A08040132401A0099A334'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','10434 19 17 17 1','2118117 2120403 2120405 2120405 2120421','3815 1136110 1181459 1190207 2120421',X'0603040908041AD36901332CD000861A2F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','437 1 1 1 1','2595414 2595739 2595739 2595739 2595739','5005 1409452 1464066 1475163 2595739',X'0603040808031CE7FD01317FD46BFBCC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','12619 38 38 38 1','2595957 2600212 2600212 2600212 2600249','5007 1410347 1464961 1476068 2600249',X'0603040808041CE87E01328F61008CE96A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','7534 23 18 18 1','3329985 3334890 3334895 3334895 3334912','6901 1834013 1902216 1917268 3334912',X'060304090804244E1901328F59008CAA39'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','5693 1 1 1 1','3891665 3893609 3893609 3893609 3893609','8357 2164400 2245393 2263185 3893609',X'0603040808043063B70132B66800A28A43'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','44405 2588 2223 1527 1','4220255 4221633 4221998 4222694 4224220','9221 2354858 2441973 2461511 4224220',X'0603040909043377630133517A00B0DE4F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','6883 32 28 28 1','4423918 4429926 4429930 4429930 4429957','9690 2452276 2543443 2563995 4429957',X'06030409080434F46801328F5C008CC3DA'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','6974 27 26 26 1','5048404 5051129 5051130 5051130 5051155','11703 2817010 2920184 2944013 5051155',X'0603040908043C1C5C0132DEA5009F7473'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','476 2 2 2 1','5191322 5191479 5191479 5191479 5191479','12242 2901130 3006663 3031222 5191479',X'0603040908033DC6080132DEA478849A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','627 4 4 4 1','6488823 6489349 6489349 6489349 6489349','16423 3644815 3778857 3809866 6489349',X'0603040808035AA00E0131F4AE342150'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','145 2 2 1 1','7787091 7787218 7787218 7787219 7787219','20223 4343720 4510110 4547961 7787219',X'0603040809037254890132189C703706'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','20 1 1 1 1','9085074 9085089 9085089 9085089 9085089','25315 5033102 5230788 5275692 9085089',X'06040408080300EAE6CA01326657620652'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','229621 6135 5934 5934 1','9507353 9572696 9572696 9572696 9576801','27189 5255584 5463962 5511784 9576801',X'06040408080300F2FA440132DF1A7D1A60'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','6376 24 22 22 1','10381524 10382938 10382940 10382940 10382959','30519 5581705 5804515 5856651 10382959',X'06040409080400F9DBF3013305AC00A688A4'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','7761 45 9 9 1','10569039 10572476 10572512 10572512 10572520','31455 5661599 5888691 5941811 10572520',X'06040409080400FB31560132DDD800A05DF5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','8382 37 37 37 1','10866664 10867565 10867565 10867565 10867601','33475 5809193 6042611 6097741 10867601',X'06040409080400FFA4A701332A0E00A93957'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','76136 4099 3018 3018 1','11283107 11308143 11309224 11309224 11312241','37001 6022861 6264510 6322923 11312241',X'060404090804010B0A5C0133517200B0E8E0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','23472 2188 2188 2181 1','11365285 11380281 11380281 11380288 11382468','37055 6026680 6268909 6327509 11382468',X'060404080904010B3C6701332B2E00AA4374'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','59591 4087 4073 4 1','11415316 11448759 11448773 11452842 11452845','37350 6040743 6283483 6342389 11452845',X'060404090904010BFA810133512800B010AE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix9','43891 3029 3021 4 1','11598477 11622881 11622889 11625906 11625909','39110 6107644 6353109 6413914 11625909',X'0604040909040113B9960133512800B01235'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7340 4977 19 1 1 1','206533 206533 208739 208757 208757 208757','125 164 111403 207397 207399 208757',X'070308040407030187840132B54B0101A0D1401C0000000000004C87E5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','8877 8788 45 1 1 1','1221375 1221375 1224509 1224553 1224553 1224553','931 1117 679933 1216705 1216722 1224553',X'07030804040703018D3F0133023D010B9B67401C0000000000007A99EF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7204 7204 39 1 1 1','1240162 1240162 1242572 1242610 1242610 1242610','942 1131 688420 1234655 1234672 1242610',X'07030804040703018D4F0132DB820105D324401C0000000000007EC569'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','9608 9608 44 1 1 1','1264939 1264939 1266529 1266572 1266572 1266572','952 1145 699518 1258423 1258440 1266572',X'07030804040704018D61013305B9010D3CEB406E8000000000000081E17A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','6636 6636 1 1 1 1','1294580 1294580 1297869 1297869 1297869 1297869','964 1159 713121 1289522 1289540 1297869',X'07030804030704018D7801328F693482A2403400000000000000A26728'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7822 6629 26 1 1 1','2375708 2375708 2381333 2381358 2381358 2381358','3423 3833 1371902 2366527 2366559 2381358',X'0703080403070301B1F501317F16403B7B403F00000000000060D67A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','1403 1303 5 1 1 1','2594767 2594767 2595737 2595739 2595739 2595739','3914 4427 1512042 2580073 2580114 2595739',X'0703080403070301B6480131CC18558082407120000000000029CC12'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7901 6067 26 1 1 1','3424107 3424107 3425939 3425964 3425964 3425964','5872 6630 2032411 3406550 3406594 3425964',X'0703080404070401C3F90132B7A100FDCC04403E00000000000000A014CE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7483 6161 22 1 1 1','3549446 3549446 3555223 3555244 3555244 3555244','5932 6752 2099309 3535259 3535304 3555244',X'0703080403070301C4490131573F4104F8403400000000000067FD1E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','12076 8263 37 1 1 1','3558079 3558079 3560036 3560072 3560072 3560072','5935 6758 2101989 3540078 3540123 3560072',X'0703080404070301C44E0132DD0901076DA9404200000000000076F994'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','1123 1113 1 1 1 1','3892913 3892913 3893609 3893609 3893609 3893609','6594 7611 2305483 3871711 3871770 3893609',X'0703080403070301CA280131CA1C215083401C00000000000071F6B2'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','9344 7315 41 1 1 1','4213510 4213510 4219434 4219474 4219474 4219474','7200 8390 2503024 4196141 4196204 4219474',X'0703080404070301CE8C01317DE800FE4E8B4034000000000000458317'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','8062 3291 1 1 1 1','5037060 5037060 5040350 5040350 5040350 5040350','10201 11915 3045602 5012912 5012997 5040350',X'070308040307030213B20130B83A16DF86403600000000000028F8CD'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','9125 2926 1 1 1 1','5046490 5052665 5055590 5055590 5055590 5055590','10203 11926 3055524 5028097 5028182 5055590',X'070302040307030213B5232A013107F01745AF40330000000000002B57DE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','591 591 1 1 1 1','5190991 5190991 5191479 5191479 5191479 5191479','10649 12426 3145181 5163206 5163296 5191479',X'070308040307030244AD0131315217C1CD401C00000000000003BC32'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7381 4689 1 1 1 1','6112248 6112248 6116936 6116936 6116936 6116936','13780 16308 3748958 6083681 6083797 6116936',X'0703080403070402A9D1013108B531A21C401C0000000000000092F5C6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7569 7381 28 1 1 1','6280084 6280084 6281842 6281869 6281869 6281869','14559 17217 3856803 6247722 6247841 6281869',X'0703080404070302C14C0132DBF101044CC7401C00000000000074FB16'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','8289 7047 28 1 1 1','6290764 6290764 6296854 6296881 6296881 6296881','14569 17229 3863206 6262658 6262777 6296881',X'0703080403070302C16401317CC348B670401C0000000000006824BB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','2209 2209 1 1 1 1','6489075 6489075 6489349 6489349 6489349 6489349','15377 18147 3986912 6454194 6454318 6489349',X'0703080403070402EA5901332A656C6F5E401C00000000000000AE7C03'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7381 6799 1 1 1 1','7314420 7314420 7321218 7321218 7321218 7321218','18403 21722 4532963 7281695 7281847 7321218',X'07030804030703049EE501310667176DC940438000000000005ED2B5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','7163 7001 31 1 1 1','7652849 7652849 7658600 7658630 7658630 7658630','19462 22956 4750159 7617449 7617608 7658630',X'070308040407030503EB01317DEF010ADD3F402800000000000061C3EF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','1433 1433 2 1 1 1','7785842 7785842 7787219 7787219 7787219 7787219','20001 23575 4834605 7745315 7745477 7787219',X'07030804030703055010013156D81B11AC404380000000000004A313'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','2247 2247 1 1 1 1','9083272 9083272 9085089 9085089 9085089 9085089','24940 29143 5668423 9036693 9036887 9085089',X'070308040307031A620A01323EEB5CE39C406FE000000000006F8177'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix8','107 107 5 1 1 1','10382912 10382912 10382957 10382959 10382959 10382959','31251 36297 6541362 10329764 10330008 10382959',X'0704080403070400955501013350516AA9D0406060000000000000884648'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7340 4770 4527 3331 3331 970 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','206533 206533 206533 206533 206533 206596 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565 207565','125 202 402 512 560 6209 20696 25885 206260 206260 206260 206260 206260 206260 206260 206260 206260 206260 206260 206260 206260 207565',X'1703080808080704030408030808010308070808080803018784401C000000000000024FD353493F8801317E4700FFFF0F00FFFFC0F869E0000000002642C5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','8877 4669 71 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','1221375 1225583 1230181 1230249 1230249 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251 1230251','931 1504 2992 3495 3751 39629 120561 147424 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1222711 1230251',X'1703090902080704030408090808010108070404040804018D3F03E8405680000000000000822B981EB823013351F00F0C4086E00000000000013351F0013351F053870D7500B22A8C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7204 4801 193 193 4 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','1240162 1240162 1244770 1244770 1244959 1244961 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962 1244962','942 1520 3024 3531 3791 40098 122274 149540 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1237296 1244962',X'1703080908010703030408030808010308070408040803018D4F07406FE000000000000602CF16DE05013303C300FFFF0300FFFFC0F869E000000000013303C3008000004BD756'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','9608 6098 5910 5910 5910 2149 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','1264939 1264939 1264939 1264939 1264939 1265217 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365 1267365','952 1536 3055 3576 3841 40616 124132 151876 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1259547 1267365',X'1703080808080704030408090808010101070404040803018D61401C0000000000000131374D1726AB0132DD780F0C0540390000000000000132DD780132DD784E2789C6190CA9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','6636 4411 4237 4237 4237 33 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1','1294580 1294580 1294580 1294580 1294580 1297842 1297862 1297862 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869','964 1557 3097 3622 3888 41246 126538 154868 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1289863 1297869',X'1703080808080703030408090808010308070808080803018D7840420000000000007332F1227B5901321AF80800FFFF40260000000000006D0CEB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7822 4817 260 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','2375708 2375708 2380265 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524 2380524','3423 5117 10120 11184 11775 86237 242937 294878 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2366404 2380524',X'170308090308070304040803080801030807040408080401B1F501831C405C40000000000077646800EAD44C0132697000FFFF0300FFFFC0F869E0000000000132696F0132696F0094935E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','1403 1022 82 74 74 55 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','2594767 2594767 2595707 2595707 2595707 2595708 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739','3914 5817 11518 12879 13613 98100 278304 342850 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2580971 2595739',X'170308090808070303040803080801030807080808080301B648405C400000000000038EAC243F770131A6F700FFFF0E00FFFFC0F869E0000000005C8664'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7901 5298 291 55 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','3424107 3424107 3429114 3429350 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404 3429404','5872 8944 17727 19769 20846 145206 401995 498360 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3411279 3429404',X'170308090201070404040803080801030807040808080401C3F9232807405C40000000000000FF559400F2FA440133294600FFFF0300FFFFC0F869E000000000013329460083157B'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7483 5407 230 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','3549446 3549446 3554623 3554845 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852 3554852','5932 9041 17921 20139 21264 149060 417718 520064 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3536268 3554852',X'170308090201070404040803080801030807040808080401C449232807405C40000000000000FF559400F2FA440133294600FFFF0300FFFFC0F869E000000000013329460083162A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','12076 8365 7981 5546 5546 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','3558079 3558079 3558079 3558079 3558079 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624 3563624','5935 9046 17930 20154 21279 149235 418443 521109 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3544970 3563624',X'170308080808070303040803080801030107040408080301C44E4074300000000000029EB13BB98E01328EFE00FFFF0E00FFFF0AC0F869E00000000001328F0001328F0071D802'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','1123 916 875 875 875 93 22 22 1 1 1 1 1 1 1 1 1 1 1 1 1 1','3892913 3892913 3892913 3892913 3892913 3893531 3893602 3893602 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609','6594 10057 19942 22653 23964 165533 468498 587524 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3873325 3893609',X'170308080808070403040802080801030107040404080301CA28403F00000000000000832DC71933330132DB8800FC0F00FFFF054050C000000000000132DB870132DB8A4D5E35A2107205'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','9344 6359 6022 9 9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','4213510 4213510 4213510 4219523 4219523 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531 4219531','7200 11025 21872 25036 26543 181203 517345 652858 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4198057 4219531',X'170308080308070303040803080801030807080808080301CE8C0186A0403F00000000000002C2142F19870131554100FFFF0F00FFFFC0F869E0000000000687F7'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','8062 4993 241 53 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','5037060 5037060 5041812 5042000 5042051 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052 5042052','10201 15484 30736 35196 37326 231854 654010 829510 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5017193 5042052',X'17030809020107030404080308080103080704080808030213B2245407406FE0000000000002C0AA00F6ABA101332A7E00FFFF0300FFFFC0F869E00000000001332A7E5287C0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','9125 5761 264 5 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','5046490 5046490 5051987 5052246 5052246 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250 5052250','10203 15488 30744 35230 37365 232178 654964 830718 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5027358 5052250',X'17030809030807030304080308080103080708080808030213B501831F406FE00000000000029E627136F901328DD500FFFF0300FFFFC0F869E000000000290DD6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','591 591 566 566 566 27 18 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1','5190991 5190991 5190991 5190991 5190991 5191461 5191464 5191474 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479','10649 16115 31973 36593 38793 239550 673441 853755 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5165855 5191479',X'17030808080807030404080108080101080708080808040244AD4045800000000000029E6200EAE8740132690D0A0F0C402E00000000000000941EAF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7381 3728 83 16 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','6112248 6115901 6119546 6119613 6119613 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628 6119628','13780 20707 41067 47538 50438 296473 834203 1056686 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6089878 6119628',X'170309090208070304040809080801010807040404080402A9D12328407360000000000002172300EABCFF0133517F0F0C404AA6665E02EA960133517F01335239538BC5C1008B5EC9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7569 5785 274 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','6280084 6280084 6285595 6285867 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868 6285868','14559 21811 43240 50020 53057 307264 862871 1092992 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6255378 6285868',X'170308090301070404040803080801030807040808080302C14C01832707405C40000000000000FF559400F2FA440133294600FFFF0300FFFFC0F869E000000000013329461E5109'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','8289 5734 266 33 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','6290764 6290764 6296232 6296465 6296495 6296495 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497 6296497','14569 21827 43272 50056 53096 307563 864043 1094585 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6265950 6296497',X'170308090201070404040803080801030807040808080402C164232807405C40000000000000FF559400F2FA440133294600FFFF0300FFFFC0F869E0000000000133294600A90415'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','2209 1450 1369 1369 1369 597 13 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1','6489075 6489075 6489075 6489075 6489075 6489139 6489344 6489344 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349','15377 22998 45584 52641 55837 319564 895653 1134252 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6458046 6489349',X'170308080808070303040802080801030807040404080302EA59401C0000000000000D4B201AD8B30132DF0400FC0600FFFF40180000000000000132DF040132DF054EBA338714FBBA'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7381 5446 171 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','7314420 7314420 7319695 7319855 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865 7319865','18403 27319 54152 62541 66337 369851 1032180 1306261 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7284923 7319865',X'1703080902010703030408030808010308070408080804049EE503E907405C400000000000029EC32E97BE0133061F00FFFF0300FFFFC0F869E0000000000133061F00A9ECEF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','7163 4782 209 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','7652849 7652849 7657422 7657626 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630 7657630','19462 28830 57147 65962 69945 388539 1084446 1372423 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7621247 7657630',X'17030809020107040404080308080103080704080808040503EB03EA07405C40000000000000FF559400F2FA440133294600FFFF0300FFFFC0F869E0000000000133294600831554'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','1433 582 571 571 571 15 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1','7785842 7786693 7786693 7786693 7786693 7787208 7787208 7787208 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219','20001 29582 58632 67649 71736 396840 1107204 1400830 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7750264 7787219',X'1703090808080703040408090808010108070404040804055010406E80000000000001C7A600FC429201332D890F0C402C00000000000001332D890133505352D7248A008775D8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','2247 682 657 657 657 117 45 45 1 1 1 1 1 1 1 1 1 1 1 1 1 1','9083272 9084837 9084837 9084837 9084837 9085088 9085088 9085088 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089','24940 36384 72113 82665 87632 474987 1318830 1664527 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9042708 9085089',X'17030908080807030304080208080103010704040408031A620A403E00000000000001C3D332CF850132DE9D00FC0200FFFF054050E000000000000132DE9D0132DE9D4E8C092E790553'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix7','107 77 69 69 69 11 5 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1','10382912 10382942 10382942 10382942 10382942 10382952 10382956 10382956 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959','31251 45639 90416 102896 109225 567280 1544395 1943661 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10337289 10382959',X'170409080808070303040809080801010807040404080300955501403E000000000000029E686E250B01332D220F0C402E00000000000001332D220133504E52CFCF4F21CD7F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7337 4975 19 19 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 206462 206462 210789 210789 210807 210807 210807 210807 210807 210807 210807 210807 210807 210807 210807 210807 210807 210807 210807','0 0 0 125 164 112407 128579 207456 209489 209490 209490 209490 209490 209490 209490 209490 209490 209490 209490 209490 209490 210807',X'170808080308040804030807080301030807080808080301878401317F26024FD3531E2DAF404200000000000000FFFF0200FFFFC0F869E0000000002642C4'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 8874 8785 45 25 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 1221012 1221012 1224145 1224165 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189 1224189','0 0 0 931 1117 679896 773861 1207582 1216653 1216673 1216673 1216673 1216673 1216673 1216673 1216673 1216673 1216673 1216673 1216673 1216673 1224189',X'1708080803080409040408070809010308070404040803018D3F0133023D01940C420106B14D40420000000000000F00FFFF4070E000000000000133023D0133023D4F2053654AE525'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7200 7200 39 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 1239793 1239793 1242199 1242223 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237 1242237','0 0 0 942 1131 688381 783660 1225441 1234602 1234622 1234622 1234622 1234622 1234622 1234622 1234622 1234622 1234622 1234622 1234622 1234622 1242237',X'1708080803080409040308070809010301070404040804018D4F0132DB820113FAB92F19C5401C0000000000000F00FFFF0F403A0000000000000132DB820132DB824D542A4F009B5C72'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 9606 9606 44 25 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 1264560 1264560 1266149 1266168 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192 1266192','0 0 0 952 1145 699479 796008 1249062 1258369 1258391 1258391 1258391 1258391 1258391 1258391 1258391 1258391 1258391 1258391 1258391 1258391 1266192',X'1708080803080409040308070809010101070404040803018D61013305B9017CDF4916F8B140280000000000000F0C0A403600000000000001330557013305B9507EA8DD212E79'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 6635 6635 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 1294199 1294199 1297868 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869 1297869','0 0 0 964 1159 713241 812408 1280435 1289849 1289871 1289871 1289871 1289871 1289871 1289871 1289871 1289871 1289871 1289871 1289871 1289871 1297869',X'1708080803080409030308070803010308070808080803018D78013267DC0EF747387106403F00000000000000FFFF0F00FFFFC0F869E00000000006B968'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7815 6624 26 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 2374939 2374939 2380559 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584 2380584','0 0 0 3423 3833 1371803 1539928 2350493 2366415 2366460 2366460 2366460 2366460 2366460 2366460 2366460 2366460 2366460 2366460 2366460 2366460 2380584',X'170808080308040903030807080301030807080808080301B1F501317F160DDEA51C46AB405280000000000000FFFF0F00FFFFC0F869E0000000006ADDA9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 3595 3459 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 2595336 2595336 2595734 2595737 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739 2595739','0 0 0 3918 4433 1512586 1693312 2557025 2580917 2580967 2580967 2580967 2580967 2580967 2580967 2580967 2580967 2580967 2580967 2580967 2580967 2595739',X'170808080308040903030807080101010107040404080301B64F01332ACC029E833D19084028000000000000320F0C054074A0000000000001332A0901332ACC518A316F1F30D6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7894 6061 26 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 3422592 3422592 3424418 3424434 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443 3424443','0 0 0 5872 6630 2032185 2267240 3366727 3406294 3406363 3406363 3406363 3406363 3406363 3406363 3406363 3406363 3406363 3406363 3406363 3406363 3424443',X'170808080308040904030807080101030807040404080401C3F90132B7A100D6FD7F6CE97F4070500000000000100F00FFFF40560000000000000132B7310132DB2D4D3F72D9009AE8EE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7479 6158 22 22 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 3547845 3547845 3553619 3553619 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640 3553640','0 0 0 5932 6752 2099067 2343370 3491679 3534981 3535053 3535053 3535053 3535053 3535053 3535053 3535053 3535053 3535053 3535053 3535053 3535053 3553640',X'170808080308040804030807080301030807080808080301C4490131573F008E7AC03077E0403E00000000000000FFFF0F00FFFFC0F869E00000000065B45A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 12068 8257 37 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 3556474 3556474 3558426 3558446 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462 3558462','0 0 0 5935 6758 2101744 2346448 3496404 3539797 3539869 3539869 3539869 3539869 3539869 3539869 3539869 3539869 3539869 3539869 3539869 3539869 3558462',X'170808080308040904030807080201010107040404080301C44E0132DD09016891C11788EB404200000000000000FC0F0C0F400199999999999A0132DD090132DD094DE5DCE3763299'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 1510 1497 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 3892149 3892149 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609 3893609','0 0 0 6596 7614 2306358 2572095 3823194 3873232 3873319 3873319 3873319 3873319 3873319 3873319 3873319 3873319 3873319 3873319 3873319 3873319 3893609',X'170808080308040803030807080301030807080808080301CA2E01312E3A038EE6257265400000000000000000FFFF0600FFFFC0F869E00000000032518F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 9341 7313 41 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 4211282 4211282 4217204 4217243 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244 4217244','0 0 0 7200 8390 2502650 2792131 4139620 4195704 4195798 4195798 4195798 4195798 4195798 4195798 4195798 4195798 4195798 4195798 4195798 4195798 4217244',X'170808080308040903030807080301030807080808080301CE8C01317DE8029E9D3B6D23403E00000000000000FFFF0F00FFFFC0F869E00000000008EF7D'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 8055 3290 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 5033936 5033936 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225 5037225','0 0 0 10201 11915 3045026 3383481 4941323 5012256 5012369 5012369 5012369 5012369 5012369 5012369 5012369 5012369 5012369 5012369 5012369 5012369 5037225',X'17080808030804090303080708030803080708080808030213B20130B83A018A7516DF86403600000000000000FFFF00FFFFC0F869E00000000028F8CD'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 9117 2923 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 5043358 5049528 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450 5052450','0 0 0 10203 11926 3054947 3394812 4956408 5027439 5027552 5027552 5027552 5027552 5027552 5027552 5027552 5027552 5027552 5027552 5027552 5027552 5052450',X'17080808030204080303080708030103080708080808030213B5232A013107F00217231745AF403300000000000000FFFF0200FFFFC0F869E0000000002B57DE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 333 333 4 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 5191271 5191271 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479 5191479','0 0 0 10672 12452 3147059 3494842 5093162 5165710 5165827 5165827 5165827 5165827 5165827 5165827 5165827 5165827 5165827 5165827 5165827 5165827 5191479',X'17080808030804080303080708030103080708080808030244F00131CB4201C1C917188E403F00000000000000FFFF0800FFFFC0F869E00000000001C5CB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7374 4684 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 6107894 6107894 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577 6112577','0 0 0 13780 16308 3748117 4153600 5995776 6082692 6082834 6082834 6082834 6082834 6082834 6082834 6082834 6082834 6082834 6082834 6082834 6082834 6112577',X'170808080308040803030807080301030807080808080402A9D1013108B5029E6831A21C401C00000000000000FFFF0200FFFFC0F869E0000000000092F5C6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7562 7376 28 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 6275521 6275521 6277274 6277291 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301 6277301','0 0 0 14559 17217 3855913 4271255 6156622 6246677 6246823 6246823 6246823 6246823 6246823 6246823 6246823 6246823 6246823 6246823 6246823 6246823 6277301',X'170808080308040904030807080201030107040404080302C14C0132DBF100832DC739FF53403F00000000000000FC0F00FFFF05402C0000000000000132DBF10132DBF34D89B7AA1114CB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 8282 7043 28 28 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 6286191 6286191 6292277 6292277 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304 6292304','0 0 0 14569 17229 3862314 4278722 6171137 6261611 6261757 6261757 6261757 6261757 6261757 6261757 6261757 6261757 6261757 6261757 6261757 6261757 6292304',X'170808080308040804030807080301030807080808080302C16401317CC301B5AA4A1AB270405680000000000000FFFF0F00FFFFC0F869E00000000048FD4C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 3101 3101 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 6486495 6486495 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349 6489349','0 0 0 15379 18149 3988504 4417216 6363796 6457879 6458036 6458036 6458036 6458036 6458036 6458036 6458036 6458036 6458036 6458036 6458036 6458036 6489349',X'170808080308040803030807080301030807080808080302EA6601317F7301C3EB17C4CE401C00000000000000FFFF0F00FFFFC0F869E000000000398198'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 7379 6798 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 7308682 7308682 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479 7315479','0 0 0 18403 21722 4531809 5008068 7172304 7280343 7280536 7280536 7280536 7280536 7280536 7280536 7280536 7280536 7280536 7280536 7280536 7280536 7315479',X'1708080803080408040308070803010308070808080803049EE501310667008390D0176DC9404380000000000000FFFF0500FFFFC0F869E0000000005ED2B5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 211 211 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 7787150 7787150 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219','0 0 0 20027 23602 4837427 5341824 7634169 7750020 7750224 7750224 7750224 7750224 7750224 7750224 7750224 7750224 7750224 7750224 7750224 7750224 7787219',X'17080808030804080303080708090103080704040808030550B30132B73501A79C17C3D840340000000000000F00FFFF40140000000000000132B6D00132B7400D1DB9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 26 26 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 9085083 9085083 9085088 9085088 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089 9085089','0 0 0 24964 29171 5671673 6246216 8904392 9042441 9042684 9042684 9042684 9042684 9042684 9042684 9042684 9042684 9042684 9042684 9042684 9042684 9085089',X'17080808030804080303080708030103080708080808031AA25C0131CA197A6D831B1D84401C00000000000000FFFF0F00FFFFC0F869E00000000071E307'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','11668540 11668540 11668540 1261 1261 9 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','0 0 0 10381872 10381872 10382956 10382956 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959 10382959','0 0 0 31297 36344 6545140 7198586 10180602 10336983 10337266 10337266 10337266 10337266 10337266 10337266 10337266 10337266 10337266 10337266 10337266 10337266 10382959',X'17080808040804080303080708010101080708080808030095A4C401321BB603010141073C401C000000000000080F0C40308000000000007E55BE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix6','12287 12287 12287 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1','11668540 11668540 11668540 11672111 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127 11672127','1 1 1 43128 49243 7431284 8170740 11452355 11624787 11625093 11625093 11625093 11625093 11625093 11625093 11625093 11625093 11625093 11625093 11625093 11625093 11672127',X'1701080803020408040409070803010308070408040804070267C127130133041E00AB540900E64074405C40000000000000FFFF0300FFFFC0F869E0000000000133041E0080000000A3EE16'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 24157 24157 29 29 1 1 1 1','0 0 0 1236590 1236590 1251799 1251799 1251827 1251827 1251827 1251827','0 0 0 3120 4771 71527 72755 1238782 1238782 1238782 1251827',X'0C08080803040308040808031A080400FF5594029BB30131CD372B1368'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 1209 1209 129 129 1 1 1 1','0 0 0 1296873 1296873 1297744 1297744 1297869 1297869 1297869 1297869','0 0 0 3203 4902 74577 75831 1284645 1284645 1284645 1297869',X'0C08080803030308040808041A215F04C9D901B0A30131066F0087162A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 12129 9261 428 428 1 1 1 1','0 0 0 1790076 1790076 1790076 1790076 1790503 1790503 1790503 1790503','0 0 0 4938 7561 108783 110860 1774402 1774402 1774402 1790503',X'0C08080803030308040808031CE87E029E6B018700013219C1373BA8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 273 273 5 5 1 1 1 1','0 0 0 2595625 2595625 2595738 2595738 2595739 2595739 2595739 2595739','0 0 0 7863 12132 166423 169877 2575172 2575172 2575172 2595739',X'0C08080803030308040808042F020502DA0E02C73A0133049700A711F8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 7735 7735 29 29 1 1 1 1','0 0 0 2924165 2924165 2929754 2929754 2929782 2929782 2929782 2929782','0 0 0 9123 14045 191316 195293 2907742 2907742 2907742 2929782',X'0C080808030403080408080333776300FF559475928D013329435A824F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 360 229 27 27 1 1 1 1','0 0 0 3893374 3893505 3893605 3893605 3893609 3893609 3893609 3893609','0 0 0 13912 21124 273265 278784 3866425 3866425 3866425 3893609',X'0C08080803030308040808044717710E070B01E88F0131A5B80098D0A5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 683 671 32 32 1 1 1 1','0 0 0 5191447 5191459 5191477 5191477 5191479 5191479 5191479 5191479','0 0 0 20361 30776 381171 389104 5158962 5158962 5158962 5191479',X'0C08080803030308040808037370D10F00290188450132B537354C5E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 213354 213354 113 113 1 1 1 1','0 0 0 6102233 6102233 6155183 6155183 6155295 6155295 6155295 6155295','0 0 0 26812 39489 472780 483115 6119281 6119281 6119281 6155295',X'0C080808040403080408080300F2FA4400FF5594019B6D01324067714AE8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 3675 3675 241 241 1 1 1 1','0 0 0 6486701 6486701 6489287 6489287 6489349 6489349 6489349 6489349','0 0 0 28380 41383 502486 513750 6452691 6452691 6452691 6489349',X'0C080808040304080408080300F6ABAC6C967D009F84B60132DBDD155A2A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 24063 24063 38 38 1 1 1 1','0 0 0 7080911 7080911 7102380 7102380 7102417 7102417 7102417 7102417','0 0 0 35724 49844 582928 595393 7065320 7065320 7065320 7102417',X'0C0808080404040804080803010B0A5C00FF559400CCD3EE0133294559DDCD'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 7173953 7173950 20284 20284 38 38 1 1 1 1','0 0 0 7107237 7107237 7126606 7126606 7126643 7126643 7126643 7126643','0 0 0 35764 49885 586473 599030 7089546 7089546 7089546 7126643',X'0C0808080404040804080803010B3C6700FF55940114CE73013329432225CC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 630326 618063 11855 11855 3 1 1 1 1 1','0 7173953 7173953 7665258 7665258 7672559 7672561 7672561 7672561 7672561 7672561','0 1 2 64320 91213 1077048 1100563 7630436 7630436 7630436 7672561',X'0C080908040403020408080400F2FA4400FF559405DD0A23280132DD75009F3468'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 630326 618063 4 4 1 1 1 1 1 1','0 7173953 7173953 7787218 7787218 7787219 7787219 7787219 7787219 7787219 7787219','0 1 2 74034 102405 1189484 1215034 7745001 7745001 7745001 7787219',X'0C0809080403040804080803010DDABE0368B700FEBFF60133068F22D1E5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','7804279 630326 12263 1433 1433 1 1 1 1 1 1','0 7173953 7792016 7797877 7797877 7799309 7799309 7799309 7799309 7799309 7799309','0 1 3 76213 104626 1201397 1227113 7757087 7757087 7757087 7799309',X'0C08090104040408040808030700F2FA4400FF559401C3969E013329461E5052'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 8657 8657 605 605 1 1 1 1','7804279 7804279 7804279 8360485 8360485 8364643 8364643 8365247 8365247 8365247 8365247','1 2 4 77865 106290 1217527 1243460 8321843 8321843 8321843 8365247',X'0C09080803030308040808031AD369021FFC0DC36E01328E2F3D9128'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 33421 33421 57 26 1 1 1 1','7804279 7804279 7804279 8873934 8873934 8891008 8891039 8891064 8891064 8891064 8891064','1 2 4 78914 107340 1231432 1257622 8846644 8846644 8846644 8891064',X'0C090808030403020408080433776300FF55940CE166232801332A1800836DFB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 2182 2182 94 94 1 1 1 1','7804279 7804279 7804279 9083187 9083187 9085006 9085006 9085089 9085089 9085089 9085089','1 2 4 79307 107733 1237174 1263453 9040316 9040316 9040316 9085089',X'0C09080803030308040808033AC92C021FFC04AF670132B5FC38DBD0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 6023 6023 50 50 1 1 1 1','7804279 7804279 7804279 9393480 9393480 9395815 9395815 9395864 9395864 9395864 9395864','1 2 4 79973 108402 1245294 1271679 9350536 9350536 9350536 9395864',X'0C09080803030308040808034CDD9A7E1C2301C30D0132908703CC11'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 79 79 6 6 1 1 1 1','7804279 7804279 7804279 10382946 10382946 10382956 10382956 10382959 10382959 10382959 10382959','1 2 4 82501 110947 1276304 1303221 10336296 10336296 10336296 10382959',X'0C090808040303080408080400E9A10A0CC31602A47201332C6C00ABCD60'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 8251 8251 280 280 1 1 1 1','7804279 7804279 7804279 11067468 11067468 11072690 11072690 11072969 11072969 11072969 11072969','1 2 4 85529 113989 1307763 1335183 11025935 11025935 11025935 11072969',X'0C090808040404080408080300FFA4A7008A66AD0089DBDD0132B5FF6AE2B8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 44772 44772 58 58 1 1 1 1','7804279 7804279 7804279 11268036 11268036 11269261 11269261 11269318 11269318 11269318 11269318','1 2 4 87132 115597 1321101 1348736 11222284 11222284 11222284 11269318',X'0C0908080404030804080804010B0A5C00FF5594018ACD0133294300B0E291'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 53775 53775 37 19 1 1 1 1','7804279 7804279 7804279 11330929 11330929 11355027 11355045 11355063 11355063 11355063 11355063','1 2 4 87335 115800 1327560 1355328 11308029 11308029 11308029 11355063',X'0C0908080404030204080803010BFA8100FF5594026C24232801332B2E1F8BB5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 3718791 3718791 39430 39430 39 39 1 1 1 1','7804279 7804279 7804279 11458789 11458789 11476757 11476757 11476795 11476795 11476795 11476795','1 2 4 88502 116970 1340484 1368500 11429761 11429761 11429761 11476795',X'0C09080804040308040808030113B99600FF559402F6AF01332B2E1F8A54'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix5','3876548 157757 157736 5317 5317 1 1 1 1 1 1','7804279 11523070 11523070 11652823 11652823 11658139 11658139 11658139 11658139 11658139 11658139','1 3 5 100045 128561 1480184 1510648 11611105 11611105 11611105 11658139',X'0C0909080404040204080803010BFA8100FF559402594CCB2328013351E85B0F5D'); - - - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 4748 4629 308 1 1 1 1 1','0 0 0 634880 634880 639119 639426 639426 639426 639426 639426','0 0 0 779 907 26900 633919 633920 633920 633920 639426',X'0C0808080308040403080803018C4A00F450A80132671F029EAC271DA5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 4608 4608 246 1 1 1 1 1','0 0 0 752580 752580 755578 755823 755823 755823 755823 755823','0 0 0 936 1089 31876 749384 749385 749385 749385 755823',X'0C0808080308030403080804018D4F347FD20131547D018A7500936FE2'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 4776 4776 240 1 1 1 1 1','0 0 0 762070 762070 764545 764784 764784 764784 764784 764784','0 0 0 940 1097 32187 758274 758275 758275 758275 764784',X'0C0808080308030403080804018D562E0EAB0131A68F029E9300994D36'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5910 5910 257 1 1 1 1 1','0 0 0 771353 771353 772646 772902 772902 772902 772902 772902','0 0 0 946 1103 32460 766333 766334 766334 766334 772902',X'0C0808080308030404080803018D611726F40130E13C00822B980302A0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 1834 1834 46 1 1 1 1 1','0 0 0 1296866 1296866 1297832 1297869 1297869 1297869 1297869 1297869','0 0 0 2621 2842 56932 1287063 1287064 1287064 1287064 1297869',X'0C080808030803040308080301A6E33010BC01317F2005516E3932DB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5007 3959 317 1 1 1 1 1','0 0 0 2152400 2152400 2153781 2154097 2154097 2154097 2154097 2154097','0 0 0 5683 6304 111431 2139450 2139457 2139457 2139457 2154097',X'0C080808030803040308080301C3F91E114001315549029F74635F36'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 4768 4609 397 1 1 1 1 1','0 0 0 2200466 2200466 2200700 2201096 2201096 2201096 2201096 2201096','0 0 0 5714 6370 114266 2186220 2186227 2186227 2186227 2201096',X'0C080808030803040308080401C42217887E01312D72036D5B009AF3F8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5177 4669 264 1 1 1 1 1','0 0 0 2234078 2234078 2235865 2236128 2236128 2236128 2236128 2236128','0 0 0 5743 6422 116499 2221108 2221115 2221115 2221115 2236128',X'0C080808030803040308080401C4491EF49D013155450D4B200091BFB3'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 7981 5546 272 1 1 1 1 1','0 0 0 2239923 2239923 2242583 2242854 2242854 2242854 2242854 2242854','0 0 0 5746 6428 116800 2227775 2227782 2227782 2227782 2242854',X'0C080808030803040308080301C44E2EFF35013109E67764687E36D6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 351 336 15 1 1 1 1 1','0 0 0 2595725 2595725 2595725 2595739 2595739 2595739 2595739 2595739','0 0 0 6747 7717 144364 2578697 2578708 2578708 2578708 2595739',X'0C080808030803040308080401CCC91782C20131CC1902D7C0008E7A4F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 6022 4942 304 1 1 1 1 1','0 0 0 2648510 2648510 2648849 2649152 2649152 2649152 2649152 2649152','0 0 0 6934 7959 149030 2631886 2631900 2631900 2631900 2649152',X'0C080808030803040308080301CE8C17887E01312D6E036D5B424939'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 4752 1965 5 1 1 1 1 1','0 0 0 3161780 3161780 3163740 3163744 3163744 3163744 3163744 3163744','0 0 0 9707 11219 194477 3143873 3143896 3143896 3143896 3163744',X'0C08080803080404030808030213B20116290C01332B9D0270102494C2'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5497 1880 3 1 1 1 1 1','0 0 0 3167643 3167643 3169520 3169522 3169522 3169522 3169522 3169522','0 0 0 9709 11226 194760 3149632 3149655 3149655 3149655 3169522',X'0C08080803080404040808030213B5010B0A5C0133294500FF55941DCA72'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 2185 2126 134 1 1 1 1 1','0 0 0 3891669 3891669 3893607 3893609 3893609 3893609 3893609 3893609','0 0 0 13596 15952 257364 3869701 3869733 3869733 3869733 3893609',X'0C080808030804040308080302BD5F01010F13013350517B8BF356D913'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5511 5355 345 1 1 1 1 1','0 0 0 3931849 3931849 3931954 3932298 3932298 3932298 3932298 3932298','0 0 0 13793 16188 260160 3908172 3908206 3908206 3908206 3932298',X'0C080808030803040308080402C14C17887E01312D75036D5B009AF4B1'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5468 5115 310 1 1 1 1 1','0 0 0 3939090 3939090 3939894 3940203 3940203 3940203 3940203 3940203','0 0 0 13803 16200 260571 3916034 3916068 3916068 3916068 3940203',X'0C080808030803040308080302C164191E7F0131A4FC0606F30CE25A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 5275 4792 252 1 1 1 1 1','0 0 0 4590216 4590216 4591340 4591591 4591591 4591591 4591591 4591591','0 0 0 17456 20455 315887 4563939 4563981 4563981 4563981 4591591',X'0C0808080308030403080804049EE51EB67B01317C5204C9D900AE08CD'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 339 339 20 1 1 1 1 1','0 0 0 5191257 5191257 5191475 5191479 5191479 5191479 5191479 5191479','0 0 0 20754 24230 366257 5160652 5160701 5160701 5160701 5191479',X'0C08080803080404030808030CEE9300E50D8D013242BE018A755F6BC3'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 7173953 7173950 13 13 1 1 1 1 1 1','0 0 0 6489337 6489337 6489349 6489349 6489349 6489349 6489349 6489349','0 0 0 29449 33987 481632 6453309 6453378 6453378 6453378 6489349',X'0C08080804080304030808030091B3AB600E9801323F54029F7403EF0C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 630326 618063 10 9 1 1 1 1 1 1','0 7173953 7173953 7787217 7787217 7787219 7787219 7787219 7787219 7787219 7787219','0 1 2 74978 85458 1107555 7744920 7744997 7744997 7744997 7787219',X'0C0809080408030403080804014F459B48960801332ADC01C7A600AA1BA3'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','7804279 630326 12263 17 1 1 1 1 1 1 1','0 7173953 7792016 7795570 7795586 7795586 7795586 7795586 7795586 7795586 7795586','0 1 3 78329 89057 1115864 7753287 7753364 7753364 7753364 7795586',X'0C0809010302040404080804070267C1271300E640740133041E00AB540900A3EE16'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','3876548 3718791 3718791 397 397 46 1 1 1 1 1','7804279 7804279 7804279 9084892 9084892 9085088 9085089 9085089 9085089 9085089 9085089','1 2 4 87584 99143 1159195 9040539 9040616 9040616 9040616 9085089',X'0C090808030804040308080301CBAF00E5C288013351810C390F26671E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','3876548 3718791 3718791 141 141 20 1 1 1 1 1','7804279 7804279 7804279 10382921 10382921 10382951 10382959 10382959 10382959 10382959 10382959','1 2 4 95054 107437 1210217 10336699 10336776 10336776 10336776 10382959',X'0C09080803080304030808030DB5C14114E301332A7E018A751F17C1'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix4','3876548 157757 157736 83 16 1 1 1 1 1 1','7804279 11523070 11523070 11587733 11587800 11587815 11587815 11587815 11587815 11587815 11587815','1 3 5 112412 126326 1332792 11540704 11540781 11540781 11540781 11587815',X'0C090908030204040308080402A9D12328010B92880133517F029E9D008B5B23'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 213279 213279 213279 213279 376 212 101 1 1','0 0 12394 12394 12394 12394 18421 18421 18421 18424 18424','0 0 3 3 3 3 810 1027 1949 18324 18424',X'0C0808030808080308030403018A75018788178574013265FC611E2A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 86515 86515 86515 86515 377 377 377 1 1','0 0 271240 271240 271240 271240 274521 274521 274521 274780 274780','0 0 8 8 8 8 9766 10762 19602 273178 274780',X'0C080803080808030803040401A79C01886F174AEF0132678B00A4AEFF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 193482 193482 193482 193482 444 444 444 1 1','0 0 542802 542802 542802 542802 575453 575453 575453 575505 575505','0 0 27 27 27 27 24310 25597 43165 571774 575505',X'0C080803080808030803040401C3EB018CCE55312F013305B700AF487C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 126108 126108 126108 126108 200 200 28 1 1','0 0 747801 747801 747801 747801 762121 762121 762293 762320 762320','0 0 33 33 33 33 30770 32410 56629 757315 762320',X'0C080803080808030803040301C7A6018A9D6AB1100131F17D04364A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 149712 149712 149712 149712 216 216 5 1 1','0 0 1107747 1107747 1107747 1107747 1147090 1147090 1147301 1147305 1147305','0 0 98 98 98 98 51603 53785 94043 1139967 1147305',X'0C080803080808030803040302172301B84D2E828501317B95651924'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 87289 87289 87289 87289 27 27 12 1 1','0 0 1257751 1257751 1257751 1257751 1297850 1297850 1297865 1297869 1297869','0 0 100 100 100 100 57625 60123 107069 1289807 1297869',X'0C0808030808080308040403021FFC02554D00E643C7013242692A9BBC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 192597 192597 192597 192597 291 291 3 1 1','0 0 1464077 1464077 1464077 1464077 1512946 1512946 1513234 1513236 1513236','0 0 134 134 134 134 67476 70262 123260 1502886 1513236',X'0C0808030808080308040404029E6201B94000F8341701330419008B74DA'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 196917 196917 196917 196917 326 326 12 1 1','0 0 1677739 1677739 1677739 1677739 1797333 1797333 1797647 1797658 1797658','0 0 136 136 136 136 76717 80026 143308 1785522 1797658',X'0C0808030808080308040404029E6802B7DC0108ACBA0132DD7B0087795F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 140297 140297 140297 140297 206 188 90 1 1','0 0 1951850 1951850 1951850 1951850 2020506 2020524 2020622 2020711 2020711','0 0 146 146 146 146 85439 89181 160816 2006993 2020711',X'0C0808030808080302040403029E8102171603E800FA82B20132B5AD384ECD'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 132041 132041 132041 132041 173 173 20 1 1','0 0 2415706 2415706 2415706 2415706 2428962 2428962 2429115 2429134 2429134','0 0 163 163 163 163 100984 105182 186071 2412732 2429134',X'0C0808030808080308030403029EB1018BF55020D60131A3D23BB156'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 6830 6830 6830 6830 35 35 35 1 1','0 0 2595444 2595444 2595444 2595444 2595711 2595711 2595711 2595739 2595739','0 0 169 169 169 169 108584 113037 199947 2578183 2595739',X'0C0808030808080308030403029EC001878C17A7520131A43A6E513C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 101615 101615 101615 101615 244 33 33 1 1','0 0 2999185 2999185 2999185 2999185 3019255 3019466 3019466 3019498 3019498','0 0 213 213 213 213 131035 136293 237357 2999333 3019498',X'0C080803080808030203040302D7C001B93E03F041A96D013303017C72B6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 26914 26914 26914 26914 87 87 73 1 1','0 0 3868553 3868553 3868553 3868553 3893568 3893568 3893582 3893609 3893609','0 0 387 387 387 387 172456 180121 311050 3869040 3893609',X'0C08080308080803080304040498C86B7EF347CC5A0132B678008A4646'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 97492 97492 97492 97492 410 410 44 1 1','0 0 4948831 4948831 4948831 4948831 5009456 5009456 5009822 5009865 5009865','0 0 751 751 751 751 226745 236274 399260 4980988 5009865',X'0C08080308080803080404030E565F03686C00F89CD001332A115479DC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 1782 1782 1782 1782 52 52 52 1 1','0 0 5190938 5190938 5190938 5190938 5191434 5191434 5191434 5191479 5191479','0 0 800 800 800 800 236362 246237 414618 5161779 5191479',X'0C08080308080803080304040EBD0F0268E064A6DB013242CB00875BAF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 4645 4645 4645 4645 17 17 17 1 1','0 0 6485214 6485214 6485214 6485214 6489339 6489339 6489339 6489349 6489349','0 0 1396 1396 1396 1396 317293 329836 538486 6453712 6489349',X'0C080804080808040803040300ABD9B000A69D33737CBB01328F6B0F6298'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 7173953 290196 290196 290196 290196 138 138 26 1 1','0 0 6734628 6734628 6734628 6734628 6744872 6744872 6744984 6745009 6745009','0 0 1641 1641 1641 1641 338986 352099 569319 6708651 6745009',X'0C080804080808030804040400FF5594018819010B3C670133294300B1674C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','7804279 630326 24310 1435 1435 1435 1 1 1 1 1','0 7173953 7763625 7786500 7786500 7786500 7787219 7787219 7787219 7787219 7787219','0 1 3518 4119 4119 4119 726018 753845 1215054 7745002 7787219',X'0C080904010808030204040400FF5594070357AB232800F2FA440133294600A90441'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','3876548 3718791 114188 114188 114188 114188 463 61 61 1 1','7804279 7804279 7809377 7809377 7809377 7809377 7864755 7865157 7865157 7865217 7865217','1 2 3751 4413 4413 4413 740133 768607 1233927 7822883 7865217',X'0C0908030808080302030403018A750213B2245416DF860131CB3A2879CC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','3876548 3718791 86108 86108 86108 86108 605 605 605 1 1','7804279 7804279 8403815 8403815 8403815 8403815 8463845 8463845 8463845 8464449 8464449','1 2 3805 4467 4467 4467 760796 789718 1255047 8421249 8464449',X'0C0908030808080308030403021FFC0DC36E1AD36901328E2F3D9128'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','3876548 3718791 60490 60490 60490 60490 44 44 44 1 1','7804279 7804279 9062901 9062901 9062901 9062901 9085056 9085056 9085056 9085089 9085089','1 2 3845 4507 4507 4507 778931 808217 1273550 9040805 9085089',X'0C0908030808080308040403029EB101C30B00E889140132697F092505'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','3876548 3718791 57304 57304 57304 57304 2 2 2 1 1','7804279 7804279 10328144 10328144 10328144 10328144 10382958 10382958 10382958 10382959 10382959','1 2 4106 4768 4768 4768 823966 853934 1319290 10336860 10382959',X'0C09080308080804080404040E565F00CE8C3100E7F68D0133517900B0B4CE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','3876548 3718791 174377 174377 174377 174377 81 81 66 1 1','7804279 7804279 11246252 11246252 11246252 11246252 11358749 11358749 11358764 11358829 11358829','1 2 4517 5179 5179 5179 867595 898252 1363807 11311829 11358829',X'0C090804080808030804040300FF55940E584300F2FA44013240670E2E89'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix3','3876548 157757 15066 15066 15066 15066 1 1 1 1 1','7804279 11523070 11657249 11657249 11657249 11657249 11672314 11672314 11672314 11672314 11672314','1 3 5503 6167 6167 6167 1025351 1059076 1524822 11625280 11672314',X'0C090904080808040203040300FF5594025D19032328337763013351F2277A3E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 4748 4629 4629 4629 4629 17 1 1 1','0 0 634880 634880 634880 634880 634880 639175 639191 639191 639191','0 0 779 907 907 907 907 415429 633684 633685 639191',X'0C0808030808080804030303018C4A013157983CE7FE05E54B6BB7FB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 4608 4608 4608 4608 4608 33 1 1 1','0 0 752580 752580 752580 752580 752580 755506 755538 755538 755538','0 0 936 1089 1089 1089 1089 491324 749126 749127 755538',X'0C0808030808080804030303018D4F0131A682512ECF029E6A70A9E9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 4776 4776 4776 4776 4776 27 1 1 1','0 0 762070 762070 762070 762070 762070 763357 763383 763383 763383','0 0 940 1097 1097 1097 1097 495628 756890 756891 763383',X'0C0808030808080804040303018D560132DB8800F3416D029EA654D9AC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5910 5910 5910 5910 5910 37 2 2 1','0 0 771353 771353 771353 771353 771353 775562 775597 775597 775598','0 0 946 1103 1103 1103 1103 501111 769013 769014 775598',X'0C0808030808080804030303018D610131CADE4C6E2D01D5860141A9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 1834 1834 1834 1834 1834 6 1 1 1','0 0 1296866 1296866 1296866 1296866 1296866 1297867 1297869 1297869 1297869','0 0 2621 2842 2842 2842 2842 857867 1287063 1287064 1297869',X'0C080803080808080403030301A6E30132419A1E1B7F0567EE2880C0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5007 3959 3959 3959 3959 25 1 1 1','0 0 2152400 2152400 2152400 2152400 2152400 2155551 2155575 2155575 2155575','0 0 5683 6304 6304 6304 6304 1442790 2140930 2140937 2155575',X'0C080803080808080404030301C3F901317CC701044CC7029E6834F7E2'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 4768 4609 4609 4609 4609 26 1 1 1','0 0 2200466 2200466 2200466 2200466 2200466 2204364 2204389 2204389 2204389','0 0 5714 6370 6370 6370 6370 1470393 2189496 2189503 2204389',X'0C080803080808080403030301C4220131586B3EB735018A7567CE9E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5177 4669 4669 4669 4669 22 1 1 1','0 0 2234078 2234078 2234078 2234078 2234078 2238366 2238387 2238387 2238387','0 0 5743 6422 6422 6422 6422 1490145 2223355 2223362 2238387',X'0C080803080808080403030301C4490131573F4104F802D9CA67FD1E'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 7981 5546 5546 5546 5546 32 1 1 1','0 0 2239923 2239923 2239923 2239923 2239923 2243388 2243419 2243419 2243419','0 0 5746 6428 6428 6428 6428 1492784 2228358 2228365 2243419',X'0C080803080808080404030301C44E0131A4FE00FDCC04029E8175076B'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 351 336 336 336 336 1 1 1 1','0 0 2595725 2595725 2595725 2595725 2595725 2595739 2595739 2595739 2595739','0 0 6747 7717 7717 7717 7717 1732397 2578697 2578708 2595739',X'0C080803080808080404030301CCC901332A7700F17E5D0E5D6F523B01'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 6022 4942 4942 4942 4942 38 1 1 1','0 0 2648510 2648510 2648510 2648510 2648510 2652126 2652163 2652163 2652163','0 0 6934 7959 7959 7959 7959 1770411 2634884 2634898 2652163',X'0C080803080808080404030301CE8C01317DE800FE4E8B029E81458317'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 4752 1965 1965 1965 1965 1 1 1 1','0 0 3161780 3161780 3161780 3161780 3161780 3163744 3163744 3163744 3163744','0 0 9707 11219 11219 11219 11219 2143797 3143873 3143896 3163744',X'0C08080308080808040303030213B20130BC9216F939029E815B86EE'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5497 1880 1880 1880 1880 1 1 1 1','0 0 3167643 3167643 3167643 3167643 3167643 3169522 3169522 3169522 3169522','0 0 9709 11226 11226 11226 11226 2148088 3149632 3149655 3169522',X'0C08080308080808040303030213B50130BBC616FC6501C7A62A1BB2'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 2185 2126 2126 2126 2126 4 1 1 1','0 0 3891670 3891670 3891670 3891670 3891670 3893609 3893609 3893609 3893609','0 0 13596 15952 15953 15953 15953 2677069 3869700 3869732 3893609',X'0C080803080808080403030302BD5F01317CC81782F704C9D95EFF0C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5511 5355 5355 5355 5355 21 1 1 1','0 0 3931850 3931850 3931850 3931850 3931850 3936206 3936226 3936226 3936226','0 0 13793 16188 16189 16189 16189 2705655 3912091 3912125 3936226',X'0C080803080808080403030302C14C01317C514010FA01B64235E688'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5468 5115 5115 5115 5115 27 1 1 1','0 0 3939091 3939091 3939091 3939091 3939091 3943255 3943281 3943281 3943281','0 0 13803 16200 16201 16201 16201 2709082 3919099 3919133 3943281',X'0C080803080808080403030302C16401317CC348B67001C3EB6824BB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 5275 4792 4792 4792 4792 31 1 1 1','0 0 4590217 4590217 4590217 4590217 4590217 4591639 4591669 4591669 4591669','0 0 17456 20455 20456 20456 20456 3175906 4564022 4564064 4591669',X'0C0808030808080804040403049EE50132915200FA2F9300EA0DC50554E0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 339 339 339 339 339 2 1 1 1','0 0 5191258 5191258 5191258 5191258 5191258 5191478 5191479 5191479 5191479','0 0 20754 24230 24231 24231 24231 3601696 5160652 5160701 5191479',X'0C08080308080808040303030CEE930132671A1B8AFF01B6426386D0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 7173953 13 13 13 13 13 1 1 1 1','0 0 6489339 6489339 6489339 6489339 6489339 6489349 6489349 6489349 6489349','0 0 29449 33987 33989 33989 33989 4540005 6453309 6453378 6489349',X'0C08080408080808040303030091B3AB01321B5A4F26F2018A750B6686'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','7804279 630326 19 19 18 18 18 1 1 1 1','0 7173953 7787203 7787203 7787203 7787203 7787203 7787219 7787219 7787219 7787219','0 1 73522 83967 91688 91688 91688 5643606 7744920 7744997 7787219',X'0C080904080808080404030300FF69210132DB2900FB0715029EB573EB9F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','3876548 3718791 4598 4512 4512 4512 4512 38 1 1 1','7804279 7804279 8237877 8237877 8237877 8237877 8237877 8238986 8239023 8239023 8239023','1 2 76726 87349 95641 95641 95641 5923145 8195880 8195957 8239023',X'0C0908030808080804040404018D3F01332A780111068001FB6F840083BEF9'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','3876548 3718791 397 397 397 397 397 2 1 1 1','7804279 7804279 9084892 9084892 9084892 9084892 9084892 9085089 9085089 9085089 9085089','1 2 79826 90851 99143 99143 99143 6505397 9040540 9040617 9085089',X'0C090803080808080403030301CBAF0133028A4E35BE715A2A49098C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','3876548 3718791 141 141 141 141 141 2 1 1 1','7804279 7804279 10382921 10382921 10382921 10382921 10382921 10382958 10382959 10382959 10382959','1 2 87296 99145 107437 107437 107437 7432077 10336699 10336776 10382959',X'0C09080308080808040403030DB5C101332BF7010E37310EB97420BFF6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix2','3876548 157757 83 16 16 16 16 1 1 1 1','7804279 11523070 11587750 11587817 11587817 11587817 11587817 11587832 11587832 11587832 11587832','1 3 104655 118035 126343 126343 126343 8311754 11540721 11540798 11587832',X'0C090903020808080404030402A9D1232801332CC300EB7D35029E83008581B1'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 24157 24157 24157 24157 24157 133 1 1 1','0 0 1236590 1236590 1236590 1236590 1236590 1241150 1241282 1241282 1241282','0 0 3120 3120 3120 3120 4771 741878 1223262 1228239 1241282',X'0C08080308080804040408031A080400FF559401321BC20099C49F3BE84C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 1209 1209 1209 1209 1209 2 1 1 1','0 0 1296873 1296873 1296873 1296873 1296873 1297868 1297869 1297869 1297869','0 0 3203 3203 3203 3203 4902 763298 1279554 1284645 1297869',X'0C08080308080803040308031A215F04C9D901317D1501B0A355A290'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 12129 12129 12129 12129 9261 38 1 1 1','0 0 1790076 1790076 1790076 1790076 1790076 1791737 1791774 1791774 1791774','0 0 4938 4938 4938 4938 7561 1075153 1767990 1775629 1791774',X'0C08080308080803040408031CE87E029E6B01328F6100B473FD5BE552'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 273 273 273 273 273 1 1 1 1','0 0 2595625 2595625 2595625 2595625 2595625 2595739 2595739 2595739 2595739','0 0 7863 7863 7863 7863 12132 1580849 2562484 2575172 2595739',X'0C08080308080803040308032F020502DA0E013241A16B73DE01E021'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 7735 7735 7735 7735 7735 503 1 1 1','0 0 2924165 2924165 2924165 2924165 2924165 2931394 2931896 2931896 2931896','0 0 9123 9123 9123 9123 14045 1794002 2895440 2909856 2931896',X'0C080803080808040404080433776300FF55940133294301C56631008BCB5A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 360 360 360 360 229 1 1 1 1','0 0 3893374 3893374 3893374 3893374 3893505 3893609 3893609 3893609 3893609','0 0 13912 13912 13912 13912 21124 2420346 3846830 3866425 3893609',X'0C08080308080803040308034717710E070B01317F7102C73A396CE1'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 683 683 683 683 671 2 1 1 1','0 0 5191447 5191447 5191447 5191447 5191459 5191479 5191479 5191479 5191479','0 0 20361 20361 20361 20361 30776 3226670 5127525 5158962 5191479',X'0C08080308080803040308037370D10F00290132B59A018F7A694C9B'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 213354 213354 213354 213354 213354 5934 1 1 1','0 0 6102233 6102233 6102233 6102233 6102233 6154276 6155650 6155650 6155650','0 0 26812 26812 26812 26812 39489 3770219 6079715 6119855 6155650',X'0C080804080808040403080300F2FA4400FF55940132DF1A01C0C115D4D4'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 3675 3675 3675 3675 3675 14 1 1 1','0 0 6486701 6486701 6486701 6486701 6486701 6489347 6489349 6489349 6489349','0 0 28380 28380 28380 28380 41383 3868787 6409451 6452691 6489349',X'0C080804080808030403020300F6ABAC6C967D0132B672026C8D03E8155844'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 24063 24063 24063 24063 24063 1799 1 1 1','0 0 7080914 7080914 7080914 7080914 7080914 7103178 7104976 7104976 7104976','0 0 35724 35725 35725 35725 49845 4189282 7019641 7067879 7104976',X'0C0808040808080404040804010B0A5C00FF55940133294301D2C35700A877B5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 7173953 20284 20284 20284 20284 20284 1518 1 1 1','0 0 7107240 7107240 7107240 7107240 7107240 7124584 7126101 7126101 7126101','0 0 35764 35765 35765 35765 49886 4191089 7040717 7089004 7126101',X'0C0808040808080404040803010B3C6700FF55940133294501F0A829511573'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 630326 13288 11855 11855 11855 11855 5449 1 1 1','0 7173953 7671119 7671119 7671119 7671119 7671119 7676514 7676526 7676526 7676526','0 1 64320 65543 65543 65543 92453 4431581 7580039 7634401 7676526',X'0C080904080808040403080400F2FA4400FF5594013329430186CB00A866E4'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','7804279 630326 61 61 61 61 61 14 1 1 1','0 7173953 7787172 7787172 7787172 7787172 7787172 7787217 7787219 7787219 7787219','0 1 73272 75274 75274 75274 103642 4468650 7689369 7745002 7787219',X'0C0809040808080304030803010ABA910DD2420133068F05DE6223042F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 8657 8657 8657 8657 8657 18 1 1 1','7804279 7804279 8360485 8360485 8360485 8360485 8360485 8360977 8360994 8360994 8360994','1 2 75785 77865 77865 77865 106290 4756698 8258979 8317590 8360994',X'0C09080308080803040408031AD369021FFC0133517F01B017F259F6C3'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 33421 33421 33421 33421 33421 2221 1 1 1','7804279 7804279 8873934 8873934 8873934 8873934 8873934 8874868 8877088 8877088 8877088','1 2 76834 78914 78914 78914 107340 5041847 8770182 8832668 8877088',X'0C090803080808040404020333776300FF5594013351790241FEE4232825FB3D'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 2182 2182 2182 2182 2182 20 1 1 1','7804279 7804279 9083187 9083187 9083187 9083187 9083187 9085087 9085089 9085089 9085089','1 2 77227 79307 79307 79307 107733 5141706 8974619 9040316 9085089',X'0C09080308080803040308043AC92C021FFC0132B668018BAB00964778'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 6008 6008 6008 6008 6008 26 1 1 1','7804279 7804279 9124662 9124662 9124662 9124662 9124662 9128286 9128311 9128311 9128311','1 2 77300 79380 79380 79380 107806 5160088 9016921 9083451 9128311',X'0C09080308080804040408033C1C5C00F024880132DB2100B88E8A420C1B'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 6023 6023 6023 6023 6023 91 1 1 1','7804279 7804279 9393480 9393480 9393480 9393480 9393480 9396519 9396609 9396609 9396609','1 2 77893 79973 79973 79973 108402 5311949 9282988 9351281 9396609',X'0C09080308080803040408044CDD9A7E1C230132DE4200D105C800A087F7'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 79 79 79 79 79 1 1 1 1','7804279 7804279 10382946 10382946 10382946 10382946 10382946 10382959 10382959 10382959 10382959','1 2 80421 82501 82501 82501 110947 5821380 10258569 10336296 10382959',X'0C090804080808030403080300E9A10A0CC3160133505F0D25365733C6'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 8251 8251 8251 8251 8251 37 1 1 1','7804279 7804279 11067468 11067468 11067468 11067468 11067468 11068084 11068120 11068120 11068120','1 2 83449 85529 85529 85529 113989 6177561 10936213 11021086 11068120',X'0C090804080808040404080400FFA4A7008A66AD01332AD10170A8B10084054A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 44772 44772 44772 44772 44772 3018 1 1 1','7804279 7804279 11268036 11268036 11268036 11268036 11268036 11282829 11285846 11285846 11285846','1 2 85052 87132 87132 87132 115597 6281979 11151347 11238812 11285846',X'0C0908040808080404040804010B0A5C00FF5594013351720249087400B0523C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 53775 53775 53775 53775 53775 4069 1 1 1','7804279 7804279 11330929 11330929 11330929 11330929 11330929 11359035 11363103 11363103 11363103','1 2 85255 87335 87335 87335 115800 6292285 11227544 11316069 11363103',X'0C0908040808080404040804010BFA8100FF5594013351280252F8A000B01818'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 3718791 39430 39430 39430 39430 39430 3018 1 1 1','7804279 7804279 11458789 11458789 11458789 11458789 11458789 11468188 11471205 11471205 11471205','1 2 86422 88502 88502 88502 116970 6333877 11333316 11424171 11471205',X'0C09080408080804040408040113B99600FF559401335174024530C4008AC82C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix1','3876548 157757 5317 5317 5317 5317 5317 12 1 1 1','7804279 11523070 11652844 11652844 11652844 11652844 11652844 11658149 11658160 11658160 11658160','1 3 97969 100051 100051 100051 128567 6429914 11517744 11611126 11658160',X'0C0909040808080404040804010BFA8100FF559401332B2E01521E0B008447F4'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 24157 29 29 29 29 29 1 1 1','0 0 1236590 1251799 1251799 1251799 1251799 1251799 1251827 1251827 1251827','0 0 3120 62451 63798 63798 63798 63798 1238772 1238782 1251827',X'0C08080303080808080404031A0804029BB30131CD3700FF55942B1368'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 1209 129 129 129 129 129 1 1 1','0 0 1296873 1297744 1297744 1297744 1297744 1297744 1297869 1297869 1297869','0 0 3203 65280 66657 66657 66657 66657 1284635 1284645 1297869',X'0C08080303080808080403041A215F01B0A30131066F04C9D90087162A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 12129 604 604 604 604 604 1 1 1','0 0 1790076 1790076 1790076 1790076 1790076 1790076 1790679 1790679 1790679','0 0 4938 95334 97612 97612 97612 97612 1774566 1774578 1790679',X'0C08080303080808080403031CE87E01870001317C4D0CED622FE2E8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 273 5 5 5 5 5 1 1 1','0 0 2595625 2595738 2595738 2595738 2595738 2595738 2595739 2595739 2595739','0 0 7863 145612 149427 149427 149427 149427 2575145 2575172 2595739',X'0C08080303080808080403042F020502C73A0133049702DA0E00A711F8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 7735 29 29 29 29 29 1 1 1','0 0 2924165 2929754 2929754 2929754 2929754 2929754 2929782 2929782 2929782','0 0 9123 167852 172269 172269 172269 172269 2907715 2907742 2929782',X'0C080803030808080804040333776375928D0133294300FF55945A824F'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 360 6 6 6 6 6 1 1 1','0 0 3893374 3893607 3893607 3893607 3893607 3893607 3893609 3893609 3893609','0 0 13912 240908 247109 247109 247109 247109 3866384 3866425 3893609',X'0C080803030808080804030347177104AF8701317D220E070B687905'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 683 32 32 32 32 32 2 2 1','0 0 5191447 5191465 5191465 5191465 5191465 5191465 5191479 5191479 5191479','0 0 20361 336764 345696 345696 345696 345696 5158907 5158962 5191479',X'0C08080303080808080403037370D101884501328F690F002900A69C'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 213354 113 113 113 113 113 1 1 1','0 0 6102233 6155183 6155183 6155183 6155183 6155183 6155295 6155295 6155295','0 0 26812 421693 433202 433202 433202 433202 6119212 6119281 6155295',X'0C080804030808080804040300F2FA44019B6D0132406700FF5594714AE8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 3675 241 241 241 241 241 1 1 1','0 0 6486701 6489287 6489287 6489287 6489287 6489287 6489349 6489349 6489349','0 0 28380 450494 462953 462953 462953 462953 6452616 6452691 6489349',X'0C080804040808080804030300F6ABAC009F84B60132DBDD6C967D155A2A'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 24063 38 38 38 38 38 1 1 1','0 0 7080914 7102383 7102383 7102383 7102383 7102383 7102420 7102420 7102420','0 0 35724 528136 541855 541858 541858 541858 7065247 7065323 7102420',X'0C0808040408080808040403010B0A5C00CCD3EE0133294500FF559459DDCD'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 7173953 20284 38 38 38 38 38 1 1 1','0 0 7107240 7126609 7126609 7126609 7126609 7126609 7126646 7126646 7126646','0 0 35764 531673 545484 545487 545487 545487 7089473 7089549 7126646',X'0C0808040408080808040403010B3C670114CE730133294300FF55942225CC'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 630326 13288 5 1 1 1 1 1 1 1','0 7173953 7671119 7675167 7675171 7675171 7675171 7675171 7675171 7675171 7675171','0 1 64320 967583 993386 999414 999414 999414 7632969 7633046 7675171',X'0C080904030308080804040400F2FA4401D16F0183350132DEFE00FF5594009FA501'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','7804279 630326 61 1 1 1 1 1 1 1 1','0 7173953 7787172 7787219 7787219 7787219 7787219 7787219 7787219 7787219 7787219','0 1 73272 1068631 1096442 1107608 1107608 1107608 7744925 7745002 7787219',X'0C0809040408080808040304010ABA9100AA4C1F013351DB0DD242008BFFEF'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 8657 605 605 605 605 605 1 1 1','7804279 7804279 8360485 8364643 8364643 8364643 8364643 8364643 8365247 8365247 8365247','1 2 75785 1096159 1124446 1135923 1135923 1135923 8321766 8321843 8365247',X'0C09080303080808080403031AD3690DC36E01328E2F021FFC3D9128'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 33421 57 26 26 26 26 1 1 1','7804279 7804279 8873934 8891008 8891039 8891039 8891039 8891039 8891064 8891064 8891064','1 2 76834 1110063 1138607 1150084 1150084 1150084 8846567 8846644 8891064',X'0C09080303020808080404043377630CE166232801332A1800FF559400836DFB'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 2182 94 94 94 94 94 1 1 1','7804279 7804279 9083187 9085006 9085006 9085006 9085006 9085006 9085089 9085089 9085089','1 2 77227 1115805 1144438 1155915 1155915 1155915 9040239 9040316 9085089',X'0C09080303080808080403033AC92C04AF670132B5FC021FFC38DBD0'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 6008 277 277 277 277 277 1 1 1','7804279 7804279 9124662 9124662 9124662 9124662 9124662 9124662 9124938 9124938 9124938','1 2 77300 1116652 1145304 1156781 1156781 1156781 9080000 9080077 9124938',X'0C09080303080808080404033C1C5C01B49901328DDA00F024883D6052'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 6023 50 50 50 50 50 1 1 1','7804279 7804279 9393480 9395815 9395815 9395815 9395815 9395815 9395864 9395864 9395864','1 2 77893 1123924 1152663 1164140 1164140 1164140 9350459 9350536 9395864',X'0C09080303080808080403034CDD9A01C30D013290877E1C2303CC11'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 79 6 6 6 6 6 1 1 1','7804279 7804279 10382946 10382956 10382956 10382956 10382956 10382956 10382959 10382959 10382959','1 2 80421 1154920 1184197 1195674 1195674 1195674 10336219 10336296 10382959',X'0C090804030808080804030400E9A10A02A47201332C6C0CC31600ABCD60'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 8251 280 280 280 280 280 1 1 1','7804279 7804279 11067468 11072690 11072690 11072690 11072690 11072690 11072969 11072969 11072969','1 2 83449 1186373 1216159 1227636 1227636 1227636 11025858 11025935 11072969',X'0C090804040808080804040300FFA4A70089DBDD0132B5FF008A66AD6AE2B8'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 44772 58 58 58 58 58 1 1 1','7804279 7804279 11268036 11269261 11269261 11269261 11269261 11269261 11269318 11269318 11269318','1 2 85052 1199706 1229712 1241189 1241189 1241189 11222207 11222284 11269318',X'0C0908040308080808040404010B0A5C018ACD0133294300FF559400B0E291'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 53775 37 19 19 19 19 1 1 1','7804279 7804279 11330929 11355027 11355045 11355045 11355045 11355045 11355063 11355063 11355063','1 2 85255 1206165 1236304 1247781 1247781 1247781 11307952 11308029 11355063',X'0C0908040302080808040403010BFA81026C24232801332B2E00FF55941F8BB5'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 3718791 39430 39 39 39 39 39 1 1 1','7804279 7804279 11458789 11476757 11476757 11476757 11476757 11476757 11476795 11476795 11476795','1 2 86422 1219089 1249476 1260953 1260953 1260953 11429684 11429761 11476795',X'0C09080403080808080404030113B99602F6AF01332B2E00FF55941F8A54'); - INSERT INTO sqlite_stat4 VALUES('tx1','ix0','3876548 157757 5317 1 1 1 1 1 1 1 1','7804279 11523070 11652844 11658160 11658160 11658160 11658160 11658160 11658160 11658160 11658160','1 3 97969 1358780 1391643 1403122 1403122 1403122 11611049 11611126 11658160',X'0C0909040402080808040403010BFA8102594CCB2328013351E800FF55945B0F5D'); - ANALYZE sqlite_master; - - - EXPLAIN QUERY PLAN - SELECT aid, sid, MAX(edate) edate - FROM tx1 - WHERE cid = 115790 - AND sid = 9100 - AND edate <= 20140430 AND edate >= 20120429 - GROUP BY aid; - - - CREATE TABLE tab( - id INTEGER PRIMARY KEY, - minChild INTEGER REFERENCES t1, - maxChild INTEGER REFERENCES t1, - x INTEGER - ); - EXPLAIN QUERY PLAN - SELECT t4.x - FROM tab AS t0, tab AS t1, tab AS t2, tab AS t3, tab AS t4 - WHERE t0.id=0 - AND t1.id BETWEEN t0.minChild AND t0.maxChild - AND t2.id BETWEEN t1.minChild AND t1.maxChild - AND t3.id BETWEEN t2.minChild AND t2.maxChild - AND t4.id BETWEEN t3.minChild AND t3.maxChild - ORDER BY t4.x; - - - EXPLAIN QUERY PLAN - SELECT t4.x - FROM tab AS t0a, tab AS t0b, - tab AS t1a, tab AS t1b, - tab AS t2a, tab AS t2b, - tab AS t3a, tab AS t3b, - tab AS t4 - WHERE 1 - AND t0a.id=1 - AND t1a.id BETWEEN t0a.minChild AND t0a.maxChild - AND t2a.id BETWEEN t1a.minChild AND t1a.maxChild - AND t3a.id BETWEEN t2a.minChild AND t2a.maxChild - AND t0b.id=2 - AND t1b.id BETWEEN t0b.minChild AND t0b.maxChild - AND t2b.id BETWEEN t1b.minChild AND t1b.maxChild - AND t3b.id BETWEEN t2b.minChild AND t2b.maxChild - AND t4.id BETWEEN t3a.minChild AND t3b.maxChild - ORDER BY t4.x; - - CREATE TABLE t1(a, b, c) - - SELECT a, count(*) FROM t1 GROUP BY a HAVING a < 8; - - - CREATE INDEX idx_ab ON t1(a, b); - CREATE INDEX idx_c ON t1(c); - ANALYZE; - - - CREATE TABLE le( - le_id largeint, - xid char(31), - type smallint, - name char(255) DEFAULT '', - mtime largeint DEFAULT 0, - muuid int DEFAULT 0 - ); - CREATE TABLE cx( - cx_id largeint, - code char(31), - type smallint, - name char(31), - description varchar, - role smallint, - mtime largeint DEFAULT 0, - muuid int DEFAULT 0, - le_id largeint DEFAULT 0, - imco smallint DEFAULT 0 - ); - CREATE TABLE px( - px_id largeint, - cx_id largeint, - px_tid largeint, - name char(31), - description varchar DEFAULT '', - ia smallint, - sl smallint, - le_id largeint DEFAULT 0, - mtime largeint DEFAULT 0, - muuid int DEFAULT 0 - ); - CREATE INDEX le_id on le (le_id); - CREATE INDEX c_id on cx (cx_id); - CREATE INDEX c_leid on cx (le_id); - CREATE INDEX p_id on px (px_id); - CREATE INDEX p_cid0 on px (cx_id); - CREATE INDEX p_pt on px (px_tid); - CREATE INDEX p_leid on px (le_id); - - - ANALYZE sqlite_master; - INSERT INTO sqlite_stat1 VALUES('le','le_id','1979 1'); - INSERT INTO sqlite_stat1 VALUES('cx','c_leid','852 171'); - INSERT INTO sqlite_stat1 VALUES('cx','c_id','852 1'); - INSERT INTO sqlite_stat1 VALUES('px','p_leid','114443 63'); - INSERT INTO sqlite_stat1 VALUES('px','p_pt','114443 22889'); - INSERT INTO sqlite_stat1 VALUES('px','p_cid0','114443 181'); - INSERT INTO sqlite_stat1 VALUES('px','p_id','114443 1'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','162 162','162 162',X'030202013903fb'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','208 208','208 208',X'0302020253012d'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','219 219','219 219',X'030202025e0131'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','248 248','248 248',X'030202027b014e'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','265 265','265 265',X'030202028c015f'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','358 358','358 358',X'03020202e901bc'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','439 439','439 439',X'030202033a020d'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','657 657','657 657',X'030202041402b4'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','659 659','659 659',X'030202041602b6'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','681 681','681 681',X'030202042c02cc'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','831 831','831 831',X'03020204c20482'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','852 852','852 852',X'03020204d70497'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','870 870','870 870',X'03020204e904a9'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','879 879','879 879',X'03020204f204b2'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1099 1099','1099 1099',X'03020205ce058e'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1273 1273','1273 1273',X'030202067c05a9'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1319 1319','1319 1319',X'03020206e30730'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1330 1330','1330 1330',X'0302020700035b'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1539 1539','1539 1539',X'03020207d105d8'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1603 1603','1603 1603',X'03020208390780'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1759 1759','1759 1759',X'030202092f0618'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1843 1843','1843 1843',X'03020209880650'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1915 1915','1915 1915',X'03020209d0068b'); - INSERT INTO sqlite_stat4 VALUES('le','le_id','1 1','1927 1927','1927 1927',X'03020209dc0697'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 94','0 94',X'0308015f'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 189','0 189',X'03080200be'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 284','0 284',X'0308020120'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 379','0 379',X'030802017f'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 474','0 474',X'03080201de'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 569','0 569',X'030802023d'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 664','0 664',X'030802029f'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','846 1','0 759','0 759',X'03080202fe'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','3 1','846 847','1 847',X'0301024500e6'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','1 1','849 849','2 849',X'03010246027e'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','1 1','850 850','3 850',X'0301024700c9'); - INSERT INTO sqlite_stat4 VALUES('cx','c_leid','1 1','851 851','4 851',X'03010248027f'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','94 94','94 94',X'03020200b801a8'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','113 113','113 113',X'03020200d101ad'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','171 171','171 171',X'030201011d2a'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','177 177','177 177',X'030202012600f2'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','189 189','189 189',X'030202013501c8'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','206 206','206 206',X'030201014f2d'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','231 231','231 231',X'030202016d00fc'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','284 284','284 284',X'03020201b702d0'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','291 291','291 291',X'03020101c042'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','311 311','311 311',X'03020201d801e7'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','339 339','339 339',X'03020101f74b'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','347 347','347 347',X'03020202030118'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','379 379','379 379',X'030202022f01fa'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','393 393','393 393',X'030201023f55'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','407 407','407 407',X'03020202500201'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','413 413','413 413',X'03020102565a'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','468 468','468 468',X'030201029468'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','474 474','474 474',X'030202029a0211'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','517 517','517 517',X'03020102cc76'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','548 548','548 548',X'03020202f00223'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','569 569','569 569',X'03020203090087'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','664 664','664 664',X'03020203740163'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','759 759','759 759',X'03020203e800b3'); - INSERT INTO sqlite_stat4 VALUES('cx','c_id','1 1','803 803','803 803',X'030202041b026f'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 12715','0 12715',X'030802345b'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 25431','0 25431',X'0308026718'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 38147','0 38147',X'030803009a5c'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 50863','0 50863',X'03080300cdbe'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 63579','0 63579',X'0308030100e8'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 76295','0 76295',X'03080301351d'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 89011','0 89011',X'03080301674c'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110728 1','0 101727','0 101727',X'030803019b99'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','28 1','110824 110843','16 110843',X'0301037a0107f1'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','53 1','110873 110875','25 110875',X'0302020095275a'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','32 1','110927 110936','27 110936',X'030203009b009b4a'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','51 1','110980 111017','30 111017',X'03020300a4016c00'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','67 1','111047 111059','38 111059',X'03020200af2611'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','60 1','111136 111156','43 111156',X'03020300bc009aeb'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','42 1','111222 111239','59 111239',X'03020300d200b17b'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','36 1','111264 111266','60 111266',X'03020200d426d6'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','27 1','111733 111757','159 111757',X'030203014e017e1b'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','36 1','111760 111773','160 111773',X'030203014f00a2b9'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','29 1','111822 111833','167 111833',X'0302030176009c22'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','75 1','113031 113095','1190 113095',X'030203068501912c'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','132 1','113230 113263','1252 113263',X'0302030711009ee6'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','110 1','113851 113918','1572 113918',X'03020308e9011ca2'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','78 1','114212 114217','1791 114217',X'03020209e13b24'); - INSERT INTO sqlite_stat4 VALUES('px','p_leid','112 1','114303 114351','1799 114351',X'03020309ea0128f2'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 12715','0 12715',X'030802477e'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 25431','0 25431',X'0308027c20'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 38147','0 38147',X'03080300c211'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 50863','0 50863',X'03080300fbe5'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 63579','0 63579',X'0308030140ff'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 76295','0 76295',X'03080301792d'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','89824 1','0 89011','0 89011',X'03080301bb68'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','24217 1','89824 101727','1 101727',X'03090300da12'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','154 1','114041 114154','2 114154',X'0301030200e5e9'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','198 1','114195 114351','3 114351',X'03010303015cb1'); - INSERT INTO sqlite_stat4 VALUES('px','p_pt','50 1','114393 114441','4 114441',X'0301030401b2ef'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','3867 1','3 3736','2 3736',X'03010337015c6a'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','4194 1','4177 8209','5 8209',X'0301033b015075'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','4335 1','8371 11129','6 11129',X'0301033d0156fc'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1740 1','12706 12715','7 12715',X'0301023e34b9'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1680 1','14446 15487','8 15487',X'0301033f011694'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','7163 1','20116 25431','32 25431',X'03020300a400ed26'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1525 1','29100 29302','42 29302',X'03020200bb00d1'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','3703 1','30655 33323','45 33323',X'03020300be013fa5'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','2612 1','37767 38147','61 38147',X'03020200e32828'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1882 1','40545 41584','63 41584',X'03020300ea01a35a'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','6984 1','44110 50863','73 50863',X'0302030102017467'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1728 1','51230 51680','75 51680',X'030203010400b3e0'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','2805 1','55491 57936','95 57936',X'030203014101a004'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','2837 1','58934 59506','103 59506',X'030203015900a283'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','94 1','63492 63579','137 63579',X'0302030191016319'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','3573 1','63591 64497','140 64497',X'030203019c00822e'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','5037 1','70917 73033','160 73033',X'03020301c70091d9'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1940 1','75954 76295','161 76295',X'03020201c817f1'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1927 1','83926 84371','209 84371',X'03020202114295'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1522 1','86601 88117','213 88117',X'030203021b01b7b5'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','210 1','88906 89011','226 89011',X'030203022800dbbb'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','6165 1','92125 98066','258 98066',X'030203024d0189ac'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','2900 1','100721 101727','293 101727',X'030203027500cf39'); - INSERT INTO sqlite_stat4 VALUES('px','p_cid0','1501 1','110012 110154','503 110154',X'0302020380493a'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','11129 11129','11129 11129',X'03030300d84e014d51'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','12715 12715','12715 12715',X'03030200de816f51'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','13030 13030','13030 13030',X'03030200e05b6fc4'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','25431 25431','25431 25431',X'0303030123df00efb0'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','29302 29302','29302 29302',X'030302013a2812c7'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','35463 35463','35463 35463',X'03030301666e00f866'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','38147 38147','38147 38147',X'030302017a391b74'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','38525 38525','38525 38525',X'030303017c6e00fb58'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','50863 50863','50863 50863',X'03030201b68724dd'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','58461 58461','58461 58461',X'03030201d95b2e1e'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','59506 59506','59506 59506',X'03030301dd7000a0fb'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','63468 63468','63468 63468',X'03030301ecea011405'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','63579 63579','63579 63579',X'03030201ed5932d5'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','64497 64497','64497 64497',X'03030301f0ef00a680'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','73033 73033','73033 73033',X'0303030225b90190e5'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','75650 75650','75650 75650',X'030303023a19019362'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','76295 76295','76295 76295',X'030303023e9801940c'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','79152 79152','79152 79152',X'030303024be50196b9'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','83249 83249','83249 83249',X'0303030261750123b1'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','89011 89011','89011 89011',X'030303027b3900c3af'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','98066 98066','98066 98066',X'03030302a76500ce54'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','101590 101590','101590 101590',X'03030302b63d00d3b5'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','101727 101727','101727 101727',X'03030202b6f24e9b'); - INSERT INTO sqlite_stat4 VALUES('px','p_id','1 1','107960 107960','107960 107960',X'03030302d8ce0136ad'); - ANALYZE sqlite_master; - - - EXPLAIN QUERY PLAN - SELECT - px.name, - px.description - FROM - le, - cx, - px - WHERE - cx.code = '2990' - AND cx.type=2 - AND px.cx_id = cx.cx_id - AND px.px_tid = 0 - AND px.le_id = le.le_id; - diff --git a/libsql-wal/tests/assets/fixtures/whereK.test b/libsql-wal/tests/assets/fixtures/whereK.test deleted file mode 100644 index a5b5ded465..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereK.test +++ /dev/null @@ -1,41 +0,0 @@ - - CREATE TABLE t1(a,b,c); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<99) - INSERT INTO t1(a,b,c) SELECT x, x/10, x%10 FROM c; - CREATE INDEX t1bc ON t1(b,c); - SELECT a FROM t1 WHERE b>9 OR b=9 ORDER BY +a; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b>9 OR b=9 ORDER BY +a; - - - SELECT a FROM t1 WHERE b>8 OR (b=8 AND c>7) ORDER BY +a; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b>8 OR (b=8 AND c>7) ORDER BY +a; - - - SELECT a FROM t1 WHERE (b=8 AND c>7) OR b>8 ORDER BY +a; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE (b=8 AND c>7) OR b>8 ORDER BY +a; - - - SELECT a FROM t1 WHERE (b=8 AND c>7) OR 87) OR 87) OR (b>8 AND c NOT IN (4,5,6)) - ORDER BY +a; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE (b=8 AND c>7) OR (b>8 AND c NOT IN (4,5,6)) - ORDER BY +a; - diff --git a/libsql-wal/tests/assets/fixtures/whereL.test b/libsql-wal/tests/assets/fixtures/whereL.test deleted file mode 100644 index 6dddb4f485..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereL.test +++ /dev/null @@ -1,120 +0,0 @@ - - CREATE TABLE t1(a INT PRIMARY KEY, b, c, d, e); - CREATE TABLE t2(a INT PRIMARY KEY, f, g, h, i); - CREATE TABLE t3(a INT PRIMARY KEY, j, k, l, m); - CREATE VIEW v4 AS SELECT * FROM t2 UNION ALL SELECT * FROM t3; - - - CREATE TABLE c3(x COLLATE binary, y COLLATE nocase, z COLLATE binary); - CREATE INDEX c3x ON c3(x); - INSERT INTO c3 VALUES('ABC', 'ABC', 'abc'); - SELECT * FROM c3 WHERE x=y AND y=z AND z='abc'; - - - SELECT * FROM c3 WHERE x='abc' AND y='abc' AND z='abc'; - - - CREATE TABLE A(id INTEGER PRIMARY KEY, label TEXT); - CREATE TABLE B(id INTEGER PRIMARY KEY, label TEXT, Aid INTEGER); - CREATE TABLE C( - id INTEGER PRIMARY KEY, - xx INTEGER NOT NULL, - yy INTEGER, - zz INTEGER - ); - CREATE UNIQUE INDEX x2 ON C(yy); - CREATE UNIQUE INDEX x4 ON C(yy, zz); - INSERT INTO A(id) VALUES(1); - INSERT INTO B(id) VALUES(2); - INSERT INTO C(id,xx,yy,zz) VALUES(99,50,1,2); - SELECT 1 - FROM A, - (SELECT id,xx,yy,zz FROM C) subq, - B - WHERE A.id='1' - AND A.id=subq.yy - AND B.id=subq.zz; - - - SELECT 1 - FROM A, - (SELECT id,xx,yy,zz FROM C) subq, - B - WHERE A.id=1 - AND A.id=subq.yy - AND B.id=subq.zz; - - - SELECT 1 - FROM A, - (SELECT id,yy,zz FROM C) subq, - B - WHERE A.id='1' - AND A.id=subq.yy - AND B.id=subq.zz; - - - CREATE TABLE x(a, b, c); - CREATE TABLE y(a, b); - INSERT INTO x VALUES (1, 0, 1); - INSERT INTO y VALUES (1, 2); - SELECT x.a FROM x JOIN y ON x.c = y.a WHERE x.b = 1 AND x.b = 1; - - - PRAGMA automatic_index=OFF; - CREATE TABLE t0(c0); - INSERT INTO t0 VALUES('0'); - CREATE VIEW v0(c0) AS SELECT CAST(0 AS INT) FROM t0; - SELECT 200, * FROM t0, v0 WHERE 0 = t0.c0 AND t0.c0 = v0.c0; - - - SELECT 200, * FROM t0, v0 WHERE t0.c0 = 0 AND t0.c0 = v0.c0; - - - SELECT 200, * FROM t0, v0 WHERE 0 = t0.c0 AND v0.c0 = t0.c0; - - - SELECT 200, * FROM t0, v0 WHERE t0.c0 = 0 AND v0.c0 = t0.c0; - - - CREATE TABLE t1(x TEXT); - CREATE TABLE t2(y TEXT); - INSERT INTO t1 VALUES('good'),('bad'); - INSERT INTO t2 VALUES('good'),('bad'); - SELECT * FROM t1 JOIN t2 ON x=y - WHERE x='good' AND y='good'; - - - CREATE TABLE tableA( - ID int, - RunYearMonth int - ); - INSERT INTO tableA VALUES(1,202003),(2,202003),(3,202003),(4,202004), - (5,202004),(6,202004),(7,202004),(8,202004); - CREATE TABLE tableB ( - ID int, - RunYearMonth int - ); - INSERT INTO tableB VALUES(1,202004),(2,202004),(3,202004),(4,202004), - (5,202004); - SELECT * - FROM ( - SELECT * - FROM tableA - WHERE RunYearMonth = 202004 - ) AS A - INNER JOIN ( - SELECT * - FROM tableB - WHERE RunYearMonth = 202004 - ) AS B - ON A.ID = B.ID - AND A.RunYearMonth = B.RunYearMonth; - - - CREATE TABLE t1(v INTEGER); - WITH RECURSIVE c(x) AS (VALUES(-10) UNION ALL SELECT x+1 FROM c WHERE x<10) - INSERT INTO t1(v) SELECT x FROM c; - CREATE INDEX idx ON t1( abs(v) ); - SELECT v FROM t1 WHERE abs(v)=1 and v=1; - diff --git a/libsql-wal/tests/assets/fixtures/whereM.test b/libsql-wal/tests/assets/fixtures/whereM.test deleted file mode 100644 index 9633898037..0000000000 --- a/libsql-wal/tests/assets/fixtures/whereM.test +++ /dev/null @@ -1,83 +0,0 @@ - - CREATE TABLE t1(a, b INTEGER, c TEXT, d REAL, e BLOB); - INSERT INTO t1 VALUES(10.0, 10.0, 10.0, 10.0, 10.0); - SELECT * FROM t1; - - - SELECT a=10, a = '10.0', a LIKE '10.0' FROM t1; - - - SELECT count(*) FROM t1 WHERE a=10 AND a = '10.0' - - - SELECT count(*) FROM t1 WHERE a=10 AND a LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE a='10.0' AND a LIKE '10.0' - - - SELECT b=10, b = '10.0', b LIKE '10.0', b LIKE '10' FROM t1; - - - SELECT count(*) FROM t1 WHERE b=10 AND b = '10.0' - - - SELECT count(*) FROM t1 WHERE b=10 AND b LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE b='10.0' AND b LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE b=10 AND b LIKE '10' - - - SELECT count(*) FROM t1 WHERE b='10.0' AND b LIKE '10' - - - SELECT c=10, c = 10.0, c = '10.0', c LIKE '10.0' FROM t1; - - - SELECT count(*) FROM t1 WHERE c=10 AND c = '10.0' - - - SELECT count(*) FROM t1 WHERE c=10 AND c LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE c='10.0' AND c LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE c=10.0 AND c = '10.0' - - - SELECT count(*) FROM t1 WHERE c=10.0 AND c LIKE '10.0' - - - SELECT d=10, d = 10.0, d = '10.0', d LIKE '10.0', d LIKE '10' FROM t1; - - - SELECT count(*) FROM t1 WHERE d=10 AND d = '10.0' - - - SELECT count(*) FROM t1 WHERE d=10 AND d LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE d='10.0' AND d LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE d='10' AND d LIKE '10.0' - - - SELECT e=10, e = '10.0', e LIKE '10.0', e LIKE '10' FROM t1; - - - SELECT count(*) FROM t1 WHERE e=10 AND e = '10.0' - - - SELECT count(*) FROM t1 WHERE e=10 AND e LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE e='10.0' AND e LIKE '10.0' - - - SELECT count(*) FROM t1 WHERE e=10.0 AND e LIKE '10.0' - diff --git a/libsql-wal/tests/assets/fixtures/wherefault.test b/libsql-wal/tests/assets/fixtures/wherefault.test deleted file mode 100644 index 9f191cab06..0000000000 --- a/libsql-wal/tests/assets/fixtures/wherefault.test +++ /dev/null @@ -1,11 +0,0 @@ - - PRAGMA writable_schema = 1; - BEGIN TRANSACTION; - CREATE TABLE t1( - a INT AS (c*11), - b TEXT AS (substr(d,1,3)) STORED, - c INTEGEB PRIMARI KEY, d TEXT - ); - CREATE INDEX t1a ON t1(a); - COMMIT; - diff --git a/libsql-wal/tests/assets/fixtures/wherelfault.test b/libsql-wal/tests/assets/fixtures/wherelfault.test deleted file mode 100644 index a334742e54..0000000000 --- a/libsql-wal/tests/assets/fixtures/wherelfault.test +++ /dev/null @@ -1,23 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 'f'); - INSERT INTO t1 VALUES(2, 'e'); - INSERT INTO t1 VALUES(3, 'd'); - INSERT INTO t1 VALUES(4, 'c'); - INSERT INTO t1 VALUES(5, 'b'); - INSERT INTO t1 VALUES(6, 'a'); - - CREATE VIEW v1 AS SELECT a,b FROM t1; - CREATE TABLE log(op, a); - - CREATE TRIGGER v1del INSTEAD OF DELETE ON v1 BEGIN - INSERT INTO log VALUES('delete', old.a); - END; - - CREATE TRIGGER v1upd INSTEAD OF UPDATE ON v1 BEGIN - INSERT INTO log VALUES('update', old.a); - END; - - - CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID; - diff --git a/libsql-wal/tests/assets/fixtures/wherelimit.test b/libsql-wal/tests/assets/fixtures/wherelimit.test deleted file mode 100644 index bbd65f7d36..0000000000 --- a/libsql-wal/tests/assets/fixtures/wherelimit.test +++ /dev/null @@ -1,22 +0,0 @@ - - CREATE TABLE t1(a int); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - INSERT INTO t1 VALUES(3); - CREATE TABLE t2(a int); - INSERT INTO t2 SELECT a+100 FROM t1; - CREATE VIEW tv(r,a) AS - SELECT rowid, a FROM t2 UNION ALL SELECT rowid, a FROM t1; - CREATE TRIGGER tv_del INSTEAD OF DELETE ON tv - BEGIN - DELETE FROM t1 WHERE rowid=old.r; - DELETE FROM t2 WHERE rowid=old.r; - END; - - - CREATE TABLE t3(a,b,c,d TEXT, PRIMARY KEY(a,b)) WITHOUT ROWID; - INSERT INTO t3(a,b,c,d) VALUES(1,2,3,4),(5,6,7,8),(9,10,11,12); - - - SELECT a,b,c,d FROM t3 ORDER BY 1; - diff --git a/libsql-wal/tests/assets/fixtures/wherelimit2.test b/libsql-wal/tests/assets/fixtures/wherelimit2.test deleted file mode 100644 index f880d57ff9..0000000000 --- a/libsql-wal/tests/assets/fixtures/wherelimit2.test +++ /dev/null @@ -1,203 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 'f'); - INSERT INTO t1 VALUES(2, 'e'); - INSERT INTO t1 VALUES(3, 'd'); - INSERT INTO t1 VALUES(4, 'c'); - INSERT INTO t1 VALUES(5, 'b'); - INSERT INTO t1 VALUES(6, 'a'); - - CREATE VIEW v1 AS SELECT a,b FROM t1; - CREATE TABLE log(op, a); - - CREATE TRIGGER v1del INSTEAD OF DELETE ON v1 BEGIN - INSERT INTO log VALUES('delete', old.a); - END; - - CREATE TRIGGER v1upd INSTEAD OF UPDATE ON v1 BEGIN - INSERT INTO log VALUES('update', old.a); - END; - - - DELETE FROM v1 ORDER BY a LIMIT 3; - SELECT * FROM log; DELETE FROM log; - - - DELETE FROM v1 ORDER BY b LIMIT 3; - SELECT * FROM log; DELETE FROM log; - - - UPDATE v1 SET b = 555 ORDER BY a LIMIT 3; - SELECT * FROM log; DELETE FROM log; - - - UPDATE v1 SET b = 555 ORDER BY b LIMIT 3; - SELECT * FROM log; DELETE FROM log; - - - CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID; - INSERT INTO t2 VALUES(1, 1, 'h'); - INSERT INTO t2 VALUES(1, 2, 'g'); - INSERT INTO t2 VALUES(2, 1, 'f'); - INSERT INTO t2 VALUES(2, 2, 'e'); - INSERT INTO t2 VALUES(3, 1, 'd'); - INSERT INTO t2 VALUES(3, 2, 'c'); - INSERT INTO t2 VALUES(4, 1, 'b'); - INSERT INTO t2 VALUES(4, 2, 'a'); - - - BEGIN; - DELETE FROM t2 WHERE b=1 ORDER BY c LIMIT 2; - SELECT c FROM t2 ORDER BY 1; - ROLLBACK; - - - BEGIN; - UPDATE t2 SET c=NULL ORDER BY a, b DESC LIMIT 3 OFFSET 1; - SELECT a, b, c FROM t2; - ROLLBACK; - - - DROP TABLE t2; - CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c) WITHOUT ROWID; - INSERT INTO t2 VALUES(1, 1, 'h'); - INSERT INTO t2 VALUES(2, 2, 'g'); - INSERT INTO t2 VALUES(3, 1, 'f'); - INSERT INTO t2 VALUES(4, 2, 'e'); - INSERT INTO t2 VALUES(5, 1, 'd'); - INSERT INTO t2 VALUES(6, 2, 'c'); - INSERT INTO t2 VALUES(7, 1, 'b'); - INSERT INTO t2 VALUES(8, 2, 'a'); - - - BEGIN; - DELETE FROM t2 WHERE b=1 ORDER BY c LIMIT 2; - SELECT c FROM t2 ORDER BY 1; - ROLLBACK; - - - BEGIN; - UPDATE t2 SET c=NULL ORDER BY a DESC LIMIT 3 OFFSET 1; - SELECT a, b, c FROM t2; - ROLLBACK; - - - CREATE VIRTUAL TABLE ft USING fts5(x); - INSERT INTO ft(rowid, x) VALUES(-45, 'a a'); - INSERT INTO ft(rowid, x) VALUES(12, 'a b'); - INSERT INTO ft(rowid, x) VALUES(444, 'a c'); - INSERT INTO ft(rowid, x) VALUES(12300, 'a d'); - INSERT INTO ft(rowid, x) VALUES(25400, 'a c'); - INSERT INTO ft(rowid, x) VALUES(25401, 'a b'); - INSERT INTO ft(rowid, x) VALUES(50000, 'a a'); - - - BEGIN; - DELETE FROM ft ORDER BY rowid LIMIT 3; - SELECT x FROM ft; - ROLLBACK; - - - BEGIN; - DELETE FROM ft WHERE ft MATCH 'a' ORDER BY rowid LIMIT 3; - SELECT x FROM ft; - ROLLBACK; - - - BEGIN; - DELETE FROM ft WHERE ft MATCH 'b' ORDER BY rowid ASC LIMIT 1 OFFSET 1; - SELECT rowid FROM ft; - ROLLBACK; - - - BEGIN; - UPDATE ft SET x='hello' ORDER BY rowid LIMIT 2 OFFSET 2; - SELECT x FROM ft; - ROLLBACK; - - - BEGIN; - UPDATE ft SET x='hello' WHERE ft MATCH 'a' - ORDER BY rowid DESC LIMIT 2 OFFSET 2; - SELECT x FROM ft; - ROLLBACK; - - - CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c, d); - CREATE INDEX x1bc ON x1(b, c); - INSERT INTO x1 VALUES(1,1,1,1); - INSERT INTO x1 VALUES(2,1,2,2); - INSERT INTO x1 VALUES(3,2,1,3); - INSERT INTO x1 VALUES(4,2,2,3); - INSERT INTO x1 VALUES(5,3,1,2); - INSERT INTO x1 VALUES(6,3,2,1); - - - BEGIN; - DELETE FROM x1 ORDER BY a LIMIT 2; - SELECT a FROM x1; - ROLLBACK; - - - DELETE FROM x1 INDEXED BY x1bc WHERE b=3 LIMIT 1; - SELECT a FROM x1; - - - UPDATE x1 INDEXED BY x1bc SET d=5 WHERE b=2 LIMIT 1; - SELECT a, d FROM x1; - - - CREATE TABLE "x y"("a b" PRIMARY KEY, "c d") WITHOUT ROWID; - CREATE INDEX xycd ON "x y"("c d"); - - INSERT INTO "x y" VALUES('a', 'a'); - INSERT INTO "x y" VALUES('b', 'b'); - INSERT INTO "x y" VALUES('c', 'c'); - INSERT INTO "x y" VALUES('d', 'd'); - INSERT INTO "x y" VALUES('e', 'a'); - INSERT INTO "x y" VALUES('f', 'b'); - INSERT INTO "x y" VALUES('g', 'c'); - INSERT INTO "x y" VALUES('h', 'd'); - - - BEGIN; - DELETE FROM "x y" WHERE "c d"!='e' ORDER BY "c d" LIMIT 2 OFFSET 2; - SELECT * FROM "x y" ORDER BY 1; - ROLLBACK; - - - BEGIN; - UPDATE "x y" SET "c d"='e' WHERE "c d"!='e' ORDER BY "c d" LIMIT 2 OFFSET 2; - SELECT * FROM "x y" ORDER BY 1; - ROLLBACK; - - - CREATE VIEW "v w" AS SELECT * FROM "x y"; - CREATE TRIGGER tr1 INSTEAD OF DELETE ON "v w" BEGIN - SELECT log(old."a b", old."c d"); - END; - CREATE TRIGGER tr2 INSTEAD OF UPDATE ON "v w" BEGIN - SELECT log(new."a b", new."c d"); - END; - - - CREATE TABLE t2(x); - INSERT INTO t2(x) VALUES(1),(2),(3),(5),(8),(13); - - - WITH t2 AS MATERIALIZED (VALUES(5)) - DELETE FROM t2 ORDER BY rank()OVER() LIMIT 2; - - - SELECT * FROM t2; - - - CREATE TABLE t1(a INT); INSERT INTO t1(a) VALUES(0); - - - WITH t1(b) AS (SELECT * FROM (SELECT * FROM (VALUES(2)))) - UPDATE t1 SET a=3 LIMIT 1; - - - SELECT * FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/widetab1.test b/libsql-wal/tests/assets/fixtures/widetab1.test deleted file mode 100644 index 0c22cfc518..0000000000 --- a/libsql-wal/tests/assets/fixtures/widetab1.test +++ /dev/null @@ -1,109 +0,0 @@ - - CREATE TABLE a( - a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, - a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, - a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, - a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, - a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, - a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, - pd, bn, vb, bc, cn, ie, qm); - CREATE INDEX a1 on a(pd, bn, vb, bc, cn); -- preferred index - CREATE INDEX a2 on a(pd, bc, ie, qm); -- suboptimal index - CREATE TABLE b(bg, bc, bn, iv, ln, mg); - CREATE INDEX b1 on b(bn, iv, bg); - - - CREATE TABLE t1( - c00,c01,c02,c03,c04,c05,c06,c07,c08,c09, - c10,c11,c12,c13,c14,c15,c16,c17,c18,c19, - c20,c21,c22,c23,c24,c25,c26,c27,c28,c29, - c30,c31,c32,c33,c34,c35,c36,c37,c38,c39, - c40,c41,c42,c43,c44,c45,c46,c47,c48,c49, - c50,c51,c52,c53,c54,c55,c56,c57,c58,c59, - c60,c61,c62,c63,c64,c65,c66,c67,c68,c69, - c70,c71,c72,c73,c74,c75,c76,c77,c78,c79, - c80,c81,c82,c83,c84,c85,c86,c87,c88,c89, - c90,c91,c92,c93,c94,c95,c96,c97,c98,c99, - a,b,c,d,e - ); - CREATE INDEX t1x1 on t1(c00,a,b, - c01,c02,c03,c04,c05,c06,c07,c08,c09, - c10,c11,c12,c13,c14,c15,c16,c17,c18,c19, - c20,c21,c22,c23,c24,c25,c26,c27,c28,c29, - c30,c31,c32,c33,c34,c35,c36,c37,c38,c39, - c40,c41,c42,c43,c44,c45,c46,c47,c48,c49, - c50,c51,c52,c53,c54,c55,c56,c57,c58,c59, - c60,c61,c62,c63,c64,c65,c66,c67,c68,c69, - c70,c71,c72,c73,c74,c75,c76,c77,c78,c79, - c80,c81,c82,c83,c84,c85,c86,c87,c88,c89, - c90,c91,c92,c93,c94,c00,c96,c97,c98,c99 - ); - CREATE INDEX t1cd ON t1(c,d); - CREATE INDEX t1x2 ON t1(c01,c02,c03,a,b); - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1000 FROM c WHERE x<9000) - INSERT INTO t1 SELECT - x+00, x+01, x+02, x+03, x+04, x+05, x+06, x+07, x+08, x+09, - x+10, x+11, x+12, x+13, x+14, x+15, x+16, x+17, x+18, x+19, - x+20, x+21, x+22, x+23, x+24, x+25, x+26, x+27, x+28, x+29, - x+30, x+31, x+32, x+33, x+34, x+35, x+36, x+37, x+38, x+39, - x+40, x+41, x+42, x+43, x+44, x+45, x+46, x+47, x+48, x+49, - x+50, x+51, x+52, x+53, x+54, x+55, x+56, x+57, x+58, x+59, - x+60, x+61, x+62, x+63, x+64, x+65, x+66, x+67, x+68, x+69, - x+70, x+71, x+72, x+73, x+74, x+75, x+76, x+77, x+78, x+79, - x+80, x+81, x+82, x+83, x+84, x+85, x+86, x+87, x+88, x+89, - x+90, x+91, x+92, x+93, x+94, x+95, x+96, x+97, x+98, x+99, - x+100, x+101, x+102, x+103, x+104 FROM c; - -SELECT sum(c62) FROM t1; -SELECT sum(c63) FROM t1; -SELECT sum(c64) FROM t1; -SELECT sum(c65) FROM t1; - - BEGIN; - SELECT sum(c62) FROM t1; - UPDATE t1 SET c62=c62+1 WHERE c00=1000; - SELECT sum(c62) FROM t1; - - - SELECT sum(c65) FROM t1; - UPDATE t1 SET c65=c65+1 WHERE c00=1000; - SELECT sum(c65) FROM t1; - ROLLBACK; - - - BEGIN; - SELECT count(*) FROM t1; - DELETE FROM t1 WHERE c=3102; - SELECT COUNT(*) FROM t1; - ROLLBACK; - - - BEGIN; - SELECT count(*) FROM t1; - DELETE FROM t1 WHERE c=3102 AND d=3103; - SELECT COUNT(*) FROM t1; - ROLLBACK; - - - BEGIN; - DELETE FROM t1 WHERE (c,d) IN (VALUES(3102,3103),(4102,4103),(5102,5103),(1,2)); - SELECT count(*) FROM t1; - ROLLBACK; - - - DROP INDEX t1cd; - DROP INDEX t1x1; - DROP INDEX t1x2; - CREATE INDEX t1x3 ON t1(c00,c05,c08); - -SELECT sum(c08) FROM t1 WHERE c00 IN (1000,5000); -SELECT sum(c63) FROM t1 WHERE c00 IN (1000,5000); -SELECT sum(c64) FROM t1 WHERE c00 IN (1000,5000); - - DROP INDEX t1x3; - CREATE TABLE t2 AS SELECT * FROM t1; - CREATE INDEX t1x4 ON t1(c00, c62, a, b); - CREATE INDEX t2x4 ON t2(c01, c62, c63, b, c); - SELECT t1.b, t2.b FROM t1 JOIN t2 ON t2.c01=t1.c00+1 WHERE +t1.b<7000 - ORDER BY +t1.b; - diff --git a/libsql-wal/tests/assets/fixtures/win32heap.test b/libsql-wal/tests/assets/fixtures/win32heap.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/win32lock.test b/libsql-wal/tests/assets/fixtures/win32lock.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/win32longpath.test b/libsql-wal/tests/assets/fixtures/win32longpath.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/win32nolock.test b/libsql-wal/tests/assets/fixtures/win32nolock.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/window1.test b/libsql-wal/tests/assets/fixtures/window1.test deleted file mode 100644 index fd4b1dbe47..0000000000 --- a/libsql-wal/tests/assets/fixtures/window1.test +++ /dev/null @@ -1,1262 +0,0 @@ - - CREATE TABLE t1(a, b, c, d); - INSERT INTO t1 VALUES(1, 2, 3, 4); - INSERT INTO t1 VALUES(5, 6, 7, 8); - INSERT INTO t1 VALUES(9, 10, 11, 12); - - - SELECT sum(b) OVER () FROM t1 - - - SELECT a, sum(b) OVER () FROM t1 - - - SELECT a, 4 + sum(b) OVER () FROM t1 - - - SELECT a + 4 + sum(b) OVER () FROM t1 - - - SELECT a, sum(b) OVER (PARTITION BY c) FROM t1 - - - CREATE TABLE t2(a, b, c); - INSERT INTO t2 VALUES(0, 0, 0); - INSERT INTO t2 VALUES(1, 1, 1); - INSERT INTO t2 VALUES(2, 0, 2); - INSERT INTO t2 VALUES(3, 1, 0); - INSERT INTO t2 VALUES(4, 0, 1); - INSERT INTO t2 VALUES(5, 1, 2); - INSERT INTO t2 VALUES(6, 0, 0); - - - SELECT a, sum(a) OVER (PARTITION BY b) FROM t2; - - - SELECT a, sum(a) OVER (PARTITION BY b) FROM t2 ORDER BY a; - - - SELECT a, sum(a) OVER () FROM t2 ORDER BY a; - - - SELECT a, sum(a) OVER (ORDER BY a) FROM t2; - - - SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a) FROM t2 ORDER BY a - - - SELECT a, sum(a) OVER (PARTITION BY c ORDER BY a) FROM t2 ORDER BY a - - - SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a DESC) FROM t2 ORDER BY a - - - SELECT a, - sum(a) OVER (PARTITION BY b ORDER BY a DESC), - sum(a) OVER (PARTITION BY c ORDER BY a) - FROM t2 ORDER BY a - - - SELECT a, - sum(a) OVER (ORDER BY a), - avg(a) OVER (ORDER BY a) - FROM t2 ORDER BY a - - - SELECT a, - count() OVER (ORDER BY a DESC), - string_agg(a, '.') OVER (ORDER BY a DESC) - FROM t2 ORDER BY a DESC - - - SELECT a, - count(*) OVER (ORDER BY a DESC), - group_concat(a, '.') OVER (ORDER BY a DESC) - FROM t2 ORDER BY a DESC - - - CREATE TABLE t4(a, b); - SELECT ntile(1) OVER (ORDER BY a) FROM t4; - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(7), (6), (5), (4), (3), (2), (1); - - CREATE TABLE t2(x); - INSERT INTO t2 VALUES('b'), ('a'); - - SELECT x, count(*) OVER (ORDER BY x) FROM t1; - - - SELECT * FROM t2, (SELECT x, count(*) OVER (ORDER BY x) FROM t1) - ORDER BY 1, 2; - - - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t1 VALUES(7, 8); - INSERT INTO t1 VALUES(9, 10); - - - SELECT - lead(y) OVER win, - lead(y, 2) OVER win, - lead(y, 3, 'default') OVER win - FROM t1 - WINDOW win AS (ORDER BY x) - - - SELECT row_number() OVER (ORDER BY x) FROM t1 - - - SELECT - row_number() OVER win, - lead(x) OVER win - FROM t1 - WINDOW win AS (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - CREATE TABLE t3(a, b, c); - - WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<6 ) - INSERT INTO t3 SELECT i, i, i FROM s; - - CREATE VIEW v1 AS SELECT - sum(b) OVER (ORDER BY c), - min(b) OVER (ORDER BY c), - max(b) OVER (ORDER BY c) - FROM t3; - - CREATE VIEW v2 AS SELECT - sum(b) OVER win, - min(b) OVER win, - max(b) OVER win - FROM t3 - WINDOW win AS (ORDER BY c); - - - SELECT * FROM v1 - - - SELECT * FROM v2 - - - SELECT * FROM v1 - - - SELECT * FROM v2 - - - CREATE TABLE t4(x, y); - INSERT INTO t4 VALUES(1, 'g'); - INSERT INTO t4 VALUES(2, 'i'); - INSERT INTO t4 VALUES(3, 'l'); - INSERT INTO t4 VALUES(4, 'g'); - INSERT INTO t4 VALUES(5, 'a'); - - CREATE TABLE t5(x, y, m); - CREATE TRIGGER t4i AFTER INSERT ON t4 BEGIN - DELETE FROM t5; - INSERT INTO t5 - SELECT x, y, max(y) OVER xyz FROM t4 - WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x); - END; - - - SELECT x, y, max(y) OVER xyz FROM t4 - WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) ORDER BY 1 - - - INSERT INTO t4 VALUES(6, 'm'); - SELECT x, y, max(y) OVER xyz FROM t4 - WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) ORDER BY 1 - - - SELECT * FROM t5 ORDER BY 1 - - - WITH aaa(x, y, z) AS ( - SELECT x, y, max(y) OVER xyz FROM t4 - WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) - ) - SELECT * FROM aaa ORDER BY 1; - - - WITH aaa(x, y, z) AS ( - SELECT x, y, max(y) OVER xyz FROM t4 - WINDOW xyz AS (ORDER BY x) - ) - SELECT *, min(z) OVER (ORDER BY x) FROM aaa ORDER BY 1; - - - CREATE TABLE sales(emp TEXT PRIMARY KEY, region, total); - INSERT INTO sales VALUES - ('Alice', 'North', 34), - ('Frank', 'South', 22), - ('Charles', 'North', 45), - ('Darrell', 'South', 8), - ('Grant', 'South', 23), - ('Brad' , 'North', 22), - ('Elizabeth', 'South', 99), - ('Horace', 'East', 1); - - - SELECT emp, region, total FROM ( - SELECT - emp, region, total, - row_number() OVER (PARTITION BY region ORDER BY total DESC) AS rank - FROM sales - ) WHERE rank<=2 ORDER BY region, total DESC - - - SELECT emp, region, sum(total) OVER win FROM sales - WINDOW win AS (PARTITION BY region ORDER BY total) - - - SELECT emp, region, sum(total) OVER win FROM sales - WINDOW win AS (PARTITION BY region ORDER BY total) - LIMIT 5 - - - SELECT emp, region, sum(total) OVER win FROM sales - WINDOW win AS (PARTITION BY region ORDER BY total) - LIMIT 5 OFFSET 2 - - - SELECT emp, region, sum(total) OVER win FROM sales - WINDOW win AS ( - PARTITION BY region ORDER BY total - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) - - - SELECT emp, region, sum(total) OVER win FROM sales - WINDOW win AS ( - PARTITION BY region ORDER BY total - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) LIMIT 5 OFFSET 2 - - - SELECT emp, region, ( - SELECT sum(total) OVER ( - ORDER BY total RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) || outer.emp FROM sales - ) FROM sales AS outer; - - - SELECT emp, region, ( - SELECT sum(total) FILTER (WHERE sales.emp!=outer.emp) OVER ( - ORDER BY total RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM sales - ) FROM sales AS outer; - - CREATE TABLE t6(a, b, c); - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(id INT, b VARCHAR, c VARCHAR); - INSERT INTO t1 VALUES(1, 'A', 'one'); - INSERT INTO t1 VALUES(2, 'B', 'two'); - INSERT INTO t1 VALUES(3, 'C', 'three'); - INSERT INTO t1 VALUES(4, 'D', 'one'); - INSERT INTO t1 VALUES(5, 'E', 'two'); - SELECT id, b, lead(c,1) OVER(ORDER BY c) AS x - FROM t1 WHERE id>1 - ORDER BY b LIMIT 1; - - - INSERT INTO t1 VALUES(6, 'F', 'three'); - INSERT INTO t1 VALUES(7, 'G', 'one'); - SELECT id, b, lead(c,1) OVER(ORDER BY c) AS x - FROM t1 WHERE id>1 - ORDER BY b LIMIT 2; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a int, b int); - INSERT INTO t1 VALUES(1,11); - INSERT INTO t1 VALUES(2,12); - - - SELECT a, rank() OVER(ORDER BY b) FROM t1; - SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; - - - SELECT a, rank() OVER(ORDER BY b) FROM t1 - UNION ALL - SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; - - - SELECT a, rank() OVER(ORDER BY b) FROM t1 - UNION - SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; - - - SELECT a, rank() OVER(ORDER BY b) FROM t1 - EXCEPT - SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; - - - SELECT a, rank() OVER(ORDER BY b) FROM t1 - INTERSECT - SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; - - - SELECT * FROM( - SELECT * FROM (SELECT 1 AS c) WHERE c IN ( - SELECT (row_number() OVER()) FROM (VALUES (0)) - ) - ); - - - CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(12345); - CREATE TABLE t2(c); INSERT INTO t2(c) VALUES(1); - SELECT y, y+1, y+2 FROM ( - SELECT c IN ( - SELECT (row_number() OVER()) FROM t1 - ) AS y FROM t2 - ); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('a'), ('b'), ('c'); - CREATE TABLE t2(a, b); - INSERT INTO t2 VALUES('X', 1), ('X', 2), ('Y', 2), ('Y', 3); - SELECT x, ( - SELECT sum(b) - OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING - AND UNBOUNDED FOLLOWING) - FROM t2 WHERE b=10; - - - CREATE TABLE t1 (a DOUBLE PRIMARY KEY); - INSERT INTO t1 VALUES(10.0); - - - SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2)) - - - SELECT * FROM ( - SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2)) - ) - WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 ) - - - SELECT a FROM ( - SELECT * FROM ( - SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2)) - ) - WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 ) - ) - WHERE a=1 OR a=10.0 - - - SELECT a FROM ( - SELECT * FROM ( - SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2)) - ) - WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 ) - ) - WHERE a=1 OR ((SELECT sum(a) OVER(ORDER BY a%8)) AND 10<=a) - - -SELECT * FROM (SELECT * FROM t1 NATURAL JOIN t1 WHERE a%1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum((SELECT * FROM (SELECT * FROM (SELECT * FROM t1 NATURAL JOIN t1 WHERE a%1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum((SELECT * FROM t1 NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)))OVER(ORDER BY a% 1 )) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND 10<=a)))OVER(ORDER BY a%5)) AND a<=10); - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES('AA','bb',356); - INSERT INTO t1 VALUES('CC','aa',158); - INSERT INTO t1 VALUES('BB','aa',399); - INSERT INTO t1 VALUES('FF','bb',938); - - - SELECT - count() OVER win1, - sum(c) OVER win2, - first_value(c) OVER win2, - count(a) OVER (ORDER BY b) - FROM t1 - WINDOW - win1 AS (ORDER BY a), - win2 AS (PARTITION BY 6 ORDER BY a - RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING ); - - -SELECT - count() OVER (), - sum(c) OVER win2, - first_value(c) OVER win2, - count(a) OVER (ORDER BY b) -FROM t1 -WINDOW - win1 AS (ORDER BY a), - win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a - RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING ); - - - SELECT - count() OVER win1, - sum(c) OVER win2, - first_value(c) OVER win2, - count(a) OVER (ORDER BY b) - FROM t1 - WINDOW - win1 AS (ORDER BY a), - win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a - RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING ); - - - CREATE TABLE a(c UNIQUE); - INSERT INTO a VALUES(4),(0),(9),(-9); - SELECT a.c - FROM a - JOIN a AS b ON a.c=4 - JOIN a AS e ON a.c=e.c - WHERE a.c=(SELECT (SELECT coalesce(lead(2) OVER(),0) + sum(d.c)) - FROM a AS d - WHERE a.c); - - - CREATE TABLE t1(a VARCHAR(20), b FLOAT); - INSERT INTO t1 VALUES('1',10.0); - - - INSERT INTO t1 VALUES('2',5.0); - INSERT INTO t1 VALUES('3',15.0); - - - CREATE TABLE a(b); - SELECT - (SELECT b FROM a - GROUP BY b - HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b)) - ) - FROM a - UNION - SELECT 99 - ORDER BY 1; - - - CREATE TABLE t1(a, b INTEGER); - CREATE TABLE t2(c, d); - - - CREATE TABLE t4(a, b, c, d, e); - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(NULL,NULL,NULL); - SELECT - sum(a), - min(b) OVER (), - count(c) OVER (ORDER BY b) - FROM t1; - - - CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ; - INSERT INTO v0 VALUES ( 10 ) ; - SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2; - - - CREATE TABLE a(a, b, c); - INSERT INTO a VALUES(1, 2, 3); - INSERT INTO a VALUES(4, 5, 6); - SELECT sum(345+b) OVER (ORDER BY b), - sum(avg(678)) OVER (ORDER BY c) FROM a; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1 (x INTEGER PRIMARY KEY); - INSERT INTO t1 VALUES (99); - SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER()); - - - CREATE TABLE t1(a); - CREATE TABLE t2(y); - - - SELECT ( - SELECT count(a) OVER ( ORDER BY (SELECT sum(y) FROM t2) ) - + total(a) OVER() - ) - FROM t1 - - - SELECT ( - SELECT count(a) OVER ( ORDER BY sum(a) ) - + total(a) OVER() - ) - FROM t1 - - - SELECT - sum(a) OVER ( ORDER BY a ) - FROM t1 - ORDER BY (SELECT sum(y) FROM t2) - - - CREATE TABLE t1(a VARCHAR(20), b FLOAT); - INSERT INTO t1 VALUES('1',10.0); - - - SELECT * FROM ( - SELECT sum(b) OVER() AS c FROM t1 - UNION - SELECT b AS c FROM t1 - ) WHERE c>10; - - - INSERT INTO t1 VALUES('2',5.0); - INSERT INTO t1 VALUES('3',15.0); - - - SELECT * FROM ( - SELECT sum(b) OVER() AS c FROM t1 - UNION - SELECT b AS c FROM t1 - ) WHERE c>10; - - - CREATE TABLE t1(b, x); - CREATE TABLE t2(c, d); - CREATE TABLE t3(e, f); - - - SELECT max(b) OVER( - ORDER BY SUM( - (SELECT c FROM t2 UNION SELECT x ORDER BY c) - ) - ) FROM t1; - - - SELECT sum(b) over( - ORDER BY ( - SELECT max(b) OVER( - ORDER BY sum( - (SELECT x AS c UNION SELECT 1234 ORDER BY c) - ) - ) AS e - ORDER BY e - ) - ) - FROM t1; - - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b); - INSERT INTO t1 VALUES(1, 'abcd'); - INSERT INTO t1 VALUES(2, 'BCDE'); - INSERT INTO t1 VALUES(3, 'cdef'); - INSERT INTO t1 VALUES(4, 'DEFG'); - - - SELECT rowid, max(b COLLATE nocase)||'' - FROM t1 - GROUP BY rowid - ORDER BY max(b COLLATE nocase)||''; - - - SELECT count() OVER (), rowid, max(b COLLATE nocase)||'' - FROM t1 - GROUP BY rowid - ORDER BY max(b COLLATE nocase)||''; - - - SELECT count() OVER (), rowid, max(b COLLATE nocase) - FROM t1 - GROUP BY rowid - ORDER BY max(b COLLATE nocase); - - - CREATE TABLE t1(c1); - INSERT INTO t1 VALUES('abcd'); - - - SELECT max(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1; - - - SELECT - count() OVER (), - group_concat(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1; - - - SELECT COUNT() OVER () LIKE lead(102030) OVER( - ORDER BY sum('abcdef' COLLATE nocase) IN (SELECT 54321) - ) - FROM t1; - - - CREATE TABLE t1(a INTEGER); - INSERT INTO t1 VALUES(3578824042033200656); - INSERT INTO t1 VALUES(3029012920382354029); - - - CREATE TABLE t2(a INTEGER); - INSERT INTO t2 VALUES(45); - INSERT INTO t2 VALUES(30); - - - CREATE TABLE t1(a, b, c); - CREATE TABLE t2(a, b, c); - - - CREATE TABLE t1(a); - - - SELECT substr(a,4,lag(a,7) OVER(PARTITION BY 'cf23' ORDER BY 2)) AS ca0 FROM t1 ORDER BY ca0; - - - SELECT substr(a,4,lag(a,7) OVER(PARTITION BY 'cf23' ORDER BY likely(2))) AS ca0 FROM t1 ORDER BY ca0; - - - CREATE TABLE dual(dummy); INSERT INTO dual VALUES('X'); - CREATE VIEW v1(x,y) AS SELECT RANK() OVER (PARTITION BY 0), SUM(0) FROM dual; - SELECT * FROM v1 WHERE true; - - - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES (0); - CREATE VIEW v0(c0) AS SELECT TOTAL(0) OVER (PARTITION BY t0.c0) FROM t0; - - - SELECT COUNT(*) FROM ( - SELECT TOTAL(0) OVER (PARTITION BY t0.c0) FROM t0 - ) - WHERE ('1' IS NOT ('abcde' NOTNULL)); - - - CREATE TABLE t1(a INT); - INSERT INTO t1(a) VALUES(1),(2),(4); - CREATE VIEW t2(b,c) AS SELECT * FROM t1 JOIN t1 A ORDER BY sum(0) OVER(PARTITION BY 0); - CREATE TRIGGER x1 INSTEAD OF UPDATE ON t2 BEGIN SELECT true; END; - - - SELECT * FROM t2; - - - UPDATE t2 SET c=99 WHERE b=4 RETURNING *; - - - SELECT *, nth_value(15,2) OVER() FROM t2, t1 WHERE b=4; - - - UPDATE t2 SET c=nth_value(15,2) OVER() FROM (SELECT * FROM t1) WHERE b=4 RETURNING *; - - - DROP TRIGGER x1; - - - CREATE TABLE t1 (a INT, b INT); - CREATE TABLE t2 (c INT, d INT); - CREATE INDEX idx ON t1(abs(a)); - INSERT INTO t1 VALUES(1,2),(3,4); - INSERT INTO t2 VALUES(5,6),(7,8); - - - SELECT ( - SELECT count( a ) FROM t2 LIMIT 1 - ) - FROM t1; - - - SELECT ( - SELECT count( a+c ) FROM t2 LIMIT 1 - ) - FROM t1; - - - SELECT ( - SELECT count( ( SELECT(sum(0) OVER(ORDER BY c, abs(a))) ) ) - FROM t2 GROUP BY c LIMIT 1 - ) - FROM t1; - - - /* Original test case reported in https://sqlite.org/forum/forumpost/bad532820c - CREATE TABLE v0 (c1); - CREATE INDEX i ON v0 (c1, c1=1); - SELECT 0 FROM v0 AS a1 - WHERE (SELECT count((SELECT(sum(0) OVER(PARTITION BY(c1), (a1.c1=1) )))) - FROM v0 - GROUP BY hex(0)) - AND a1.c1=0; - - - DROP TABLE t1; - CREATE TABLE t1(a INT, b INT); - CREATE INDEX t1x ON t1(a+b); - - - CREATE TABLE t1(a INT, b INT); - INSERT INTO t1(a,b) VALUES (111,222),(111,223),(118,229); - CREATE INDEX t1a ON t1(a); - CREATE TABLE t2(x INT); - INSERT INTO t2 VALUES (333),(444),(555); - - - SELECT c, (SELECT c + sum(1) OVER ()) AS "res" - FROM t2 LEFT JOIN (SELECT +a AS c FROM t1) AS v1 ON true - GROUP BY c - ORDER by c; - - - CREATE TABLE t3(x); - CREATE TABLE t4(y); - INSERT INTO t3 VALUES(100), (200), (400); - INSERT INTO t4 VALUES(100), (300), (400); - - - SELECT (SELECT y+sum(0) OVER ()) FROM t3 LEFT JOIN t4 ON x=y; - - - SELECT (SELECT y+sum(0) OVER ()) FROM t3 LEFT JOIN t4 ON x=y GROUP BY x; - - - SELECT (SELECT max(y)+sum(0) OVER ()) FROM t3 LEFT JOIN t4 ON x=y GROUP BY x; - - - CREATE TABLE t1(x INT); - CREATE INDEX t1x ON t1(likely(x)); - INSERT INTO t1 VALUES(1),(2),(4),(8); - - - SELECT max(~likely(x)) FILTER (WHERE true) FROM t1 INDEXED BY t1x GROUP BY x; - diff --git a/libsql-wal/tests/assets/fixtures/window2.test b/libsql-wal/tests/assets/fixtures/window2.test deleted file mode 100644 index c29cc191bd..0000000000 --- a/libsql-wal/tests/assets/fixtures/window2.test +++ /dev/null @@ -1,399 +0,0 @@ - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER); - INSERT INTO t1 VALUES(1, 'odd', 'one', 1); - INSERT INTO t1 VALUES(2, 'even', 'two', 2); - INSERT INTO t1 VALUES(3, 'odd', 'three', 3); - INSERT INTO t1 VALUES(4, 'even', 'four', 4); - INSERT INTO t1 VALUES(5, 'odd', 'five', 5); - INSERT INTO t1 VALUES(6, 'even', 'six', 6); - - - SELECT c, sum(d) OVER (PARTITION BY b ORDER BY c) FROM t1; - - - SELECT sum(d) OVER () FROM t1; - - - SELECT sum(d) OVER (PARTITION BY b) FROM t1; - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1000 PRECEDING AND 1 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1000 PRECEDING AND 1000 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 1000 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 2 PRECEDING AND CURRENT ROW - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 1 PRECEDING AND 2 PRECEDING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY a%2 - ORDER BY d - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b - ORDER BY d - ROWS BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY b - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - PARTITION BY b ORDER BY d - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY b - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t1 - - - SELECT a, sum(d) OVER ( - ORDER BY d/2 - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) FROM t1 - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER); - INSERT INTO t2(a, b) VALUES - (1,0), (2,74), (3,41), (4,74), (5,23), (6,99), (7,26), (8,33), (9,2), - (10,89), (11,81), (12,96), (13,59), (14,38), (15,68), (16,39), (17,62), - (18,91), (19,46), (20,6), (21,99), (22,97), (23,27), (24,46), (25,78), - (26,54), (27,97), (28,8), (29,67), (30,29), (31,93), (32,84), (33,77), - (34,23), (35,16), (36,16), (37,93), (38,65), (39,35), (40,47), (41,7), - (42,86), (43,74), (44,61), (45,91), (46,85), (47,24), (48,85), (49,43), - (50,59), (51,12), (52,32), (53,56), (54,3), (55,91), (56,22), (57,90), - (58,55), (59,15), (60,28), (61,89), (62,25), (63,47), (64,1), (65,56), - (66,40), (67,43), (68,56), (69,16), (70,75), (71,36), (72,89), (73,98), - (74,76), (75,81), (76,4), (77,94), (78,42), (79,30), (80,78), (81,33), - (82,29), (83,53), (84,63), (85,2), (86,87), (87,37), (88,80), (89,84), - (90,72), (91,41), (92,9), (93,61), (94,73), (95,95), (96,65), (97,13), - (98,58), (99,96), (100,98), (101,1), (102,21), (103,74), (104,65), (105,35), - (106,5), (107,73), (108,11), (109,51), (110,87), (111,41), (112,12), (113,8), - (114,20), (115,31), (116,31), (117,15), (118,95), (119,22), (120,73), - (121,79), (122,88), (123,34), (124,8), (125,11), (126,49), (127,34), - (128,90), (129,59), (130,96), (131,60), (132,55), (133,75), (134,77), - (135,44), (136,2), (137,7), (138,85), (139,57), (140,74), (141,29), (142,70), - (143,59), (144,19), (145,39), (146,26), (147,26), (148,47), (149,80), - (150,90), (151,36), (152,58), (153,47), (154,9), (155,72), (156,72), (157,66), - (158,33), (159,93), (160,75), (161,64), (162,81), (163,9), (164,23), (165,37), - (166,13), (167,12), (168,14), (169,62), (170,91), (171,36), (172,91), - (173,33), (174,15), (175,34), (176,36), (177,99), (178,3), (179,95), (180,69), - (181,58), (182,52), (183,30), (184,50), (185,84), (186,10), (187,84), - (188,33), (189,21), (190,39), (191,44), (192,58), (193,30), (194,38), - (195,34), (196,83), (197,27), (198,82), (199,17), (200,7); - - - SELECT a, sum(b) OVER ( - PARTITION BY (b%10) - ORDER BY b - ) FROM t2 ORDER BY a; - - - SELECT a, sum(b) OVER ( - PARTITION BY (b%10) - ORDER BY b - RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) FROM t2 ORDER BY a; - - - SELECT b, sum(b) OVER ( - ORDER BY b - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER ( - ORDER BY b - RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER ( - ORDER BY b - RANGE BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER ( - RANGE BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER () FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER ( - RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER ( - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY b; - - - SELECT b, sum(b) OVER ( - ROWS BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ORDER BY a - ROWS BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ORDER BY a - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ORDER BY a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY 1, 2; - - - SELECT b, sum(b) OVER ( - ORDER BY a - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t2 ORDER BY 1, 2; - - - SELECT count(*) OVER (ORDER BY b) FROM t1 - - - SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1 - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x INTEGER, y INTEGER); - INSERT INTO t1 VALUES(10, 1); - INSERT INTO t1 VALUES(20, 2); - INSERT INTO t1 VALUES(3, 3); - INSERT INTO t1 VALUES(2, 4); - INSERT INTO t1 VALUES(1, 5); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 INTEGER UNIQUE); - INSERT INTO t0 VALUES(0); - - - SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0; - - - SELECT * FROM t0 WHERE - (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER); - INSERT INTO t1 VALUES(1, 1, 1); - INSERT INTO t1 VALUES(1, 2, 2); - INSERT INTO t1 VALUES(3, 3, 3); - INSERT INTO t1 VALUES(3, 4, 4); - - - SELECT c, sum(c) OVER win1 FROM t1 - WINDOW win1 AS (ORDER BY b) - - - SELECT c, sum(c) OVER win1 FROM t1 - WINDOW win1 AS (PARTITION BY 1 ORDER BY b) - - - SELECT c, sum(c) OVER win1 FROM t1 - WINDOW win1 AS (ORDER BY 1) - diff --git a/libsql-wal/tests/assets/fixtures/window3.test b/libsql-wal/tests/assets/fixtures/window3.test deleted file mode 100644 index 0b6dd1b85d..0000000000 --- a/libsql-wal/tests/assets/fixtures/window3.test +++ /dev/null @@ -1,4135 +0,0 @@ - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER); - INSERT INTO t2(a, b) VALUES - (10,89), (11,81), (12,96), (13,59), (14,38), (15,68), (16,39), (17,62), - (18,91), (19,46), (20,6), (21,99), (22,97), (23,27), (24,46), (25,78), - (26,54), (27,97), (28,8), (29,67), (30,29), (31,93), (32,84), (33,77), - (34,23), (35,16), (36,16), (37,93), (38,65), (39,35), (40,47), (41,7), - (42,86), (43,74), (44,61), (45,91), (46,85), (47,24), (48,85), (49,43), - (50,59), (51,12), (52,32), (53,56), (54,3), (55,91), (56,22), (57,90), - (58,55), (59,15), (60,28), (61,89), (62,25), (63,47), (64,1), (65,56), - (66,40), (67,43), (68,56), (69,16), (70,75), (71,36), (72,89), (73,98), - (74,76), (75,81), (76,4), (77,94), (78,42), (79,30), (80,78), (81,33), - (82,29), (83,53), (84,63), (85,2), (86,87), (87,37), (88,80), (89,84), - (90,72), (91,41), (92,9), (93,61), (94,73), (95,95), (96,65), (97,13), - (98,58), (99,96), (100,98), (101,1), (102,21), (103,74), (104,65), (105,35), - (106,5), (107,73), (108,11), (109,51), (110,87), (111,41), (112,12), (113,8), - (114,20), (115,31), (116,31), (117,15), (118,95), (119,22), (120,73), - (121,79), (122,88), (123,34), (124,8), (125,11), (126,49), (127,34), - (128,90), (129,59), (130,96), (131,60), (132,55), (133,75), (134,77), - (135,44), (136,2), (137,7), (138,85), (139,57), (140,74), (141,29), (142,70), - (143,59), (144,19), (145,39), (146,26), (147,26), (148,47), (149,80), - (150,90), (151,36), (152,58), (153,47), (154,9), (155,72), (156,72), (157,66), - (158,33), (159,93), (160,75), (161,64), (162,81), (163,9), (164,23), (165,37), - (166,13), (167,12), (168,14), (169,62), (170,91), (171,36), (172,91), - (173,33), (174,15), (175,34), (176,36), (177,99), (178,3), (179,95), (180,69), - (181,58), (182,52), (183,30), (184,50), (185,84), (186,10), (187,84), - (188,33), (189,21), (190,39), (191,44), (192,58), (193,30), (194,38), - (195,34), (196,83), (197,27), (198,82), (199,17), (200,7); - - - SELECT max(b) OVER ( - ORDER BY a - ) FROM t2 - - - SELECT max(b) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT string_agg(CAST(b AS TEXT), '.') OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT string_agg(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT string_agg(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT string_agg(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT max(b) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT max(b) OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 PRECEDING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN CURRENT ROW AND CURRENT ROW) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 4 FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 4 FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 FOLLOWING AND UNBOUNDED FOLLOWING) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES) - - - SELECT max(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT min(b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT row_number() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT row_number() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT row_number() OVER ( ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT dense_rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT rank() OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%10 ORDER BY b ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT rank() OVER ( ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT - row_number() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ), - rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ), - dense_rank() OVER ( PARTITION BY b%2 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT last_value(a+b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT last_value(a+b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT last_value(a+b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT nth_value(b,b+1) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT nth_value(b,b+1) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT nth_value(b,b+1) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT first_value(b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT first_value(b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT first_value(b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT first_value(b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT lead(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT lead(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT lead(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT lead(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT lag(b,b) OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT lag(b,b) OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT lag(b,b) OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT lag(b,b) OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%10 ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( PARTITION BY b%10 ORDER BY b,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER ( ORDER BY b%10,a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (PARTITION BY b%2,a ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) FROM t2 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ORDER BY b%10 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10) - ORDER BY 1 - - - SELECT group_concat(CAST(b AS TEXT), '.') OVER win2 - FROM t2 - WINDOW win1 AS (PARTITION BY b%2,a ORDER BY b%10), - win2 AS (win1 ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - ORDER BY 1 - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 0=1) OVER win FROM t2 - WINDOW win AS (ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE 1=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - - - SELECT count(*) OVER win, group_concat(CAST(b AS TEXT), '.') - FILTER (WHERE a%2=0) OVER win FROM t2 - WINDOW win AS (PARTITION BY (a%10) ORDER BY a ROWS BETWEEN 4 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) - diff --git a/libsql-wal/tests/assets/fixtures/window4.test b/libsql-wal/tests/assets/fixtures/window4.test deleted file mode 100644 index b4e3b8f687..0000000000 --- a/libsql-wal/tests/assets/fixtures/window4.test +++ /dev/null @@ -1,1050 +0,0 @@ - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a TEXT PRIMARY KEY); - INSERT INTO t3 VALUES('a'), ('b'), ('c'), ('d'), ('e'); - INSERT INTO t3 VALUES('f'), ('g'), ('h'), ('i'), ('j'); - - - SELECT a, ntile(1) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(2) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(3) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(4) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(5) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(6) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(7) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(8) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(9) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(10) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(11) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(12) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(13) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(14) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(15) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(16) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(17) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(18) OVER (ORDER BY a) FROM t3 - - - SELECT a, ntile(19) OVER (ORDER BY a) FROM t3 - - - DROP TABLE IF EXISTS t4; - CREATE TABLE t4(a INTEGER PRIMARY KEY, b TEXT, c INTEGER); - INSERT INTO t4 VALUES(1, 'A', 9); - INSERT INTO t4 VALUES(2, 'B', 3); - INSERT INTO t4 VALUES(3, 'C', 2); - INSERT INTO t4 VALUES(4, 'D', 10); - INSERT INTO t4 VALUES(5, 'E', 5); - INSERT INTO t4 VALUES(6, 'F', 1); - INSERT INTO t4 VALUES(7, 'G', 1); - INSERT INTO t4 VALUES(8, 'H', 2); - INSERT INTO t4 VALUES(9, 'I', 10); - INSERT INTO t4 VALUES(10, 'J', 4); - - - SELECT a, nth_value(b, c) OVER (ORDER BY a) FROM t4 - - - SELECT a, lead(b) OVER (ORDER BY a) FROM t4 - - - SELECT a, lead(b, 2) OVER (ORDER BY a) FROM t4 - - - SELECT a, lead(b, 3, 'abc') OVER (ORDER BY a) FROM t4 - - - SELECT a, lag(b) OVER (ORDER BY a) FROM t4 - - - SELECT a, lag(b, 2) OVER (ORDER BY a) FROM t4 - - - SELECT a, lag(b, 3, 'abc') OVER (ORDER BY a) FROM t4 - - - SELECT group_concat(b, '.') OVER ( - ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM t4 - - - DROP TABLE IF EXISTS t5; - CREATE TABLE t5(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER); - INSERT INTO t5 VALUES(1, 'A', 'one', 5); - INSERT INTO t5 VALUES(2, 'B', 'two', 4); - INSERT INTO t5 VALUES(3, 'A', 'three', 3); - INSERT INTO t5 VALUES(4, 'B', 'four', 2); - INSERT INTO t5 VALUES(5, 'A', 'five', 1); - - - SELECT a, nth_value(c, d) OVER (ORDER BY b) FROM t5 - - - SELECT a, nth_value(c, d) OVER (PARTITION BY b ORDER BY a) FROM t5 - - - SELECT a, count(*) OVER abc, count(*) OVER def FROM t5 - WINDOW abc AS (ORDER BY a), - def AS (ORDER BY a DESC) - ORDER BY a; - - - SELECT a, max(a) FILTER (WHERE (a%2)=0) OVER w FROM t5 - WINDOW w AS (ORDER BY a) - - - SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 2 PRECEDING) - FROM t5 - - - SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM t5 - - - SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING) - FROM t5 - - - SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 2 FOLLOWING AND 1 FOLLOWING) - FROM t5 - - - SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) - FROM t5 - - - SELECT a, max(c) OVER (ORDER BY a ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING) - FROM t5 - - - DROP TABLE IF EXISTS ttt; - CREATE TABLE ttt(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER); - INSERT INTO ttt VALUES(1, 1, 1); - INSERT INTO ttt VALUES(2, 2, 2); - INSERT INTO ttt VALUES(3, 3, 3); - - INSERT INTO ttt VALUES(4, 1, 2); - INSERT INTO ttt VALUES(5, 2, 3); - INSERT INTO ttt VALUES(6, 3, 4); - - INSERT INTO ttt VALUES(7, 1, 3); - INSERT INTO ttt VALUES(8, 2, 4); - INSERT INTO ttt VALUES(9, 3, 5); - - - SELECT max(c), max(b) OVER (ORDER BY b) FROM ttt GROUP BY b; - - - SELECT max(b) OVER (ORDER BY max(c)) FROM ttt GROUP BY b; - - - SELECT abs(max(b) OVER (ORDER BY b)) FROM ttt GROUP BY b; - - - SELECT sum(b) OVER ( - ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ) FROM ttt; - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), - sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), - sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - FROM ttt ORDER BY a - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x INTEGER, y INTEGER); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t1 VALUES(7, 8); - INSERT INTO t1 VALUES(9, 10); - - - SELECT lead(y) OVER win FROM t1 - WINDOW win AS (ORDER BY x) - - - SELECT lead(y, 2) OVER win FROM t1 - WINDOW win AS (ORDER BY x) - - - SELECT lead(y, 3, -1) OVER win FROM t1 - WINDOW win AS (ORDER BY x) - - - SELECT - lead(y) OVER win, lead(y) OVER win - FROM t1 - WINDOW win AS (ORDER BY x) - - - SELECT - lead(y) OVER win, - lead(y, 2) OVER win, - lead(y, 3, -1) OVER win - FROM t1 - WINDOW win AS (ORDER BY x) - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER, d INTEGER); - INSERT INTO t1 VALUES(1, 2, 3, 4); - INSERT INTO t1 VALUES(5, 6, 7, 8); - INSERT INTO t1 VALUES(9, 10, 11, 12); - - - SELECT row_number() OVER win, - nth_value(d,2) OVER win, - lead(d) OVER win - FROM t1 - WINDOW win AS (ORDER BY a) - - - SELECT row_number() OVER win, - rank() OVER win, - dense_rank() OVER win, - ntile(2) OVER win, - first_value(d) OVER win, - last_value(d) OVER win, - nth_value(d,2) OVER win, - lead(d) OVER win, - lag(d) OVER win, - max(d) OVER win, - min(d) OVER win - FROM t1 - WINDOW win AS (ORDER BY a) - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(x INTEGER); - INSERT INTO t2 VALUES(1), (1), (1), (4), (4), (6), (7); - - - SELECT rank() OVER () FROM t2 - - - SELECT dense_rank() OVER (PARTITION BY x) FROM t2 - - - SELECT x, rank() OVER (ORDER BY x) FROM t2 ORDER BY 1,2 - - - SELECT DISTINCT x, rank() OVER (ORDER BY x) FROM t2 ORDER BY 1,2 - - - DROP TABLE IF EXISTS t7; - CREATE TABLE t7(id INTEGER PRIMARY KEY, a INTEGER, b INTEGER); - INSERT INTO t7(id, a, b) VALUES - (1, 1, 2), (2, 1, NULL), (3, 1, 4), - (4, 3, NULL), (5, 3, 8), (6, 3, 1); - - - SELECT id, min(b) OVER (PARTITION BY a ORDER BY id) FROM t7; - - - SELECT id, lead(b, -1) OVER (PARTITION BY a ORDER BY id) FROM t7; - - - SELECT id, lag(b, -1) OVER (PARTITION BY a ORDER BY id) FROM t7; - - - DROP VIEW IF EXISTS v8; - DROP TABLE IF EXISTS t8; - CREATE TABLE t8(t INT, total INT); - INSERT INTO t8 VALUES(0,2); - INSERT INTO t8 VALUES(5,1); - INSERT INTO t8 VALUES(10,1); - - - SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8; - - - CREATE VIEW v8 AS SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8; - - - SELECT * FROM v8; - - - SELECT * FROM ( - SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8 - ) sub; - - - SELECT sum( min(t) ) OVER () FROM t8 GROUP BY total; - - - SELECT sum( max(t) ) OVER () FROM t8 GROUP BY total; - - - SELECT sum( min(t) ) OVER () FROM t8; - - - SELECT sum( max(t) ) OVER () FROM t8; - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER); - INSERT INTO t2 VALUES(1), (2), (3); - - - SELECT (SELECT min(a) OVER ()) FROM t2 - diff --git a/libsql-wal/tests/assets/fixtures/window5.test b/libsql-wal/tests/assets/fixtures/window5.test deleted file mode 100644 index adeae19814..0000000000 --- a/libsql-wal/tests/assets/fixtures/window5.test +++ /dev/null @@ -1,21 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(4, 'a'); - INSERT INTO t1 VALUES(6, 'b'); - INSERT INTO t1 VALUES(1, 'c'); - INSERT INTO t1 VALUES(5, 'd'); - INSERT INTO t1 VALUES(2, 'e'); - INSERT INTO t1 VALUES(3, 'f'); - - - SELECT win(a) OVER (ORDER BY b), median(a) OVER (ORDER BY b) FROM t1; - - - SELECT sumint(a) OVER (ORDER BY rowid) FROM t1 ORDER BY rowid; - - - SELECT sumint(a) OVER (ORDER BY rowid ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t1 ORDER BY rowid; - - - SELECT sum(a) FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/window6.test b/libsql-wal/tests/assets/fixtures/window6.test deleted file mode 100644 index df6f1f3723..0000000000 --- a/libsql-wal/tests/assets/fixtures/window6.test +++ /dev/null @@ -1,127 +0,0 @@ - - SELECT window('hello world'); - - - CREATE TABLE window(x COLLATE window); - INSERT INTO window VALUES('bob'), ('alice'), ('cate'); - SELECT * FROM window ORDER BY x COLLATE window; - - - DROP TABLE window; - CREATE TABLE x1(x); - INSERT INTO x1 VALUES('bob'), ('alice'), ('cate'); - CREATE INDEX window ON x1(x COLLATE window); - SELECT * FROM x1 ORDER BY x COLLATE window; - - CREATE TABLE t4(x, y); - PRAGMA parser_trace = 1 - - SELECT * FROM t4 window, t4; - - - CREATE TABLE over(x, over); - CREATE TABLE window(x, window); - INSERT INTO over VALUES(1, 2), (3, 4), (5, 6); - INSERT INTO window VALUES(1, 2), (3, 4), (5, 6); - SELECT sum(x) over FROM over - - - SELECT sum(x) over over FROM over WINDOW over AS () - - - SELECT sum(over) over over over FROM over over WINDOW over AS (ORDER BY over) - - - SELECT sum(over) over over over FROM over over WINDOW over AS (ORDER BY over); - - - SELECT sum(window) OVER window window FROM window window window window AS (ORDER BY window); - - - SELECT count(*) OVER win FROM over - WINDOW win AS (ORDER BY x ROWS BETWEEN +2 FOLLOWING AND +3 FOLLOWING) - - - SELECT LIKE('!', '', '!') x WHERE x; - - - SELECT LIKE("!","","!")""WHeRE""; - - - CREATE TABLE t1(x TEXT); - CREATE INDEX i1 ON t1(x COLLATE nocase); - INSERT INTO t1 VALUES(''); - - - SELECT count(*) FROM t1 WHERE x LIKE '!' ESCAPE '!'; - - - CREATE TABLE IF NOT EXISTS "sample" ( - "id" INTEGER NOT NULL PRIMARY KEY, - "counter" INTEGER NOT NULL, - "value" REAL NOT NULL - ); - - INSERT INTO "sample" (counter, value) - VALUES (1, 10.), (1, 20.), (2, 1.), (2, 3.), (3, 100.); - - - SELECT "counter", "value", RANK() OVER w AS "rank" - FROM "sample" - WINDOW w AS (PARTITION BY "counter" ORDER BY "value" DESC) - ORDER BY "counter", RANK() OVER w - - - SELECT "counter", "value", SUM("value") OVER - (ORDER BY "id" ROWS 2 PRECEDING) - FROM "sample" - ORDER BY "id" - - - SELECT SUM("value") OVER - (ORDER BY "id" ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) - FROM "sample" - ORDER BY "id" - - - WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<5) - SELECT x, group_concat(x) OVER (ORDER BY x ROWS 2 PRECEDING) - FROM c; - - - WITH t1(a,b) AS (VALUES(1,2)) - SELECT count() FILTER (where b<>5) OVER w1 - FROM t1 - WINDOW w1 AS (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING); - - - CREATE TABLE t1(a INT); - INSERT INTO t1 VALUES(10),(15),(20),(20),(25),(30),(30),(50); - CREATE TABLE t3(x INT, y VARCHAR); - INSERT INTO t3(x,y) VALUES(10,'ten'),('15','fifteen'),(30,'thirty'); - - - SELECT a, (SELECT y FROM t3 WHERE x=a) FROM t1 ORDER BY a; - - - SELECT a, (SELECT y FROM t3 WHERE x=a), sum(a) OVER (ORDER BY a) - FROM t1 ORDER BY a; - - - SELECT a, sum(a) OVER win FROM t1 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - - - SELECT a, sum(a) OVER win FROM t1 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING) - - - SELECT a, sum(a) OVER win FROM t1 - WINDOW win AS (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) - - - SELECT y, group_concat(y, '.') OVER win FROM t3 - WINDOW win AS ( - ORDER BY y RANGE BETWEEN UNBOUNDED PRECEDING AND 10 PRECEDING - ); - diff --git a/libsql-wal/tests/assets/fixtures/window7.test b/libsql-wal/tests/assets/fixtures/window7.test deleted file mode 100644 index 3f47ee4621..0000000000 --- a/libsql-wal/tests/assets/fixtures/window7.test +++ /dev/null @@ -1,61 +0,0 @@ - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a INTEGER, b INTEGER); - INSERT INTO t3 VALUES - (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), - (9, 9), (0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), - (7, 17), (8, 18), (9, 19), (0, 20), (1, 21), (2, 22), (3, 23), (4, 24), - (5, 25), (6, 26), (7, 27), (8, 28), (9, 29), (0, 30), (1, 31), (2, 32), - (3, 33), (4, 34), (5, 35), (6, 36), (7, 37), (8, 38), (9, 39), (0, 40), - (1, 41), (2, 42), (3, 43), (4, 44), (5, 45), (6, 46), (7, 47), (8, 48), - (9, 49), (0, 50), (1, 51), (2, 52), (3, 53), (4, 54), (5, 55), (6, 56), - (7, 57), (8, 58), (9, 59), (0, 60), (1, 61), (2, 62), (3, 63), (4, 64), - (5, 65), (6, 66), (7, 67), (8, 68), (9, 69), (0, 70), (1, 71), (2, 72), - (3, 73), (4, 74), (5, 75), (6, 76), (7, 77), (8, 78), (9, 79), (0, 80), - (1, 81), (2, 82), (3, 83), (4, 84), (5, 85), (6, 86), (7, 87), (8, 88), - (9, 89), (0, 90), (1, 91), (2, 92), (3, 93), (4, 94), (5, 95), (6, 96), - (7, 97), (8, 98), (9, 99), (0, 100); - - - SELECT a, sum(b) FROM t3 GROUP BY a ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a GROUPS BETWEEN CURRENT ROW AND CURRENT ROW - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a GROUPS BETWEEN 0 PRECEDING AND 0 FOLLOWING - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 1 FOLLOWING - ) FROM t3 ORDER BY 1; - - - SELECT a, sum(b) OVER ( - ORDER BY a DESC RANGE BETWEEN 0 PRECEDING AND 1 FOLLOWING - ) FROM t3 ORDER BY 1; - diff --git a/libsql-wal/tests/assets/fixtures/window8.test b/libsql-wal/tests/assets/fixtures/window8.test deleted file mode 100644 index c5fc65fe05..0000000000 --- a/libsql-wal/tests/assets/fixtures/window8.test +++ /dev/null @@ -1,2054 +0,0 @@ - - DROP TABLE IF EXISTS t3; - CREATE TABLE t3(a TEXT, b TEXT, c INTEGER); - INSERT INTO t3 VALUES - ('HH', 'bb', 355), ('CC', 'aa', 158), ('BB', 'aa', 399), - ('FF', 'bb', 938), ('HH', 'aa', 480), ('FF', 'bb', 870), - ('JJ', 'aa', 768), ('JJ', 'aa', 899), ('GG', 'bb', 929), - ('II', 'bb', 421), ('GG', 'bb', 844), ('FF', 'bb', 574), - ('CC', 'bb', 822), ('GG', 'bb', 938), ('BB', 'aa', 660), - ('HH', 'aa', 979), ('BB', 'bb', 792), ('DD', 'aa', 845), - ('JJ', 'bb', 354), ('FF', 'bb', 295), ('JJ', 'aa', 234), - ('BB', 'bb', 840), ('AA', 'aa', 934), ('EE', 'aa', 113), - ('AA', 'bb', 309), ('BB', 'aa', 412), ('AA', 'aa', 911), - ('AA', 'bb', 572), ('II', 'aa', 398), ('II', 'bb', 250), - ('II', 'aa', 652), ('BB', 'bb', 633), ('AA', 'aa', 239), - ('FF', 'aa', 670), ('BB', 'bb', 705), ('HH', 'bb', 963), - ('CC', 'bb', 346), ('II', 'bb', 671), ('BB', 'aa', 247), - ('AA', 'aa', 223), ('GG', 'aa', 480), ('HH', 'aa', 790), - ('FF', 'aa', 208), ('BB', 'bb', 711), ('EE', 'aa', 777), - ('DD', 'bb', 716), ('CC', 'aa', 759), ('CC', 'aa', 430), - ('CC', 'aa', 607), ('DD', 'bb', 794), ('GG', 'aa', 148), - ('GG', 'aa', 634), ('JJ', 'bb', 257), ('DD', 'bb', 959), - ('FF', 'bb', 726), ('BB', 'aa', 762), ('JJ', 'bb', 336), - ('GG', 'aa', 335), ('HH', 'bb', 330), ('GG', 'bb', 160), - ('JJ', 'bb', 839), ('FF', 'aa', 618), ('BB', 'aa', 393), - ('EE', 'bb', 629), ('FF', 'aa', 667), ('AA', 'bb', 870), - ('FF', 'bb', 102), ('JJ', 'aa', 113), ('DD', 'aa', 224), - ('AA', 'bb', 627), ('HH', 'bb', 730), ('II', 'bb', 443), - ('HH', 'bb', 133), ('EE', 'bb', 252), ('II', 'bb', 805), - ('BB', 'bb', 786), ('EE', 'bb', 768), ('HH', 'bb', 683), - ('DD', 'bb', 238), ('DD', 'aa', 256); - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, rank() OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, max(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, min(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) FROM t3 ORDER BY 1, 2, 3; - - - SELECT a, b, - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW), - sum(c) OVER (ORDER BY a,b GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) - FROM t3 ORDER BY 1, 2, 3; - - - SELECT row_number() OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS - ) - - - SELECT nth_value(c, 14) OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS - ) - - - SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS - ) ORDER BY a, b, c; - - - SELECT row_number() OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW - ) - - - SELECT nth_value(c, 14) OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW - ) - - - SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW - ) ORDER BY a, b, c; - - - SELECT row_number() OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP - ) - - - SELECT nth_value(c, 14) OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP - ) - - - SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP - ) ORDER BY a, b, c; - - - SELECT row_number() OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES - ) - - - SELECT nth_value(c, 14) OVER win - FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES - ) - - - SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3 - WINDOW win AS ( - ORDER BY c, b, a - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES - ) ORDER BY a, b, c; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a REAL, b INTEGER); - INSERT INTO t1 VALUES - (5, 10), (10, 20), (13, 26), (13, 26), - (15, 30), (20, 40), (22,80), (30, 90); - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 5.1 PRECEDING AND 5.3 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 10.2 PRECEDING AND 5.4 PRECEDING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 2.6 FOLLOWING AND 3.5 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 5.7 PRECEDING AND 5.8 FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND 5.9 PRECEDING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 2.1 FOLLOWING AND UNBOUNDED FOLLOWING ) - - - SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE 5.1 PRECEDING ) - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER, b INTEGER); - INSERT INTO t1 VALUES - (NULL, 1), (NULL, 2), (NULL, 3), (10, 4), (10, 5); - - - SELECT sum(b) OVER ( - ORDER BY a RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1; - - - SELECT sum(b) OVER ( - ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1; - - - SELECT sum(b) OVER ( - ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS FIRST; - - - SELECT sum(b) OVER ( - ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - SELECT sum(b) OVER ( - ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS FIRST; - - - SELECT sum(b) OVER ( - ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - SELECT sum(b) OVER ( - ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS FIRST; - - - SELECT sum(b) OVER ( - ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - SELECT sum(b) OVER ( - ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS FIRST; - - - SELECT sum(b) OVER ( - ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - SELECT sum(b) OVER ( - ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS FIRST; - - - SELECT sum(b) OVER ( - ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - SELECT sum(b) OVER ( - ORDER BY a ASC NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - SELECT sum(b) OVER ( - ORDER BY a DESC NULLS FIRST RANGE - BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 NULLS LAST; - - - INSERT INTO t3 VALUES - (NULL, 'bb', 355), (NULL, 'cc', 158), (NULL, 'aa', 399), - ('JJ', NULL, 839), ('FF', NULL, 618), ('BB', NULL, 393), - (NULL, 'bb', 629), (NULL, NULL, 667), (NULL, NULL, 870); - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( PARTITION BY coalesce(a, '') - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT max(c) OVER win, - min(c) OVER win, - count(a) OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, - rank() OVER win, - dense_rank() OVER win - FROM t3 - WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST - ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a TEXT, b INTEGER); - INSERT INTO t2 VALUES('A', NULL); - INSERT INTO t2 VALUES('B', NULL); - INSERT INTO t2 VALUES('C', 1); - - - SELECT group_concat(a, '.') OVER ( - ORDER BY b NULLS FIRST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING - ) - FROM t2 - - - SELECT group_concat(a, '.') OVER ( - ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING - ) - FROM t2 - - - DROP TABLE IF EXISTS t2; - CREATE TABLE t2(a INTEGER, b INTEGER); - - INSERT INTO t2 VALUES(1, 65); - INSERT INTO t2 VALUES(2, NULL); - INSERT INTO t2 VALUES(3, NULL); - INSERT INTO t2 VALUES(4, NULL); - INSERT INTO t2 VALUES(5, 66); - INSERT INTO t2 VALUES(6, 67); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING - ); - - - SELECT min (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING - ); - - - SELECT sum (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING - ); - - - SELECT max (a) OVER win FROM t2 - WINDOW win AS ( - ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING - ); - - - DROP TABLE IF EXISTS tx; - CREATE TABLE tx(a INTEGER PRIMARY KEY); - INSERT INTO tx VALUES(1), (2), (3), (4), (5), (6); - - DROP TABLE IF EXISTS map; - CREATE TABLE map(v INTEGER PRIMARY KEY, t TEXT); - INSERT INTO map VALUES - (1, 'odd'), (2, 'even'), (3, 'odd'), - (4, 'even'), (5, 'odd'), (6, 'even'); - - - SELECT sum(a) OVER ( - PARTITION BY ( - SELECT t FROM map WHERE v=a - ) ORDER BY a - ) FROM tx; - - - SELECT sum(a) OVER win FROM tx - WINDOW win AS ( - PARTITION BY ( - SELECT t FROM map WHERE v=a - ) ORDER BY a - ); - - - WITH map2 AS ( - SELECT * FROM map - ) - SELECT sum(a) OVER ( - PARTITION BY ( - SELECT t FROM map2 WHERE v=a - ) ORDER BY a - ) FROM tx; - - - WITH map2 AS ( - SELECT * FROM map - ) - SELECT sum(a) OVER win FROM tx - WINDOW win AS ( - PARTITION BY ( - SELECT t FROM map2 WHERE v=a - ) ORDER BY a - ); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a INTEGER); - CREATE TABLE t2(y INTEGER); - - - SELECT ( - SELECT max(a) OVER ( ORDER BY (SELECT sum(a) FROM t1) ) - + min(a) OVER() - ) - FROM t1 - diff --git a/libsql-wal/tests/assets/fixtures/window9.test b/libsql-wal/tests/assets/fixtures/window9.test deleted file mode 100644 index 02f6af1f32..0000000000 --- a/libsql-wal/tests/assets/fixtures/window9.test +++ /dev/null @@ -1,144 +0,0 @@ - - CREATE TABLE fruits( - name TEXT COLLATE NOCASE, - color TEXT COLLATE NOCASE - ); - - - INSERT INTO fruits (name, color) VALUES ('apple', 'RED'); - INSERT INTO fruits (name, color) VALUES ('APPLE', 'yellow'); - INSERT INTO fruits (name, color) VALUES ('pear', 'YELLOW'); - INSERT INTO fruits (name, color) VALUES ('PEAR', 'green'); - - - SELECT name, color, dense_rank() OVER (ORDER BY name) FROM fruits; - - - SELECT name, color, - dense_rank() OVER (PARTITION BY name ORDER BY color) - FROM fruits; - - - SELECT name, color, - dense_rank() OVER (ORDER BY name), - dense_rank() OVER (PARTITION BY name ORDER BY color) - FROM fruits; - - - SELECT name, color, - dense_rank() OVER (ORDER BY name), - dense_rank() OVER (PARTITION BY name ORDER BY color) - FROM fruits ORDER BY color; - - - CREATE TABLE t1(a BLOB, b INTEGER, c COLLATE nocase); - INSERT INTO t1 VALUES(1, 2, 'abc'); - INSERT INTO t1 VALUES(3, 4, 'ABC'); - - - SELECT c=='Abc' FROM t1 - - - SELECT c=='Abc', rank() OVER (ORDER BY b) FROM t1 - - - SELECT b=='2' FROM t1 - - - SELECT b=='2', rank() OVER (ORDER BY a) FROM t1 - - - CREATE TABLE t1(a); - CREATE TABLE t2(a,b,c); - - - SELECT EXISTS(SELECT 1 FROM t1 ORDER BY sum(a) OVER ()) FROM t1; - - - SELECT sum(a) OVER () FROM t2 - ORDER BY EXISTS(SELECT 1 FROM t2 ORDER BY sum(a) OVER ()); - - - CREATE TABLE t1(a, b TEXT); - INSERT INTO t1 VALUES('A', 1), ('A', 2), ('2', 1), ('2', 2); - - - SELECT b, b=count(*), '1,2' FROM t1 GROUP BY b; - - - SELECT b, b=count(*), group_concat(b) OVER () FROM t1 GROUP BY b; - - - CREATE TABLE t1(a, b, c, d, e); - CREATE INDEX i1 ON t1(a, b, c, d, e); - - - CREATE TABLE t0(c0); - INSERT INTO t0(c0) VALUES (0); - - - SELECT * FROM t0 WHERE - EXISTS ( - SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 - ) >=1 AND - EXISTS ( - SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 - ) <=1; - - - SELECT * FROM t0 WHERE EXISTS ( - SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 - ) - BETWEEN 1 AND 1; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x, y); - INSERT INTO t1 VALUES(10, 1); - INSERT INTO t1 VALUES(20, 2); - INSERT INTO t1 VALUES(3, 3); - INSERT INTO t1 VALUES(2, 4); - INSERT INTO t1 VALUES(1, 5); - - - SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z - - - SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (z IS y); - - - SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (y IS z); - - - SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY z + 0.0; - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2), (3, 4); - SELECT min( sum(a) ) OVER () FROM t1; - - - SELECT min( sum(a) ) OVER () FROM t1 GROUP BY a; - - - CREATE VIEW v1 AS - SELECT 0 AS x - UNION - SELECT count() OVER() FROM (SELECT 0) - ORDER BY 1 - ; - - - SELECT( - SELECT x UNION - SELECT sum( avg((SELECT x FROM v1)) ) OVER() - ) - FROM v1; - - - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(NULL,'bb',356); - INSERT INTO t1 VALUES('CB','aa',158); - INSERT INTO t1 VALUES('BB','aa',399); - INSERT INTO t1 VALUES('FF','bb',938); - diff --git a/libsql-wal/tests/assets/fixtures/windowA.test b/libsql-wal/tests/assets/fixtures/windowA.test deleted file mode 100644 index 7260a49494..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowA.test +++ /dev/null @@ -1,130 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), d FLOAT); - INSERT INTO t1 VALUES - (1, 'A', 5.4), - (2, 'B', 5.55), - (3, 'C', 8.0), - (4, 'D', 10.25), - (5, 'E', 10.26), - (6, 'N', NULL), - (7, 'N', NULL); - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN 2.50 PRECEDING AND 2.25 FOLLOWING) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN 2.50 PRECEDING AND 2.25 FOLLOWING) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN 2.50 PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN 2.50 PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN 2.50 PRECEDING AND CURRENT ROW) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN 2.50 PRECEDING AND CURRENT ROW) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN UNBOUNDED PRECEDING AND 2.25 FOLLOWING) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN UNBOUNDED PRECEDING AND 2.25 FOLLOWING) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN CURRENT ROW AND 2.25 FOLLOWING) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN CURRENT ROW AND 2.25 FOLLOWING) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS LAST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - ORDER BY +d DESC NULLS LAST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - ORDER BY +d DESC NULLS FIRST, +a; - - - SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 - WINDOW w1 AS - (ORDER BY d DESC NULLS FIRST - RANGE BETWEEN 2.50 PRECEDING AND 0.5 PRECEDING) - ORDER BY +d DESC NULLS FIRST, +a; - diff --git a/libsql-wal/tests/assets/fixtures/windowB.test b/libsql-wal/tests/assets/fixtures/windowB.test deleted file mode 100644 index a74d840d3e..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowB.test +++ /dev/null @@ -1,254 +0,0 @@ - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(NULL, 1); - INSERT INTO t1 VALUES(NULL, 2); - INSERT INTO t1 VALUES(NULL, 3); - - - SELECT sum(b) OVER win FROM t1 - WINDOW win AS ( - ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) - - - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, NULL); - INSERT INTO t1 VALUES(2, 45); - INSERT INTO t1 VALUES(3, 66.2); - INSERT INTO t1 VALUES(4, 'hello world'); - INSERT INTO t1 VALUES(5, 'hello world'); - INSERT INTO t1 VALUES(6, X'1234'); - INSERT INTO t1 VALUES(7, X'1234'); - INSERT INTO t1 VALUES(8, NULL); - - - CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT, x TEXT); - INSERT INTO testjson VALUES(1, '{"a":1 - - SELECT json_group_array(json(j)) FROM testjson; - - - SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson; - - - SELECT json_group_array(json(j)) OVER ( - ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - EXCLUDE TIES - ) FROM testjson; - - - SELECT json_group_array(json(j)) OVER ( - ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM testjson; - - - SELECT json_group_array(json(j)) OVER ( - ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING - ) FROM testjson; - - - UPDATE testjson SET j = replace(j,char(125),',"e":9'||char(125)); - SELECT j FROM testjson; - - - SELECT group_concat(x,'') OVER ( - ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING - ) FROM testjson ORDER BY id; - - - SELECT json_group_array(json(j)) OVER ( - ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING - ) FROM testjson; - - - SELECT json_group_object(x,json(j)) OVER ( - ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING - ) FROM testjson; - - - SELECT group_concat(x,'') FILTER (WHERE id!=2) OVER ( - ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING - ) FROM testjson; - - - SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER ( - ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING - ) FROM testjson - - - SELECT json_group_object(x,json(j)) FILTER (WHERE id!=2) OVER ( - ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING - ) FROM testjson - - - CREATE TABLE x(a); - INSERT INTO x VALUES(1); - INSERT INTO x VALUES(2); - - - WITH y AS ( - SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION BY a) - ) - SELECT * FROM y; - - - CREATE TABLE t1(a, c); - CREATE INDEX i1 ON t1(a); - - INSERT INTO t1 VALUES(0, 421); - INSERT INTO t1 VALUES(1, 844); - INSERT INTO t1 VALUES(2, 1001); - - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING - ) FROM t1; - - - INSERT INTO t1 VALUES(NULL, 123); - INSERT INTO t1 VALUES(NULL, 111); - INSERT INTO t1 VALUES('xyz', 222); - INSERT INTO t1 VALUES('xyz', 333); - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING - ) FROM t1; - - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING - ) FROM t1; - - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING EXCLUDE NO OTHERS - ) FROM t1; - - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING EXCLUDE NO OTHERS - ) FROM t1; - - - CREATE TABLE t1(a, c); - CREATE INDEX i1 ON t1(a); - - INSERT INTO t1 VALUES(7, 997); - INSERT INTO t1 VALUES(8, 997); - INSERT INTO t1 VALUES('abc', 1001); - - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING - ) FROM t1; - - - SELECT a, sum(c) OVER ( - ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING EXCLUDE NO OTHERS - ) FROM t1; - - - CREATE TABLE t1(a, c); - CREATE INDEX i1 ON t1(a); - - INSERT INTO t1 VALUES(NULL, 46); - INSERT INTO t1 VALUES(NULL, 45); - INSERT INTO t1 VALUES(7, 997); - INSERT INTO t1 VALUES(7, 1000); - INSERT INTO t1 VALUES(8, 997); - INSERT INTO t1 VALUES(8, 1000); - INSERT INTO t1 VALUES('abc', 1001); - INSERT INTO t1 VALUES('abc', 1004); - INSERT INTO t1 VALUES('xyz', 3333); - - - SELECT a, max(c) OVER ( - ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING - ) FROM t1; - - - SELECT a, min(c) OVER ( - ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING - ) FROM t1; - - - SELECT a, max(c) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 2 PRECEDING - ) FROM t1; - - - SELECT a, min(c) OVER ( - ORDER BY a RANGE BETWEEN 0 PRECEDING AND 2 PRECEDING - ) FROM t1; - - - BEGIN TRANSACTION; - CREATE TABLE t1(a, c); - INSERT INTO t1 VALUES('aa', 111); - INSERT INTO t1 VALUES('BB', 660); - INSERT INTO t1 VALUES('CC', 938); - INSERT INTO t1 VALUES('dd', 979); - COMMIT; - - CREATE INDEX i1 ON t1(a COLLATE nocase); - - - SELECT sum(c) OVER - (ORDER BY a COLLATE nocase RANGE BETWEEN 10.0 PRECEDING AND 5.0 PRECEDING) - FROM t1; - - - CREATE TABLE seps(x); - INSERT INTO seps(x) VALUES ('1'), ('22'), ('333'), ('4444'); - SELECT group_concat('-', x) - OVER ( ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) - FROM seps; - - - CREATE TABLE t1(i INTEGER PRIMARY KEY, v); - INSERT INTO t1 VALUES( 1, 'one' ); - INSERT INTO t1 VALUES( 2, 'two' ); - - - SELECT - json_group_array( v ) OVER w, - json_group_array( v ) OVER w - FROM t1 - window w as ( - range between unbounded preceding and unbounded following - ) - - - SELECT - group_concat( v ) OVER w, - json_group_array( v ) OVER w, - json_group_array( v ) OVER w, - group_concat( v ) OVER w - FROM t1 - window w as ( - range between unbounded preceding and unbounded following - ) - - - SELECT value FROM json_each('[1,2,3,4,5]'); - - - SELECT key, value FROM json_each('[1,2,3,4,5]'); - - - SELECT rowid, value FROM json_each('[1,2,3,4,5]'); - - - SELECT sum(value) OVER (ORDER BY rowid) FROM json_each('[1,2,3,4,5]') - - - SELECT sum(value) OVER ( - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) FROM json_each('[1,2,3,4,5]') - - - SELECT sum(value) OVER (ORDER BY rowid DESC) FROM json_each('[1,2,3,4,5]') - - - SELECT sum(value) OVER (ORDER BY value ASC) FROM json_each('[2,1,4,3,5]') - diff --git a/libsql-wal/tests/assets/fixtures/windowC.test b/libsql-wal/tests/assets/fixtures/windowC.test deleted file mode 100644 index cc2e2e800c..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowC.test +++ /dev/null @@ -1,17 +0,0 @@ - - CREATE TABLE x1(i INTEGER PRIMARY KEY, x); - - - PRAGMA encoding=UTF16le; - WITH separator(x) AS (VALUES(',a,'),(',bc,')), - value(y) AS (VALUES(1),(x'5585d09013455178cd11ce4a')) - SELECT group_concat(y,x) OVER (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM separator, value; - - - PRAGMA encoding=UTF16be; - WITH separator(x) AS (VALUES(',a,'),(',bc,')), - value(y) AS (VALUES(1),(x'5585d09013455178cd11ce4a')) - SELECT group_concat(y,x) OVER (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - FROM separator, value; - diff --git a/libsql-wal/tests/assets/fixtures/windowD.test b/libsql-wal/tests/assets/fixtures/windowD.test deleted file mode 100644 index 583fc87ad7..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowD.test +++ /dev/null @@ -1,44 +0,0 @@ - - CREATE TABLE t0(c0 TEXT); - CREATE VIEW v0(c0, c1) - AS SELECT CUME_DIST() OVER (PARTITION BY t0.c0), TRUE FROM t0; - INSERT INTO t0 VALUES ('x'); - - - SELECT ('500') IS (v0.c1) FROM v0; - - - SELECT (('500') IS (v0.c1)) FROM v0, t0; - - - SELECT (('500') IS (v0.c1)) IS FALSE FROM v0; - - - SELECT * FROM v0; - - - SELECT * FROM v0 WHERE ('500' IS v0.c1) IS FALSE; - - - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('value'); - CREATE VIEW v1(a, b, c, d) AS SELECT 1, 2, TRUE, FALSE FROM t1; - - - SELECT 500 IS a, 500 IS b, 500 IS c, 500 IS d FROM v1 - - - SELECT * FROM v1 WHERE 500 IS c; - - - SELECT * FROM v1 WHERE 500 IS d; - - - CREATE VIEW v2 AS SELECT max(x) OVER () AS a, TRUE AS c FROM t1; - - - SELECT 500 IS c FROM v2; - - - SELECT * FROM v2 WHERE 500 IS c; - diff --git a/libsql-wal/tests/assets/fixtures/windowE.test b/libsql-wal/tests/assets/fixtures/windowE.test deleted file mode 100644 index 538e5d9435..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowE.test +++ /dev/null @@ -1,25 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT COLLATE custom); - INSERT INTO t1 VALUES(1, 'one'); - INSERT INTO t1 VALUES(2, 'two'); - INSERT INTO t1 VALUES(3, 'three'); - INSERT INTO t1 VALUES(4, 'four'); - INSERT INTO t1 VALUES(5, 'five'); - INSERT INTO t1 VALUES(6, 'six'); - CREATE INDEX t1b ON t1(b); - - - SELECT * FROM t1 - - - SELECT group_concat(a,',') OVER win FROM t1 - WINDOW win AS ( - ORDER BY b RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ) - - - SELECT group_concat(a,',') OVER win FROM t1 - WINDOW win AS ( - ORDER BY b RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING - ) - diff --git a/libsql-wal/tests/assets/fixtures/windowerr.test b/libsql-wal/tests/assets/fixtures/windowerr.test deleted file mode 100644 index 4921dbc6db..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowerr.test +++ /dev/null @@ -1,9 +0,0 @@ - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a INTEGER, b INTEGER); - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t1 VALUES(2, 2); - INSERT INTO t1 VALUES(3, 3); - INSERT INTO t1 VALUES(4, 4); - INSERT INTO t1 VALUES(5, 5); - diff --git a/libsql-wal/tests/assets/fixtures/windowfault.test b/libsql-wal/tests/assets/fixtures/windowfault.test deleted file mode 100644 index 6ea8aac897..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowfault.test +++ /dev/null @@ -1,42 +0,0 @@ - - CREATE TABLE t1(a, b, c, d); - INSERT INTO t1 VALUES(1, 2, 3, 4); - INSERT INTO t1 VALUES(5, 6, 7, 8); - INSERT INTO t1 VALUES(9, 10, 11, 12); - - - PRAGMA page_size = 512; - PRAGMA cache_size = 2; - CREATE TABLE t(x INTEGER PRIMARY KEY, y TEXT); - WITH s(i) AS ( - VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1900 - ) - INSERT INTO t(y) SELECT 1500 FROM s; - - - CREATE TABLE t1(a, b, c, d); - CREATE TABLE t2(a, b, c, d); - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0(c0 INTEGER UNIQUE); - INSERT INTO t0 VALUES(0); - - - CREATE TABLE t1(a, b, c); - - - CREATE TABLE t1(id INTEGER PRIMARY KEY, a, b); - INSERT INTO t1 VALUES(1, '1', 'a'); - INSERT INTO t1 VALUES(2, '22', 'b'); - INSERT INTO t1 VALUES(3, '333', 'c'); - INSERT INTO t1 VALUES(4, '4444', 'dddd'); - INSERT INTO t1 VALUES(5, '55555', 'e'); - INSERT INTO t1 VALUES(6, '666666', 'f'); - INSERT INTO t1 VALUES(7, '7777777', 'gggggggggg'); - - - SELECT group_concat(a, b) OVER ( - ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 - diff --git a/libsql-wal/tests/assets/fixtures/windowpushd.test b/libsql-wal/tests/assets/fixtures/windowpushd.test deleted file mode 100644 index 1c0d3c2099..0000000000 --- a/libsql-wal/tests/assets/fixtures/windowpushd.test +++ /dev/null @@ -1,61 +0,0 @@ - - CREATE TABLE t1(id INTEGER PRIMARY KEY, grp_id); - CREATE INDEX i1 ON t1(grp_id); - CREATE VIEW lll AS SELECT - row_number() OVER (PARTITION BY grp_id), - grp_id, id - FROM t1 - - - INSERT INTO t1 VALUES - (1, 2), (2, 3), (3, 3), (4, 1), (5, 1), - (6, 1), (7, 1), (8, 1), (9, 3), (10, 3), - (11, 2), (12, 3), (13, 3), (14, 2), (15, 1), - (16, 2), (17, 1), (18, 2), (19, 3), (20, 2) - - - SELECT * FROM lll - - - SELECT * FROM lll WHERE grp_id=2 - - - CREATE TABLE t1(a, b, c, d); - INSERT INTO t1 VALUES('A', 'C', 1, 0.1); - INSERT INTO t1 VALUES('A', 'D', 2, 0.2); - INSERT INTO t1 VALUES('A', 'E', 3, 0.3); - INSERT INTO t1 VALUES('A', 'C', 4, 0.4); - INSERT INTO t1 VALUES('B', 'D', 5, 0.5); - INSERT INTO t1 VALUES('B', 'E', 6, 0.6); - INSERT INTO t1 VALUES('B', 'C', 7, 0.7); - INSERT INTO t1 VALUES('B', 'D', 8, 0.8); - INSERT INTO t1 VALUES('C', 'E', 9, 0.9); - INSERT INTO t1 VALUES('C', 'C', 10, 1.0); - INSERT INTO t1 VALUES('C', 'D', 11, 1.1); - INSERT INTO t1 VALUES('C', 'E', 12, 1.2); - - CREATE INDEX i1 ON t1(a); - CREATE INDEX i2 ON t1(b); - - CREATE VIEW v1 AS SELECT a, c, max(c) OVER (PARTITION BY a) FROM t1; - - CREATE VIEW v2 AS SELECT a, c, - max(c) OVER (PARTITION BY a), - row_number() OVER () - FROM t1; - - CREATE VIEW v3 AS SELECT b, d, - max(d) OVER (PARTITION BY b), - row_number() OVER (PARTITION BY b) - FROM t1; - - CREATE TABLE t2(x, y, z); - INSERT INTO t2 VALUES('W', 3, 1); - INSERT INTO t2 VALUES('W', 2, 2); - INSERT INTO t2 VALUES('X', 1, 4); - INSERT INTO t2 VALUES('X', 5, 7); - INSERT INTO t2 VALUES('Y', 1, 9); - INSERT INTO t2 VALUES('Y', 4, 2); - INSERT INTO t2 VALUES('Z', 3, 3); - INSERT INTO t2 VALUES('Z', 3, 4); - diff --git a/libsql-wal/tests/assets/fixtures/with1.test b/libsql-wal/tests/assets/fixtures/with1.test deleted file mode 100644 index cc94b95fd5..0000000000 --- a/libsql-wal/tests/assets/fixtures/with1.test +++ /dev/null @@ -1,606 +0,0 @@ - - CREATE TABLE t1(x INTEGER, y INTEGER); - WITH x(a) AS ( SELECT * FROM t1) SELECT 10 - - - SELECT * FROM ( WITH x AS ( SELECT * FROM t1) SELECT 10 ); - - - WITH x(a) AS ( SELECT * FROM t1) INSERT INTO t1 VALUES(1,2); - - - WITH x(a) AS ( SELECT * FROM t1) DELETE FROM t1; - - - WITH x(a) AS ( SELECT * FROM t1) UPDATE t1 SET x = y; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - WITH tmp AS ( SELECT * FROM t1 ) SELECT x FROM tmp; - - - WITH tmp(a) AS ( SELECT * FROM t1 ) SELECT a FROM tmp; - - - SELECT * FROM ( - WITH tmp(a) AS ( SELECT * FROM t1 ) SELECT a FROM tmp - ); - - - WITH tmp1(a) AS ( SELECT * FROM t1 ), - tmp2(x) AS ( SELECT * FROM tmp1) - SELECT * FROM tmp2; - - - WITH tmp2(x) AS ( SELECT * FROM tmp1), - tmp1(a) AS ( SELECT * FROM t1 ) - SELECT * FROM tmp2; - - - CREATE TABLE t3(x); - CREATE TABLE t4(x); - - INSERT INTO t3 VALUES('T3'); - INSERT INTO t4 VALUES('T4'); - - WITH t3(a) AS (SELECT * FROM t4) - SELECT * FROM t3; - - - WITH tmp AS ( SELECT * FROM t3 ), - tmp2 AS ( WITH tmp AS ( SELECT * FROM t4 ) SELECT * FROM tmp ) - SELECT * FROM tmp2; - - - WITH tmp AS ( SELECT * FROM t3 ), - tmp2 AS ( WITH xxxx AS ( SELECT * FROM t4 ) SELECT * FROM tmp ) - SELECT * FROM tmp2; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - INSERT INTO t1 VALUES(3); - INSERT INTO t1 VALUES(4); - - WITH dset AS ( SELECT 2 UNION ALL SELECT 4 ) - DELETE FROM t1 WHERE x IN dset; - SELECT * FROM t1; - - - WITH iset AS ( SELECT 2 UNION ALL SELECT 4 ) - INSERT INTO t1 SELECT * FROM iset; - SELECT * FROM t1; - - - WITH uset(a, b) AS ( SELECT 2, 8 UNION ALL SELECT 4, 9 ) - UPDATE t1 SET x = COALESCE( (SELECT b FROM uset WHERE a=x), x ); - SELECT * FROM t1; - - - WITH i(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM i) - SELECT x FROM i LIMIT 10; - - - CREATE TABLE edge(xfrom, xto, seq, PRIMARY KEY(xfrom, xto)) WITHOUT ROWID; - INSERT INTO edge VALUES(0, 1, 10); - INSERT INTO edge VALUES(1, 2, 20); - INSERT INTO edge VALUES(0, 3, 30); - INSERT INTO edge VALUES(2, 4, 40); - INSERT INTO edge VALUES(3, 4, 40); - INSERT INTO edge VALUES(2, 5, 50); - INSERT INTO edge VALUES(3, 6, 60); - INSERT INTO edge VALUES(5, 7, 70); - INSERT INTO edge VALUES(3, 7, 70); - INSERT INTO edge VALUES(4, 8, 80); - INSERT INTO edge VALUES(7, 8, 80); - INSERT INTO edge VALUES(8, 9, 90); - - WITH RECURSIVE - ancest(id, mtime) AS - (VALUES(0, 0) - UNION - SELECT edge.xto, edge.seq FROM edge, ancest - WHERE edge.xfrom=ancest.id - ORDER BY 2 - ) - SELECT * FROM ancest; - - - WITH RECURSIVE - ancest(id, mtime) AS - (VALUES(0, 0) - UNION ALL - SELECT edge.xto, edge.seq FROM edge, ancest - WHERE edge.xfrom=ancest.id - ORDER BY 2 - ) - SELECT * FROM ancest; - - - WITH RECURSIVE - ancest(id, mtime) AS - (VALUES(0, 0) - UNION ALL - SELECT edge.xto, edge.seq FROM edge, ancest - WHERE edge.xfrom=ancest.id - ORDER BY 2 LIMIT 4 OFFSET 2 - ) - SELECT * FROM ancest; - - - WITH i(x) AS ( VALUES(1) UNION ALL SELECT (x+1)%10 FROM i) - SELECT x FROM i LIMIT 20; - - - WITH i(x) AS ( VALUES(1) UNION SELECT (x+1)%10 FROM i) - SELECT x FROM i LIMIT 20; - - - CREATE TABLE f( - id INTEGER PRIMARY KEY, parentid REFERENCES f, name TEXT - ); - - INSERT INTO f VALUES(0, NULL, ''); - INSERT INTO f VALUES(1, 0, 'bin'); - INSERT INTO f VALUES(2, 1, 'true'); - INSERT INTO f VALUES(3, 1, 'false'); - INSERT INTO f VALUES(4, 1, 'ls'); - INSERT INTO f VALUES(5, 1, 'grep'); - INSERT INTO f VALUES(6, 0, 'etc'); - INSERT INTO f VALUES(7, 6, 'rc.d'); - INSERT INTO f VALUES(8, 7, 'rc.apache'); - INSERT INTO f VALUES(9, 7, 'rc.samba'); - INSERT INTO f VALUES(10, 0, 'home'); - INSERT INTO f VALUES(11, 10, 'dan'); - INSERT INTO f VALUES(12, 11, 'public_html'); - INSERT INTO f VALUES(13, 12, 'index.html'); - INSERT INTO f VALUES(14, 13, 'logo.gif'); - - - WITH flat(fid, fpath) AS ( - SELECT id, '' FROM f WHERE parentid IS NULL - UNION ALL - SELECT id, fpath || '/' || name FROM f, flat WHERE parentid=fid - ) - SELECT fpath FROM flat WHERE fpath!='' ORDER BY 1; - - - WITH flat(fid, fpath) AS ( - SELECT id, '' FROM f WHERE parentid IS NULL - UNION ALL - SELECT id, fpath || '/' || name FROM f, flat WHERE parentid=fid - ) - SELECT count(*) FROM flat; - - - WITH x(i) AS ( - SELECT 1 - UNION ALL - SELECT i+1 FROM x WHERE i<10 - ) - SELECT count(*) FROM x - - - CREATE TABLE tree(i, p); - INSERT INTO tree VALUES(1, NULL); - INSERT INTO tree VALUES(2, 1); - INSERT INTO tree VALUES(3, 1); - INSERT INTO tree VALUES(4, 2); - INSERT INTO tree VALUES(5, 4); - - - WITH t(id, path) AS ( - SELECT i, '' FROM tree WHERE p IS NULL - UNION ALL - SELECT i, path || '/' || i FROM tree, t WHERE p = id - ) - SELECT path FROM t; - - - WITH t(id) AS ( - VALUES(2) - UNION ALL - SELECT i FROM tree, t WHERE p = id - ) - SELECT id FROM t; - - - WITH RECURSIVE - xaxis(x) AS (VALUES(-2.0) UNION ALL SELECT x+0.05 FROM xaxis WHERE x<1.2), - yaxis(y) AS (VALUES(-1.0) UNION ALL SELECT y+0.1 FROM yaxis WHERE y<1.0), - m(iter, cx, cy, x, y) AS ( - SELECT 0, x, y, 0.0, 0.0 FROM xaxis, yaxis - UNION ALL - SELECT iter+1, cx, cy, x*x-y*y + cx, 2.0*x*y + cy FROM m - WHERE (x*x + y*y) < 4.0 AND iter<28 - ), - m2(iter, cx, cy) AS ( - SELECT max(iter), cx, cy FROM m GROUP BY cx, cy - ), - a(t) AS ( - SELECT group_concat( substr(' .+*#', 1+min(iter/7,4), 1), '') - FROM m2 GROUP BY cy - ) - SELECT group_concat(rtrim(t),x'0a') FROM a; - - - WITH RECURSIVE - input(sud) AS ( - VALUES('53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') - ), - - /* A table filled with digits 1..9, inclusive. */ - digits(z, lp) AS ( - VALUES('1', 1) - UNION ALL SELECT - CAST(lp+1 AS TEXT), lp+1 FROM digits WHERE lp<9 - ), - - /* The tricky bit. */ - x(s, ind) AS ( - SELECT sud, instr(sud, '.') FROM input - UNION ALL - SELECT - substr(s, 1, ind-1) || z || substr(s, ind+1), - instr( substr(s, 1, ind-1) || z || substr(s, ind+1), '.' ) - FROM x, digits AS z - WHERE ind>0 - AND NOT EXISTS ( - SELECT 1 - FROM digits AS lp - WHERE z.z = substr(s, ((ind-1)/9)*9 + lp, 1) - OR z.z = substr(s, ((ind-1)%9) + (lp-1)*9 + 1, 1) - OR z.z = substr(s, (((ind-1)/3) % 3) * 3 - + ((ind-1)/27) * 27 + lp - + ((lp-1) / 3) * 6, 1) - ) - ) - SELECT s FROM x WHERE ind=0; - - - DROP TABLE IF EXISTS tree; - CREATE TABLE tree(id INTEGER PRIMARY KEY, parentid, payload); - - - WITH flat(fid, p) AS ( - SELECT id, '/' || payload FROM tree WHERE parentid IS NULL - UNION ALL - SELECT id, p || '/' || payload FROM flat, tree WHERE parentid=fid - ) - SELECT p FROM flat ORDER BY p; - - - WITH t(a) AS ( - SELECT 1 AS b UNION ALL SELECT a+1 AS c FROM t WHERE a<5 ORDER BY b - ) - SELECT * FROM t - - - WITH t(a) AS ( - SELECT 1 AS b UNION ALL SELECT a+1 AS c FROM t WHERE a<5 ORDER BY c - ) - SELECT * FROM t - - - WITH flat(fid, depth, p) AS ( - SELECT id, 1, '/' || payload FROM tree WHERE parentid IS NULL - UNION ALL - SELECT id, depth+1, p||'/'||payload FROM flat, tree WHERE parentid=fid - ORDER BY 2, 3 COLLATE nocase - ) - SELECT p FROM flat; - - - WITH flat(fid, depth, p) AS ( - SELECT id, 1, ('/' || payload) COLLATE nocase - FROM tree WHERE parentid IS NULL - UNION ALL - SELECT id, depth+1, (p||'/'||payload) - FROM flat, tree WHERE parentid=fid - ORDER BY 2, 3 - ) - SELECT p FROM flat; - - - WITH flat(fid, depth, p) AS ( - SELECT id, 1, ('/' || payload) - FROM tree WHERE parentid IS NULL - UNION ALL - SELECT id, depth+1, (p||'/'||payload) COLLATE nocase - FROM flat, tree WHERE parentid=fid - ORDER BY 2, 3 - ) - SELECT p FROM flat; - - - CREATE TABLE tst(a,b); - INSERT INTO tst VALUES('a', 'A'); - INSERT INTO tst VALUES('b', 'B'); - INSERT INTO tst VALUES('c', 'C'); - SELECT a COLLATE nocase FROM tst UNION ALL SELECT b FROM tst ORDER BY 1; - - - SELECT a FROM tst UNION ALL SELECT b COLLATE nocase FROM tst ORDER BY 1; - - - SELECT a||'' FROM tst UNION ALL SELECT b COLLATE nocase FROM tst ORDER BY 1; - - - CREATE TABLE org( - name TEXT PRIMARY KEY, - boss TEXT REFERENCES org - ) WITHOUT ROWID; - INSERT INTO org VALUES('Alice',NULL); - INSERT INTO org VALUES('Bob','Alice'); - INSERT INTO org VALUES('Cindy','Alice'); - INSERT INTO org VALUES('Dave','Bob'); - INSERT INTO org VALUES('Emma','Bob'); - INSERT INTO org VALUES('Fred','Cindy'); - INSERT INTO org VALUES('Gail','Cindy'); - INSERT INTO org VALUES('Harry','Dave'); - INSERT INTO org VALUES('Ingrid','Dave'); - INSERT INTO org VALUES('Jim','Emma'); - INSERT INTO org VALUES('Kate','Emma'); - INSERT INTO org VALUES('Lanny','Fred'); - INSERT INTO org VALUES('Mary','Fred'); - INSERT INTO org VALUES('Noland','Gail'); - INSERT INTO org VALUES('Olivia','Gail'); - -- The above are all under Alice. Add a few more records for people - -- not in Alice's group, just to prove that they won't be selected. - INSERT INTO org VALUES('Xaviar',NULL); - INSERT INTO org VALUES('Xia','Xaviar'); - INSERT INTO org VALUES('Xerxes','Xaviar'); - INSERT INTO org VALUES('Xena','Xia'); - -- Find all members of Alice's group, breath-first order - WITH RECURSIVE - under_alice(name,level) AS ( - VALUES('Alice','0') - UNION ALL - SELECT org.name, under_alice.level+1 - FROM org, under_alice - WHERE org.boss=under_alice.name - ORDER BY 2 - ) - SELECT group_concat(substr('...............',1,level*3) || name,x'0a') - FROM under_alice; - - - WITH RECURSIVE - under_alice(name,level) AS ( - VALUES('Alice','0') - UNION ALL - SELECT org.name, under_alice.level+1 - FROM org, under_alice - WHERE org.boss=under_alice.name - ORDER BY 2 DESC - ) - SELECT group_concat(substr('...............',1,level*3) || name,x'0a') - FROM under_alice; - - - WITH RECURSIVE - under_alice(name,level) AS ( - VALUES('Alice','0') - UNION ALL - SELECT org.name, under_alice.level+1 - FROM org, under_alice - WHERE org.boss=under_alice.name - ) - SELECT group_concat(substr('...............',1,level*3) || name,x'0a') - FROM under_alice; - - -WITH RECURSIVE - t1(x) AS (VALUES(2) UNION ALL SELECT x+2 FROM t1 WHERE x<20), - t2(y) AS (VALUES(3) UNION ALL SELECT y+3 FROM t2 WHERE y<20) -SELECT x FROM t1 EXCEPT SELECT y FROM t2 ORDER BY 1; - - - WITH x AS (SELECT * FROM t) SELECT 0 EXCEPT SELECT 0 ORDER BY 1 COLLATE binary; - - - WITH x(a) AS ( - WITH y(b) AS (SELECT 10) - SELECT 9 UNION ALL SELECT * FROM y - ) - SELECT * FROM x - - - WITH x AS ( - WITH y(b) AS (SELECT 10) - SELECT * FROM y UNION ALL SELECT * FROM y - ) - SELECT * FROM x - - - WITH - x1 AS (SELECT 10), - x2 AS (SELECT * FROM x1), - x3 AS ( - WITH x1 AS (SELECT 11) - SELECT * FROM x2 UNION ALL SELECT * FROM x2 - ) - SELECT * FROM x3; - - - WITH - x1 AS (SELECT 10), - x2 AS (SELECT * FROM x1), - x3 AS ( - WITH x1 AS (SELECT 11) - SELECT * FROM x2 UNION ALL SELECT * FROM x1 - ) - SELECT * FROM x3; - - - WITH - x1 AS (SELECT 10), - x2 AS (SELECT * FROM x1), - x3 AS ( - WITH - x1 AS ( SELECT 11 ), - x4 AS ( SELECT * FROM x2 ) - SELECT * FROM x4 UNION ALL SELECT * FROM x1 - ) - SELECT * FROM x3; - - - WITH - x1 AS (SELECT 10), - x2 AS (SELECT * FROM x1), - x3 AS ( - WITH - x1 AS ( SELECT 11 ), - x4 AS ( SELECT * FROM x2 ) - SELECT * FROM x4 UNION ALL SELECT * FROM x1 - ) - SELECT * FROM x3; - - - WITH - x1 AS (SELECT 10), - x2 AS (SELECT 11), - x3 AS ( - SELECT * FROM x1 UNION ALL SELECT * FROM x2 - ), - x4 AS ( - WITH - x1 AS (SELECT 12), - x2 AS (SELECT 13) - SELECT * FROM x3 - ) - SELECT * FROM x4; - - - WITH xyz(x) AS (VALUES(NULL) UNION SELECT round(1i fROM c; - - - WITH c(i)AS(VALUES(5)UNIoN SELECT 0)SELECT min(1)-i fROM c; - - - WITH RECURSIVE t21(a,b) AS ( - WITH t21(x) AS (VALUES(1)) - SELECT x, x FROM t21 ORDER BY 1 - ) - SELECT * FROM t21 AS tA, t21 AS tB - - - /* This variant from chromium bug 922312 on 2019-01-16 */ - WITH RECURSIVE t21(a,b) AS ( - WITH t21(x) AS (VALUES(1)) - SELECT x, x FROM t21 ORDER BY 1 LIMIT 5 - ) - SELECT * FROM t21 AS tA, t21 AS tB - - - SELECT printf('', - EXISTS (WITH RECURSIVE Table0 AS (WITH Table0 AS (SELECT DISTINCT 1) - SELECT *, * FROM Table0 ORDER BY 1 DESC) - SELECT * FROM Table0 NATURAL JOIN Table0)); - - - CREATE TABLE t1(id INTEGER NULL PRIMARY KEY, name Text); - INSERT INTO t1 VALUES (1, 'john'); - INSERT INTO t1 VALUES (2, 'james'); - INSERT INTO t1 VALUES (3, 'jingle'); - INSERT INTO t1 VALUES (4, 'himer'); - INSERT INTO t1 VALUES (5, 'smith'); - CREATE VIEW v2 AS - WITH t4(Name) AS (VALUES ('A'), ('B')) - SELECT Name Name FROM t4; - CREATE VIEW v3 AS - WITH t4(Att, Val, Act) AS (VALUES - ('C', 'D', 'E'), - ('F', 'G', 'H') - ) - SELECT D.Id Id, P.Name Protocol, T.Att Att, T.Val Val, T.Act Act - FROM t1 D - CROSS JOIN v2 P - CROSS JOIN t4 T; - SELECT * FROM v3; - - - CREATE TABLE t1(a, b, c); - CREATE VIEW v1 AS SELECT max(a), min(b) FROM t1 GROUP BY c; - - - ATTACH "" AS aux; - CREATE VIEW aux.v3 AS VALUES(1); - CREATE VIEW main.v3 AS VALUES(3); - - CREATE VIEW aux.v2 AS SELECT * FROM v3; - CREATE VIEW main.v2 AS SELECT * FROM v3; - - SELECT * FROM main.v2 AS a, aux.v2 AS b, aux.v2 AS c, main.v2 AS d; - - - CREATE TABLE t (label VARCHAR(10), step INTEGER); - INSERT INTO T VALUES('a', 1); - INSERT INTO T VALUES('a', 1); - INSERT INTO T VALUES('b', 1); - WITH RECURSIVE cte(label, step) AS ( - SELECT DISTINCT * FROM t - UNION ALL - SELECT label, step + 1 FROM cte WHERE step < 3 - ) - SELECT * FROM cte ORDER BY +label, +step; - - - WITH RECURSIVE cte(label, step) AS ( - SELECT * FROM t - UNION - SELECT label, step + 1 FROM cte WHERE step < 3 - ) - SELECT * FROM cte ORDER BY +label, +step; - - - CREATE TABLE tworow(x); - INSERT INTO tworow(x) VALUES(1),(2); - DELETE FROM t WHERE rowid=2; - WITH RECURSIVE cte(label, step) AS ( - SELECT * FROM t - UNION ALL - SELECT DISTINCT label, step + 1 FROM cte, tworow WHERE step < 3 - ) - SELECT * FROM cte ORDER BY +label, +step; - - - CREATE TABLE t1(k); - CREATE TABLE log(k, cte_map, main_map); - CREATE TABLE map(k, v); - INSERT INTO map VALUES(1, 'main1'), (2, 'main2'); - - CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN - INSERT INTO log - WITH map(k,v) AS (VALUES(1,'cte1'),(2,'cte2')) - SELECT - new.k, - (SELECT v FROM map WHERE k=new.k), - (SELECT v FROM main.map WHERE k=new.k); - END; - - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - SELECT k, cte_map, main_map, '|' FROM log ORDER BY k; - diff --git a/libsql-wal/tests/assets/fixtures/with2.test b/libsql-wal/tests/assets/fixtures/with2.test deleted file mode 100644 index 3d91f42d81..0000000000 --- a/libsql-wal/tests/assets/fixtures/with2.test +++ /dev/null @@ -1,341 +0,0 @@ - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1); - INSERT INTO t1 VALUES(2); - - - WITH x1 AS (SELECT * FROM t1) - SELECT sum(a) FROM x1; - - - WITH x1 AS (SELECT * FROM t1) - SELECT (SELECT sum(a) FROM x1); - - - WITH x1 AS (SELECT * FROM t1) - SELECT (SELECT sum(a) FROM x1); - - - CREATE TABLE t2(i); - INSERT INTO t2 VALUES(2); - INSERT INTO t2 VALUES(3); - INSERT INTO t2 VALUES(5); - - WITH x1 AS (SELECT i FROM t2), - i(a) AS ( - SELECT min(i)-1 FROM x1 UNION SELECT a+1 FROM i WHERE a<10 - ) - SELECT a FROM i WHERE a NOT IN x1 - - - WITH x1 AS (SELECT a FROM t1), - x2 AS (SELECT i FROM t2), - x3 AS (SELECT * FROM x1, x2 WHERE x1.a IN x2 AND x2.i IN x1) - SELECT * FROM x3 - - - CREATE TABLE t3 AS SELECT 3 AS x; - CREATE TABLE t4 AS SELECT 4 AS x; - - WITH x1 AS (SELECT * FROM t3), - x2 AS ( - WITH t3 AS (SELECT * FROM t4) - SELECT * FROM x1 - ) - SELECT * FROM x2; - - - WITH x2 AS ( - WITH t3 AS (SELECT * FROM t4) - SELECT * FROM t3 - ) - SELECT * FROM x2; - - - WITH x2 AS ( - WITH t3 AS (SELECT * FROM t4) - SELECT * FROM main.t3 - ) - SELECT * FROM x2; - - - WITH x1 AS (SELECT * FROM t1) - SELECT (SELECT sum(a) FROM x1), (SELECT max(a) FROM x1); - - - WITH x1 AS (SELECT * FROM t1) - SELECT (SELECT sum(a) FROM x1), (SELECT max(a) FROM x1), a FROM x1; - - - WITH - i(x) AS ( - WITH - j(x) AS ( SELECT * FROM i ), - i(x) AS ( SELECT * FROM t1 ) - SELECT * FROM j - ) - SELECT * FROM i; - - - WITH r(i) AS ( - VALUES('.') - UNION ALL - SELECT i || '.' FROM r, ( - SELECT x FROM x INTERSECT SELECT y FROM y - ) WHERE length(i) < 10 - ), - x(x) AS ( VALUES(1) UNION ALL VALUES(2) UNION ALL VALUES(3) ), - y(y) AS ( VALUES(2) UNION ALL VALUES(4) UNION ALL VALUES(6) ) - - SELECT * FROM r; - - - WITH r(i) AS ( - VALUES('.') - UNION ALL - SELECT i || '.' FROM r, ( SELECT x FROM x WHERE x=2 ) WHERE length(i) < 10 - ), - x(x) AS ( VALUES(1) UNION ALL VALUES(2) UNION ALL VALUES(3) ) - - SELECT * FROM r ORDER BY length(i) DESC; - - - WITH - t4(x) AS ( - VALUES(4) - UNION ALL - SELECT x+1 FROM t4 WHERE x<10 - ) - SELECT * FROM t4; - - - WITH - t4(x) AS ( - VALUES(4) - UNION ALL - SELECT x+1 FROM main.t4 WHERE x<10 - ) - SELECT * FROM t4; - - - WITH i(x) AS ( - VALUES($min) UNION ALL SELECT x+1 FROM i WHERE x < $max - ) - SELECT * FROM i; - - - WITH i(x) AS ( - VALUES($min) UNION ALL SELECT x+1 FROM i WHERE x < $max - ) - SELECT x FROM i JOIN i AS j USING (x); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - - - DROP TABLE IF EXISTS t1; - DROP TABLE IF EXISTS t2; - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - - - CREATE TABLE t5(x INTEGER); - CREATE TABLE t6(y INTEGER); - - WITH s(x) AS ( VALUES(7) UNION ALL SELECT x+7 FROM s WHERE x<49 ) - INSERT INTO t5 - SELECT * FROM s; - - INSERT INTO t6 - WITH s(x) AS ( VALUES(2) UNION ALL SELECT x+2 FROM s WHERE x<49 ) - SELECT * FROM s; - - - SELECT * FROM t6 WHERE y IN (SELECT x FROM t5) - - - WITH ss AS (SELECT x FROM t5) - SELECT * FROM t6 WHERE y IN (SELECT x FROM ss) - - - WITH ss(x) AS ( VALUES(7) UNION ALL SELECT x+7 FROM ss WHERE x<49 ) - SELECT * FROM t6 WHERE y IN (SELECT x FROM ss) - - - SELECT * FROM t6 WHERE y IN ( - WITH ss(x) AS ( VALUES(7) UNION ALL SELECT x+7 FROM ss WHERE x<49 ) - SELECT x FROM ss - ) - - - CREATE TABLE t7(y); - INSERT INTO t7 VALUES(NULL); - CREATE VIEW v AS SELECT * FROM t7 ORDER BY y; - - - WITH q(a) AS ( - SELECT 1 - UNION - SELECT a+1 FROM q, v WHERE a<5 - ) - SELECT * FROM q; - - - WITH q(a) AS ( - SELECT 1 - UNION ALL - SELECT a+1 FROM q, v WHERE a<5 - ) - SELECT * FROM q; - - - WITH xyz(a) AS ( - WITH abc AS ( SELECT 1234 ) SELECT * FROM abc - ) - SELECT * FROM xyz AS one, xyz AS two, ( - SELECT * FROM xyz UNION ALL SELECT * FROM xyz - ); - - - WITH - cst(rsx, rsy) AS ( - SELECT 100, 100 - ), - cst2(minx, maxx, stepx, miny, maxy, stepy, qualitativex, qualitativey) AS ( - SELECT NULL, NULL, NULL, NULL, NULL, NULL, 0, 0 - ), - ds0(m, n, x, y, x2, y2, title, size, mark, label, markmode) AS ( - SELECT 1, 2, 3, 4, 5, 6, 7 , 8, 9, 10, 11 - ), - ds(m, n, x, y, x2, y2, title, size, mark, label, markmode) AS ( - SELECT m, n, x, - y, x2, - y2, - title, size, mark, label, markmode - FROM ds0 - WINDOW w AS (PARTITION BY m, x ORDER BY n) - ), - d(m, n, x, y, x2, y2, labelx,labely,title,size,mark,label,markmode) AS ( - SELECT m, n, x, y, x2, y2, x, y, title, size, mark, label, markmode - FROM ds, cst2 - ), - ylabels(y, label) AS ( - SELECT y, MIN(labely) FROM d GROUP BY y - ), - yaxis(maxy, miny, stepy , minstepy) AS ( - WITH - xt0(minx, maxx) AS ( - SELECT coalesce(miny, min(min(y2), - min(y))), coalesce(maxy, max(max(y2), - max(y))) + qualitativey - FROM d, cst2 - ), - xt1(mx, mn) AS (SELECT maxx, minx FROM xt0), - xt2(mx, mn, step) AS (SELECT mx, mn, (mx-mn) FROM xt1), - - xt3(mx, mn, ms) AS ( - SELECT mx, mn, first_value(rs) OVER (order by x desc) AS ms - FROM (SELECT mx, mn, step, f,(mx-mn) as rng, - 1.0*step/f as rs, 1.0*(mx-mn)/(step/f) AS x - FROM xt2, (SELECT 1 AS f UNION ALL SELECT 2 - UNION ALL SELECT 4 - UNION ALL SELECT 5)) AS src - WHERE x < 10 limit 1), - xt4(minstepy) AS ( - SELECT MIN(abs(y2-y)) FROM d WHERE y2 != y - ) - SELECT (mx/ms)*ms, (mn/ms)*ms, coalesce(stepy, ms), - coalesce(minstepy, ms, stepy) FROM xt3, cst2,xt4 - ), - distinct_mark_n_m(mark, ze, zem, title) AS ( - SELECT DISTINCT mark, n AS ze, m AS zem, title FROM ds0 - ), - facet0(m, mi, title, radial) AS ( - SELECT md, row_number() OVER () - 1, title, 'radial' - IN (SELECT mark FROM distinct_mark_n_m WHERE zem = md) - FROM (SELECT DISTINCT zem AS md, title AS title - FROM distinct_mark_n_m ORDER BY 2, 1) - ), - facet(m, mi, xorigin, yorigin, title, radial) AS ( - SELECT m, mi, - rsx * 1.2 * IFNULL(CASE WHEN ( - 0 - ) > 0 THEN mi / ( - 0 - ) ELSE mi % ( - 2 - ) END, mi), - rsy * 1.2 * IFNULL(CASE WHEN ( - 2 - ) > 0 THEN mi / ( - 2 - ) ELSE mi / ( - 0 - ) END, 0), - title, radial FROM facet0, cst - ), - radygrid(m, mi, tty, wty, ttx, ttx2, xorigin, yorigin) AS ( - SELECT m, mi, rsy / 2 / ((maxy-miny)/stepy) * (value-1) AS tty, - coalesce(NULL, miny + stepy * (value-1)) AS wty, - xorigin, xorigin+rsx, xorigin + rsx / 2, - yorigin + rsy / 2 - FROM generate_series(1), yaxis, cst, - facet LEFT JOIN ylabels ON ylabels.y = (miny + (value-1) * stepy) - WHERE radial AND stop = 1+1.0*(maxy-miny)/stepy - ), - ypos(m, mi, pcx, pcy, radial) AS ( - SELECT m, mi, xorigin, yorigin + CASE - WHEN 0 BETWEEN miny AND maxy THEN - rsy - (0 - miny) * rsy / (maxy-miny) - WHEN 0 >= maxy THEN 0 - ELSE rsy - END, radial FROM yaxis, cst, facet WHERE NOT radial - UNION ALL - SELECT m, mi, xorigin + rsx / 2, yorigin + (CASE - WHEN 0 BETWEEN miny AND maxy THEN - rsy - (0 - miny) * rsy / 2 / (maxy-miny) - WHEN 0 >= maxy THEN 0 - ELSE rsy - END ) / 2, radial FROM yaxis, cst, facet WHERE radial - ) - SELECT * FROM radygrid , ypos; - - - SELECT 1 AS c WHERE ( - SELECT ( - WITH t1(a) AS (VALUES( c )) - SELECT ( SELECT t1a.a FROM t1 AS t1a, t1 AS t1x ) - FROM t1 AS xyz GROUP BY 1 - ) - ) - - - CREATE TABLE t1(a); - CREATE VIEW v2(c) AS - WITH x AS ( - WITH y AS ( - WITH z AS(SELECT * FROM t1) - SELECT * FROM v2 - ) SELECT a - ) SELECT * from t1; - ALTER TABLE t1 RENAME COLUMN a TO b; - SELECT sql FROM sqlite_schema WHERE name='t1'; - - - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1),('hello'),(4.25),(NULL),(x'3c626c6f623e'); - CREATE VIEW v2(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM t1) SELECT * FROM v2) SELECT a) SELECT * from t1; - CREATE VIEW v3(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM v2) SELECT * FROM v3) SELECT a) SELECT * from t1; - ALTER TABLE t1 RENAME TO t1x; - SELECT quote(c) FROM v3; - - - WITH - t1(x) AS (SELECT 111), - t2(y) AS (SELECT 222), - t3(z) AS (SELECT * FROM t2 WHERE false UNION ALL SELECT * FROM t2) - SELECT * FROM t1, t3; - diff --git a/libsql-wal/tests/assets/fixtures/with3.test b/libsql-wal/tests/assets/fixtures/with3.test deleted file mode 100644 index ed9fb5f921..0000000000 --- a/libsql-wal/tests/assets/fixtures/with3.test +++ /dev/null @@ -1,93 +0,0 @@ - - WITH - x1 AS (SELECT 10), - x2 AS (SELECT 11), - x3 AS ( - SELECT * FROM x1 UNION ALL SELECT * FROM x2 - ), - x4 AS ( - WITH - x1 AS (SELECT 12), - x2 AS (SELECT 13) - SELECT * FROM x3 - ) - SELECT * FROM x4; - - - - CREATE TABLE t1(x); - WITH - x1(a) AS (values(100)) - INSERT INTO t1(x) - SELECT * FROM (WITH x2(y) AS (SELECT * FROM x1) SELECT y+a FROM x1, x2); - SELECT * FROM t1; - - - CREATE TABLE y1(a, b); - CREATE INDEX y1a ON y1(a); - - WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1000) - INSERT INTO y1 SELECT i%10, i FROM cnt; - ANALYZE; - - - - CREATE TABLE w1(pk INTEGER PRIMARY KEY, x INTEGER); - CREATE TABLE w2(pk INTEGER PRIMARY KEY); - - - WITH t5(t5col1) AS ( - SELECT ( - WITH t3(t3col1) AS ( - WITH t2 AS ( - WITH t1 AS (SELECT 1 AS c1 GROUP BY 1) - SELECT a.c1 FROM t1 AS a, t1 AS b - WHERE anoncol1 = 1 - ) - SELECT (SELECT 1 FROM t2) FROM t2 - ) - SELECT t3col1 FROM t3 WHERE t3col1 - ) FROM (SELECT 1 AS anoncol1) - ) - SELECT t5col1, t5col1 FROM t5 - - - SELECT EXISTS ( - WITH RECURSIVE Table0 AS ( - WITH RECURSIVE Table0(Col0) AS (SELECT ALL 1 ) - SELECT ALL ( - WITH RECURSIVE Table0 AS ( - WITH RECURSIVE Table0 AS ( - WITH RECURSIVE Table0 AS (SELECT DISTINCT 1 GROUP BY 1 ) - SELECT DISTINCT * FROM Table0 NATURAL INNER JOIN Table0 - WHERE Col0 = 1 - ) - SELECT ALL (SELECT DISTINCT * FROM Table0) FROM Table0 WHERE Col0 = 1 - ) - SELECT ALL * FROM Table0 NATURAL INNER JOIN Table0 - ) FROM Table0 ) - SELECT DISTINCT * FROM Table0 NATURAL INNER JOIN Table0 - ); - - - SELECT ( - WITH t1(a) AS (VALUES(1)) - SELECT ( - WITH t2(b) AS ( - WITH t3(c) AS ( - WITH t4(d) AS (VALUES('elvis')) - SELECT t4a.d FROM t4 AS t4a JOIN t4 AS t4b LEFT JOIN t4 AS t4c - ) - SELECT c FROM t3 WHERE a = 1 - ) - SELECT t2a.b FROM t2 AS t2a JOIN t2 AS t2x - ) - FROM t1 GROUP BY 1 - ) - GROUP BY 1; - - - WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<1) - SELECT x1.x||x2.x||x3.x||x4.x FROM c AS x1, c AS x2, c AS x3, c AS x4 - ORDER BY 1; - diff --git a/libsql-wal/tests/assets/fixtures/with4.test b/libsql-wal/tests/assets/fixtures/with4.test deleted file mode 100644 index 10b1a2b562..0000000000 --- a/libsql-wal/tests/assets/fixtures/with4.test +++ /dev/null @@ -1,7 +0,0 @@ - - ATTACH ':memory:' AS aux; - CREATE TABLE main.t1(a,b); - CREATE TABLE aux.t2(x,y); - INSERT INTO t1 VALUES(1,2); - INSERT INTO t2 VALUES(3,4); - diff --git a/libsql-wal/tests/assets/fixtures/with5.test b/libsql-wal/tests/assets/fixtures/with5.test deleted file mode 100644 index 6efdc7de42..0000000000 --- a/libsql-wal/tests/assets/fixtures/with5.test +++ /dev/null @@ -1,140 +0,0 @@ - - CREATE TABLE link(aa INT, bb INT); - CREATE INDEX link_f ON link(aa,bb); - CREATE INDEX link_t ON link(bb,aa); - INSERT INTO link(aa,bb) VALUES - (1,3), - (5,3), - (7,1), - (7,9), - (9,9), - (5,11), - (11,7), - (2,4), - (4,6), - (8,6); - - - WITH RECURSIVE closure(x) AS ( - VALUES(1) - UNION - SELECT aa FROM closure, link WHERE link.bb=closure.x - UNION - SELECT bb FROM closure, link WHERE link.aa=closure.x - ) - SELECT x FROM closure ORDER BY x; - - - WITH RECURSIVE closure(x) AS ( - VALUES(1) - UNION - SELECT aa FROM link, closure WHERE link.bb=closure.x - UNION - SELECT bb FROM closure, link WHERE link.aa=closure.x - ) - SELECT x FROM closure ORDER BY x; - - - WITH RECURSIVE closure(x) AS ( - VALUES(1) - UNION - SELECT bb FROM closure, link WHERE link.aa=closure.x - UNION - SELECT aa FROM link, closure WHERE link.bb=closure.x - ) - SELECT x FROM closure ORDER BY x; - - - WITH RECURSIVE closure(x) AS ( - VALUES(1),(200),(300),(400) - INTERSECT - VALUES(1) - UNION - SELECT bb FROM closure, link WHERE link.aa=closure.x - UNION - SELECT aa FROM link, closure WHERE link.bb=closure.x - ) - SELECT x FROM closure ORDER BY x; - - - WITH RECURSIVE closure(x) AS ( - VALUES(1),(200),(300),(400) - UNION ALL - VALUES(2) - UNION - SELECT bb FROM closure, link WHERE link.aa=closure.x - UNION - SELECT aa FROM link, closure WHERE link.bb=closure.x - ) - SELECT x FROM closure ORDER BY x; - - - WITH RECURSIVE closure(x) AS ( - SELECT 1 AS x - UNION - SELECT aa FROM link JOIN closure ON bb=x - UNION - SELECT bb FROM link JOIN closure on aa=x - ORDER BY x LIMIT 4 - ) - SELECT * FROM closure; - - - WITH RECURSIVE closure(x) AS ( - SELECT 1 AS x - UNION ALL - SELECT 2 - UNION - SELECT aa FROM link JOIN closure ON bb=x - UNION - SELECT bb FROM link JOIN closure on aa=x - ORDER BY x LIMIT 4 - ) - SELECT * FROM closure; - - - CREATE TABLE linkA(aa1,aa2); - INSERT INTO linkA(aa1,aa2) VALUES(1,3),(5,7),(9,11); - CREATE TABLE linkB(bb1,bb2); - INSERT INTO linkB(bb1,bb2) VALUES(7,9),(11,13),(3,5); - CREATE TABLE linkC(cc1,cc2); - INSERT INTO linkC(cc1,cc2) VALUES(1,2),(2,4),(6,8); - CREATE TABLE linkD(dd1,dd2); - INSERT INTO linkD(dd1,dd2) VALUES(4,6),(100,110); - - - WITH RECURSIVE closure(x) AS ( - VALUES(1) - UNION ALL - SELECT aa2 FROM linkA JOIN closure ON x=aa1 - UNION ALL - SELECT bb2 FROM linkB JOIN closure ON x=bb1 - UNION ALL - SELECT cc2 FROM linkC JOIN closure ON x=cc1 - UNION ALL - SELECT dd2 FROM linkD JOIN closure ON x=dd1 - ) - SELECT x FROM closure ORDER BY +x; - - - CREATE TABLE linkA_ipk(aa1 INTEGER PRIMARY KEY,aa2); - INSERT INTO linkA_ipk(aa1,aa2) SELECT aa1, aa2 FROM linkA; - CREATE TABLE linkB_ipk(bb1 INTEGER PRIMARY KEY,bb2); - INSERT INTO linkB_ipk(bb1,bb2) SELECT bb1, bb2 FROM linkB; - CREATE TABLE linkC_ipk(cc1 INTEGER PRIMARY KEY,cc2); - INSERT INTO linkC_ipk(cc1,cc2) SELECT cc1, cc2 FROM linkC; - CREATE TABLE linkD_ipk(dd1 INTEGER PRIMARY KEY,dd2); - INSERT INTO linkD_ipk(dd1,dd2) SELECT dd1, dd2 FROM linkD; - WITH RECURSIVE closure(x) AS ( - VALUES(1) - UNION ALL - SELECT aa2 FROM linkA_ipk JOIN closure ON x=aa1 - UNION ALL - SELECT bb2 FROM linkB_ipk JOIN closure ON x=bb1 - UNION ALL - SELECT cc2 FROM linkC_ipk JOIN closure ON x=cc1 - UNION ALL - SELECT dd2 FROM linkD_ipk JOIN closure ON x=dd1 - ) - SELECT x FROM closure ORDER BY +x; - diff --git a/libsql-wal/tests/assets/fixtures/with6.test b/libsql-wal/tests/assets/fixtures/with6.test deleted file mode 100644 index 8d8ff0ef94..0000000000 --- a/libsql-wal/tests/assets/fixtures/with6.test +++ /dev/null @@ -1,90 +0,0 @@ - - WITH c(x) AS (VALUES(0),(1)) - SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3; - - - WITH c(x) AS MATERIALIZED (VALUES(0),(1)) - SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3; - - - WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1)) - SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3; - - - WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1)) - SELECT c1.x||c2.x||c3.x - FROM (SELECT x FROM c LIMIT 5) AS c1, - (SELECT x FROM c LIMIT 5) AS c2, - (SELECT x FROM c LIMIT 5) AS c3; - - - WITH c(x) AS MATERIALIZED (VALUES(0),(1)) - SELECT c1.x||c2.x||c3.x - FROM (SELECT x FROM c LIMIT 5) AS c1, - (SELECT x FROM c LIMIT 6) AS c2, - (SELECT x FROM c LIMIT 7) AS c3; - - - WITH c(x) AS (VALUES(0),(1)) - SELECT c1.x||c2.x||c3.x - FROM (SELECT x FROM c LIMIT 5) AS c1, - (SELECT x FROM c LIMIT 6) AS c2, - (SELECT x FROM c LIMIT 7) AS c3; - - - WITH c(x) AS (VALUES(0),(1)) - SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x) - FROM c AS c2 WHERE c2.x<10; - - - WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1)) - SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x) - FROM c AS c2 WHERE c2.x<10; - - - CREATE TABLE t1(x); - INSERT INTO t1(x) VALUES(4); - CREATE VIEW t2(y) AS - WITH c(z) AS (VALUES(4),(5),(6)) - SELECT c1.z+c2.z*100+t1.x*10000 - FROM t1, - (SELECT z FROM c LIMIT 5) AS c1, - (SELECT z FROM c LIMIT 5) AS c2; - SELECT y FROM t2 ORDER BY y; - - - DROP VIEW t2; - CREATE VIEW t2(y) AS - WITH c(z) AS NOT MATERIALIZED (VALUES(4),(5),(6)) - SELECT c1.z+c2.z*100+t1.x*10000 - FROM t1, - (SELECT z FROM c LIMIT 5) AS c1, - (SELECT z FROM c LIMIT 5) AS c2; - SELECT y FROM t2 ORDER BY y; - - - DROP VIEW t2; - CREATE VIEW t2(y) AS - WITH c(z) AS MATERIALIZED (VALUES(4),(5),(6)) - SELECT c1.z+c2.z*100+t1.x*10000 - FROM t1, - (SELECT z FROM c LIMIT 5) AS c1, - (SELECT z FROM c LIMIT 5) AS c2; - SELECT y FROM t2 ORDER BY y; - - - CREATE TABLE t2(a INT,b INT,d INT); INSERT INTO t2 VALUES(4,5,6),(7,8,9); - CREATE TABLE t3(a INT,b INT,e INT); INSERT INTO t3 VALUES(3,3,3),(8,8,8); - - - WITH t23 AS MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b)) - SELECT * FROM t23; - - - WITH t23 AS NOT MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b)) - SELECT * FROM t23; - - - WITH t23 AS (SELECT * FROM t2 FULL JOIN t3 USING(b)) - SELECT * FROM t23; - diff --git a/libsql-wal/tests/assets/fixtures/withM.test b/libsql-wal/tests/assets/fixtures/withM.test deleted file mode 100644 index 229b814da9..0000000000 --- a/libsql-wal/tests/assets/fixtures/withM.test +++ /dev/null @@ -1,4 +0,0 @@ - - CREATE TABLE t1(x INTEGER, y INTEGER); - INSERT INTO t1 VALUES(123, 456); - diff --git a/libsql-wal/tests/assets/fixtures/without_rowid1.test b/libsql-wal/tests/assets/fixtures/without_rowid1.test deleted file mode 100644 index e18f0fc9b4..0000000000 --- a/libsql-wal/tests/assets/fixtures/without_rowid1.test +++ /dev/null @@ -1,271 +0,0 @@ - - CREATE TABLE t1(a,b,c,d, PRIMARY KEY(c,a)) WITHOUT ROWID; - CREATE INDEX t1bd ON t1(b, d); - INSERT INTO t1 VALUES('journal','sherman','ammonia','helena'); - INSERT INTO t1 VALUES('dynamic','juliet','flipper','command'); - INSERT INTO t1 VALUES('journal','sherman','gamma','patriot'); - INSERT INTO t1 VALUES('arctic','sleep','ammonia','helena'); - SELECT *, '|' FROM t1 ORDER BY c, a; - - - SELECT *, '|' FROM t1 ORDER BY +c, a; - - - SELECT *, '|' FROM t1 ORDER BY c DESC, a DESC; - - - SELECT *, '|' FROM t1 ORDER BY b, d; - - - SELECT *, '|' FROM t1 ORDER BY +b, d; - - - REPLACE INTO t1 VALUES('dynamic','phone','flipper','harvard'); - SELECT *, '|' FROM t1 ORDER BY c, a; - - - SELECT *, '|' FROM t1 ORDER BY b, d; - - - UPDATE t1 SET d=3.1415926 WHERE a='journal'; - SELECT *, '|' FROM t1 ORDER BY c, a; - - - SELECT *, '|' FROM t1 ORDER BY b, d; - - - UPDATE t1 SET a=1250 WHERE b='phone'; - SELECT *, '|' FROM t1 ORDER BY c, a; - - - SELECT *, '|' FROM t1 ORDER BY b, d; - - - VACUUM; - SELECT *, '|' FROM t1 ORDER BY b, d; - - - ANALYZE; - SELECT * FROM sqlite_stat1 ORDER BY idx; - - - SELECT DISTINCT tbl, idx FROM sqlite_stat4 ORDER BY idx; - - - CREATE TABLE t4 (a COLLATE nocase PRIMARY KEY, b) WITHOUT ROWID; - INSERT INTO t4 VALUES('abc', 'def'); - SELECT * FROM t4; - - - UPDATE t4 SET a = 'ABC'; - SELECT * FROM t4; - - - DROP TABLE t4; - CREATE TABLE t4 (b, a COLLATE nocase PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t4(a, b) VALUES('abc', 'def'); - SELECT * FROM t4; - - - UPDATE t4 SET a = 'ABC', b = 'xyz'; - SELECT * FROM t4; - - - CREATE TABLE t5 (a, b, PRIMARY KEY(b, a)) WITHOUT ROWID; - INSERT INTO t5(a, b) VALUES('abc', 'def'); - UPDATE t5 SET a='abc', b='def'; - - - CREATE TABLE t6 ( - a COLLATE nocase, b, c UNIQUE, PRIMARY KEY(b, a) - ) WITHOUT ROWID; - - INSERT INTO t6(a, b, c) VALUES('abc', 'def', 'ghi'); - UPDATE t6 SET a='ABC', c='ghi'; - - - SELECT * FROM t6 ORDER BY b, a; - SELECT * FROM t6 ORDER BY c; - - - CREATE TABLE t1(a, b, PRIMARY KEY(a)) WITHOUT ROWID; - CREATE UNIQUE INDEX i1 ON t1(b); - - CREATE TABLE t2(a, b, PRIMARY KEY(a)) WITHOUT ROWID; - CREATE UNIQUE INDEX i2 ON t2(b); - - INSERT INTO t1 VALUES('one', 'two'); - INSERT INTO t2 VALUES('three', 'two'); - - - INSERT OR REPLACE INTO t1 SELECT * FROM t2; - SELECT * FROM t1; - - - DELETE FROM t1; - INSERT INTO t1 SELECT * FROM t2; - SELECT * FROM t1; - - - CREATE TABLE t3(a PRIMARY KEY); - CREATE TABLE t4(a PRIMARY KEY); - - INSERT INTO t4 VALUES('i'); - INSERT INTO t4 VALUES('ii'); - INSERT INTO t4 VALUES('iii'); - - INSERT INTO t3 SELECT * FROM t4; - SELECT * FROM t3; - - - CREATE TABLE t41(a PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t41 VALUES('abc'); - CREATE TABLE t42(x); - INSERT INTO t42 VALUES('xyz'); - SELECT t42.rowid FROM t41, t42; - - - SELECT t42.rowid FROM t42, t41; - - - CREATE TABLE t45(a PRIMARY KEY, b, c) WITHOUT ROWID; - CREATE INDEX i45 ON t45(b); - - INSERT INTO t45 VALUES(2, 'one', 'x'); - INSERT INTO t45 VALUES(4, 'one', 'x'); - INSERT INTO t45 VALUES(6, 'one', 'x'); - INSERT INTO t45 VALUES(8, 'one', 'x'); - INSERT INTO t45 VALUES(10, 'one', 'x'); - - INSERT INTO t45 VALUES(1, 'two', 'x'); - INSERT INTO t45 VALUES(3, 'two', 'x'); - INSERT INTO t45 VALUES(5, 'two', 'x'); - INSERT INTO t45 VALUES(7, 'two', 'x'); - INSERT INTO t45 VALUES(9, 'two', 'x'); - - - SELECT * FROM t45 WHERE b='two' AND a>4 - - - SELECT * FROM t45 WHERE b='one' AND a<8 - - - CREATE TABLE t46(a, b, c, d, PRIMARY KEY(a, b)) WITHOUT ROWID; - WITH r(x) AS ( - SELECT 1 UNION ALL SELECT x+1 FROM r WHERE x<100 - ) - INSERT INTO t46 SELECT x / 20, x % 20, x % 10, x FROM r; - - - CREATE INDEX i46 ON t46(c); - - - CREATE TABLE t47(a, b UNIQUE PRIMARY KEY) WITHOUT ROWID; - CREATE INDEX i47 ON t47(a); - INSERT INTO t47 VALUES(1, 2); - INSERT INTO t47 VALUES(2, 4); - INSERT INTO t47 VALUES(3, 6); - INSERT INTO t47 VALUES(4, 8); - - VACUUM; - PRAGMA integrity_check; - SELECT name FROM sqlite_master WHERE tbl_name = 't47'; - - - CREATE TABLE t48( - a UNIQUE UNIQUE, - b UNIQUE, - PRIMARY KEY(a), - UNIQUE(a) - ) WITHOUT ROWID; - INSERT INTO t48 VALUES('a', 'b'), ('c', 'd'), ('e', 'f'); - VACUUM; - PRAGMA integrity_check; - SELECT name FROM sqlite_master WHERE tbl_name = 't48'; - - - CREATE TABLE t70a( - a INT CHECK( rowid!=33 ), - b TEXT PRIMARY KEY - ); - INSERT INTO t70a(a,b) VALUES(99,'hello'); - - - CREATE TABLE t1(x INTEGER PRIMARY KEY UNIQUE, b) WITHOUT ROWID; - CREATE INDEX t1x ON t1(x); - INSERT INTO t1(x,b) VALUES('funny','buffalo'); - SELECT type, name, '|' FROM sqlite_master; - - - CREATE TABLE t2(b, c, PRIMARY KEY(b,c)) WITHOUT ROWID; - CREATE UNIQUE INDEX t2b ON t2(b); - UPDATE t2 SET b=1 WHERE b=''; - - - DELETE FROM t2 WHERE b=1 - - - CREATE TABLE t1(a, b, c UNIQUE, PRIMARY KEY(a, b)) WITHOUT ROWID; - INSERT INTO t1 VALUES('a', 'a', 1); - INSERT INTO t1 VALUES('a', 'b', 2); - INSERT INTO t1 VALUES('b', 'a', 3); - INSERT INTO t1 VALUES('b', 'b', 4); - - - CREATE TRIGGER t1_tr BEFORE UPDATE ON t1 BEGIN - DELETE FROM t1 WHERE a = new.a; - END; - UPDATE t1 SET c = c+1 WHERE a = 'a'; - SELECT * FROM t1; - - - CREATE TABLE t11(a TEXT PRIMARY KEY, b INT) WITHOUT ROWID; - CREATE INDEX t11a ON t11(a COLLATE NOCASE); - INSERT INTO t11(a,b) VALUES ('A',1),('a',2); - PRAGMA integrity_check; - SELECT a FROM t11 ORDER BY a COLLATE binary; - - - DROP TABLE IF EXISTS t0; - CREATE TABLE t0 (c0 INTEGER PRIMARY KEY DESC, c1 UNIQUE DEFAULT NULL) WITHOUT ROWID; - INSERT INTO t0(c0) VALUES (1), (2), (3), (4), (5); - REINDEX; - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t0; - DROP TABLE IF EXISTS t1; - CREATE TABLE t0( - c0, - c1 UNIQUE, - PRIMARY KEY(c1, c1) - ) WITHOUT ROWID; - INSERT INTO t0(c0,c1) VALUES('abc','xyz'); - CREATE TABLE t1( - c0, - c1 UNIQUE, - PRIMARY KEY(c1, c1) - ) WITHOUT ROWID; - INSERT INTO t1 SELECT * FROM t0; - PRAGMA integrity_check; - SELECT * FROM t0, t1; - - - CREATE TABLE t1(a INT PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t1(a) VALUES(10); - ALTER TABLE t1 ADD COLUMN b INT; - SELECT * FROM t1 WHERE a=20 OR (a=10 AND b=10); - - - CREATE TABLE dual AS SELECT 'X' AS dummy; - EXPLAIN QUERY PLAN SELECT * FROM dual, t1 WHERE a=10 AND b=10; - - - PRAGMA writable_schema=ON; - CREATE TABLE sqlite_sequence (name PRIMARY KEY) WITHOUT ROWID; - PRAGMA writable_schema=OFF; - CREATE TABLE c1(x); - INSERT INTO sqlite_sequence(name) VALUES('c0'),('c1'),('c2'); - ALTER TABLE c1 RENAME TO a; - SELECT name FROM sqlite_sequence ORDER BY +name; - diff --git a/libsql-wal/tests/assets/fixtures/without_rowid2.test b/libsql-wal/tests/assets/fixtures/without_rowid2.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/without_rowid3.test b/libsql-wal/tests/assets/fixtures/without_rowid3.test deleted file mode 100644 index 7a26a8939b..0000000000 --- a/libsql-wal/tests/assets/fixtures/without_rowid3.test +++ /dev/null @@ -1,58 +0,0 @@ - - PRAGMA foreign_keys=ON; - CREATE TABLE t1(a,b,c,d,e,f, - UNIQUE (a,b), - PRIMARY KEY (e,c), - FOREIGN KEY (d,f) REFERENCES t1(e,c) - ) WITHOUT rowid; - INSERT INTO t1 VALUES(1,2,3,5,5,3); - INSERT INTO t1 VALUES(2,3,4,6,6,4); - INSERT INTO t1 VALUES('x','y',1.5,'fizzle','fizzle',1.5); - SELECT *, '|' FROM t1 ORDER BY a, b; - - - UPDATE t1 SET c=99, f=99 WHERE a=1; - SELECT *, '|' FROM t1 ORDER BY a, b; - - - UPDATE t1 SET e=876, d=876 WHERE a=2; - SELECT *, '|' FROM t1 ORDER BY a, b; - - - DELETE FROM t1 WHERE a=1; - SELECT *, '|' FROM t1 ORDER BY a, b; - - - DROP TABLE t1; - CREATE TABLE t1(a,b,c,d,e,f, - PRIMARY KEY (a,b), - UNIQUE (e,c), - FOREIGN KEY (d,f) REFERENCES t1(e,c) - ) WITHOUT rowid; - INSERT INTO t1 VALUES(1,2,3,5,5,3); - INSERT INTO t1 VALUES(2,3,4,6,6,4); - INSERT INTO t1 VALUES('x','y',1.5,'fizzle','fizzle',1.5); - SELECT *, '|' FROM t1 ORDER BY a, b; - - - UPDATE t1 SET c=99, f=99 WHERE a=1; - SELECT *, '|' FROM t1 ORDER BY a, b; - - - UPDATE t1 SET e=876, d=876 WHERE a=2; - SELECT *, '|' FROM t1 ORDER BY a, b; - - - DELETE FROM t1 WHERE a=1; - SELECT *, '|' FROM t1 ORDER BY a, b; - - - CREATE TABLE t1(a,b,PRIMARY KEY(a,b)) WITHOUT ROWID; - CREATE TABLE t2(a,b,PRIMARY KEY(a,b)) WITHOUT ROWID; - INSERT INTO t1 VALUES(1,2),(3,4),(5,6); - SELECT changes(); - - - INSERT INTO t2 SELECT * FROM t1; - SELECT changes(); - diff --git a/libsql-wal/tests/assets/fixtures/without_rowid4.test b/libsql-wal/tests/assets/fixtures/without_rowid4.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/without_rowid5.test b/libsql-wal/tests/assets/fixtures/without_rowid5.test deleted file mode 100644 index 53d94c52ae..0000000000 --- a/libsql-wal/tests/assets/fixtures/without_rowid5.test +++ /dev/null @@ -1,62 +0,0 @@ - - CREATE TABLE t1(a PRIMARY KEY,b,c); - CREATE TABLE t1w(a PRIMARY KEY,b,c) WITHOUT ROWID; - INSERT INTO t1 VALUES(1565,681,1148),(1429,1190,1619),(425,358,1306); - INSERT INTO t1w SELECT a,b,c FROM t1; - SELECT rowid, _rowid_, oid FROM t1 ORDER BY a DESC; - - - CREATE TABLE IF NOT EXISTS wordcount( - word TEXT PRIMARY KEY, - cnt INTEGER - ) WITHOUT ROWID; - INSERT INTO wordcount VALUES('one',1); - - - CREATE TABLE IF NOT EXISTS wordcount_b( - word TEXT PRIMARY KEY, - cnt INTEGER - ) WITHOUT rowid; - INSERT INTO wordcount_b VALUES('one',1); - - - CREATE TABLE IF NOT EXISTS wordcount_c( - word TEXT PRIMARY KEY, - cnt INTEGER - ) without rowid; - INSERT INTO wordcount_c VALUES('one',1); - - - CREATE TABLE IF NOT EXISTS wordcount_d( - word TEXT PRIMARY KEY, - cnt INTEGER - ) WITHOUT rowid; - INSERT INTO wordcount_d VALUES('one',1); - - - CREATE TABLE ipk(key INTEGER PRIMARY KEY, val TEXT) WITHOUT ROWID; - INSERT INTO ipk VALUES('rival','bonus'); -- ok to insert non-integer key - SELECT * FROM ipk; - - - ROLLBACK; - - - CREATE TABLE nn(a, b, c, d, e, PRIMARY KEY(c,a,e)); - CREATE TABLE nnw(a, b, c, d, e, PRIMARY KEY(c,a,e)) WITHOUT ROWID; - INSERT INTO nn VALUES(1,2,3,4,5); - INSERT INTO nnw VALUES(1,2,3,4,5); - - - INSERT INTO nn VALUES(NULL, 3,4,5,6); - INSERT INTO nn VALUES(3,4,NULL,7,8); - INSERT INTO nn VALUES(4,5,6,7,NULL); - SELECT count(*) FROM nn; - - - SELECT count(*) FROM nnw; - - - CREATE TABLE b1(a INTEGER PRIMARY KEY, b BLOB) WITHOUT ROWID; - INSERT INTO b1 VALUES(1,x'0102030405060708090a0b0c0d0e0f'); - diff --git a/libsql-wal/tests/assets/fixtures/without_rowid6.test b/libsql-wal/tests/assets/fixtures/without_rowid6.test deleted file mode 100644 index 04af70854b..0000000000 --- a/libsql-wal/tests/assets/fixtures/without_rowid6.test +++ /dev/null @@ -1,89 +0,0 @@ - - CREATE TABLE t1(a,b,c,d,e, PRIMARY KEY(a,b,c,a,b,c,d,a,b,c)) WITHOUT ROWID; - CREATE INDEX t1a ON t1(b, b); - WITH RECURSIVE - c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<1000) - INSERT INTO t1(a,b,c,d,e) SELECT i, i+1000, printf('x%dy',i), 0, 0 FROM c; - ANALYZE; - - - SELECT c FROM t1 WHERE a=123; - - - SELECT c FROM t1 WHERE b=1123; - - - SELECT c FROM t1 ORDER BY a DESC LIMIT 5; - - - SELECT c FROM t1 ORDER BY b LIMIT 5; - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1( - a UNIQUE, - b UNIQUE, - c UNIQUE, - PRIMARY KEY(b) - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9); - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - PRAGMA index_list(t1); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1( - a UNIQUE, - b PRIMARY KEY, - c UNIQUE, - UNIQUE(b) - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9); - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - PRAGMA index_list(t1); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1( - a UNIQUE, - b UNIQUE PRIMARY KEY, - c UNIQUE - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9); - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - PRAGMA index_list(t1); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a,b,c, - UNIQUE(b,c), - PRIMARY KEY(b,c) - ) WITHOUT ROWID; - INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9); - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - EXPLAIN QUERY PLAN - SELECT a FROM t1 WHERE b>3 ORDER BY b; - - - PRAGMA index_list(t1); - diff --git a/libsql-wal/tests/assets/fixtures/without_rowid7.test b/libsql-wal/tests/assets/fixtures/without_rowid7.test deleted file mode 100644 index bab9656d0e..0000000000 --- a/libsql-wal/tests/assets/fixtures/without_rowid7.test +++ /dev/null @@ -1,20 +0,0 @@ - - CREATE TABLE t1(a, b COLLATE nocase, PRIMARY KEY(a, a, b)) WITHOUT ROWID; - - - CREATE TABLE t2(a, b, PRIMARY KEY(a COLLATE nocase, a)) WITHOUT ROWID; - - - INSERT INTO t2 VALUES(1, 'one'); - SELECT b FROM t2; - - - PRAGMA index_info(t2); - - - PRAGMA index_xinfo(t2); - - - CREATE TABLE t3(a, b, PRIMARY KEY(a COLLATE nocase, a)); - PRAGMA index_info(t3); - diff --git a/libsql-wal/tests/assets/fixtures/writecrash.test b/libsql-wal/tests/assets/fixtures/writecrash.test deleted file mode 100644 index 5a5ce42177..0000000000 --- a/libsql-wal/tests/assets/fixtures/writecrash.test +++ /dev/null @@ -1,7 +0,0 @@ - - CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB UNIQUE); - WITH s(i) AS ( - VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100 - ) - INSERT INTO t1 SELECT NULL, randomblob(900) FROM s; - diff --git a/libsql-wal/tests/assets/fixtures/zeroblob.test b/libsql-wal/tests/assets/fixtures/zeroblob.test deleted file mode 100644 index bf0e1163cc..0000000000 --- a/libsql-wal/tests/assets/fixtures/zeroblob.test +++ /dev/null @@ -1,10 +0,0 @@ - - SELECT length(zeroblob(-1444444444444444)); - - - DROP TABLE IF EXISTS t1; - CREATE TABLE t1(a,b,c); - CREATE INDEX t1bbc ON t1(b, b+c); - INSERT INTO t1(a,b,c) VALUES(1,zeroblob(8),3); - SELECT a, quote(b), length(b), c FROM t1; - diff --git a/libsql-wal/tests/assets/fixtures/zeroblobfault.test b/libsql-wal/tests/assets/fixtures/zeroblobfault.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/zerodamage.test b/libsql-wal/tests/assets/fixtures/zerodamage.test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libsql-wal/tests/assets/fixtures/zipfile.test b/libsql-wal/tests/assets/fixtures/zipfile.test deleted file mode 100644 index ee7ed79129..0000000000 --- a/libsql-wal/tests/assets/fixtures/zipfile.test +++ /dev/null @@ -1,254 +0,0 @@ - - CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip'); - PRAGMA table_info(zz); - - - INSERT INTO zz(name, mode, mtime, data, method) - VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0); - - - INSERT INTO zz(name, mode, mtime, data, method) - VALUES('g.txt', NULL, 1000000002, '12345', 0); - - - SELECT name, mtime, data FROM zipfile('test.zip') - - - INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt', - '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb' - ); - - - SELECT name, mtime, data, method FROM zipfile('test.zip'); - - - SELECT name, json_extract( zipfile_cds(z) , '$.crc32')!=0 - FROM zipfile('test.zip'); - - - BEGIN; - INSERT INTO zz(name, mode, mtime, data, method) - VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0); - SELECT name FROM zz; - COMMIT; - - - SELECT name FROM zz; - - - SELECT data FROM zz WHERE name='i.txt'; - - - DELETE FROM zz WHERE name='g.txt'; - SELECT name FROM zz; - - - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - UPDATE zz SET mtime=4 WHERE name='i.txt'; - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - UPDATE zz SET mode=$modes WHERE name='h.txt'; - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - UPDATE zz SET name = 'blue.txt' WHERE name='f.txt'; - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - UPDATE zz SET data = 'edcba' WHERE name='blue.txt'; - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - UPDATE zz SET mode=NULL, data = NULL WHERE name='blue.txt'; - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); - - - UPDATE zz SET data = '' WHERE name='i.txt'; - SELECT name,mode,mtime,data,method from zipfile('test.zip'); - - - SELECT a.name, a.data - FROM zz AS a, zz AS b - WHERE a.name=+b.name AND +a.mode=b.mode - - - SELECT name, data FROM zz WHERE name LIKE '%txt' - - - DELETE FROM zz; - SELECT * FROM zz; - - - CREATE VIRTUAL TABLE zzz USING zipfile('test.zip'); - INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x'); - SELECT name, mode, data FROM zzz; - - - INSERT INTO zzz(name, data) VALUES('dirname2', NULL); - INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop'); - SELECT name, mode, data FROM zzz; - - - SELECT name, mode, data FROM zzz; - - - CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip'); - INSERT INTO x1(name, data) VALUES('dir1/', NULL); - INSERT INTO x1(name, data) VALUES('file1', '1234'); - INSERT INTO x1(name, data) VALUES('dir1/file2', '5678'); - - - WITH c(name,mtime,data) AS ( - SELECT 'a.txt', 946684800, 'abc' - ) - SELECT name,mtime,data FROM zipfile( - ( SELECT rt( zipfile(name,NULL,mtime,data,NULL) ) FROM c ) - ) - - - SELECT name, mtime, data FROM zipfile('test1.zip') - - - SELECT name, mtime, sz, rawdata, data FROM zipfile('test2.zip') - - - CREATE VIRTUAL TABLE zz USING zipfile('test.zip'); - BEGIN; - INSERT INTO zz(name, data) VALUES('a.txt', '1'); - INSERT INTO zz(name, data) VALUES('b.txt', '2'); - INSERT INTO zz(name, data) VALUES('c.txt', '1'); - INSERT INTO zz(name, data) VALUES('d.txt', '2'); - SELECT name, data FROM zz; - - - CREATE VIRTUAL TABLE nogood USING zipfile('test_unzip'); - - - DROP TABLE nogood; - BEGIN; - CREATE VIRTUAL TABLE nogood USING zipfile('test_unzip'); - - - COMMIT; - - - BEGIN; - CREATE VIRTUAL TABLE ok USING zipfile('test.zip'); - INSERT INTO ok(name, data) VALUES ('sqlite3', 'elf'); - COMMIT; - - - WITH src(nm) AS ( - VALUES('dir1') UNION ALL - VALUES('dir2/') UNION ALL - VALUES('dir3//') UNION ALL - VALUES('dir4///') UNION ALL - VALUES('/') - ) - SELECT name FROM zipfile((SELECT zipfile(nm, NULL) FROM src)) - - - CREATE VIRTUAL TABLE z USING zipfile('test.zip'); - - - SELECT name, data FROM z; - - - REPLACE INTO z(name,data) VALUES('a0','three'),('a0','four'); - - - SELECT name, data FROM z; - - - INSERT OR IGNORE INTO z(name,data) VALUES('a0','five'),('a0','six'); - - - SELECT name, data FROM z; - - - DELETE FROM z; - - - SELECT name, data FROM z; - - - INSERT INTO z (name,data) VALUES ('b0','one'); - SELECT name, data FROM z; - - - UPDATE z SET name = 'b1' WHERE name = 'b0'; - SELECT name, data FROM z; - - - INSERT INTO z (name,data) VALUES ('b0','one'); - SELECT name, data FROM z ORDER BY name; - - - UPDATE z SET data = 'two' WHERE name = 'b0'; - SELECT name, data FROM z ORDER BY name; - - - UPDATE z SET name = name; - SELECT name, data FROM z ORDER BY name; - - - UPDATE z SET name = name || 'suffix'; - SELECT name, data FROM z ORDER BY name; - - - SELECT name FROM fsdir('subdir') ORDER BY 1; - - - CREATE TABLE d AS SELECT 'subdir' d; - CREATE TABLE x AS SELECT 1 x; - - - SELECT name FROM d JOIN x JOIN fsdir(d) ORDER BY 1; - - - SELECT name FROM d JOIN x JOIN fsdir('.', d) ORDER BY 1; - - - DROP TABLE IF EXISTS t0; - DROP TABLE IF EXISTS t1; - CREATE TABLE t0(a,b,c,d,e,f,g); - REPLACE INTO t0(c,b,f) VALUES(10,10,10); - CREATE VIRTUAL TABLE t1 USING zipfile('h.zip'); - REPLACE INTO t1 SELECT * FROM t0; - SELECT quote(name),quote(mode),quote(mtime),quote(sz),quote(rawdata), - quote(data),quote(method) FROM t1; - - - DROP TABLE t1; - CREATE TABLE t1(x char); - INSERT INTO t1(x) VALUES('1'); - INSERT INTO t1(x) SELECT zipfile(x, 'xyz') FROM t1; - INSERT INTO t1(x) SELECT zipfile(x, 'uvw') FROM t1; - SELECT count(*) FROM t1; - PRAGMA integrity_check; - - - DROP TABLE IF EXISTS t1; - CREATE VIRTUAL TABLE t1 USING zipfile(null); - REPLACE INTO t1 VALUES(null,null,0,null,null,null,null); - - - DROP TABLE IF EXISTS t2; - CREATE VIRTUAL TABLE t2 USING zipfile(null); - REPLACE INTO t2 values(null,null,null,null,null,10,null); - - - WITH vlist(x) AS ( - VALUES(9223372036854775807), - (-9223372036854775808), - (9223372036854775806), - (-9223372036854775807) - ) - SELECT DISTINCT typeof(zipfile(0,0,x,0)) FROM vlist; - diff --git a/libsql-wal/tests/assets/fixtures/zipfile2.test b/libsql-wal/tests/assets/fixtures/zipfile2.test deleted file mode 100644 index 5b48fc044a..0000000000 --- a/libsql-wal/tests/assets/fixtures/zipfile2.test +++ /dev/null @@ -1,34 +0,0 @@ - - CREATE VIRTUAL TABLE aaa USING zipfile('testzip'); - CREATE VIRTUAL TABLE bbb USING zipfile("testzip"); - CREATE VIRTUAL TABLE ccc USING zipfile(`testzip`); - CREATE VIRTUAL TABLE ddd USING zipfile([testzip]); - CREATE VIRTUAL TABLE eee USING zipfile(testzip); - CREATE VIRTUAL TABLE fff USING zipfile('test''zip'); - - - WITH contents(name,mtime,data) AS ( - VALUES('a.txt', 1000000, 'contents of a.txt') UNION ALL - VALUES('b.txt', 1000000, 'contents of b.txt') - ) SELECT quote( zipfile(name,NULL,mtime,data) ) FROM contents; - - - SELECT name,mtime,data FROM zipfile($blob) - - - SELECT name,mtime,data,method FROM zipfile($blob) - - - SELECT name,mtime,data IS NULL,method FROM zipfile($blob) - - - CREATE VIRTUAL TABLE temp.zip USING zipfile('test.zip'); - INSERT INTO temp.zip (name,data) VALUES ('test1','test'); - INSERT INTO temp.zip (name,data) VALUES ('test2','test'); - - - INSERT INTO temp.zip (name,data) VALUES ('test1','test'); - INSERT INTO temp.zip (name,data) VALUES ('test2','test'); - UPDATE OR REPLACE zip SET name='test2' WHERE name='test1'; - SELECT name FROM zip; - diff --git a/libsql-wal/tests/assets/fixtures/zipfilefault.test b/libsql-wal/tests/assets/fixtures/zipfilefault.test deleted file mode 100644 index 5013bd602f..0000000000 --- a/libsql-wal/tests/assets/fixtures/zipfilefault.test +++ /dev/null @@ -1,11 +0,0 @@ - - CREATE VIRTUAL TABLE setup USING zipfile('test.zip'); - INSERT INTO setup(name, data) VALUES('a.txt', '1234567890'); - - - CREATE VIRTUAL TABLE setup USING zipfile('test.zip'); - INSERT INTO setup(name, data) VALUES('a.txt', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa'); - - - CREATE VIRTUAL TABLE setup USING zipfile('test.zip') - diff --git a/libsql-wal/tests/flaky_fs.rs b/libsql-wal/tests/flaky_fs.rs deleted file mode 100644 index 6bb72844f0..0000000000 --- a/libsql-wal/tests/flaky_fs.rs +++ /dev/null @@ -1,263 +0,0 @@ -use std::ffi::c_int; -use std::fs::File; -use std::future::ready; -use std::path::Path; -use std::sync::atomic::{AtomicBool, Ordering::Relaxed}; -use std::sync::Arc; - -use chrono::prelude::{DateTime, Utc}; -use libsql_wal::io::{file::FileExt, Io}; -use libsql_wal::registry::WalRegistry; -use libsql_wal::storage::TestStorage; -use libsql_wal::wal::LibsqlWalManager; - -use libsql_sys::name::NamespaceName; -use libsql_sys::rusqlite::{self, ErrorCode, OpenFlags}; - -use parking_lot::Mutex; -use rand::{Rng, SeedableRng}; -use rand_chacha::ChaCha8Rng; -use tempfile::tempdir; - -#[derive(Clone)] -struct FlakyIo { - p_failure: f32, - rng: Arc>, - enabled: Arc, -} - -struct FlakyFile { - inner: File, - fs: FlakyIo, -} - -impl FileExt for FlakyFile { - fn write_all_at(&self, buf: &[u8], offset: u64) -> std::io::Result<()> { - self.fs - .with_random_failure(|| self.inner.write_all_at(buf, offset)) - } - - fn write_at_vectored(&self, bufs: &[std::io::IoSlice], offset: u64) -> std::io::Result { - self.fs - .with_random_failure(|| self.inner.write_at_vectored(bufs, offset)) - } - - fn write_at(&self, buf: &[u8], offset: u64) -> std::io::Result { - self.fs - .with_random_failure(|| self.inner.write_at(buf, offset)) - } - - fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> std::io::Result<()> { - self.fs - .with_random_failure(|| self.inner.read_exact_at(buf, offset)) - } - - fn sync_all(&self) -> std::io::Result<()> { - self.fs.with_random_failure(|| self.inner.sync_all()) - } - - fn set_len(&self, len: u64) -> std::io::Result<()> { - self.fs.with_random_failure(|| self.inner.set_len(len)) - } - - fn len(&self) -> std::io::Result { - self.inner.len() - } - - fn read_exact_at_async( - &self, - _buf: B, - _offset: u64, - ) -> impl std::future::Future)> + Send { - todo!(); - #[allow(unreachable_code)] - ready((_buf, Ok(()))) - } - - fn write_all_at_async( - &self, - _buf: B, - _offset: u64, - ) -> impl std::future::Future)> + Send { - todo!(); - #[allow(unreachable_code)] - ready((_buf, Ok(()))) - } - - fn read_at(&self, _buf: &mut [u8], _offset: u64) -> std::io::Result { - todo!() - } - - async fn read_at_async( - &self, - _buf: B, - _offset: u64, - ) -> (B, std::io::Result) { - todo!() - } -} - -impl FlakyIo { - fn with_random_failure(&self, f: impl FnOnce() -> std::io::Result) -> std::io::Result { - let r = self.rng.lock().gen_range(0.0..1.0); - if self.enabled.load(Relaxed) && r <= self.p_failure { - Err(std::io::Error::new(std::io::ErrorKind::Other, "failure")) - } else { - f() - } - } -} - -impl Io for FlakyIo { - type File = FlakyFile; - type TempFile = FlakyFile; - type Rng = rand_chacha::ChaCha8Rng; - - fn create_dir_all(&self, path: &std::path::Path) -> std::io::Result<()> { - self.with_random_failure(|| std::fs::create_dir_all(path)) - } - - fn open( - &self, - create_new: bool, - read: bool, - write: bool, - path: &std::path::Path, - ) -> std::io::Result { - self.with_random_failure(|| { - let inner = std::fs::OpenOptions::new() - .create_new(create_new) - .read(read) - .write(write) - .open(path)?; - Ok(FlakyFile { - inner, - fs: self.clone(), - }) - }) - } - - fn tempfile(&self) -> std::io::Result { - todo!() - } - - fn now(&self) -> DateTime { - Utc::now() - } - - fn hard_link(&self, _src: &Path, _dst: &Path) -> std::io::Result<()> { - todo!() - } - - fn with_rng(&self, f: F) -> R - where - F: FnOnce(&mut Self::Rng) -> R, - { - f(&mut self.rng.lock()) - } - - fn remove_file_async( - &self, - path: &Path, - ) -> impl std::future::Future> + Send { - async move { self.with_random_failure(|| std::fs::remove_file(path)) } - } -} - -macro_rules! assert_not_corrupt { - ($($e:expr,)*) => { - $( - match $e { - Ok(_) => (), - Err(e) => { - match e.sqlite_error() { - Some(e) if e.code == ErrorCode::DatabaseCorrupt => panic!("db corrupt"), - _ => () - } - } - }; - )* - }; -} - -fn enable_libsql_logging() { - use std::sync::Once; - static ONCE: Once = Once::new(); - - fn libsql_log(code: c_int, msg: &str) { - println!("sqlite error {code}: {msg}"); - } - - ONCE.call_once(|| unsafe { - rusqlite::trace::config_log(Some(libsql_log)).unwrap(); - }); -} - -#[tokio::test] -async fn flaky_fs() { - enable_libsql_logging(); - let seed = rand::thread_rng().gen(); - println!("seed: {seed}"); - let enabled = Arc::new(AtomicBool::new(false)); - let io = FlakyIo { - p_failure: 0.1, - rng: Arc::new(Mutex::new(ChaCha8Rng::seed_from_u64(seed))), - enabled: enabled.clone(), - }; - let tmp = tempdir().unwrap(); - let resolver = |path: &Path| { - let name = path.file_name().unwrap().to_str().unwrap(); - NamespaceName::from_string(name.to_string()) - }; - let (sender, _receiver) = tokio::sync::mpsc::channel(64); - let registry = Arc::new( - WalRegistry::new_with_io(io.clone(), TestStorage::new_io(false, io).into(), sender) - .unwrap(), - ); - let wal_manager = LibsqlWalManager::new(registry.clone(), Arc::new(resolver)); - tokio::fs::create_dir_all(tmp.path().join("test")) - .await - .unwrap(); - let conn = libsql_sys::Connection::open( - tmp.path().join("test/data").clone(), - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - wal_manager.clone(), - 100000, - None, - ) - .unwrap(); - - let _ = conn.execute( - "CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB(16), c BLOB(16), d BLOB(400));", - (), - ); - let _ = conn.execute("CREATE INDEX i1 ON t1(b);", ()); - let _ = conn.execute("CREATE INDEX i2 ON t1(c);", ()); - - enabled.store(true, Relaxed); - - for _ in 0..50_000 { - assert_not_corrupt! { - conn.execute("REPLACE INTO t1 VALUES(abs(random() % 5000000), randomblob(16), randomblob(16), randomblob(400));", ()), - conn.execute("REPLACE INTO t1 VALUES(abs(random() % 5000000), randomblob(16), randomblob(16), randomblob(400));", ()), - conn.execute("REPLACE INTO t1 VALUES(abs(random() % 5000000), randomblob(16), randomblob(16), randomblob(400));", ()), - } - - let mut stmt = conn - .prepare("SELECT * FROM t1 WHERE a>abs((random()%5000000)) LIMIT 10;") - .unwrap(); - - assert_not_corrupt! { - stmt.query(()).map(|r| r.mapped(|_r| Ok(())).count()), - stmt.query(()).map(|r| r.mapped(|_r| Ok(())).count()), - stmt.query(()).map(|r| r.mapped(|_r| Ok(())).count()), - } - } - - enabled.store(false, Relaxed); - - conn.pragma_query(None, "integrity_check", |_r| Ok(())) - .unwrap(); - conn.query_row("select count(0) from t1", (), |_r| Ok(())) - .unwrap(); -} diff --git a/libsql-wal/tests/misc.rs b/libsql-wal/tests/misc.rs deleted file mode 100644 index 23f9442342..0000000000 --- a/libsql-wal/tests/misc.rs +++ /dev/null @@ -1,102 +0,0 @@ -use libsql_wal::test::TestEnv; - -#[tokio::test] -async fn transaction_rollback() { - let env = TestEnv::new(); - let mut conn1 = env.open_conn("test"); - let conn2 = env.open_conn("test"); - - let tx = conn1.transaction().unwrap(); - tx.execute("create table test (x)", ()).unwrap(); - - assert!(conn2 - .query_row("select count(0) from test", (), |_| { Ok(()) }) - .is_err()); - - tx.execute("insert into test values (42)", ()).unwrap(); - tx.query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 1); - Ok(()) - }) - .unwrap(); - - assert!(conn2 - .query_row("select count(0) from test", (), |_| { Ok(()) }) - .is_err()); - - tx.rollback().unwrap(); - - assert!(conn1 - .query_row("select count(0) from test", (), |_| { Ok(()) }) - .is_err()); - - assert!(conn2 - .query_row("select count(0) from test", (), |_| { Ok(()) }) - .is_err()); - - conn1.execute("create table test (c)", ()).unwrap(); - - conn1 - .query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 0); - Ok(()) - }) - .unwrap(); - conn2 - .query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 0); - Ok(()) - }) - .unwrap(); -} - -#[tokio::test] -async fn transaction_savepoints() { - let env = TestEnv::new(); - let mut conn = env.open_conn("test"); - - let mut tx = conn.transaction().unwrap(); - tx.execute("create table test (x)", ()).unwrap(); - - let mut s1 = tx.savepoint().unwrap(); - s1.execute("insert into test values (42)", ()).unwrap(); - s1.query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 1); - Ok(()) - }) - .unwrap(); - - let mut s2 = s1.savepoint().unwrap(); - s2.execute("insert into test values (42)", ()).unwrap(); - s2.query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 2); - Ok(()) - }) - .unwrap(); - - s2.rollback().unwrap(); - drop(s2); - - s1.query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 1); - Ok(()) - }) - .unwrap(); - - s1.rollback().unwrap(); - drop(s1); - - tx.query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 0); - Ok(()) - }) - .unwrap(); - - tx.commit().unwrap(); - - conn.query_row("select count(0) from test", (), |r| { - assert_eq!(r.get::<_, usize>(0).unwrap(), 0); - Ok(()) - }) - .unwrap(); -} diff --git a/libsql-wal/tests/oracle.rs b/libsql-wal/tests/oracle.rs deleted file mode 100644 index 543607895b..0000000000 --- a/libsql-wal/tests/oracle.rs +++ /dev/null @@ -1,290 +0,0 @@ -//! This test suite runs about 30k test files against sqlite and our test_suite, compares the -//! results, and then compares the database files. - -use std::ffi::c_char; -use std::fmt::Display; -use std::mem::size_of; -use std::os::unix::prelude::FileExt; -use std::path::Path; -use std::sync::Arc; - -use libsql_sys::ffi::{sqlite3_finalize, sqlite3_prepare, Sqlite3DbHeader}; -use libsql_sys::name::NamespaceName; -use libsql_sys::rusqlite::OpenFlags; -use libsql_sys::wal::{Sqlite3WalManager, Wal, WalManager}; -use libsql_sys::Connection; -use libsql_wal::registry::WalRegistry; -use libsql_wal::storage::TestStorage; -use libsql_wal::test::{seal_current_segment, wait_current_durable}; -use libsql_wal::wal::LibsqlWalManager; -use once_cell::sync::Lazy; -use rand::Rng; -use rand_chacha::rand_core::{RngCore, SeedableRng}; -use rand_chacha::ChaCha8Rng; -use regex::{Captures, Regex}; -use tempfile::tempdir; - -type Result = std::result::Result<(), Box>; - -#[tokio::test] -async fn test_oracle() { - let manifest_path: &Path = env!("CARGO_MANIFEST_DIR").as_ref(); - let test_samples_path = manifest_path.join("tests/assets/fixtures"); - - let filter = std::env::var("LIBSQL_WAL_FILTER"); - let dir = walkdir::WalkDir::new(test_samples_path); - for entry in dir { - let entry = entry.unwrap(); - if let Ok(ref filter) = filter { - if entry.path().file_name().unwrap().to_str().unwrap() != filter { - continue; - } - } - if entry.file_type().is_file() { - run_test_sample(entry.path()).await.unwrap(); - } - } -} - -async fn run_test_sample(path: &Path) -> Result { - println!("test: {:?}", path.file_name().unwrap()); - let curdir = std::env::current_dir().unwrap(); - let tmp = tempdir()?; - - std::fs::create_dir_all(tmp.path().join("test")).unwrap(); - std::env::set_current_dir(tmp.path().join("test")).unwrap(); - - let script = std::fs::read_to_string(path).unwrap(); - - let sqlite_conn = libsql_sys::Connection::open( - tmp.path().join("test/data"), - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - Sqlite3WalManager::default(), - 1000, - None, - ) - .unwrap(); - - let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(42); - let before = std::time::Instant::now(); - let sqlite_results = run_script( - &sqlite_conn, - &script, - &mut rng, - Sqlite3WalManager::default(), - ) - .collect::>(); - println!("ran sqlite in {:?}", before.elapsed()); - drop(sqlite_conn); - - std::fs::rename(tmp.path().join("test/data"), tmp.path().join("sqlite-data")).unwrap(); - std::fs::remove_dir_all(tmp.path().join("test")).unwrap(); - std::fs::create_dir_all(tmp.path().join("test")).unwrap(); - std::env::set_current_dir(tmp.path().join("test")).unwrap(); - - let resolver = |path: &Path| { - if path.file_name().unwrap() != "data" { - return NamespaceName::from_string( - path.file_name().unwrap().to_str().unwrap().to_string(), - ); - } - let name = path - .parent() - .unwrap() - .file_name() - .unwrap() - .to_str() - .unwrap(); - NamespaceName::from_string(name.to_string()) - }; - - let (sender, _receiver) = tokio::sync::mpsc::channel(64); - let registry = Arc::new(WalRegistry::new(TestStorage::new().into(), sender).unwrap()); - let wal_manager = LibsqlWalManager::new(registry.clone(), Arc::new(resolver)); - tokio::fs::create_dir_all(tmp.path().join("test")) - .await - .unwrap(); - let db_path = tmp.path().join("test/data").clone(); - let libsql_conn = libsql_sys::Connection::open( - &db_path, - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - wal_manager.clone(), - 100000, - None, - ) - .unwrap(); - - let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(42); - let before = std::time::Instant::now(); - let libsql_results = - run_script(&libsql_conn, &script, &mut rng, wal_manager.clone()).collect::>(); - println!("ran libsql in {:?}", before.elapsed()); - - for ((a, _), (b, _)) in sqlite_results.iter().zip(libsql_results.iter()) { - if a != b { - panic!( - "sqlite and libsql output differ:\n{}", - PrintScript(sqlite_results, libsql_results) - ); - } - } - - drop(libsql_conn); - - let shared = registry.clone().open(&db_path, &"test".into()).unwrap(); - seal_current_segment(&shared); - wait_current_durable(&shared).await; - shared.checkpoint().await.unwrap(); - - std::env::set_current_dir(curdir).unwrap(); - match std::panic::catch_unwind(|| { - compare_db_files( - &tmp.path().join("sqlite-data"), - &tmp.path().join("test/data"), - ); - }) { - Ok(_) => (), - Err(e) => { - let path = tmp.into_path(); - std::fs::rename(path, "./failure").unwrap(); - std::panic::resume_unwind(e) - } - } - - Ok(()) -} - -struct PrintScript(Vec<(String, String)>, Vec<(String, String)>); - -impl Display for PrintScript { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - for ((a, cmd), (b, _)) in self.0.iter().zip(self.1.iter()) { - writeln!(f, "stmt: {}", cmd.trim())?; - if a != b { - writeln!(f, "sqlite: {}", a)?; - writeln!(f, "libsql: {}", b)?; - } else { - writeln!(f, "OK")?; - } - } - - Ok(()) - } -} - -fn compare_db_files(sqlite: &Path, libsql: &Path) { - let db1 = std::fs::File::open(sqlite).unwrap(); - let db2 = std::fs::File::open(libsql).unwrap(); - - let len1 = db1.metadata().unwrap().len(); - let len2 = db2.metadata().unwrap().len(); - - // sqlite file may contain a footer, compare only the data portions of the db files. - assert_eq!(len1, 4096 * (len2 / 4096)); - - let n_pages = len1 / 4096; - let mut buf1 = [0; 4096]; - let mut buf2 = [0; 4096]; - - for i in 0..n_pages { - db1.read_exact_at(&mut buf1, i * 4096).unwrap(); - db2.read_exact_at(&mut buf2, i * 4096).unwrap(); - if i == 0 { - // todo!(page 1 differ) - assert_eq!( - buf1[size_of::()..], - buf2[size_of::()..], - "page 1 differ" - ); - continue; - } else { - assert_eq!(buf1, buf2, "page {} differ", i + 1); - } - } -} - -fn run_script<'a, T: Wal>( - conn: &'a Connection, - script: &'a str, - rng: &'a mut ChaCha8Rng, - wal_manager: impl WalManager + Clone + 'static, -) -> impl Iterator + 'a { - let mut stmts = split_statements(conn, script); - std::iter::from_fn(move || { - let stmt_str = patch_randomness(stmts.next()?, rng); - if stmt_str.trim_start().starts_with("ATTACH") { - patch_attach(&stmt_str, wal_manager.clone()); - } - let mut stmt = conn.prepare(&stmt_str).unwrap(); - - let ret = stmt - .query(()) - .unwrap() - .mapped(|r| Ok(format!("{r:?}"))) - .map(|r| { - // let _ = r.as_ref().map_err(|e| assert!(!matches!(e.sqlite_error_code().unwrap(), ErrorCode::DatabaseCorrupt))); - r.unwrap_or_else(|e| e.to_string()) - }) - .collect::(); - - Some((ret, stmt_str.to_string())) - }) -} - -fn patch_attach(s: &str, wal: impl WalManager) { - let mut split = s.split_whitespace(); - let name = split.nth(1).unwrap(); - let name = name.trim_matches('\''); - let _ = libsql_sys::Connection::open( - name, - OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_READ_WRITE, - wal, - 100000, - None, - ) - .unwrap(); -} - -fn patch_randomness<'a>(s: &'a str, rng: &'a mut ChaCha8Rng) -> String { - static RE_RANDOM_BLOB: Lazy = - Lazy::new(|| Regex::new(r#"randomblob\((\d+)\)"#).unwrap()); - static RE_RANDOM: Lazy = Lazy::new(|| Regex::new(r#"random\(\)"#).unwrap()); - // static RE_STR: Lazy = Lazy::new(|| Regex::new(r#"randomstr\((\d+), (\d+)\)"#).unwrap()); - let s = RE_RANDOM_BLOB.replace_all(s, |cap: &Captures| { - let len = cap[1].parse::().unwrap(); - let mut data = vec![0; len]; - rng.fill_bytes(&mut data); - format!("X'{}'", hex::encode(data)) - }); - - RE_RANDOM - .replace_all(&s, |_cap: &Captures| { - let rand: u64 = rng.gen(); - format!("{rand}") - }) - .to_string() -} - -// shenanigans to split statments -fn split_statements<'a, T: Wal>( - conn: &'a Connection, - script: &'a str, -) -> impl Iterator + 'a { - let mut tail = script.as_ptr() as *const c_char; - let mut stmt = std::ptr::null_mut(); - let mut len = script.len(); - std::iter::from_fn(move || unsafe { - let previous = tail; - sqlite3_prepare(conn.handle(), previous, len as _, &mut stmt, &mut tail); - sqlite3_finalize(stmt); - if stmt.is_null() { - None - } else { - let start = previous as usize - (script.as_ptr() as usize); - let end = tail as usize - (script.as_ptr() as usize); - let s = std::str::from_utf8(&script.as_bytes()[start..end]).unwrap(); - len -= s.len(); - Some(s) - } - }) -}