diff --git a/.buildkite/pipeline.public-common.yml b/.buildkite/pipeline.public-common.yml index 134ba3dfc2..2b5a67ba41 100644 --- a/.buildkite/pipeline.public-common.yml +++ b/.buildkite/pipeline.public-common.yml @@ -117,6 +117,7 @@ steps: - export RUST_BACKTRACE=full - cargo --locked run --bin readyset-logictest -- verify logictests - cargo --locked run --bin readyset-logictest -- verify logictests/psql --database-type postgresql + - cargo --locked run --bin readyset-logictest -- verify logictests/mysql --database-type mysql timeout_in_minutes: 60 depends_on: - build-image diff --git a/.cargo/config b/.cargo/config.toml similarity index 100% rename from .cargo/config rename to .cargo/config.toml diff --git a/Cargo.lock b/Cargo.lock index faecefeb90..debad2ce4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,23 +19,23 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.9", + "getrandom", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.9", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -43,18 +43,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -88,58 +88,57 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.56" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "array2" @@ -151,9 +150,9 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "assert_approx_eq" @@ -172,9 +171,9 @@ dependencies = [ [[package]] name = "async-bincode" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a31c08aa335b3ab414d29bdefe1f4353408abf93f3db1e3e2cc78d3ec4f0d43" +checksum = "942d9ad0df19d83070509a488b95844a3dd3117468acdf315bc21b593a4bd9d8" dependencies = [ "bincode", "byteorder", @@ -202,20 +201,20 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -237,9 +236,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "axum" @@ -293,10 +292,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom 0.2.9", + "getrandom", "instant", "pin-project-lite", - "rand 0.8.5", + "rand", "tokio", ] @@ -310,7 +309,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.5.4", "object", "rustc-demangle", "serde", @@ -318,21 +317,27 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" [[package]] name = "bb8" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b4b0f25f18bcdc3ac72bdb486ed0acf7e185221fd4dc985bc15db5800b0ba2" +checksum = "df7c2093d15d6a1d33b1f972e1c5ea3177748742b97a5f392aa83a65262c6780" dependencies = [ "async-trait", "futures-channel", @@ -349,7 +354,7 @@ dependencies = [ "async-trait", "atomic-counter", "chrono", - "clap 4.3.2", + "clap 4.5.4", "crossbeam-skiplist", "csv", "data-generator", @@ -368,11 +373,11 @@ dependencies = [ "nom-sql", "nom_locate", "num-integer", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "prometheus-parse", "proptest", "query-generator", - "rand 0.8.5", + "rand", "rand_distr", "readyset-adapter", "readyset-client", @@ -446,19 +451,19 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "regex", "rustc-hash", "shlex", - "syn 2.0.39", + "syn 2.0.60", ] [[package]] name = "bit-set" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] @@ -480,9 +485,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -507,9 +512,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -531,33 +536,33 @@ checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytecount" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.12.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "bzip2-sys" @@ -585,12 +590,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -610,9 +616,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -620,7 +626,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -648,9 +654,9 @@ dependencies = [ [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -659,15 +665,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", @@ -675,15 +681,15 @@ dependencies = [ [[package]] name = "cidr" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300bccc729b1ada84523246038aad61fead689ac362bb9d44beea6f6a188c34b" +checksum = "8d18b093eba54c9aaa1e3784d4361eb2ba944cf7d0a932a830132238f483e8d8" [[package]] name = "clang-sys" -version = "1.3.3" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", @@ -707,52 +713,50 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.2" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", - "bitflags 1.3.2", "clap_lex", - "strsim 0.10.0", + "strsim 0.11.1", "terminal_size", ] [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "heck 0.5.0", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "clipboard-win" -version = "4.4.1" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3e1238132dc01f081e1cbb9dace14e5ef4c3a51ee244bd982275fb514605db" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" dependencies = [ "error-code", "str-buf", @@ -761,27 +765,27 @@ dependencies = [ [[package]] name = "cloudflare-zlib" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfcefb5df07f146eb15756342a135eb7d76b8bb609eff9c111f7539d060f94d" +checksum = "40fa160a8670a2607111b0d6474261ad2992f3b4651982e14f902859086ecb91" dependencies = [ "cloudflare-zlib-sys", ] [[package]] name = "cloudflare-zlib-sys" -version = "0.3.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2040b6d1edfee6d75f172d81e2d2a7807534f3f294ce18184c70e7bb0105cd6f" +checksum = "c3185ff8c69c53ab346d5ac89f418e194b997d48393cae321cb611dd05f83c90" dependencies = [ "cc", ] [[package]] name = "cmake" -version = "0.1.48" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" dependencies = [ "cc", ] @@ -794,24 +798,24 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "futures-core", "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.2", + "tokio-util 0.7.10", ] [[package]] name = "concrete-iter" version = "0.1.0" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -830,9 +834,9 @@ dependencies = [ [[package]] name = "const-str" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9bcff0990fc0845922231ea0e394e50298d38e5fd6218b37e16df43663a747" +checksum = "3618cccc083bb987a415d85c02ca6c9994ea5b44731ec28b9ecf09658655fba9" [[package]] name = "consulrs" @@ -840,7 +844,7 @@ version = "0.1.0" source = "git+https://github.com/readysettech/consulrs.git?branch=allow-disabling-rustls-tls-2#177d1a5b86584e4ac76e54c26778a87f078c1a61" dependencies = [ "async-trait", - "base64 0.13.0", + "base64 0.13.1", "consulrs_derive", "derive_builder 0.10.2", "http", @@ -860,8 +864,8 @@ name = "consulrs_derive" version = "0.1.0" source = "git+https://github.com/readysettech/consulrs.git?branch=allow-disabling-rustls-tls-2#177d1a5b86584e4ac76e54c26778a87f078c1a61" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", "synstructure", ] @@ -874,9 +878,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -884,9 +888,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpp_demangle" @@ -908,18 +912,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -933,7 +937,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.3.2", + "clap 4.5.4", "criterion-plot", "futures", "is-terminal", @@ -964,11 +968,10 @@ dependencies = [ [[package]] name = "crossbeam" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" dependencies = [ - "cfg-if", "crossbeam-channel", "crossbeam-deque", "crossbeam-epoch", @@ -978,57 +981,49 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.13" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.5" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-skiplist" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883a5821d7d079fcf34ac55f27a833ee61678110f6b97637cc74513c0d0b42fc" +checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", - "scopeguard", ] [[package]] @@ -1037,6 +1032,12 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1049,9 +1050,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", "itoa", @@ -1061,9 +1062,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] @@ -1090,12 +1091,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "darling_core 0.14.2", - "darling_macro 0.14.2", + "darling_core 0.14.4", + "darling_macro 0.14.4", ] [[package]] @@ -1116,8 +1117,8 @@ checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "strsim 0.10.0", "syn 1.0.109", ] @@ -1130,22 +1131,22 @@ checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "strsim 0.10.0", "syn 1.0.109", ] [[package]] name = "darling_core" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a784d2ccaf7c98501746bf0be29b2022ba41fd62a2e622af997a03e9f972859f" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "strsim 0.10.0", "syn 1.0.109", ] @@ -1158,10 +1159,10 @@ checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "strsim 0.10.0", - "syn 2.0.39", + "syn 2.0.60", ] [[package]] @@ -1171,7 +1172,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" dependencies = [ "darling_core 0.12.4", - "quote 1.0.33", + "quote 1.0.36", "syn 1.0.109", ] @@ -1182,18 +1183,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core 0.13.4", - "quote 1.0.33", + "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "darling_core 0.14.2", - "quote 1.0.33", + "darling_core 0.14.4", + "quote 1.0.36", "syn 1.0.109", ] @@ -1204,8 +1205,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", - "quote 1.0.33", - "syn 2.0.39", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -1220,9 +1221,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "data-generator" @@ -1236,7 +1237,7 @@ dependencies = [ "mysql_async", "nom-sql", "proptest", - "rand 0.8.5", + "rand", "rand_regex", "readyset-data", "rust_decimal", @@ -1252,8 +1253,7 @@ dependencies = [ name = "database-utils" version = "0.1.0" dependencies = [ - "async-trait", - "clap 4.3.2", + "clap 4.5.4", "deadpool-postgres", "derive_more", "futures", @@ -1282,7 +1282,7 @@ dependencies = [ "mysql_async", "nom-sql", "partial-map", - "postgres 0.19.7", + "postgres 0.19.7 (git+https://github.com/readysettech/rust-postgres.git)", "proptest", "readyset-data", "readyset-errors", @@ -1301,11 +1301,11 @@ dependencies = [ name = "dataflow-state" version = "0.0.1" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.11", "anyhow", "async-trait", "bincode", - "clap 4.3.2", + "clap 4.5.4", "criterion", "derive_more", "hashbag", @@ -1318,7 +1318,7 @@ dependencies = [ "pretty_assertions", "proptest", "proptest-stateful", - "rand 0.7.3", + "rand", "readyset-alloc", "readyset-client", "readyset-common", @@ -1353,9 +1353,9 @@ dependencies = [ [[package]] name = "deadpool-postgres" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e866e414e9e12fc988f0bfb89a0b86228e7ed196ca509fbc4dcbc738c56e753c" +checksum = "836a24a9d49deefe610b8b60c767a7412e9a931d79a89415cd2d2d71630ca8d7" dependencies = [ "deadpool", "log", @@ -1365,9 +1365,9 @@ dependencies = [ [[package]] name = "deadpool-runtime" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa37046cc0f6c3cc6090fbdbf73ef0b8ef4cfcc37f6befc0020f63e8cf121e1" +checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" dependencies = [ "tokio", ] @@ -1378,7 +1378,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "uuid 1.3.0", + "uuid 1.8.0", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", ] [[package]] @@ -1406,8 +1415,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66e616858f6187ed828df7c64a6d71720d83767a7f19740b2d1b6fe6327b36e5" dependencies = [ "darling 0.12.4", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -1417,9 +1426,9 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" dependencies = [ - "darling 0.14.2", - "proc-macro2 1.0.69", - "quote 1.0.33", + "darling 0.14.4", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -1450,39 +1459,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "rustc_version", "syn 1.0.109", ] [[package]] name = "derive_utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7590f99468735a318c254ca9158d0c065aa9b5312896b5a043b5e39bc96f5fa2" -dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", -] - -[[package]] -name = "derive_utils" -version = "0.13.1" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ce151e1b790e3e36d767ae57691240feafe8b605e1c2fe081183d64ac1bff3" +checksum = "61bb5a1014ce6dfc2a378578509abe775a5aa06bff584a547555d9efdb81b926" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "diff" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" @@ -1518,9 +1516,9 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "encode_unicode" @@ -1536,9 +1534,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.29" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -1556,8 +1554,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -1567,8 +1565,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f16ef37b2a9b242295d61a154ee91ae884afff6b8b933b486b12481cc58310ca" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -1578,21 +1576,21 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e40a16955681d469ab3da85aaa6b42ff656b3c67b52e1d8d3dd36afe97fd462" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "enum_dispatch" -version = "0.3.8" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eb359f1476bf611266ac1f5355bc14aeca37b299d0ebccc038ee7058891c9cb" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" dependencies = [ "once_cell", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -1612,12 +1610,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1640,13 +1638,13 @@ dependencies = [ [[package]] name = "fail" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3245a0ca564e7f3c797d20d833a6870f57a728ac967d5225b3ffdef4465011" +checksum = "fe5e43d0f78a42ad591453aedb1d7ae631ce7ee445c7643691055a9ed8d3b01c" dependencies = [ - "lazy_static", "log", - "rand 0.8.5", + "once_cell", + "rand", ] [[package]] @@ -1660,7 +1658,7 @@ dependencies = [ name = "failpoint-proc-macros" version = "0.1.0" dependencies = [ - "quote 1.0.33", + "quote 1.0.36", "syn 1.0.109", ] @@ -1672,18 +1670,18 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "fd-lock" -version = "3.0.12" +version = "3.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ae6b3d9530211fb3b12a95374b8b0823be812f53d09e18c5675c0146b09642" +checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" dependencies = [ "cfg-if", - "rustix 0.37.8", + "rustix", "windows-sys 0.48.0", ] @@ -1711,6 +1709,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + [[package]] name = "fixedbitset" version = "0.2.0" @@ -1719,13 +1723,13 @@ checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "libz-sys", - "miniz_oxide", + "miniz_oxide 0.7.2", ] [[package]] @@ -1751,28 +1755,27 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fork" -version = "0.1.19" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b4f1a740392e495821244cc1658d86496ac6e67a47da67e243ed401b937717" +checksum = "60e74d3423998a57e9d906e49252fb79eb4a04d5cdfe188fb1b7ff9fc076a8ed" dependencies = [ "libc", ] [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "frunk" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd67cf7d54b7e72d0ea76f3985c3747d74aee43e0218ad993b7903ba7a5395e" +checksum = "11a351b59e12f97b4176ee78497dff72e4276fb1ceb13e19056aca7fa0206287" dependencies = [ "frunk_core", "frunk_derives", @@ -1781,55 +1784,43 @@ dependencies = [ [[package]] name = "frunk_core" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1246cf43ec80bf8b2505b5c360b8fb999c97dabd17dbb604d85558d5cbc25482" +checksum = "af2469fab0bd07e64ccf0ad57a1438f63160c69b2e57f04a439653d68eb558d6" [[package]] name = "frunk_derives" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dbc4f084ec5a3f031d24ccedeb87ab2c3189a2f33b8d070889073837d5ea09e" +checksum = "b0fa992f1656e1707946bbba340ad244f0814009ef8c0118eb7b658395f19a2e" dependencies = [ "frunk_proc_macro_helpers", - "quote 1.0.33", - "syn 1.0.109", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "frunk_proc_macro_helpers" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99f11257f106c6753f5ffcb8e601fb39c390a088017aaa55b70c526bff15f63e" +checksum = "35b54add839292b743aeda6ebedbd8b11e93404f902c56223e51b9ec18a13d2c" dependencies = [ "frunk_core", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "frunk_proc_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a078bd8459eccbb85e0b007b8f756585762a72a9efc53f359b371c3b6351dbcc" -dependencies = [ - "frunk_core", - "frunk_proc_macros_impl", - "proc-macro-hack", -] - -[[package]] -name = "frunk_proc_macros_impl" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffba99f0fa4f57e42f57388fbb9a0ca863bc2b4261f3c5570fed579d5df6c32" +checksum = "71b85a1d4a9a6b300b41c05e8e13ef2feca03e0334127f29eca9506a7fe13a93" dependencies = [ "frunk_core", "frunk_proc_macro_helpers", - "proc-macro-hack", - "quote 1.0.33", - "syn 1.0.109", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -1849,9 +1840,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1864,9 +1855,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1874,15 +1865,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1892,38 +1883,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1948,22 +1939,22 @@ dependencies = [ [[package]] name = "generator" -version = "0.7.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" dependencies = [ "cc", "libc", "log", "rustversion", - "winapi", + "windows", ] [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -1971,31 +1962,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ "fallible-iterator", "stable_deref_trait", @@ -2020,9 +2000,9 @@ dependencies = [ [[package]] name = "growable-bloom-filter" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8555f64d29ddd0c9a6ff88d3044b9566c77ad48dee6c30b3812c6e34dde90d9" +checksum = "c669fa03050eb3445343f215d62fc1ab831e8098bc9a55f26e9724faff11075c" dependencies = [ "serde", "serde_bytes", @@ -2042,24 +2022,28 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.6", "slab", "tokio", - "tokio-util 0.7.2", + "tokio-util 0.7.10", "tracing", ] [[package]] name = "half" -version = "1.8.2" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] [[package]] name = "hashbag" -version = "0.1.4" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461d126adae37fcc356c78b4c46966ac5dca1d41244e617af36bd4e09c7673d3" +checksum = "98f494b2060b2a8f5e63379e1e487258e014cee1b1725a735816c0107a2e9d93" [[package]] name = "hashbrown" @@ -2067,7 +2051,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] @@ -2076,26 +2060,26 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", ] [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", "allocator-api2", ] [[package]] name = "hdrhistogram" -version = "7.5.2" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.13.0", + "base64 0.21.7", "byteorder", "crossbeam-channel", "flate2", @@ -2108,7 +2092,7 @@ name = "health-reporter" version = "0.1.0" dependencies = [ "chrono", - "parking_lot 0.11.2", + "parking_lot 0.12.1", ] [[package]] @@ -2126,6 +2110,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -2137,9 +2127,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2169,9 +2159,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2180,9 +2170,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -2197,9 +2187,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -2209,9 +2199,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -2224,7 +2214,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2296,6 +2286,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "include_dir" version = "0.6.2" @@ -2315,8 +2315,8 @@ checksum = "0a0c890c85da4bab7bce4204c707396bbd3c6c8a681716a51c8814cfc2b682df" dependencies = [ "anyhow", "proc-macro-hack", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -2332,31 +2332,32 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.3", ] [[package]] name = "indicatif" -version = "0.17.3" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", + "instant", "number_prefix", - "portable-atomic 0.3.19", + "portable-atomic", "unicode-width", ] [[package]] name = "indoc" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adab1eaa3408fb7f0c777a73e7465fd5656136fc93b670eb6df3c88c2c1344e3" +checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" [[package]] name = "inferno" @@ -2364,8 +2365,8 @@ version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "321f0f839cd44a4686e9504b0a62b4d69a50b62072144c71c68f5873c167b8d9" dependencies = [ - "ahash 0.8.7", - "indexmap 2.1.0", + "ahash 0.8.11", + "indexmap 2.2.6", "is-terminal", "itoa", "log", @@ -2407,24 +2408,11 @@ dependencies = [ [[package]] name = "io-enum" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b0d47a958cb166282b4dc4840a35783e861c2b39080af846e6481ebe145eee" -dependencies = [ - "derive_utils 0.12.0", - "quote 1.0.33", - "syn 1.0.109", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "53b53d712d99a73eec59ee5e4fe6057f8052142d38eeafbbffcb06b36d738a6e" dependencies = [ - "hermit-abi 0.3.4", - "libc", - "windows-sys 0.48.0", + "derive_utils", ] [[package]] @@ -2433,7 +2421,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.3", + "socket2 0.5.6", "widestring", "windows-sys 0.48.0", "winreg 0.50.0", @@ -2441,31 +2429,28 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.7.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.4", - "io-lifetimes", - "rustix 0.37.8", - "windows-sys 0.48.0", + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", ] [[package]] name = "iter-enum" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83abfc4e5361c9cb087172c7f6d46a4db47e3c4fccf5d9168599451f230765cd" +checksum = "9afe8eb02c890a1731dffecae2a39a235ef45be79341460f25aea267e1de072f" dependencies = [ - "derive_utils 0.13.1", - "quote 1.0.33", - "syn 2.0.39", + "derive_utils", ] [[package]] @@ -2479,24 +2464,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2507,7 +2492,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", ] [[package]] @@ -2554,25 +2539,35 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.7.3" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "winapi", + "windows-targets 0.52.5", ] [[package]] name = "libm" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] [[package]] name = "librocksdb-sys" @@ -2591,9 +2586,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.8" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" dependencies = [ "cc", "pkg-config", @@ -2608,21 +2603,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2630,12 +2619,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "loom" @@ -2661,11 +2647,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efa59af2ddfad1854ae27d75009d538d0998b4b2fd47083e743ac1a10e46c60" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ - "hashbrown 0.14.1", + "hashbrown 0.14.3", ] [[package]] @@ -2689,9 +2675,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -2717,14 +2703,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matchit" @@ -2734,19 +2720,21 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "matrixmultiply" -version = "0.3.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" dependencies = [ + "autocfg", "rawpointer", ] [[package]] name = "md-5" -version = "0.10.4" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b48670c893079d3c2ed79114e3644b7004df1c361a4e0ad52e2e6940d07c3d" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] @@ -2758,9 +2746,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memmap" @@ -2774,9 +2762,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45fd3a57831bf88bc63f8cebc0cf956116276e97fef3966103e96416209f7c92" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" dependencies = [ "libc", ] @@ -2803,9 +2791,9 @@ name = "metrics" version = "0.21.1" source = "git+https://github.com/readysettech/metrics.git#9834afdd26f6dea20cd6bc1003fa15bf350cc0f5" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", "metrics-macros", - "portable-atomic 1.3.1", + "portable-atomic", ] [[package]] @@ -2813,7 +2801,7 @@ name = "metrics-exporter-prometheus" version = "0.12.1" source = "git+https://github.com/readysettech/metrics.git#9834afdd26f6dea20cd6bc1003fa15bf350cc0f5" dependencies = [ - "base64 0.21.0", + "base64 0.21.7", "hyper", "indexmap 1.9.3", "ipnet", @@ -2830,9 +2818,9 @@ name = "metrics-macros" version = "0.7.0" source = "git+https://github.com/readysettech/metrics.git#9834afdd26f6dea20cd6bc1003fa15bf350cc0f5" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -2847,7 +2835,7 @@ dependencies = [ "indexmap 1.9.3", "metrics", "num_cpus", - "ordered-float 3.7.0", + "ordered-float 3.9.2", "quanta", "radix_trie", "sketches-ddsketch", @@ -2855,9 +2843,9 @@ dependencies = [ [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -2874,6 +2862,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.8.11" @@ -2882,7 +2879,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] @@ -2898,7 +2895,7 @@ dependencies = [ "flate2", "io-enum", "libc", - "lru 0.12.0", + "lru 0.12.3", "mysql_common", "named_pipe", "native-tls", @@ -2907,25 +2904,25 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "socket2 0.5.3", + "socket2 0.5.6", "twox-hash", "url", ] [[package]] name = "mysql-common-derive" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c60492b5eb751e55b42d716b6b26dceb66767996cd7a5560a842fbf613ca2e92" +checksum = "afe0450cc9344afff34915f8328600ab5ae19260802a334d0f72d2d5bdda3bfe" dependencies = [ "darling 0.20.8", "heck 0.4.1", "num-bigint", "proc-macro-crate", "proc-macro-error", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", "termcolor", "thiserror", ] @@ -2934,11 +2931,10 @@ dependencies = [ name = "mysql-srv" version = "0.8.8" dependencies = [ - "async-trait", "byteorder", "chrono", "futures", - "getrandom 0.2.9", + "getrandom", "mysql", "mysql-time", "mysql_async", @@ -2984,7 +2980,7 @@ dependencies = [ "futures-util", "keyed_priority_queue", "lazy_static", - "lru 0.12.0", + "lru 0.12.3", "mio", "mysql_common", "native-tls", @@ -2992,28 +2988,28 @@ dependencies = [ "pem", "percent-encoding", "pin-project", - "rand 0.8.5", + "rand", "serde", "serde_json", - "socket2 0.5.3", + "socket2 0.5.6", "thiserror", "tokio", "tokio-native-tls", - "tokio-util 0.7.2", + "tokio-util 0.7.10", "twox-hash", "url", ] [[package]] name = "mysql_common" -version = "0.32.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a60cb978c0a1d654edcc1460f8d6092dacf21346ed6017d81fb76a23ef5a8de" +checksum = "d1e52cf194ab414202ead9dfda216d2a9ec59cc97ac024ba499ca686d82f040d" dependencies = [ - "base64 0.21.0", + "base64 0.21.7", "bigdecimal", "bindgen", - "bitflags 2.4.1", + "bitflags 2.5.0", "bitvec", "btoi", "byteorder", @@ -3028,7 +3024,7 @@ dependencies = [ "mysql-common-derive", "num-bigint", "num-traits", - "rand 0.8.5", + "rand", "regex", "rust_decimal", "saturating", @@ -3040,7 +3036,7 @@ dependencies = [ "subprocess", "thiserror", "time", - "uuid 1.3.0", + "uuid 1.8.0", "zstd", ] @@ -3055,9 +3051,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -3073,9 +3069,9 @@ dependencies = [ [[package]] name = "ndarray" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec23e6762830658d2b3d385a75aa212af2f67a4586d4442907144f3bb6a1ca8" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" dependencies = [ "matrixmultiply", "num-complex", @@ -3096,21 +3092,20 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "static_assertions", ] [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", @@ -3124,7 +3119,7 @@ dependencies = [ "bincode", "bit-vec", "chrono", - "clap 4.3.2", + "clap 4.5.4", "concrete-iter", "criterion", "derive_more", @@ -3162,9 +3157,9 @@ dependencies = [ [[package]] name = "nom_locate" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37794436ca3029a3089e0b95d42da1f0b565ad271e4d3bb4bad0c7bb70b10605" +checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3" dependencies = [ "bytecount", "memchr", @@ -3177,7 +3172,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "crossbeam-channel", "filetime", "fsevent-sys", @@ -3226,9 +3221,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -3237,13 +3232,19 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.2" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-format" version = "0.4.4" @@ -3256,19 +3257,18 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -3280,15 +3280,15 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -3342,11 +3342,11 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "cfg-if", "foreign-types", "libc", @@ -3361,9 +3361,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -3374,9 +3374,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -3392,7 +3392,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.1.0", + "indexmap 2.2.6", "js-sys", "once_cell", "pin-project-lite", @@ -3456,7 +3456,7 @@ dependencies = [ "opentelemetry", "ordered-float 4.2.0", "percent-encoding", - "rand 0.8.5", + "rand", "thiserror", "tokio", "tokio-stream", @@ -3464,9 +3464,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.7.0" +version = "3.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc2dbde8f8a79f2102cc474ceb0ad68e3b80b85289ea62389b60e66777e4213" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" dependencies = [ "num-traits", ] @@ -3494,7 +3494,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core 0.8.5", + "parking_lot_core 0.8.6", ] [[package]] @@ -3504,14 +3504,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.3", + "parking_lot_core 0.9.9", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", "instant", @@ -3523,15 +3523,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.4.1", "smallvec", - "windows-sys 0.36.1", + "windows-targets 0.48.5", ] [[package]] @@ -3553,9 +3553,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.6" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "peeking_take_while" @@ -3565,19 +3565,19 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "pem" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.21.0", + "base64 0.22.0", "serde", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "perf_event_open" @@ -3604,9 +3604,9 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_shared", ] @@ -3623,48 +3623,48 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", - "rand 0.8.5", + "rand", ] [[package]] name = "phf_shared" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3674,9 +3674,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plain" @@ -3686,9 +3686,9 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plotters" -version = "0.3.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ "num-traits", "plotters-backend", @@ -3699,40 +3699,34 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.2" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" [[package]] name = "plotters-svg" -version = "0.3.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" dependencies = [ "plotters-backend", ] [[package]] name = "portable-atomic" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" - -[[package]] -name = "portable-atomic" -version = "1.3.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bbda379e6e462c97ea6afe9f6233619b202bbc4968d7caa6917788d2070a044" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "postgres" -version = "0.19.3" +version = "0.19.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8bbcd5f6deb39585a0d9f4ef34c4a41c25b7ad26d23c75d837d78c8e7adc85f" +checksum = "7915b33ed60abc46040cbcaa25ffa1c7ec240668e0477c4f3070786f5916d451" dependencies = [ "bytes", "fallible-iterator", - "futures", + "futures-util", "log", "tokio", "tokio-postgres", @@ -3757,9 +3751,9 @@ version = "0.4.5" source = "git+https://github.com/readysettech/rust-postgres.git#dd34e4c4c38a2882c8722674456ef2f6e1d28297" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -3778,14 +3772,14 @@ name = "postgres-protocol" version = "0.6.6" source = "git+https://github.com/readysettech/rust-postgres.git#dd34e4c4c38a2882c8722674456ef2f6e1d28297" dependencies = [ - "base64 0.21.0", + "base64 0.21.7", "byteorder", "bytes", "fallible-iterator", "hmac", "md-5", "memchr", - "rand 0.8.5", + "rand", "sha2", "stringprep", ] @@ -3808,6 +3802,12 @@ dependencies = [ "uuid 0.8.2", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "pprof" version = "0.13.0" @@ -3854,12 +3854,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.4" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" +checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" dependencies = [ - "proc-macro2 1.0.69", - "syn 2.0.39", + "proc-macro2 1.0.81", + "syn 2.0.60", ] [[package]] @@ -3892,8 +3892,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", "version_check", ] @@ -3904,16 +3904,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "version_check", ] [[package]] name = "proc-macro-hack" -version = "0.5.19" +version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" @@ -3926,9 +3926,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -3940,34 +3940,33 @@ source = "git+https://github.com/readysettech/not-perf.git#f50e7896c4556395a5f61 [[package]] name = "prometheus-parse" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7a8ed15bcffc55fe0328931ef20d393bb89ad704756a37bd20cffb4804f306" +checksum = "c996f3caea1c51aa034c0d2dfd8447a12c555f4567b02677ef8a865ac4cce712" dependencies = [ "chrono", - "itertools", "lazy_static", "regex", ] [[package]] name = "proptest" -version = "1.0.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0d9cc07f18492d879586c92b485def06bc850da3118075cd45d50e9c95b0e5" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags 1.3.2", - "byteorder", + "bit-vec", + "bitflags 2.5.0", "lazy_static", "num-traits", - "quick-error 2.0.1", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax 0.8.3", "rusty-fork", "tempfile", + "unarray", ] [[package]] @@ -3976,7 +3975,7 @@ version = "0.1.3" dependencies = [ "async-trait", "proptest", - "rand 0.8.5", + "rand", "tokio", ] @@ -3998,8 +3997,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -4016,8 +4015,7 @@ dependencies = [ name = "psql-srv" version = "0.1.0" dependencies = [ - "async-trait", - "base64 0.21.0", + "base64 0.21.7", "bit-vec", "bytes", "chrono", @@ -4030,11 +4028,11 @@ dependencies = [ "hmac", "nom", "nom-sql", - "postgres 0.19.7", + "postgres 0.19.7 (git+https://github.com/readysettech/rust-postgres.git)", "postgres-native-tls", "postgres-protocol", "postgres-types", - "rand 0.8.5", + "rand", "readyset-adapter-types", "readyset-data", "readyset-tracing", @@ -4049,23 +4047,23 @@ dependencies = [ "tokio-native-tls", "tokio-postgres", "tokio-test", - "tokio-util 0.6.9", + "tokio-util 0.6.10", "tracing", "uuid 0.8.2", ] [[package]] name = "quanta" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc73c42f9314c4bdce450c77e6f09ecbddefbeddb1b5979ded332a3913ded33" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" dependencies = [ "crossbeam-utils", "libc", "mach2", "once_cell", "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "web-sys", "winapi", ] @@ -4077,7 +4075,7 @@ dependencies = [ "anyhow", "bit-vec", "chrono", - "clap 4.3.2", + "clap 4.5.4", "data-generator", "derive_more", "eui48", @@ -4087,9 +4085,9 @@ dependencies = [ "lazy_static", "mysql_async", "nom-sql", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "proptest", - "rand 0.8.5", + "rand", "rand_regex", "readyset-data", "readyset-sql-passes", @@ -4121,12 +4119,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quick-xml" version = "0.26.0" @@ -4147,11 +4139,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ - "proc-macro2 1.0.69", + "proc-macro2 1.0.81", ] [[package]] @@ -4171,37 +4163,14 @@ dependencies = [ ] [[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "libc", + "rand_chacha", + "rand_core", ] [[package]] @@ -4211,16 +4180,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -4229,7 +4189,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.9", + "getrandom", ] [[package]] @@ -4239,16 +4199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "rand", ] [[package]] @@ -4257,7 +4208,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b2a9fe2d7d9eeaf3279d1780452a5bbd26b31b27938787ef1c3e930d1e9cfbd" dependencies = [ - "rand 0.8.5", + "rand", "regex-syntax 0.6.29", ] @@ -4267,14 +4218,14 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] name = "raw-cpuid" -version = "10.2.0" +version = "10.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929f54e29691d4e6a9cc558479de70db7aa3d98cd6fe7ab86d7507aa2886b9d2" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" dependencies = [ "bitflags 1.3.2", ] @@ -4287,9 +4238,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -4314,7 +4265,7 @@ dependencies = [ "left-right", "partial-map", "proptest", - "rand 0.7.3", + "rand", "readyset-client", "readyset-util", "smallvec", @@ -4325,12 +4276,11 @@ dependencies = [ [[package]] name = "readyset" -version = "1.3.0" +version = "1.6.0" dependencies = [ "anyhow", - "async-trait", "chrono", - "clap 4.3.2", + "clap 4.5.4", "crossbeam-skiplist", "database-utils", "fail", @@ -4376,13 +4326,13 @@ dependencies = [ name = "readyset-adapter" version = "0.1.0" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.11", "anyhow", "async-trait", "bincode", "bit-vec", "chrono", - "clap 4.3.2", + "clap 4.5.4", "criterion", "crossbeam-skiplist", "dashmap", @@ -4398,17 +4348,17 @@ dependencies = [ "indexmap 1.9.3", "itertools", "lazy_static", - "lru 0.12.0", + "lru 0.12.3", "metrics", "metrics-exporter-prometheus", "metrics-util", "mysql_common", "nom", "nom-sql", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "proptest", "quanta", - "rand 0.8.5", + "rand", "readyset-adapter-types", "readyset-alloc", "readyset-client", @@ -4438,6 +4388,7 @@ dependencies = [ "tracing", "tracing-futures", "vec1", + "xxhash-rust", ] [[package]] @@ -4474,18 +4425,18 @@ dependencies = [ name = "readyset-client" version = "0.7.0" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.11", "anyhow", "array2", "async-bincode", "async-trait", "backoff", - "base64 0.13.0", + "base64 0.13.1", "bincode", "bit-vec", "bytes", "chrono", - "clap 4.3.2", + "clap 4.5.4", "cloudflare-zlib", "consulrs", "dataflow-expression", @@ -4506,10 +4457,10 @@ dependencies = [ "nom", "nom-sql", "nom_locate", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "petgraph", "proptest", - "rand 0.8.5", + "rand", "readyset-data", "readyset-errors", "readyset-sql-passes", @@ -4552,7 +4503,7 @@ dependencies = [ name = "readyset-client-metrics" version = "0.1.0" dependencies = [ - "clap 4.3.2", + "clap 4.5.4", "metrics", "nom-sql", "readyset-client", @@ -4600,7 +4551,7 @@ dependencies = [ "itertools", "mysql_async", "nom-sql", - "rand 0.8.5", + "rand", "readyset-adapter", "readyset-client", "readyset-client-metrics", @@ -4623,7 +4574,7 @@ dependencies = [ name = "readyset-clustertest-macros" version = "0.1.0" dependencies = [ - "quote 1.0.33", + "quote 1.0.36", "syn 1.0.109", ] @@ -4697,14 +4648,14 @@ dependencies = [ name = "readyset-dataflow" version = "0.7.0" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.11", "anyhow", "async-bincode", "backoff", "bincode", "bufstream", "byteorder", - "clap 4.3.2", + "clap 4.5.4", "criterion", "dataflow-expression", "dataflow-state", @@ -4723,7 +4674,7 @@ dependencies = [ "petgraph", "pin-project", "proptest", - "rand 0.7.3", + "rand", "reader-map", "readyset-alloc", "readyset-client", @@ -4737,7 +4688,7 @@ dependencies = [ "serde_derive", "serde_json", "serde_with", - "socket2 0.4.9", + "socket2 0.4.10", "strum", "strum_macros", "tempfile", @@ -4788,7 +4739,7 @@ dependencies = [ "bit-vec", "bytes", "chrono", - "clap 4.3.2", + "clap 4.5.4", "console", "database-utils", "derive_more", @@ -4861,7 +4812,7 @@ dependencies = [ "async-trait", "bincode", "chrono", - "clap 4.3.2", + "clap 4.5.4", "derive_more", "fail", "failpoint-macros", @@ -4912,7 +4863,7 @@ dependencies = [ "bit-vec", "chrono", "cidr", - "clap 4.3.2", + "clap 4.5.4", "criterion", "eui48", "fail", @@ -4927,7 +4878,7 @@ dependencies = [ "postgres-types", "proptest", "psql-srv", - "rand 0.8.5", + "rand", "readyset-adapter", "readyset-adapter-types", "readyset-client", @@ -4960,7 +4911,7 @@ name = "readyset-repl" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.3.2", + "clap 4.5.4", "console", "database-utils", "nom", @@ -4978,7 +4929,7 @@ dependencies = [ name = "readyset-server" version = "0.7.0" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.11", "anyhow", "array2", "assert_approx_eq", @@ -4989,7 +4940,7 @@ dependencies = [ "bincode", "catalog-tables", "chrono", - "clap 4.3.2", + "clap 4.5.4", "criterion", "database-utils", "dataflow-state", @@ -5015,13 +4966,12 @@ dependencies = [ "nom", "nom-sql", "num_cpus", - "once_cell", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "petgraph", "pin-project", "proptest", "querystring", - "rand 0.7.3", + "rand", "readyset-alloc", "readyset-alloc-metrics", "readyset-client", @@ -5092,7 +5042,7 @@ version = "0.1.0" dependencies = [ "async-trait", "backoff", - "base64 0.13.0", + "base64 0.13.1", "blake2", "derive_builder 0.11.2", "hex", @@ -5104,7 +5054,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "serde_with_macros 2.0.1", + "serde_with_macros 2.3.3", "thiserror", "tokio", "tracing", @@ -5117,7 +5067,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", - "clap 4.3.2", + "clap 4.5.4", "hyper", "readyset-client", "readyset-server", @@ -5129,15 +5079,14 @@ dependencies = [ name = "readyset-tracing" version = "0.1.0" dependencies = [ - "clap 4.3.2", + "clap 4.5.4", "lazy_static", - "once_cell", "opentelemetry", "opentelemetry-otlp", "opentelemetry-semantic-conventions", "opentelemetry_sdk", "parking_lot 0.12.1", - "rand 0.8.5", + "rand", "serde", "thiserror", "tokio", @@ -5162,10 +5111,10 @@ dependencies = [ "criterion", "eui48", "futures", - "postgres 0.19.7", + "postgres 0.19.7 (git+https://github.com/readysettech/rust-postgres.git)", "pprof", "proptest", - "rand 0.8.5", + "rand", "rust_decimal", "serde", "serde_json", @@ -5199,9 +5148,9 @@ dependencies = [ "pin-project-lite", "ryu", "sha1_smol", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", - "tokio-util 0.7.2", + "tokio-util 0.7.10", "url", ] @@ -5225,23 +5174,25 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom 0.2.9", - "redox_syscall 0.2.16", + "getrandom", + "libredox", + "thiserror", ] [[package]] name = "regex" -version = "1.8.4" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -5253,6 +5204,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.3", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -5261,9 +5223,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "replication-offset" @@ -5287,7 +5249,7 @@ dependencies = [ "bit-vec", "bytes", "chrono", - "clap 4.3.2", + "clap 4.5.4", "database-utils", "deadpool-postgres", "fail", @@ -5308,7 +5270,7 @@ dependencies = [ "postgres-types", "proptest", "proptest-stateful", - "rand 0.8.5", + "rand", "readyset-client", "readyset-client-test-helpers", "readyset-data", @@ -5334,11 +5296,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.0", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -5356,12 +5318,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", - "tokio-util 0.7.2", + "tokio-util 0.7.10", "tower-service", "url", "wasm-bindgen", @@ -5378,7 +5343,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" dependencies = [ "hostname", - "quick-error 1.2.3", + "quick-error", ] [[package]] @@ -5389,9 +5354,9 @@ checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" [[package]] name = "rgb" -version = "0.8.34" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3603b7d71ca82644f79b5a06d1220e9a58ede60bd32255f698cb1af8838b8db3" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" dependencies = [ "bytemuck", ] @@ -5407,9 +5372,9 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" dependencies = [ "byteorder", "num-traits", @@ -5418,9 +5383,9 @@ dependencies = [ [[package]] name = "rmp-serde" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +checksum = "938a142ab806f18b88a97b0dea523d39e0fd730a064b035726adcfc58a8a5188" dependencies = [ "byteorder", "rmp", @@ -5446,16 +5411,16 @@ dependencies = [ "byteorder", "bytes", "num-traits", - "postgres 0.19.3", + "postgres 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "tokio-postgres", ] [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -5496,8 +5461,8 @@ name = "rustify_derive" version = "0.5.2" source = "git+https://github.com/readysettech/rustify?branch=log-messages#f3c11081a5cc2f35e6ebd4700bfa5300171e58a1" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "regex", "serde_urlencoded", "syn 1.0.109", @@ -5506,36 +5471,31 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.8" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aef160324be24d31a62147fae491c14d2204a3865c7ca8c3b0d7f7bcb3ea635" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.1", - "windows-sys 0.48.0", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] -name = "rustix" -version = "0.38.21" +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys 0.4.10", - "windows-sys 0.48.0", + "base64 0.21.7", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "rusty-fork" @@ -5544,7 +5504,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" dependencies = [ "fnv", - "quick-error 1.2.3", + "quick-error", "tempfile", "wait-timeout", ] @@ -5578,15 +5538,15 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb35a55ab810b5c0fe31606fe9b47d1354e4dc519bec0a102655f78ea2b38057" dependencies = [ - "quote 1.0.33", + "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -5605,25 +5565,24 @@ checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71" [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "lazy_static", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "scoped-tls" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scroll" @@ -5636,20 +5595,20 @@ dependencies = [ [[package]] name = "scroll_derive" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "security-framework" -version = "2.4.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -5660,9 +5619,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -5670,44 +5629,44 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.4" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.156" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.5" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.156" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.89" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -5716,9 +5675,9 @@ dependencies = [ [[package]] name = "serde_stacker" -version = "0.1.7" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35f73df5c3072392d6a2abb8588d06db7f57b83dc95d5bbb96da71cd8468fcfd" +checksum = "babfccff5773ff80657f0ecf553c7c516bdc2eb16389c0918b36b73e7015276e" dependencies = [ "serde", "stacker", @@ -5753,21 +5712,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling 0.13.4", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "serde_with_macros" -version = "2.0.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ccadfacf6cf10faad22bbadf55986bdd0856edfb5d9210aa1dcf1f516e84e93" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ - "darling 0.14.2", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "darling 0.20.8", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -5799,16 +5758,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "sha-1" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", "cpufeatures", @@ -5817,9 +5776,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77f4e7f65455545c2153c1253d25056825e77ee2533f0e41deb65a93a34852f" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -5845,9 +5804,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -5860,24 +5819,24 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -5890,33 +5849,33 @@ dependencies = [ [[package]] name = "slotmap" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" dependencies = [ "version_check", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" dependencies = [ "serde", ] [[package]] name = "smawk" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -5924,12 +5883,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5948,8 +5907,8 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb2b4a1060801de1cc846aaae9e4255b04d809a1c5977de2b6cc9a2820d8a4f7" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -6000,9 +5959,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "str-buf" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44a3643b4ff9caf57abcee9c2c621d6c03d9135e0d8b589bd9afb5992cb176a" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" [[package]] name = "str_stack" @@ -6012,18 +5971,18 @@ checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" [[package]] name = "strawpoll" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b2fbf5804ba7164e6df8af32e95684b02ce5a014fa903e16e4c71253bcade72" +checksum = "a8379316b69d0e3dae008ff49ddef36d8ab9429cc750a211073560ad099a698d" dependencies = [ "futures-task", ] [[package]] name = "streaming-iterator" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "303235c177994a476226b80d076bd333b7b560fb05bd242a10609d11b07f81f5" +checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" [[package]] name = "string-interner" @@ -6036,10 +5995,11 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ + "finl_unicode", "unicode-bidi", "unicode-normalization", ] @@ -6056,14 +6016,20 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "structmeta" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "104842d6278bf64aa9d2f182ba4bde31e8aec7a131d29b7f444bb9b344a09e2a" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "structmeta-derive", "syn 1.0.109", ] @@ -6074,8 +6040,8 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24420be405b590e2d746d83b01f09af673270cf80e9b003a5fa7b651c58c7d93" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", ] @@ -6114,8 +6080,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "rustversion", "syn 1.0.109", ] @@ -6132,9 +6098,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "symbolic-common" @@ -6145,7 +6111,7 @@ dependencies = [ "debugid", "memmap2", "stable_deref_trait", - "uuid 1.3.0", + "uuid 1.8.0", ] [[package]] @@ -6176,19 +6142,19 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.39" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "unicode-ident", ] @@ -6204,10 +6170,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "syn 1.0.109", - "unicode-xid 0.2.2", + "unicode-xid 0.2.4", ] [[package]] @@ -6217,7 +6183,7 @@ dependencies = [ "anyhow", "benchmarks", "bincode", - "clap 4.3.2", + "clap 4.5.4", "criterion", "database-utils", "fork", @@ -6244,6 +6210,27 @@ dependencies = [ "tokio-postgres", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -6252,21 +6239,20 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "temp-dir" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab" +checksum = "1f227968ec00f0e5322f9b8173c7a0cbcff6181a0a5b28e9892491c286277231" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", - "rustix 0.38.21", - "windows-sys 0.48.0", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -6291,22 +6277,22 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.37.8", + "rustix", "windows-sys 0.48.0", ] [[package]] name = "test-strategy" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c18b325ca048e49683d5cb9166a50191fc862e36020706bbd7723c22a05d4ffa" +checksum = "62d6408d1406657be2f9d1701fbae379331d30d2f6e92050710edb0d34eeb480" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", + "proc-macro2 1.0.81", + "quote 1.0.36", "structmeta", "syn 1.0.109", ] @@ -6324,7 +6310,7 @@ dependencies = [ name = "test-utils-proc-macros" version = "0.0.0" dependencies = [ - "quote 1.0.33", + "quote 1.0.36", "syn 1.0.109", ] @@ -6350,38 +6336,39 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "thread_local" -version = "1.1.4" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ + "cfg-if", "once_cell", ] [[package]] name = "tikv-jemalloc-ctl" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37706572f4b151dff7a0146e040804e9c26fe3a3118591112f05cf12a4216c1" +checksum = "619bfed27d807b54f7f776b9430d4f8060e66ee138a28632ca898584d462c31c" dependencies = [ "libc", "paste", @@ -6390,9 +6377,9 @@ dependencies = [ [[package]] name = "tikv-jemalloc-sys" -version = "0.5.3+5.3.0-patched" +version = "0.5.4+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a678df20055b43e57ef8cddde41cdfda9a3c1a060b67f4c5836dfb1d78543ba8" +checksum = "9402443cb8fd499b6f327e40565234ff34dbda27460c5b47db0db77443dd85d1" dependencies = [ "cc", "libc", @@ -6400,9 +6387,9 @@ dependencies = [ [[package]] name = "tikv-jemallocator" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20612db8a13a6c06d57ec83953694185a367e16945f66565e8028d2c0bd76979" +checksum = "965fe0c26be5c56c94e38ba547249074803efd52adfb66de62107d95aab3eaca" dependencies = [ "libc", "tikv-jemalloc-sys", @@ -6410,13 +6397,35 @@ dependencies = [ [[package]] name = "time" -version = "0.3.9" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ + "deranged", "itoa", "libc", + "num-conv", "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", ] [[package]] @@ -6442,7 +6451,7 @@ name = "tinylb" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.3.2", + "clap 4.5.4", "tokio", ] @@ -6467,15 +6476,15 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -6485,7 +6494,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.3", + "socket2 0.5.6", "tokio-macros", "windows-sys 0.48.0", ] @@ -6502,13 +6511,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -6539,10 +6548,10 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.8.5", - "socket2 0.5.3", + "rand", + "socket2 0.5.6", "tokio", - "tokio-util 0.7.2", + "tokio-util 0.7.10", "whoami", ] @@ -6553,7 +6562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" dependencies = [ "pin-project", - "rand 0.8.5", + "rand", "tokio", ] @@ -6569,9 +6578,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -6580,9 +6589,9 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b3cbabd3ae862100094ae433e1def582cf86451b4e9bf83aa7ac1d8a7d719" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" dependencies = [ "async-stream", "bytes", @@ -6610,9 +6619,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", @@ -6624,9 +6633,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.2" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -6638,9 +6647,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -6657,7 +6666,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -6670,7 +6679,7 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", "axum", - "base64 0.21.0", + "base64 0.21.7", "bytes", "futures-core", "futures-util", @@ -6710,10 +6719,10 @@ dependencies = [ "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand 0.8.5", + "rand", "slab", "tokio", - "tokio-util 0.7.2", + "tokio-util 0.7.10", "tower-layer", "tower-service", "tracing", @@ -6727,9 +6736,9 @@ checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" @@ -6761,9 +6770,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] @@ -6848,9 +6857,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.6" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0abf5a9b5ad4a5ac1393956ae03fb57033749d3983e2cac9afbfd5ae04ec2" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" dependencies = [ "serde", "stable_deref_trait", @@ -6869,10 +6878,10 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.2.3", "ipnet", "lazy_static", - "rand 0.8.5", + "rand", "smallvec", "thiserror", "tinyvec", @@ -6903,15 +6912,15 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tuple" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a40ba241047e1174c927dc5f61c141a166b938d61a2ff61838441368cc7d0e" +checksum = "9bb9f6bd73479481158ba8ee3edf17aca93354623d13f02e96a2014fdbc1c37e" dependencies = [ "num-traits", "serde", @@ -6924,57 +6933,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.8.5", + "rand", "static_assertions", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unarray" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-linebreak" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a52dcaab0c48d931f7cc8ef826fa51690a08e1ea55117ef26f89864f532383f" -dependencies = [ - "regex", -] +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -6984,9 +6996,9 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "unicode_categories" @@ -6996,22 +7008,21 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "url" -version = "2.2.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 0.5.0", "percent-encoding", "serde", ] [[package]] name = "urlencoding" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf8parse" @@ -7025,14 +7036,14 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.9", + "getrandom", ] [[package]] name = "uuid" -version = "1.3.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" [[package]] name = "valuable" @@ -7048,9 +7059,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vec1" -version = "1.8.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc1631c774f0f9570797191e01247cbefde789eebfbf128074cb934115a6133" +checksum = "ffb60dcfffc189bfd4e2a81333c268619fee9db53da71bce2bcbd8e129c56936" dependencies = [ "serde", ] @@ -7101,31 +7112,23 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", - "winapi", "winapi-util", ] [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -7140,9 +7143,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -7150,24 +7153,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -7177,38 +7180,38 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ - "quote 1.0.33", + "quote 1.0.36", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -7219,9 +7222,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -7239,9 +7242,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fec781d48b41f8163426ed18e8fc2864c12937df9ce54c88ede7bd47270893e" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ "redox_syscall 0.4.1", "wasite", @@ -7250,9 +7253,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -7272,11 +7275,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "134306a13c5647ad6453e8deaec55d3a44d6021970129e6188735e74bf546697" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -7286,25 +7289,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.48.5", ] [[package]] -name = "windows-sys" -version = "0.36.1" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.52.5", ] [[package]] @@ -7313,7 +7312,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.5", ] [[package]] @@ -7322,152 +7321,129 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] -name = "windows_i686_msvc" -version = "0.36.1" +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -7508,9 +7484,9 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.2" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575e15bedf6e57b5c2d763ffc6c3c760143466cbd09d762d539680ab5992ded" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "yaml-rust" @@ -7542,43 +7518,43 @@ version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.81", + "quote 1.0.36", + "syn 2.0.60", ] [[package]] name = "zipf" -version = "7.0.0" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835688a7a1b5d2dfaeb5b7e1b4cfb979e7095a70cd1c72fe083f4904ef3e995e" +checksum = "390e51da0ed8cc3ade001d15fa5ba6f966b99c858fb466ec6b06d1682f1f94dd" dependencies = [ - "rand 0.8.5", + "rand", ] [[package]] name = "zstd" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.10+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index ed8b9aa271..f90c8ae89f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,10 +62,11 @@ members = [ resolver = "2" [workspace.dependencies] -clap = "4.3" +clap = "4.5" consulrs = { git = "https://github.com/readysettech/consulrs.git", branch = "allow-disabling-rustls-tls-2" } criterion = "0.5" eui48 = { git = "https://github.com/readysettech/eui48.git", branch = "master", default-features = false } +fork = "0.1" mysql_async = { git = "https://github.com/readysettech/mysql_async" } nperf-core = { git = "https://github.com/readysettech/not-perf.git" } postgres = { git = "https://github.com/readysettech/rust-postgres.git"} @@ -73,12 +74,177 @@ postgres-native-tls = { git = "https://github.com/readysettech/rust-postgres.gi postgres-protocol = { git = "https://github.com/readysettech/rust-postgres.git"} postgres-types = { git = "https://github.com/readysettech/rust-postgres.git"} tokio-postgres = { git = "https://github.com/readysettech/rust-postgres.git"} -tokio = { version = "1.32", features = ["full"] } -tokio-test = { version = "0.4.3" } +tokio = { version = "1.37", features = ["full"] } +tokio-test = { version = "0.4.4" } rocksdb = { git = "https://github.com/readysettech/rust-rocksdb.git", default-features = false, features = ["lz4", "jemalloc"] } metrics-exporter-prometheus = { git = "https://github.com/readysettech/metrics.git" } metrics = { git = "https://github.com/readysettech/metrics.git" } metrics-util = { git = "https://github.com/readysettech/metrics.git" } +ahash = "0.8" +anyhow = "1.0.82" +assert_approx_eq = "1.1.0" +assert_unordered = "0.3" +async-bincode = "0.6.2" +async-stream = "0.3.5" +async-trait = "0.1" +atomic-counter = "1.0.1" +backoff = "0.4.0" +backtrace = "=0.3.65" +bimap = "0.6.3" +bincode = "1.3.3" +bit-vec = "0.6" +blake2 = "0.10" +bufstream = "0.1.4" +byteorder = "1.5.0" +bytes = "1.6.0" +chashmap = "2.2.2" +chrono = "0.4.38" +chrono-tz = "0.8.6" +cidr = "0.2.2" +cloudflare-zlib = "0.2.10" +console = "0.15.8" +const-str = "0.5" +crossbeam-skiplist = "0.1.3" +csv = "1.3" +dashmap = "4.0.2" +deadpool-postgres = "0.10.5" +derive_builder = "0.11.2" +derive_more = "0.99.17" +diff = "0.1.13" +enum-display-derive = "0.1.1" +enum-kinds = "0.5.1" +enum_dispatch = "0.3.13" +envy = "0.4" +fail = "0.5.1" +fallible-iterator = "0.2.0" +fixedbitset = { version = "0.2.0", default-features = false } +futures = "0.3.30" +futures-core = "0.3.30" +futures-executor = "0.3.30" +futures-sink = "0.3.30" +futures-util = "0.3.30" +fxhash = "0.2.1" +getrandom = "0.2.14" +growable-bloom-filter = "2.1.0" +hashbag = "0.1.12" +hdrhistogram = "7.5" +hex = "0.4.3" +hmac = "0.12.1" +humantime = "2.1" +hyper = "0.14.28" +include_dir = "0.6.2" +indexmap = { version = "1.9.3", default-features = false } +indicatif = "0.17" +indoc = "1.0.9" +iter-enum = "1.1.3" +itertools = "0.10.5" +lazy_static = "1.4.0" +left-right = "0.11" +libc = "0.2" +lru = "0.12.3" +machine-uid = "0.2" +md5 = "0.7.0" +mysql = "25" +mysql_common = "0.32" +native-tls = "0.2.11" +ndarray = "0.15.6" +nom = "7.1.3" +nom_locate = "4.2.0" +notify = "6.1.1" +num-integer = "0.1.46" +num_cpus = "1.16.0" +opentelemetry = "0.21.0" +opentelemetry-otlp = "0.14.0" +opentelemetry-semantic-conventions = "0.13" +opentelemetry_sdk = "0.21.2" +parking_lot = "0.12.1" +paste = "1.0.14" +petgraph = "0.5" +pin-project = "1.1" +pprof = "0.13" +pratt = "0.3.0" +pretty_assertions = "1.4.0" +prettytable = "0.10.0" +proc-macro2 = "1" +prometheus-parse = "0.2.2" +proptest = "1.4.0" +quanta = { version = "0.11", default-features = false } +querystring = "1.1.0" +quote = "1.0.36" +rand = "0.8.5" +rand_distr = "0.4" +rand_regex = "0.15.1" +redis = "0.23.3" +regex = "1.10.4" +reqwest = "0.11.27" +rlimit = "0.10.1" +rmp-serde = "1.2.0" +rust_decimal = "1.26" +rusty-fork = "0.3.0" +rustyline = "11.0" +rustyline-derive = "0.6.0" +scopeguard = "1.2.0" +serde = "1.0.198" +serde_bytes = "0.11" +serde_derive = "1.0.198" +serde_json = "1.0.116" +serde_stacker = "0.1.11" +serde_with = "1.14" +serde_with_macros = "2.3.3" +serde_yaml = "0.8" +serial_test = "0.5.1" +sha-1 = "0.10.1" +sha1 = "0.10" +sha2 = "0.10.8" +slab = "0.4.9" +slotmap = "1.0.7" +smallvec = { version = "1.13.2", default-features = false } +socket2 = "0.4" +sqlformat = "0.2.1" +sqlparser = "0.41.0" +strawpoll = "0.2.3" +streaming-iterator = "0.1" +stringprep = "0.1.4" +structopt = "0.2" +strum = "0.23" +strum_macros = "0.23" +syn = { version = "1.0.109", default-features = false } +temp-dir = "0.1" +tempfile = "3.10.1" +test-strategy = "0.2.1" +textwrap = "0.14" +thiserror = "1.0.59" +tikv-jemalloc-ctl = "0.5.4" +tikv-jemalloc-sys = "0.5.4" +tikv-jemallocator = "0.5.4" +time = "0.3" +timekeeper = { version = "0.3.2", default-features = false } +tokio-native-tls = "0.3.1" +tokio-retry = "0.3" +tokio-scoped = "0.2.0" +tokio-stream = "0.1.15" +tokio-tower = "0.5.1" +tokio-util = "0.6.10" +toml = "0.5" +tower = "0.4.13" +tower-layer = "0.3.2" +tower-service = "0.3.2" +tracing = "0.1.40" +tracing-appender = "0.2.3" +tracing-attributes = "0.1.27" +tracing-futures = "0.2.5" +tracing-opentelemetry = "0.22.0" +tracing-subscriber = "0.3.18" +triomphe = "0.1" +tuple = "0.5.2" +url = "2.5.0" +uuid = "0.8" +vec1 = "1.12.0" +vec_map = "0.8.2" +vmemcached = "0.5.0" +walkdir = "2.5.0" +xxhash-rust = { version = "0.8.10", features = ["xxh3"] } +zipf = "7.0.1" [profile.release] debug=true diff --git a/array2/Cargo.toml b/array2/Cargo.toml index f6fe3e81ef..ad405fc0cb 100644 --- a/array2/Cargo.toml +++ b/array2/Cargo.toml @@ -6,5 +6,5 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -serde = { version = "1.0.137", features = ["derive"] } -thiserror = "1.0.31" +serde = { workspace = true, features = ["derive"] } +thiserror = { workspace = true } diff --git a/array2/src/lib.rs b/array2/src/lib.rs index e8e76a8d67..8be381d580 100644 --- a/array2/src/lib.rs +++ b/array2/src/lib.rs @@ -20,11 +20,9 @@ //! Internally, values are stored in a single continuous allocation row-first, alongside the length //! of the row. -#![feature(core_intrinsics, int_roundings)] +#![feature(int_roundings)] use std::fmt::Debug; -use std::intrinsics::unlikely; use std::ops::{Index, IndexMut}; -use std::usize; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -85,11 +83,16 @@ impl Array2 { /// passed an empty vector or if the rows are a different size. #[inline] pub fn try_from_rows(rows: Vec>) -> Result { + #[cold] + fn not_equal(x: usize, y: usize) -> bool { + x != y + } + let row_size = rows.first().ok_or(Error::Empty)?.len(); let mut elems = Vec::with_capacity(row_size * rows.len()); for (row_index, row) in rows.into_iter().enumerate() { - if unlikely(row.len() != row_size) { + if not_equal(row.len(), row_size) { return Err(Error::InconsistentRowSize { row_index, row_size, @@ -199,9 +202,7 @@ impl Array2 { /// ); /// ``` #[inline] - pub fn rows( - &self, - ) -> impl Iterator + ExactSizeIterator + DoubleEndedIterator + '_ { + pub fn rows(&self) -> impl ExactSizeIterator + DoubleEndedIterator + '_ { self.cells.chunks(self.row_size) } @@ -220,7 +221,7 @@ impl Array2 { /// ) /// ``` #[inline] - pub fn entries(&self) -> impl Iterator + ExactSizeIterator + '_ { + pub fn entries(&self) -> impl ExactSizeIterator + '_ { self.cells.iter().enumerate().map(move |(i, v)| { let row = i.div_floor(self.row_size); let col = i % self.row_size; @@ -243,9 +244,7 @@ impl Array2 { /// assert_eq!(my_array2, Array2::from_rows(vec![vec![1, 3], vec![4, 6]])) /// ``` #[inline] - pub fn entries_mut( - &mut self, - ) -> impl Iterator + ExactSizeIterator + '_ { + pub fn entries_mut(&mut self) -> impl ExactSizeIterator + '_ { let row_size = self.row_size; self.cells.iter_mut().enumerate().map(move |(i, v)| { let row = i.div_floor(row_size); @@ -270,7 +269,7 @@ impl Array2 { /// ) /// ``` #[inline] - pub fn into_entries(self) -> impl Iterator + ExactSizeIterator { + pub fn into_entries(self) -> impl ExactSizeIterator { self.cells .into_vec() .into_iter() diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml index d20fdfa438..b48a2fb036 100644 --- a/benchmarks/Cargo.toml +++ b/benchmarks/Cargo.toml @@ -6,45 +6,45 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -crossbeam-skiplist = "0.1.1" +crossbeam-skiplist = { workspace = true } tokio = { workspace = true, features = ["full"] } -anyhow = "1.0.38" -csv = "1.2" -nom = "7.1" -nom_locate = "4.0.0" -rand = "0.8.3" -rand_distr = "0.4" -tracing = "0.1.29" -async-trait = "0.1" -enum_dispatch = "0.3.7" -futures = "0.3" -vec1 = "1.8.0" -url = "2.2.2" -hdrhistogram = "7.4" -zipf = "7.0.0" +anyhow = { workspace = true } +csv = { workspace = true } +nom = { workspace = true } +nom_locate = { workspace = true } +rand = { workspace = true } +rand_distr = { workspace = true } +tracing = { workspace = true } +async-trait = { workspace = true } +enum_dispatch = { workspace = true } +futures = { workspace = true } +vec1 = { workspace = true } +url = { workspace = true } +hdrhistogram = { workspace = true } +zipf = { workspace = true } clap = { workspace = true, features = ["derive", "env"] } -reqwest = { version = "0.11.20", features = ["stream", "native-tls"] } -chrono = "0.4" -atomic-counter = "1.0.1" -serde_json = "1.0" -serde_yaml = "0.8" -serde = "1.0" -serde_with = "1.12" +reqwest = { workspace = true, features = ["stream", "native-tls"] } +chrono = { workspace = true } +atomic-counter = { workspace = true } +serde_json = { workspace = true } +serde_yaml = { workspace = true } +serde = { workspace = true } +serde_with = { workspace = true } metrics = { workspace = true } metrics-util = { workspace = true } metrics-exporter-prometheus = { workspace = true } -itertools = "0.10" -num-integer = "0.1.44" -lazy_static = "1.4.0" -thiserror = "1.0.30" -async-stream = "0.3.2" -parking_lot = "0.11.2" -indicatif = "0.17" -prometheus-parse = "0.2.2" -walkdir = "2.3" +itertools = { workspace = true } +num-integer = { workspace = true } +lazy_static = { workspace = true } +thiserror = { workspace = true } +async-stream = { workspace = true } +parking_lot = { workspace = true } +indicatif = { workspace = true } +prometheus-parse = { workspace = true } +walkdir = { workspace = true } tokio-postgres = { workspace = true } -vmemcached = "0.5.0" -redis = { version = "0.23.3", features = ["tokio-comp", "aio"] } +vmemcached = { workspace = true } +redis = { workspace = true, features = ["tokio-comp", "aio"] } # local dependencies database-utils = { path = "../database-utils" } @@ -96,8 +96,8 @@ path = "src/bin/snapshot_time.rs" [features] [dev-dependencies] -indoc = "1.0.3" -itertools = "0.10" -proptest = "1.0.0" -test-strategy = "0.2.0" -url = "2.2.2" +indoc = { workspace = true } +itertools = { workspace = true } +proptest = { workspace = true } +test-strategy = { workspace = true } +url = { workspace = true } diff --git a/benchmarks/src/benchmark.rs b/benchmarks/src/benchmark.rs index 10d5d155bf..7d04266aa6 100644 --- a/benchmarks/src/benchmark.rs +++ b/benchmarks/src/benchmark.rs @@ -14,7 +14,6 @@ use std::collections::HashMap; use std::str::FromStr; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseConnection, DatabaseType, DatabaseURL}; use enum_dispatch::enum_dispatch; @@ -265,7 +264,8 @@ impl BenchmarkOutput { /// The set of control functions needed to execute the benchmark in /// the `BenchmarkRunner`. -#[async_trait] +// Only used internally +#[allow(async_fn_in_trait)] #[enum_dispatch] pub trait BenchmarkControl { /// Any code required to perform setup of the benchmark goes here. This diff --git a/benchmarks/src/cache_hit_benchmark.rs b/benchmarks/src/cache_hit_benchmark.rs index a12b81f3ae..0400c4e066 100644 --- a/benchmarks/src/cache_hit_benchmark.rs +++ b/benchmarks/src/cache_hit_benchmark.rs @@ -4,7 +4,6 @@ use std::str::FromStr; use std::time::Instant; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseConnection, DatabaseURL, QueryableConnection}; use metrics::Unit; @@ -36,7 +35,6 @@ pub struct CacheHitBenchmark { num_cache_misses: u32, } -#[async_trait] impl BenchmarkControl for CacheHitBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator diff --git a/benchmarks/src/eviction_benchmark.rs b/benchmarks/src/eviction_benchmark.rs index 4a69fdbe43..a69d72d6d5 100644 --- a/benchmarks/src/eviction_benchmark.rs +++ b/benchmarks/src/eviction_benchmark.rs @@ -17,7 +17,6 @@ use std::sync::atomic::{AtomicBool, AtomicU64}; use std::time::{Duration, Instant}; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseURL, QueryableConnection}; use metrics::Unit; @@ -83,7 +82,6 @@ pub struct EvictionBenchmarkParams { target_hit_rate: f64, } -#[async_trait] impl BenchmarkControl for EvictionBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator @@ -335,7 +333,6 @@ async fn metrics_task( } } -#[async_trait] impl MultithreadBenchmark for EvictionBenchmark { type BenchmarkResult = EvictionBenchmarkResultBatch; type Parameters = EvictionBenchmarkParams; diff --git a/benchmarks/src/lib.rs b/benchmarks/src/lib.rs index ebc5a8d419..be956c5e53 100644 --- a/benchmarks/src/lib.rs +++ b/benchmarks/src/lib.rs @@ -23,7 +23,6 @@ //! row_count: u32, //! } //! -//! #[async_trait::async_trait] //! impl BenchmarkControl for MyBenchmark { //! async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { //! let mut conn = deployment.connect_to_setup().await?; diff --git a/benchmarks/src/migration_benchmark.rs b/benchmarks/src/migration_benchmark.rs index c2cdd6c13d..cb94bfcb2f 100644 --- a/benchmarks/src/migration_benchmark.rs +++ b/benchmarks/src/migration_benchmark.rs @@ -4,7 +4,6 @@ use std::str::FromStr; use std::time::Instant; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::DatabaseURL; use metrics::Unit; @@ -33,7 +32,6 @@ pub struct MigrationBenchmark { num_migrations: u32, } -#[async_trait] impl BenchmarkControl for MigrationBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator diff --git a/benchmarks/src/query_benchmark.rs b/benchmarks/src/query_benchmark.rs index 8c9adfc441..68e5603895 100644 --- a/benchmarks/src/query_benchmark.rs +++ b/benchmarks/src/query_benchmark.rs @@ -8,7 +8,6 @@ use std::str::FromStr; use std::time::{Duration, Instant}; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseURL, QueryableConnection}; use metrics::Unit; @@ -60,7 +59,6 @@ pub struct QueryBenchmarkThreadParams { query: ArbitraryQueryParameters, } -#[async_trait] impl BenchmarkControl for QueryBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator @@ -155,7 +153,6 @@ impl QueryBenchmarkResultBatch { } } -#[async_trait] impl MultithreadBenchmark for QueryBenchmark { type BenchmarkResult = QueryBenchmarkResultBatch; type Parameters = QueryBenchmarkThreadParams; diff --git a/benchmarks/src/read_write_benchmark.rs b/benchmarks/src/read_write_benchmark.rs index a1e10ae3e4..2fa846962d 100644 --- a/benchmarks/src/read_write_benchmark.rs +++ b/benchmarks/src/read_write_benchmark.rs @@ -5,7 +5,6 @@ use std::str::FromStr; use std::time::{Duration, Instant}; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseURL, QueryableConnection}; use metrics::Unit; @@ -84,7 +83,6 @@ pub struct ReadWriteBenchmarkThreadParams { upstream_conn_str: String, } -#[async_trait] impl BenchmarkControl for ReadWriteBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator @@ -190,7 +188,6 @@ impl ReadWriteBenchmarkResultBatch { } } -#[async_trait] impl MultithreadBenchmark for ReadWriteBenchmark { type BenchmarkResult = ReadWriteBenchmarkResultBatch; type Parameters = ReadWriteBenchmarkThreadParams; diff --git a/benchmarks/src/reporting/analysis.rs b/benchmarks/src/reporting/analysis.rs index b5fece2ad5..f5316fe15b 100644 --- a/benchmarks/src/reporting/analysis.rs +++ b/benchmarks/src/reporting/analysis.rs @@ -38,7 +38,6 @@ impl AnalysisInfo { #[derive(Debug)] pub struct Stats { - pub samples: i64, pub mean: f64, pub stdev: f64, } @@ -46,7 +45,6 @@ pub struct Stats { impl Stats { pub fn with(hist: &hdrhistogram::Histogram) -> Stats { Stats { - samples: hist.len() as i64, mean: hist.mean(), stdev: hist.stdev(), } diff --git a/benchmarks/src/reporting/storage/json.rs b/benchmarks/src/reporting/storage/json.rs index ae2b6654d2..c2653f7b21 100644 --- a/benchmarks/src/reporting/storage/json.rs +++ b/benchmarks/src/reporting/storage/json.rs @@ -44,7 +44,6 @@ struct Data { impl Data { fn to_stats(&self) -> Stats { Stats { - samples: self.samples as i64, mean: self.mean, stdev: self.stdev, } diff --git a/benchmarks/src/reporting/storage/postgres.rs b/benchmarks/src/reporting/storage/postgres.rs index b0b4a90851..65e9218fb7 100644 --- a/benchmarks/src/reporting/storage/postgres.rs +++ b/benchmarks/src/reporting/storage/postgres.rs @@ -146,7 +146,6 @@ impl Storage for PostgresStorage { None } [row, ..] => Some(Stats { - samples: row.get(0), mean: row.get(1), stdev: row.get(2), }), diff --git a/benchmarks/src/scale_connections.rs b/benchmarks/src/scale_connections.rs index bc8e256996..0e567cf0b7 100644 --- a/benchmarks/src/scale_connections.rs +++ b/benchmarks/src/scale_connections.rs @@ -3,7 +3,6 @@ use std::str::FromStr; use std::time::Instant; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::DatabaseURL; use metrics::Unit; @@ -27,7 +26,6 @@ pub struct ScaleConnections { parallel: bool, } -#[async_trait] impl BenchmarkControl for ScaleConnections { async fn setup(&self, _: &DeploymentParameters) -> Result<()> { Ok(()) diff --git a/benchmarks/src/scale_views.rs b/benchmarks/src/scale_views.rs index 0a86c432e4..5e6a49953b 100644 --- a/benchmarks/src/scale_views.rs +++ b/benchmarks/src/scale_views.rs @@ -11,7 +11,6 @@ use std::str::FromStr; use std::time::Instant; use anyhow::{bail, Result}; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseURL, QueryableConnection}; use itertools::Itertools; @@ -53,7 +52,6 @@ fn get_columns(num_views: usize, param_count: usize) -> Vec { (0..num_columns).map(|i| format!("c{}", i)).collect() } -#[async_trait] impl BenchmarkControl for ScaleViews { /// Creates a table with enough columns that we can create `num_views` off a /// combination of the columns. diff --git a/benchmarks/src/single_query_benchmark.rs b/benchmarks/src/single_query_benchmark.rs index 9acfa1ce24..e5405fb315 100644 --- a/benchmarks/src/single_query_benchmark.rs +++ b/benchmarks/src/single_query_benchmark.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use std::time::Instant; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use database_utils::{DatabaseConnection, DatabaseURL, QueryableConnection}; use metrics::Unit; @@ -37,7 +36,6 @@ pub struct SingleQueryBenchmark { ad_hoc: bool, } -#[async_trait] impl BenchmarkControl for SingleQueryBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator diff --git a/benchmarks/src/template.rs b/benchmarks/src/template.rs index d6695213ec..e2edce8faf 100644 --- a/benchmarks/src/template.rs +++ b/benchmarks/src/template.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; use anyhow::Result; -use async_trait::async_trait; use clap::Parser; use metrics::Unit; use serde::{Deserialize, Serialize}; @@ -16,7 +15,6 @@ pub struct Template { // Benchmark specific parameters go here. } -#[async_trait] impl BenchmarkControl for Template { async fn setup(&self, _: &DeploymentParameters) -> Result<()> { // Any code required to setup the benchmark goes. This may include diff --git a/benchmarks/src/utils/multi_thread.rs b/benchmarks/src/utils/multi_thread.rs index 78a790f49e..7c35aa2d38 100644 --- a/benchmarks/src/utils/multi_thread.rs +++ b/benchmarks/src/utils/multi_thread.rs @@ -1,7 +1,7 @@ +use std::future::Future; use std::time::Duration; use anyhow::Result; -use async_trait::async_trait; use futures::stream::futures_unordered::FuturesUnordered; use futures::StreamExt; use tokio::select; @@ -14,7 +14,6 @@ use crate::benchmark::BenchmarkResults; /// A group of methods that facilitate executing a single benchmark from multiple /// threads. This should be used in conjunction with `run_multithread_benchmark` /// to spawn the threads to run the benchmark. -#[async_trait] pub(crate) trait MultithreadBenchmark { /// The result messages passed to the result's thread via an UnboundedSender. type BenchmarkResult: Send; @@ -22,18 +21,18 @@ pub(crate) trait MultithreadBenchmark { type Parameters: Clone; /// Process a batch of benchmark results collected over `interval`. This aggregates /// all updates send on the `sender` parameter fo `benchmark_thread`. - async fn handle_benchmark_results( + fn handle_benchmark_results( results: Vec, interval: Duration, results: &mut BenchmarkResults, - ) -> Result<()>; + ) -> impl Future> + Send; /// Benchmarking code that is initialized using `params` that sends `BenchmarkResult` /// to be batched along `sender`. - async fn benchmark_thread( + fn benchmark_thread( params: Self::Parameters, sender: UnboundedSender, - ) -> Result<()>; + ) -> impl Future> + Send; } /// Returns after `duration` if it is Some, otherwise, never returns. Useful diff --git a/benchmarks/src/workload_emulator.rs b/benchmarks/src/workload_emulator.rs index 38958ac114..1f8e9836ac 100644 --- a/benchmarks/src/workload_emulator.rs +++ b/benchmarks/src/workload_emulator.rs @@ -15,7 +15,6 @@ use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; use anyhow::Result; -use async_trait::async_trait; use clap::{Parser, ValueEnum}; use database_utils::{DatabaseConnection, DatabaseStatement, QueryableConnection}; use metrics::Unit; @@ -178,7 +177,6 @@ impl WorkloadResultBatch { } } -#[async_trait] impl BenchmarkControl for WorkloadEmulator { async fn setup(&self, deployment: &DeploymentParameters) -> anyhow::Result<()> { if let Some(ref data_generator) = self.data_generator { @@ -472,7 +470,6 @@ fn ttl_jitter(ttl_secs: u32) -> u32 { ttl_secs + (ttl_secs as f32 * variance) as u32 } -#[async_trait] impl MultithreadBenchmark for WorkloadEmulator { type BenchmarkResult = WorkloadResultBatch; type Parameters = WorkloadThreadParams; diff --git a/benchmarks/src/write_benchmark.rs b/benchmarks/src/write_benchmark.rs index 4454a5b33f..dedfdfa3b8 100644 --- a/benchmarks/src/write_benchmark.rs +++ b/benchmarks/src/write_benchmark.rs @@ -6,7 +6,6 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use anyhow::{bail, Result}; -use async_trait::async_trait; use clap::{Parser, ValueHint}; use database_utils::{DatabaseConnection, DatabaseError, DatabaseURL, QueryableConnection}; use itertools::Itertools; @@ -167,7 +166,6 @@ async fn create_indices( Ok(()) } -#[async_trait] impl BenchmarkControl for WriteBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { let mut conn = DatabaseURL::from_str(&deployment.target_conn_str)? @@ -224,7 +222,6 @@ impl BenchmarkControl for WriteBenchmark { } } -#[async_trait] impl MultithreadBenchmark for WriteBenchmark { type BenchmarkResult = u128; type Parameters = WriteBenchmarkThreadData; diff --git a/benchmarks/src/write_latency_benchmark.rs b/benchmarks/src/write_latency_benchmark.rs index 5aec2b1157..b789a9bc5b 100644 --- a/benchmarks/src/write_latency_benchmark.rs +++ b/benchmarks/src/write_latency_benchmark.rs @@ -3,7 +3,6 @@ use std::convert::TryFrom; use std::time::Instant; use anyhow::{anyhow, bail, Result}; -use async_trait::async_trait; use clap::Parser; use database_utils::QueryableConnection; use metrics::Unit; @@ -34,7 +33,6 @@ pub struct WriteLatencyBenchmark { updates: u32, } -#[async_trait] impl BenchmarkControl for WriteLatencyBenchmark { async fn setup(&self, deployment: &DeploymentParameters) -> Result<()> { self.data_generator diff --git a/build/Dockerfile.cargo-deny b/build/Dockerfile.cargo-deny index 38ccb6f17b..7d10562dc4 100644 --- a/build/Dockerfile.cargo-deny +++ b/build/Dockerfile.cargo-deny @@ -1,3 +1,3 @@ -FROM 305232526136.dkr.ecr.us-east-2.amazonaws.com/ecr-public/docker/library/rust:1.74 +FROM 305232526136.dkr.ecr.us-east-2.amazonaws.com/ecr-public/docker/library/rust:1.78 -RUN cargo install cargo-deny --version 0.13.7 && cargo deny --version +RUN cargo install cargo-deny --version 0.14.23 && cargo deny --version diff --git a/concrete-iter/Cargo.toml b/concrete-iter/Cargo.toml index b7c92a1e04..fcd9f615d2 100644 --- a/concrete-iter/Cargo.toml +++ b/concrete-iter/Cargo.toml @@ -6,9 +6,9 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -syn = { version = "1.0.57", features = ["full", "parsing", "printing", "visit", "visit-mut", "extra-traits"] } -quote = "1.0.8" -proc-macro2 = "1" +syn = { workspace = true, features = ["full", "parsing", "printing", "visit", "visit-mut", "extra-traits"] } +quote = { workspace = true } +proc-macro2 = { workspace = true } [lib] proc-macro = true diff --git a/data-generator/Cargo.toml b/data-generator/Cargo.toml index 10605eff03..3030837dec 100644 --- a/data-generator/Cargo.toml +++ b/data-generator/Cargo.toml @@ -6,24 +6,24 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0.38" -bit-vec = { version = "0.6", features = ["serde"] } -chrono = "0.4.19" +anyhow = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +chrono = { workspace = true } eui48 = { workspace = true } -growable-bloom-filter = "2.0.1" -rand = "0.8.3" -rand_regex = "0.15.1" -rust_decimal = "1.26" -uuid = "0.8" -zipf = "7.0.0" +growable-bloom-filter = { workspace = true } +rand = { workspace = true } +rand_regex = { workspace = true } +rust_decimal = { workspace = true } +uuid = { workspace = true } +zipf = { workspace = true } nom-sql = { path = "../nom-sql" } readyset-data = { path = "../readyset-data/" } [dev-dependencies] -test-strategy = "0.2.0" -proptest = "1.0.0" +test-strategy = { workspace = true } +proptest = { workspace = true } mysql_async = { workspace = true } tokio = { workspace = true, features = ["full"] } -serial_test = "0.5" +serial_test = { workspace = true } test-utils = { path = "../test-utils" } diff --git a/data-generator/src/lib.rs b/data-generator/src/lib.rs index d747f5e023..2a4e4e6bd9 100644 --- a/data-generator/src/lib.rs +++ b/data-generator/src/lib.rs @@ -427,9 +427,9 @@ pub fn value_of_type(typ: &SqlType) -> DfValue { // octets. DfValue::ByteArray(Arc::new(vec![0u8])) } - SqlType::Int(_) | SqlType::Int4 | SqlType::Serial => 1i32.into(), + SqlType::Int(_) | SqlType::MediumInt(_) | SqlType::Int4 | SqlType::Serial => 1i32.into(), SqlType::BigInt(_) | SqlType::Int8 | SqlType::BigSerial => 1i64.into(), - SqlType::UnsignedInt(_) => 1u32.into(), + SqlType::UnsignedInt(_) | SqlType::UnsignedMediumInt(_) => 1u32.into(), SqlType::UnsignedBigInt(_) => 1u64.into(), SqlType::TinyInt(_) => 1i8.into(), SqlType::UnsignedTinyInt(_) => 1u8.into(), @@ -533,6 +533,8 @@ where SqlType::UnsignedTinyInt(_) => rng.gen::().into(), SqlType::SmallInt(_) | SqlType::Int2 => rng.gen::().into(), SqlType::UnsignedSmallInt(_) => rng.gen::().into(), + SqlType::MediumInt(_) => rng.gen_range((-1i32 << 23)..(1i32 << 23)).into(), + SqlType::UnsignedMediumInt(_) => rng.gen_range(0..(1u32 << 24)).into(), SqlType::Float | SqlType::Double => 1.5f64.try_into().unwrap(), SqlType::Real => 1.5f32.try_into().unwrap(), SqlType::Decimal(prec, scale) => { @@ -660,6 +662,8 @@ pub fn unique_value_of_type(typ: &SqlType, idx: u32) -> DfValue { SqlType::UnsignedTinyInt(_) => (idx).into(), SqlType::SmallInt(_) | SqlType::Int2 => (idx as i16).into(), SqlType::UnsignedSmallInt(_) => (idx as u16).into(), + SqlType::MediumInt(_) => (idx as i32).into(), + SqlType::UnsignedMediumInt(_) => (idx).into(), SqlType::Float | SqlType::Double => (1.5 + idx as f64).try_into().unwrap(), SqlType::Real => (1.5 + idx as f32).try_into().unwrap(), SqlType::Decimal(prec, scale) => Decimal::new(clamp_digits(*prec as _), *scale as _).into(), diff --git a/database-utils/Cargo.toml b/database-utils/Cargo.toml index 5a01aad217..2500fbe627 100644 --- a/database-utils/Cargo.toml +++ b/database-utils/Cargo.toml @@ -6,19 +6,18 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -derive_more = "0.99.17" -futures = "0.3.21" +derive_more = { workspace = true } +futures = { workspace = true } mysql_async = { workspace = true } -native-tls = "0.2.8" -thiserror = "1.0.30" +native-tls = { workspace = true } +thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } tokio-postgres = { workspace = true, features = ["with-chrono-0_4"] } postgres-native-tls = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -serde = { version = "1.0", features = ["derive"] } +serde = { workspace = true, features = ["derive"] } readyset-util = { path = "../readyset-util" } readyset-errors = { path = "../readyset-errors" } -async-trait = "0.1" nom-sql = { path = "../nom-sql" } -deadpool-postgres = "0.10.3" -num_cpus = "1.15.0" +deadpool-postgres = { workspace = true } +num_cpus = { workspace = true } diff --git a/database-utils/src/connection.rs b/database-utils/src/connection.rs index 160c908367..9bc3f89699 100644 --- a/database-utils/src/connection.rs +++ b/database-utils/src/connection.rs @@ -3,7 +3,6 @@ use std::hash::{Hash, Hasher}; use std::marker::{Send, Sync}; use std::str; -use async_trait::async_trait; use derive_more::From; use futures::TryStreamExt; use mysql::prelude::AsQuery; @@ -15,7 +14,8 @@ use {mysql_async as mysql, tokio_postgres as pgsql}; use crate::error::{ConnectionType, DatabaseError}; -#[async_trait] +// Only used internally +#[allow(async_fn_in_trait)] pub trait QueryableConnection: Send { /// Executes query_drop for either mysql or postgres, whichever is the underlying /// connection variant. @@ -121,7 +121,6 @@ pub enum DatabaseConnection { PostgreSQLPool(deadpool_postgres::Client), } -#[async_trait] impl QueryableConnection for DatabaseConnection { async fn query_drop(&mut self, stmt: Q) -> Result<(), DatabaseError> where @@ -316,7 +315,6 @@ impl DatabaseConnectionPool { } } -#[async_trait] impl QueryableConnection for DatabaseConnectionPool { async fn query_drop(&mut self, stmt: Q) -> Result<(), DatabaseError> where @@ -670,7 +668,6 @@ pub enum Transaction<'a> { PostgresPool(deadpool_postgres::Transaction<'a>), } -#[async_trait] impl<'a> QueryableConnection for Transaction<'a> { async fn query_drop(&mut self, stmt: Q) -> Result<(), DatabaseError> where diff --git a/dataflow-expression/Cargo.toml b/dataflow-expression/Cargo.toml index b78518f55a..6204900367 100644 --- a/dataflow-expression/Cargo.toml +++ b/dataflow-expression/Cargo.toml @@ -6,17 +6,17 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -chrono = { version = "0.4.0", features = ["serde"] } -chrono-tz = { version = "0.8.6", features = ["serde"] } -serde = { version = "1.0.8", features = ["derive"] } -serde_json = { version = "1.0" } -rust_decimal = { version = "1.26" } -lazy_static = "1.4.0" -regex = "1.4.3" -itertools = "0.10.3" -vec1 = "1.6" -proptest = "1.0.0" -test-strategy = "0.2.0" +chrono = { workspace = true, features = ["serde"] } +chrono-tz = { workspace = true, features = ["serde"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +rust_decimal = { workspace = true } +lazy_static = { workspace = true } +regex = { workspace = true } +itertools = { workspace = true } +vec1 = { workspace = true } +proptest = { workspace = true } +test-strategy = { workspace = true } # Local deps readyset-util = { path = "../readyset-util" } diff --git a/dataflow-expression/src/eval.rs b/dataflow-expression/src/eval.rs index ab586a537d..2c9155e3bc 100644 --- a/dataflow-expression/src/eval.rs +++ b/dataflow-expression/src/eval.rs @@ -343,7 +343,7 @@ mod tests { MySQL => crate::Dialect::DEFAULT_MYSQL, }; - expr_unwrap(Expr::lower(ast, expr_dialect, no_op_lower_context()), expr) + expr_unwrap(Expr::lower(ast, expr_dialect, &no_op_lower_context()), expr) .eval::(&[]) } @@ -1030,7 +1030,7 @@ mod tests { let expr = Expr::lower( parse_expr(nom_sql::Dialect::PostgreSQL, "a LIKE 'abc'").unwrap(), Dialect::DEFAULT_POSTGRESQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c == "a".into() { Ok((0, DfType::DEFAULT_TEXT)) } else { @@ -1048,7 +1048,7 @@ mod tests { let expr = Expr::lower( parse_expr(nom_sql::Dialect::PostgreSQL, "a = 'a'").unwrap(), Dialect::DEFAULT_POSTGRESQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c == "a".into() { Ok(( 0, diff --git a/dataflow-expression/src/eval/builtins.rs b/dataflow-expression/src/eval/builtins.rs index b6108d8aa3..0a27a9a07a 100644 --- a/dataflow-expression/src/eval/builtins.rs +++ b/dataflow-expression/src/eval/builtins.rs @@ -1081,7 +1081,7 @@ mod tests { PostgreSQL => crate::Dialect::DEFAULT_POSTGRESQL, MySQL => crate::Dialect::DEFAULT_MYSQL, }; - Expr::lower(ast, expr_dialect, numbered_columns()).unwrap() + Expr::lower(ast, expr_dialect, &numbered_columns()).unwrap() } #[test] @@ -1817,7 +1817,7 @@ mod tests { Expr::lower( ast, Dialect::DEFAULT_MYSQL, - resolve_columns(|c| match c.name.as_str() { + &resolve_columns(|c| match c.name.as_str() { "t" => Ok((0, DfType::DEFAULT_TEXT)), "f" => Ok((1, DfType::DEFAULT_TEXT)), _ => internal!(), diff --git a/dataflow-expression/src/lower.rs b/dataflow-expression/src/lower.rs index ea86718d2d..bc1872a24e 100644 --- a/dataflow-expression/src/lower.rs +++ b/dataflow-expression/src/lower.rs @@ -1,11 +1,11 @@ -use std::iter; +use std::{cmp, iter}; use nom_sql::{ BinaryOperator as SqlBinaryOperator, Column, DialectDisplay, Expr as AstExpr, FunctionExpr, InValue, Relation, UnaryOperator, }; use readyset_data::dialect::SqlEngine; -use readyset_data::{DfType, DfValue}; +use readyset_data::{Collation, DfType, DfValue}; use readyset_errors::{ internal, internal_err, invalid_query, invalid_query_err, unsupported, ReadySetError, ReadySetResult, @@ -459,63 +459,140 @@ impl BuiltinFunction { } } +fn mysql_temporal_types_cvt(left: &DfType, right: &DfType) -> Option { + let left_is_date_and_time = left.is_date_and_time(); + let right_is_date_and_time = right.is_date_and_time(); + + let left_is_temporal = left_is_date_and_time || left.is_any_temporal(); + let right_is_temporal = right_is_date_and_time || right.is_any_temporal(); + + if left_is_temporal && right_is_temporal { + if left_is_date_and_time && right_is_date_and_time { + if let DfType::DateTime { subsecond_digits } = left { + Some(DfType::DateTime { + subsecond_digits: cmp::max(*subsecond_digits, right.subsecond_digits()?), + }) + } else if let DfType::DateTime { subsecond_digits } = right { + Some(DfType::DateTime { + subsecond_digits: cmp::max(*subsecond_digits, left.subsecond_digits()?), + }) + } else if let DfType::TimestampTz { .. } = left + && let DfType::TimestampTz { .. } = right + { + Some(DfType::TimestampTz { + subsecond_digits: cmp::max(left.subsecond_digits()?, right.subsecond_digits()?), + }) + } else { + Some(DfType::Timestamp { + subsecond_digits: cmp::max(left.subsecond_digits()?, right.subsecond_digits()?), + }) + } + } else if let DfType::Time { + subsecond_digits: left_subsec_digs, + } = left + && let DfType::Time { + subsecond_digits: right_subsec_digs, + } = right + { + Some(DfType::Time { + subsecond_digits: cmp::max(*left_subsec_digs, *right_subsec_digs), + }) + } else if (matches!(left, DfType::Time { .. }) && right.is_any_int()) + || (matches!(right, DfType::Time { .. }) && left.is_any_int()) + { + Some(DfType::BigInt) + } else if left_is_date_and_time { + Some(left.clone()) + } else if right_is_date_and_time { + Some(right.clone()) + } else { + Some(DfType::Date) + } + } else if (left_is_date_and_time && right.is_any_int()) + || (right_is_date_and_time && left.is_any_int()) + { + Some(DfType::BigInt) + } else if left_is_temporal && right.is_any_text() { + Some(left.clone()) + } else if right_is_temporal && left.is_any_text() { + Some(right.clone()) + } else { + None + } +} + +fn get_text_type_max_length(ty: &DfType) -> Option { + match ty { + DfType::Text(..) => Some(65535), + DfType::VarChar(ln, _) => Some(*ln), + DfType::Char(ln, _) => Some(*ln), + _ => None, + } +} + +fn mysql_text_type_cvt(left: &DfType, right: &DfType) -> Option { + if left.is_any_text() && right.is_any_text() { + if matches!(left, DfType::Text(..)) || matches!(right, DfType::Text(..)) { + Some(DfType::DEFAULT_TEXT) + } else { + let left_len = get_text_type_max_length(left)?; + let right_len = get_text_type_max_length(right)?; + if let DfType::Char(..) = left + && let DfType::Char(..) = right + { + Some(DfType::Char( + cmp::max(left_len, right_len), + Collation::default(), + )) + } else { + Some(DfType::VarChar( + cmp::max(left_len, right_len), + Collation::default(), + )) + } + } + } else { + None + } +} + +fn mysql_numerical_type_cvt(left: &DfType, right: &DfType) -> Option { + if left.is_any_float() || right.is_any_float() { + Some(DfType::Double) + } else if left.is_any_int() && right.is_any_int() { + if left.is_any_unsigned_int() && right.is_any_unsigned_int() { + Some(DfType::UnsignedBigInt) + } else { + Some(DfType::BigInt) + } + } else { + let left_is_decimal = left.is_numeric(); + let right_is_decimal = right.is_numeric(); + if left_is_decimal && right_is_decimal { + // TODO: should return decimal, capable of storing max pres and scale + Some(left.clone()) + } else if left_is_decimal && right.is_any_exact_number() { + Some(left.clone()) + } else if left.is_any_exact_number() && right_is_decimal { + Some(right.clone()) + } else { + None + } + } +} + /// fn mysql_type_conversion(left_ty: &DfType, right_ty: &DfType) -> DfType { - match (left_ty, right_ty) { - // If both arguments in a comparison operation are strings, they are compared as strings. - (DfType::Text(_), DfType::Text(_)) => DfType::DEFAULT_TEXT, - - // If both arguments are integers, they are compared as integers. - ( - DfType::TinyInt - | DfType::UnsignedTinyInt - | DfType::SmallInt - | DfType::UnsignedSmallInt - | DfType::Int - | DfType::UnsignedInt - | DfType::BigInt - | DfType::UnsignedBigInt, - DfType::TinyInt - | DfType::UnsignedTinyInt - | DfType::SmallInt - | DfType::UnsignedSmallInt - | DfType::Int - | DfType::UnsignedInt - | DfType::BigInt - | DfType::UnsignedBigInt, - ) => DfType::BigInt, - - // > Hexadecimal values are treated as binary strings if not compared to a number. - // TODO - - // > If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a - // > constant, the constant is converted to a timestamp before the comparison is performed. - // > This is done to be more ODBC-friendly. This is not done for the arguments to IN() - // TODO - - // > If one of the arguments is a decimal value, comparison depends on the other argument. - // > The arguments are compared as decimal values if the other argument is a decimal or - // > integer value... - ( - decimal @ DfType::Numeric { .. }, - DfType::Numeric { .. } - | DfType::TinyInt - | DfType::UnsignedTinyInt - | DfType::SmallInt - | DfType::UnsignedSmallInt - | DfType::Int - | DfType::UnsignedInt - | DfType::BigInt - | DfType::UnsignedBigInt, - ) => decimal.clone(), - - // > or as floating-point values if the other argument is a floating-point value. - (DfType::Numeric { .. }, DfType::Float | DfType::Double) - | (DfType::Float | DfType::Double, DfType::Numeric { .. }) => DfType::Double, - - // > In all other cases, the arguments are compared as floating-point (double-precision) - // > numbers. - _ => DfType::Double, + if left_ty.is_bool() && right_ty.is_bool() { + DfType::Bool + } else if let Some(ty) = mysql_text_type_cvt(left_ty, right_ty) { + ty + } else if let Some(ty) = mysql_temporal_types_cvt(left_ty, right_ty) { + ty + } else if let Some(ty) = mysql_numerical_type_cvt(left_ty, right_ty) { + ty + } else { + DfType::Double } } @@ -744,7 +821,7 @@ impl Expr { /// - Replacing unary negation with `(expr * -1)` /// - Replacing unary NOT with `(expr != 1)` /// - Inferring the type of each node in the expression AST. - pub fn lower(expr: AstExpr, dialect: Dialect, context: C) -> ReadySetResult + pub fn lower(expr: AstExpr, dialect: Dialect, context: &C) -> ReadySetResult where C: LowerContext, { @@ -755,7 +832,7 @@ impl Expr { }) => { let args = arguments .into_iter() - .map(|arg| Self::lower(arg, dialect, context.clone())) + .map(|arg| Self::lower(arg, dialect, context)) .collect::, _>>()?; let (func, ty) = BuiltinFunction::from_name_and_args(&fname, args, dialect)?; Ok(Self::Call { @@ -764,7 +841,7 @@ impl Expr { }) } AstExpr::Call(FunctionExpr::Substring { string, pos, len }) => { - let string = Self::lower(*string, dialect, context.clone())?; + let string = Self::lower(*string, dialect, context)?; let ty = if string.ty().is_any_text() { string.ty().clone() } else { @@ -772,7 +849,7 @@ impl Expr { }; let func = Box::new(BuiltinFunction::Substring( string, - pos.map(|expr| Self::lower(*expr, dialect, context.clone())) + pos.map(|expr| Self::lower(*expr, dialect, context)) .transpose()?, len.map(|expr| Self::lower(*expr, dialect, context)) .transpose()?, @@ -801,7 +878,7 @@ impl Expr { Ok(Self::Column { index, ty }) } AstExpr::BinaryOp { lhs, op, rhs } => { - let mut left = Box::new(Self::lower(*lhs, dialect, context.clone())?); + let mut left = Box::new(Self::lower(*lhs, dialect, context)?); let mut right = Box::new(Self::lower(*rhs, dialect, context)?); let (op, negated) = BinaryOperator::from_sql_op(op, dialect, left.ty(), right.ty())?; @@ -895,8 +972,8 @@ impl Expr { let branches = branches .into_iter() .map(|branch| { - let condition = Self::lower(branch.condition, dialect, context.clone())?; - let body = Self::lower(branch.body, dialect, context.clone())?; + let condition = Self::lower(branch.condition, dialect, context)?; + let body = Self::lower(branch.body, dialect, context)?; Ok(CaseWhenBranch { condition, body }) }) .collect::>>()?; @@ -932,12 +1009,12 @@ impl Expr { BinaryOperator::Or }; - let lhs = Self::lower(*lhs, dialect, context.clone())?; + let lhs = Self::lower(*lhs, dialect, context)?; let make_comparison = |rhs| -> ReadySetResult<_> { let equal = Self::Op { left: Box::new(lhs.clone()), op: BinaryOperator::Equal, - right: Box::new(Self::lower(rhs, dialect, context.clone())?), + right: Box::new(Self::lower(rhs, dialect, context)?), ty: DfType::Bool, // type of = is always bool }; if negated { @@ -986,7 +1063,7 @@ impl Expr { expr: AstExpr, out: &mut Vec, dialect: Dialect, - context: C, + context: &C, ) -> ReadySetResult<()> where C: LowerContext, @@ -994,7 +1071,7 @@ impl Expr { match expr { AstExpr::Array(exprs) => { for expr in exprs { - flatten(expr, out, dialect, context.clone())?; + flatten(expr, out, dialect, context)?; } } _ => out.push(Expr::lower(expr, dialect, context)?), @@ -1038,13 +1115,13 @@ impl Expr { op: SqlBinaryOperator, rhs: AstExpr, dialect: Dialect, - context: C, + context: &C, mut is_all: bool, ) -> ReadySetResult where C: LowerContext, { - let mut left = Box::new(Self::lower(lhs, dialect, context.clone())?); + let mut left = Box::new(Self::lower(lhs, dialect, context)?); let mut right = Box::new(Self::lower(rhs, dialect, context)?); let (op, negated) = BinaryOperator::from_sql_op(op, dialect, left.ty(), right.ty())?; if negated { @@ -1196,7 +1273,7 @@ pub(crate) mod tests { let input = AstExpr::Literal("abc".into()); let result = - Expr::lower(input, Dialect::DEFAULT_POSTGRESQL, no_op_lower_context()).unwrap(); + Expr::lower(input, Dialect::DEFAULT_POSTGRESQL, &no_op_lower_context()).unwrap(); assert_eq!(result.ty(), &DfType::Unknown); } @@ -1206,7 +1283,7 @@ pub(crate) mod tests { let result = Expr::lower( input, Dialect::DEFAULT_MYSQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c == "t.x".into() { Ok((0, DfType::Int)) } else { @@ -1240,7 +1317,7 @@ pub(crate) mod tests { let result = Expr::lower( input, Dialect::DEFAULT_POSTGRESQL, - resolve_types(|ty| { + &resolve_types(|ty| { if ty.schema == Some("something".into()) && ty.name == "custom" { Some(enum_ty.clone()) } else { @@ -1272,7 +1349,7 @@ pub(crate) mod tests { let result = Expr::lower( input, Dialect::DEFAULT_MYSQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c == "t.x".into() { Ok((0, DfType::Int)) } else { @@ -1310,7 +1387,7 @@ pub(crate) mod tests { let result = Expr::lower( input, Dialect::DEFAULT_MYSQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c == "t.x".into() { Ok((0, DfType::Int)) } else { @@ -1341,7 +1418,7 @@ pub(crate) mod tests { #[test] fn call_concat_with_texts() { let input = parse_expr(ParserDialect::MySQL, "concat('My', 'SQ', 'L')").unwrap(); - let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, no_op_lower_context()).unwrap(); + let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, &no_op_lower_context()).unwrap(); assert_eq!( res, Expr::Call { @@ -1372,7 +1449,7 @@ pub(crate) mod tests { let res = Expr::lower( input, Dialect::DEFAULT_MYSQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c == "col".into() { Ok((0, DfType::Text(Collation::Citext))) } else { @@ -1406,7 +1483,7 @@ pub(crate) mod tests { #[test] fn substr_regular() { let input = parse_expr(ParserDialect::MySQL, "substr('abcdefghi', 1, 7)").unwrap(); - let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, no_op_lower_context()).unwrap(); + let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, &no_op_lower_context()).unwrap(); assert_eq!( res, Expr::Call { @@ -1432,7 +1509,7 @@ pub(crate) mod tests { #[test] fn substring_regular() { let input = parse_expr(ParserDialect::MySQL, "substring('abcdefghi', 1, 7)").unwrap(); - let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, no_op_lower_context()).unwrap(); + let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, &no_op_lower_context()).unwrap(); assert_eq!( res, Expr::Call { @@ -1458,7 +1535,7 @@ pub(crate) mod tests { #[test] fn substring_without_string_arg() { let input = parse_expr(ParserDialect::MySQL, "substring(123 from 2)").unwrap(); - let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, no_op_lower_context()).unwrap(); + let res = Expr::lower(input, Dialect::DEFAULT_MYSQL, &no_op_lower_context()).unwrap(); assert_eq!(res.ty(), &DfType::DEFAULT_TEXT); } @@ -1472,7 +1549,7 @@ pub(crate) mod tests { name: "greatest".into(), arguments: args.into_iter().map(AstExpr::Literal).collect(), }); - let result = Expr::lower(input, dialect, no_op_lower_context()).unwrap(); + let result = Expr::lower(input, dialect, &no_op_lower_context()).unwrap(); assert_eq!(result.ty(), &expected_ty); } @@ -1557,7 +1634,7 @@ pub(crate) mod tests { name: "greatest".into(), arguments: args.into_iter().map(AstExpr::Literal).collect(), }); - let result = Expr::lower(input, dialect, no_op_lower_context()).unwrap(); + let result = Expr::lower(input, dialect, &no_op_lower_context()).unwrap(); let compare_as = match result { Expr::Call { func, .. } => match *func { BuiltinFunction::Greatest { compare_as, .. } => compare_as, @@ -1610,7 +1687,7 @@ pub(crate) mod tests { let result = Expr::lower( input, Dialect::DEFAULT_MYSQL, - resolve_columns(|c| { + &resolve_columns(|c| { if c.name == "x" { Ok((0, DfType::DEFAULT_TEXT)) } else { @@ -1635,7 +1712,7 @@ pub(crate) mod tests { rhs: Box::new(AstExpr::Literal("abc".into())), }; let result = - Expr::lower(input, Dialect::DEFAULT_POSTGRESQL, no_op_lower_context()).unwrap(); + Expr::lower(input, Dialect::DEFAULT_POSTGRESQL, &no_op_lower_context()).unwrap(); assert_eq!(*result.ty(), DfType::Bool); } } @@ -1647,7 +1724,8 @@ pub(crate) mod tests { "ARRAY[[1, '2'::int], array[3, 4]]", ) .unwrap(); - let result = Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, no_op_lower_context()).unwrap(); + let result = + Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, &no_op_lower_context()).unwrap(); assert_eq!( result, Expr::Array { @@ -1682,7 +1760,8 @@ pub(crate) mod tests { #[test] fn op_some_to_any() { let expr = parse_expr(ParserDialect::PostgreSQL, "1 = ANY ('{1,2}')").unwrap(); - let result = Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, no_op_lower_context()).unwrap(); + let result = + Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, &no_op_lower_context()).unwrap(); assert_eq!( result, Expr::OpAny { @@ -1707,7 +1786,8 @@ pub(crate) mod tests { #[test] fn op_all() { let expr = parse_expr(ParserDialect::PostgreSQL, "1 = ALL ('{1,1}')").unwrap(); - let result = Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, no_op_lower_context()).unwrap(); + let result = + Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, &no_op_lower_context()).unwrap(); assert_eq!( result, Expr::OpAll { @@ -1736,7 +1816,8 @@ pub(crate) mod tests { "array_to_string(ARRAY[1], ',', '*')", ) .unwrap(); - let result = Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, no_op_lower_context()).unwrap(); + let result = + Expr::lower(expr, Dialect::DEFAULT_POSTGRESQL, &no_op_lower_context()).unwrap(); assert_eq!( result, Expr::Call { diff --git a/dataflow-expression/tests/common/mod.rs b/dataflow-expression/tests/common/mod.rs index fb0c77292f..031cf069b4 100644 --- a/dataflow-expression/tests/common/mod.rs +++ b/dataflow-expression/tests/common/mod.rs @@ -31,7 +31,7 @@ pub fn parse_lower_eval( expr_dialect: dataflow_expression::Dialect, ) -> DfValue { let ast = parse_expr(parser_dialect, expr).unwrap(); - let lowered = Expr::lower(ast, expr_dialect, TestLowerContext).unwrap(); + let lowered = Expr::lower(ast, expr_dialect, &TestLowerContext).unwrap(); match lowered.eval::(&[]) { Ok(res) => res, Err(e) => { diff --git a/dataflow-expression/tests/mysql_oracle.rs b/dataflow-expression/tests/mysql_oracle.rs index 0261c4ec3e..080b44949e 100644 --- a/dataflow-expression/tests/mysql_oracle.rs +++ b/dataflow-expression/tests/mysql_oracle.rs @@ -116,6 +116,10 @@ async fn example_exprs_eval_same_as_mysql() { "'7' + 5", "5 < '5.0'", "'5.0' > 5", + "'2004-01-01 12:00:00' = convert_tz('2004-01-01 12:00:00','GMT','MET')", + "'asdfadsf' = 'asdfadsf'", + "'12345' > '00012345'", + "timediff('2004-01-01 12:30:00', '2004-01-01 12:00:00') = '00:30:00'", "convert_tz('2004-01-01 12:00:00','GMT','MET')", "convert_tz('asdfadsf','asdf','MET')", "convert_tz('asdfadsf','asdf',null)", diff --git a/dataflow-state/Cargo.toml b/dataflow-state/Cargo.toml index f70f8645b6..9da1a9c7c5 100644 --- a/dataflow-state/Cargo.toml +++ b/dataflow-state/Cargo.toml @@ -6,27 +6,27 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -ahash = "0.7" -anyhow = "1.0" -bincode = "1.0.0" +ahash = { workspace = true } +anyhow = { workspace = true } +bincode = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -derive_more = "0.99.11" -hashbag = "0.1.2" -indexmap = "1.1.0" -itertools = "0.10" -notify = "6.1.1" -proptest = "1.0.0" -rand = "0.7" +derive_more = { workspace = true } +hashbag = { workspace = true } +indexmap = { workspace = true } +itertools = { workspace = true } +notify = { workspace = true } +proptest = { workspace = true } +rand = { workspace = true } rocksdb.workspace = true -serde = { version = "1.0.8", features = ["rc"] } -serde_json = "1.0.2" -tempfile = "3.4" -test-strategy = "0.2.0" -thiserror = "1.0.26" -tracing = { version = "0.1", features = ["release_max_level_debug"] } -tuple = "0.5.1" -vec1 = "1.6.0" -parking_lot = "0.12" +serde = { workspace = true, features = ["rc"] } +serde_json = { workspace = true } +tempfile = { workspace = true } +test-strategy = { workspace = true } +thiserror = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } +tuple = { workspace = true } +vec1 = { workspace = true } +parking_lot = { workspace = true } # local deps common = { path = "../readyset-common", package = "readyset-common" } @@ -40,11 +40,11 @@ replication-offset = { path = "../replication-offset" } [dev-dependencies] proptest-stateful = { path = "../proptest-stateful" } -async-trait = "0.1" -pretty_assertions = "1.4.0" -lazy_static = "1.0.0" +async-trait = { workspace = true } +pretty_assertions = { workspace = true } +lazy_static = { workspace = true } criterion = { workspace = true, features=['real_blackbox', 'async_tokio'] } -rust_decimal = { version = "1.26", features = ["db-tokio-postgres", "serde-str"] } +rust_decimal = { workspace = true, features = ["db-tokio-postgres", "serde-str"] } [[bench]] name = "persistent_state" diff --git a/dataflow-state/src/lib.rs b/dataflow-state/src/lib.rs index 667757113a..a335af15f1 100644 --- a/dataflow-state/src/lib.rs +++ b/dataflow-state/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(stmt_expr_attributes, bound_map, iter_order_by, bound_as_ref)] +#![feature(stmt_expr_attributes, iter_order_by, bound_as_ref)] mod key; mod keyed_state; @@ -252,9 +252,14 @@ pub trait State: SizeOf + Send { /// Remove all rows from this state fn clear(&mut self); - /// Tear down the state, freeing any resources. + /// Cleanly shut down the state, so that it can be reopened in the future. + /// This function is for standard restart operations. + fn shut_down(&mut self) -> ReadySetResult<()>; + + /// Tear down the state, freeing any resources. This is a permanent operation. /// For those states that are backed by resources outside ReadySet, the implementation of this - /// method should guarantee that those resources are freed. + /// method should guarantee that those resources are permamently freed (delete data from disk, + /// for example). fn tear_down(self) -> ReadySetResult<()>; } @@ -483,6 +488,14 @@ impl State for MaterializedNodeState { } } + fn shut_down(&mut self) -> ReadySetResult<()> { + match self { + MaterializedNodeState::Memory(ms) => ms.shut_down(), + MaterializedNodeState::Persistent(ps) => ps.shut_down(), + MaterializedNodeState::PersistentReadHandle(rh) => rh.shut_down(), + } + } + fn tear_down(self) -> ReadySetResult<()> { match self { MaterializedNodeState::Memory(ms) => ms.tear_down(), diff --git a/dataflow-state/src/memory_state.rs b/dataflow-state/src/memory_state.rs index 1bb7994177..0f8d685cdf 100644 --- a/dataflow-state/src/memory_state.rs +++ b/dataflow-state/src/memory_state.rs @@ -262,7 +262,7 @@ impl State for MemoryState { /// `weak_indices`. fn evict_bytes(&mut self, bytes: usize) -> Option { let mut rng = rand::thread_rng(); - let state_index = rng.gen_range(0, self.state.len()); + let state_index = rng.gen_range(0..self.state.len()); let mut bytes_freed = 0u64; let mut keys_evicted = Vec::new(); @@ -404,6 +404,10 @@ impl State for MemoryState { self.weak_indices[columns].lookup(key).map(From::from) } + fn shut_down(&mut self) -> ReadySetResult<()> { + Ok(()) + } + fn tear_down(self) -> ReadySetResult<()> { Ok(()) } diff --git a/dataflow-state/src/persistent_state/mod.rs b/dataflow-state/src/persistent_state/mod.rs index 83543f95fe..0c78e62806 100644 --- a/dataflow-state/src/persistent_state/mod.rs +++ b/dataflow-state/src/persistent_state/mod.rs @@ -489,7 +489,7 @@ impl WalFlusher { // Sleep for a random number of seconds between 1 and 10 to introduce jitter to // stagger flushes across different base tables let jitter = Duration::from_secs_f64( - rand::thread_rng().gen_range(0.0, self.flush_interval.as_secs_f64()), + rand::thread_rng().gen_range(0.0..self.flush_interval.as_secs_f64()), ); // We use recv_timeout for interruptible sleep. If recv_timeout() returns `Ok`, it means @@ -807,18 +807,13 @@ impl State for PersistentState { self.db.lookup_weak(columns, key) } - fn tear_down(mut self) -> ReadySetResult<()> { - if let Some((tx, jh)) = self.wal_flush_thread_handle.take() { - // Stop the thread that periodically flushes the WAL - tx.send(()).unwrap(); + fn shut_down(&mut self) -> ReadySetResult<()> { + trace!("PersistentState received shutdown, stopping the WAL"); + self.shut_down_wal() + } - jh.join().map_err(|_| { - ReadySetError::Internal(format!( - "could not join WAL flush thread for table {}", - self.name - )) - })?; - } + fn tear_down(mut self) -> ReadySetResult<()> { + let _ = &self.shut_down_wal()?; let temp_dir = self._tmpdir.take(); let full_path = self.db.inner().db.path().to_path_buf(); @@ -1049,6 +1044,10 @@ impl State for PersistentStateHandle { fn clear(&mut self) {} + fn shut_down(&mut self) -> ReadySetResult<()> { + Ok(()) + } + fn tear_down(self) -> ReadySetResult<()> { Ok(()) } @@ -2082,6 +2081,21 @@ impl PersistentState { Ok(()) } + + fn shut_down_wal(&mut self) -> ReadySetResult<()> { + if let Some((tx, jh)) = self.wal_flush_thread_handle.take() { + // Stop the thread that periodically flushes the WAL + tx.send(()).unwrap(); + + jh.join().map_err(|_| { + ReadySetError::Internal(format!( + "could not join WAL flush thread for table {}", + self.name + )) + })?; + } + Ok(()) + } } /// Checks if the given index is unique for this base table. @@ -2224,11 +2238,17 @@ impl SizeOf for PersistentState { .db .cf_handle(&idx.column_family) .unwrap_or_else(|| panic!("Column family not found: {}", idx.column_family)); - inner + let sstable_size = inner .db .property_int_value_cf(cf, "rocksdb.estimate-live-data-size") .unwrap() + .unwrap(); + let memtable_size = inner + .db + .property_int_value_cf(cf, "rocksdb.size-all-mem-tables") .unwrap() + .unwrap(); + sstable_size + memtable_size }) .sum() } diff --git a/deny.toml b/deny.toml index 55734a432b..154847f643 100644 --- a/deny.toml +++ b/deny.toml @@ -9,24 +9,6 @@ # The values provided in this template are the default values that will be used # when any section or field is not specified in your own configuration -# If 1 or more target triples (and optionally, target_features) are specified, -# only the specified targets will be checked when running `cargo deny check`. -# This means, if a particular package is only ever used as a target specific -# dependency, such as, for example, the `nix` crate only being used via the -# `target_family = "unix"` configuration, that only having windows targets in -# this list would mean the nix crate, as well as any of its exclusive -# dependencies not shared by any other crates, would be ignored, as the target -# list here is effectively saying which targets you are building for. -targets = [ - # The triple can be any string, but only the target triples built in to - # rustc (as of 1.40) can be checked against actual config expressions - #{ triple = "x86_64-unknown-linux-musl" }, - # You can also specify which target_features you promise are enabled for a - # particular target. target_features are currently not validated against - # the actual valid features supported by the target architecture. - #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, -] - # This section is considered when running `cargo deny check advisories` # More documentation for the advisories section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html @@ -35,16 +17,8 @@ targets = [ db-path = "~/.cargo/advisory-db" # The url(s) of the advisory databases to use db-urls = ["https://github.com/rustsec/advisory-db"] -# The lint level for security vulnerabilities -vulnerability = "deny" -# The lint level for unmaintained crates -unmaintained = "warn" # The lint level for crates that have been yanked from their source registry yanked = "warn" -# The lint level for crates with security notices. Note that as of -# 2019-12-17 there are no security notice advisories in -# https://github.com/rustsec/advisory-db -notice = "warn" # A list of advisory IDs to ignore. Note that ignored advisories will still # output a note when they are encountered. ignore = [ @@ -63,8 +37,6 @@ ignore = [ # More documentation for the licenses section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html [licenses] -# The lint level for crates which do not have a detectable license -unlicensed = "deny" # List of explicitly allowed licenses # See https://spdx.org/licenses/ for list of possible licenses # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. @@ -80,26 +52,6 @@ allow = [ "Zlib", "Unicode-DFS-2016", ] -# List of explicitly disallowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -deny = [ - #"Nokia", -] -# Lint level for licenses considered copyleft -copyleft = "deny" -# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses -# * both - The license will be approved if it is both OSI-approved *AND* FSF -# * either - The license will be approved if it is either OSI-approved *OR* FSF -# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF -# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved -# * neither - This predicate is ignored and the default lint level is used -allow-osi-fsf-free = "neither" -# Lint level used when no other predicates are matched -# 1. License isn't in the allow or deny lists -# 2. License isn't copyleft -# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" -default = "deny" # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the # canonical license text of a valid SPDX license file. @@ -110,7 +62,6 @@ confidence-threshold = 0.8 exceptions = [ # Each entry is the crate and version constraint, and its specific allow # list - { allow = ["CDDL-1.0"], name = "inferno", version = "*" }, ] # Some crates don't have (easily) machine readable licensing information, @@ -196,7 +147,6 @@ skip-tree = [ { name = "nperf-core", version = "0.1.1" }, { name = "metrics-util", version = "0.15.0" }, { name = "mysql", version = "25" }, - { name = "lru", version = "0.10.0" }, ] # This section is considered when running `cargo deny check sources`. diff --git a/failpoint-macros/proc-macros/Cargo.toml b/failpoint-macros/proc-macros/Cargo.toml index 30346d22d9..003a5a680f 100644 --- a/failpoint-macros/proc-macros/Cargo.toml +++ b/failpoint-macros/proc-macros/Cargo.toml @@ -6,8 +6,8 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -syn = {version="1.0.57",features=["full","fold"]} -quote = "1.0.8" +syn = { workspace = true, features = ["full", "fold"] } +quote = { workspace = true } [lib] proc-macro = true diff --git a/health-reporter/Cargo.toml b/health-reporter/Cargo.toml index 8a758abc08..04f3c6422b 100644 --- a/health-reporter/Cargo.toml +++ b/health-reporter/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -parking_lot = "0.11.2" -chrono = "0.4" +parking_lot = { workspace = true } +chrono = { workspace = true } diff --git a/logictests/generated/mysql/avg,avg_distinct,range_param.fail.test b/logictests/generated/mysql/1/avg,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/1/avg,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg,between_filters.test b/logictests/generated/mysql/1/avg,between_filters.test similarity index 100% rename from logictests/generated/mysql/avg,between_filters.test rename to logictests/generated/mysql/1/avg,between_filters.test diff --git a/logictests/generated/mysql/avg,distinct,inner_join.test b/logictests/generated/mysql/1/avg,distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,distinct,inner_join.test rename to logictests/generated/mysql/1/avg,distinct,inner_join.test diff --git a/logictests/generated/mysql/avg,equal_filters,left_join.test b/logictests/generated/mysql/1/avg,equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,left_join.test rename to logictests/generated/mysql/1/avg,equal_filters,left_join.test diff --git a/logictests/generated/mysql/avg,greater_filters,is_null_filters.fail.test b/logictests/generated/mysql/1/avg,greater_filters,is_null_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,is_null_filters.fail.test rename to logictests/generated/mysql/1/avg,greater_filters,is_null_filters.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,is_null_filters.fail.test b/logictests/generated/mysql/1/avg,greater_or_equal_filters,is_null_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,is_null_filters.fail.test rename to logictests/generated/mysql/1/avg,greater_or_equal_filters,is_null_filters.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters.fail.test b/logictests/generated/mysql/1/avg,greater_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters.fail.test rename to logictests/generated/mysql/1/avg,greater_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,join_subquery,range_param.fail.test b/logictests/generated/mysql/1/avg,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,join_subquery,range_param.fail.test rename to logictests/generated/mysql/1/avg,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,inner_join.fail.test b/logictests/generated/mysql/1/avg,less_or_equal_filters,inner_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,inner_join.fail.test rename to logictests/generated/mysql/1/avg,less_or_equal_filters,inner_join.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,left_join.fail.test b/logictests/generated/mysql/1/avg,less_or_equal_filters,left_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,left_join.fail.test rename to logictests/generated/mysql/1/avg,less_or_equal_filters,left_join.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,single_parameter.fail.test b/logictests/generated/mysql/1/avg,less_or_equal_filters,single_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,single_parameter.fail.test rename to logictests/generated/mysql/1/avg,less_or_equal_filters,single_parameter.fail.test diff --git a/logictests/generated/mysql/avg,max,distinct.test b/logictests/generated/mysql/1/avg,max,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,max,distinct.test rename to logictests/generated/mysql/1/avg,max,distinct.test diff --git a/logictests/generated/mysql/avg,max,equal_filters.test b/logictests/generated/mysql/1/avg,max,equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,max,equal_filters.test rename to logictests/generated/mysql/1/avg,max,equal_filters.test diff --git a/logictests/generated/mysql/avg,max,greater_or_equal_filters.fail.test b/logictests/generated/mysql/1/avg,max,greater_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,max,greater_or_equal_filters.fail.test rename to logictests/generated/mysql/1/avg,max,greater_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,max,is_null_filters.test b/logictests/generated/mysql/1/avg,max,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/avg,max,is_null_filters.test rename to logictests/generated/mysql/1/avg,max,is_null_filters.test diff --git a/logictests/generated/mysql/avg,max,not_equal_filters.test b/logictests/generated/mysql/1/avg,max,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,max,not_equal_filters.test rename to logictests/generated/mysql/1/avg,max,not_equal_filters.test diff --git a/logictests/generated/mysql/avg,max,range_param.fail.test b/logictests/generated/mysql/1/avg,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,max,range_param.fail.test rename to logictests/generated/mysql/1/avg,max,range_param.fail.test diff --git a/logictests/generated/mysql/avg,min,between_filters.test b/logictests/generated/mysql/1/avg,min,between_filters.test similarity index 100% rename from logictests/generated/mysql/avg,min,between_filters.test rename to logictests/generated/mysql/1/avg,min,between_filters.test diff --git a/logictests/generated/mysql/avg,min,less_or_equal_filters.fail.test b/logictests/generated/mysql/1/avg,min,less_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,min,less_or_equal_filters.fail.test rename to logictests/generated/mysql/1/avg,min,less_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,min,topk.test b/logictests/generated/mysql/1/avg,min,topk.test similarity index 100% rename from logictests/generated/mysql/avg,min,topk.test rename to logictests/generated/mysql/1/avg,min,topk.test diff --git a/logictests/generated/mysql/avg,single_parameter,range_param.fail.test b/logictests/generated/mysql/1/avg,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,single_parameter,range_param.fail.test rename to logictests/generated/mysql/1/avg,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/avg,topk,range_param.fail.test b/logictests/generated/mysql/1/avg,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,topk,range_param.fail.test rename to logictests/generated/mysql/1/avg,topk,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,between_filters,range_param.fail.test b/logictests/generated/mysql/1/avg_distinct,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,between_filters,range_param.fail.test rename to logictests/generated/mysql/1/avg_distinct,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,equal_filters,range_param.fail.test b/logictests/generated/mysql/1/avg_distinct,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/avg_distinct,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,left_join,range_param.fail.test b/logictests/generated/mysql/1/avg_distinct,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,left_join,range_param.fail.test rename to logictests/generated/mysql/1/avg_distinct,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,sum,range_param.fail.test b/logictests/generated/mysql/1/avg_distinct,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,sum,range_param.fail.test rename to logictests/generated/mysql/1/avg_distinct,sum,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,avg,in_parameter.fail.test b/logictests/generated/mysql/1/between_filters,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,avg,in_parameter.fail.test rename to logictests/generated/mysql/1/between_filters,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/between_filters,count,range_param.test b/logictests/generated/mysql/1/between_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,count,range_param.test rename to logictests/generated/mysql/1/between_filters,count,range_param.test diff --git a/logictests/generated/mysql/between_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/1/between_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/1/between_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,in_parameter,range_param.test b/logictests/generated/mysql/1/between_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,in_parameter,range_param.test rename to logictests/generated/mysql/1/between_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/between_filters,is_null_filters,range_param.test b/logictests/generated/mysql/1/between_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/1/between_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,is_null_filters.test b/logictests/generated/mysql/1/between_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/between_filters,is_null_filters.test rename to logictests/generated/mysql/1/between_filters,is_null_filters.test diff --git a/logictests/generated/mysql/between_filters,less_filters,range_param.test b/logictests/generated/mysql/1/between_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,less_filters,range_param.test rename to logictests/generated/mysql/1/between_filters,less_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/between_filters,min,in_parameter.fail.test b/logictests/generated/mysql/1/between_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/between_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/1/between_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/1/between_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/1/between_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,range_param,range_param.test b/logictests/generated/mysql/1/between_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,range_param,range_param.test rename to logictests/generated/mysql/1/between_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/between_filters,topk.test b/logictests/generated/mysql/1/between_filters,topk.test similarity index 100% rename from logictests/generated/mysql/between_filters,topk.test rename to logictests/generated/mysql/1/between_filters,topk.test diff --git a/logictests/generated/mysql/count,avg,greater_or_equal_filters.fail.test b/logictests/generated/mysql/1/count,avg,greater_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/count,avg,greater_or_equal_filters.fail.test rename to logictests/generated/mysql/1/count,avg,greater_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/count,avg,min.test b/logictests/generated/mysql/1/count,avg,min.test similarity index 100% rename from logictests/generated/mysql/count,avg,min.test rename to logictests/generated/mysql/1/count,avg,min.test diff --git a/logictests/generated/mysql/count,between_filters,distinct.test b/logictests/generated/mysql/1/count,between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,between_filters,distinct.test rename to logictests/generated/mysql/1/count,between_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,between_filters,in_parameter.fail.test b/logictests/generated/mysql/1/count,between_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,between_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/count,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,distinct.test b/logictests/generated/mysql/1/count,distinct.test similarity index 100% rename from logictests/generated/mysql/count,distinct.test rename to logictests/generated/mysql/1/count,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,equal_filters,in_parameter.fail.test b/logictests/generated/mysql/1/count,equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/count,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,greater_filters,range_param.test b/logictests/generated/mysql/1/count,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,range_param.test rename to logictests/generated/mysql/1/count,greater_filters,range_param.test diff --git a/logictests/generated/mysql/count,greater_filters,single_parameter.test b/logictests/generated/mysql/1/count,greater_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,single_parameter.test rename to logictests/generated/mysql/1/count,greater_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,distinct.test b/logictests/generated/mysql/1/count,greater_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,distinct.test rename to logictests/generated/mysql/1/count,greater_or_equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,greater_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/1/count,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,greater_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/count,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,group_concat,between_filters.test b/logictests/generated/mysql/1/count,group_concat,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,between_filters.test rename to logictests/generated/mysql/1/count,group_concat,between_filters.test diff --git a/logictests/generated/mysql/count,group_concat,distinct.test b/logictests/generated/mysql/1/count,group_concat,distinct.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,distinct.test rename to logictests/generated/mysql/1/count,group_concat,distinct.test diff --git a/logictests/generated/mysql/count,group_concat,less_filters.test b/logictests/generated/mysql/1/count,group_concat,less_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,less_filters.test rename to logictests/generated/mysql/1/count,group_concat,less_filters.test diff --git a/logictests/generated/mysql/count,group_concat,single_parameter.test b/logictests/generated/mysql/1/count,group_concat,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,single_parameter.test rename to logictests/generated/mysql/1/count,group_concat,single_parameter.test diff --git a/logictests/generated/mysql/count,group_concat,topk.test b/logictests/generated/mysql/1/count,group_concat,topk.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,topk.test rename to logictests/generated/mysql/1/count,group_concat,topk.test diff --git a/logictests/generated/mysql/count,inner_join,single_parameter.test b/logictests/generated/mysql/1/count,inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,inner_join,single_parameter.test rename to logictests/generated/mysql/1/count,inner_join,single_parameter.test diff --git a/logictests/generated/mysql/count,is_null_filters.test b/logictests/generated/mysql/1/count,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters.test rename to logictests/generated/mysql/1/count,is_null_filters.test diff --git a/logictests/generated/mysql/count,less_filters,is_null_filters.test b/logictests/generated/mysql/1/count,less_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,is_null_filters.test rename to logictests/generated/mysql/1/count,less_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/1/count,less_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/1/count,less_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,left_join.test b/logictests/generated/mysql/1/count,less_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,left_join.test rename to logictests/generated/mysql/1/count,less_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters.test b/logictests/generated/mysql/1/count,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters.test rename to logictests/generated/mysql/1/count,less_or_equal_filters.test diff --git a/logictests/generated/mysql/count,max,greater_filters.test b/logictests/generated/mysql/1/count,max,greater_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,greater_filters.test rename to logictests/generated/mysql/1/count,max,greater_filters.test diff --git a/logictests/generated/mysql/count,max,left_join.test b/logictests/generated/mysql/1/count,max,left_join.test similarity index 100% rename from logictests/generated/mysql/count,max,left_join.test rename to logictests/generated/mysql/1/count,max,left_join.test diff --git a/logictests/generated/mysql/count,max,less_or_equal_filters.test b/logictests/generated/mysql/1/count,max,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,less_or_equal_filters.test rename to logictests/generated/mysql/1/count,max,less_or_equal_filters.test diff --git a/logictests/generated/mysql/count,max,min.test b/logictests/generated/mysql/1/count,max,min.test similarity index 100% rename from logictests/generated/mysql/count,max,min.test rename to logictests/generated/mysql/1/count,max,min.test diff --git a/logictests/generated/mysql/count,max,not_equal_filters.test b/logictests/generated/mysql/1/count,max,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,not_equal_filters.test rename to logictests/generated/mysql/1/count,max,not_equal_filters.test diff --git a/logictests/generated/mysql/count,max,range_param.test b/logictests/generated/mysql/1/count,max,range_param.test similarity index 100% rename from logictests/generated/mysql/count,max,range_param.test rename to logictests/generated/mysql/1/count,max,range_param.test diff --git a/logictests/generated/mysql/count,max,single_parameter.test b/logictests/generated/mysql/1/count,max,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,max,single_parameter.test rename to logictests/generated/mysql/1/count,max,single_parameter.test diff --git a/logictests/generated/mysql/count,max,topk.test b/logictests/generated/mysql/1/count,max,topk.test similarity index 100% rename from logictests/generated/mysql/count,max,topk.test rename to logictests/generated/mysql/1/count,max,topk.test diff --git a/logictests/generated/mysql/count,min,greater_filters.test b/logictests/generated/mysql/1/count,min,greater_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,greater_filters.test rename to logictests/generated/mysql/1/count,min,greater_filters.test diff --git a/logictests/generated/mysql/count,multiple_range_params,range_param.test b/logictests/generated/mysql/1/count,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/count,multiple_range_params,range_param.test rename to logictests/generated/mysql/1/count,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/count,sum,inner_join.test b/logictests/generated/mysql/1/count,sum,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,sum,inner_join.test rename to logictests/generated/mysql/1/count,sum,inner_join.test diff --git a/logictests/generated/mysql/count_distinct,equal_filters,range_param.fail.test b/logictests/generated/mysql/1/count_distinct,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/count_distinct,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,is_null_filters,range_param.fail.test b/logictests/generated/mysql/1/count_distinct,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/1/count_distinct,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,join_subquery,range_param.fail.test b/logictests/generated/mysql/1/count_distinct,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,join_subquery,range_param.fail.test rename to logictests/generated/mysql/1/count_distinct,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/1/count_distinct,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/1/count_distinct,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,sum_distinct,range_param.fail.test b/logictests/generated/mysql/1/count_distinct,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/1/count_distinct,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/cte,avg,range_param.fail.test b/logictests/generated/mysql/1/cte,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,avg,range_param.fail.test rename to logictests/generated/mysql/1/cte,avg,range_param.fail.test diff --git a/logictests/generated/mysql/cte,between_filters,range_param.fail.test b/logictests/generated/mysql/1/cte,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,between_filters,range_param.fail.test rename to logictests/generated/mysql/1/cte,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,equal_filters,range_param.fail.test b/logictests/generated/mysql/1/cte,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/cte,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,greater_filters,range_param.fail.test b/logictests/generated/mysql/1/cte,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,greater_filters,range_param.fail.test rename to logictests/generated/mysql/1/cte,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/1/cte,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/cte,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/1/distinct,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/1/distinct,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,in_parameter,range_param.fail.test b/logictests/generated/mysql/1/distinct,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,in_parameter,range_param.fail.test rename to logictests/generated/mysql/1/distinct,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,range_param,range_param.test b/logictests/generated/mysql/1/distinct,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,range_param,range_param.test rename to logictests/generated/mysql/1/distinct,range_param,range_param.test diff --git a/logictests/generated/mysql/distinct,sum_distinct,range_param.fail.test b/logictests/generated/mysql/1/distinct,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/1/distinct,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,distinct,range_param.test b/logictests/generated/mysql/1/equal_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,distinct,range_param.test rename to logictests/generated/mysql/1/equal_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/equal_filters,in_parameter.test b/logictests/generated/mysql/1/equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,in_parameter.test rename to logictests/generated/mysql/1/equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,less_filters,in_parameter.test b/logictests/generated/mysql/1/equal_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/1/equal_filters,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,less_filters.test b/logictests/generated/mysql/1/equal_filters,less_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,less_filters.test rename to logictests/generated/mysql/1/equal_filters,less_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/equal_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/1/equal_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/equal_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/1/equal_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,topk,in_parameter.test b/logictests/generated/mysql/1/equal_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,topk,in_parameter.test rename to logictests/generated/mysql/1/equal_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,topk,range_param.test b/logictests/generated/mysql/1/equal_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,topk,range_param.test rename to logictests/generated/mysql/1/equal_filters,topk,range_param.test diff --git a/logictests/generated/mysql/greater_filters,avg,range_param.fail.test b/logictests/generated/mysql/1/greater_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,avg,range_param.fail.test rename to logictests/generated/mysql/1/greater_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/1/greater_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/1/greater_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/1/greater_filters,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/1/greater_filters,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/greater_filters,in_parameter,range_param.test b/logictests/generated/mysql/1/greater_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,in_parameter,range_param.test rename to logictests/generated/mysql/1/greater_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/greater_filters,left_join,in_parameter.test b/logictests/generated/mysql/1/greater_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,left_join,in_parameter.test rename to logictests/generated/mysql/1/greater_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,less_filters,in_parameter.test b/logictests/generated/mysql/1/greater_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/1/greater_filters,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/1/greater_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/1/greater_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,range_param,range_param.test b/logictests/generated/mysql/1/greater_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,range_param,range_param.test rename to logictests/generated/mysql/1/greater_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/greater_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/1/greater_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/1/greater_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,between_filters,in_parameter.test b/logictests/generated/mysql/1/greater_or_equal_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/1/greater_or_equal_filters,between_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_or_equal_filters,count,in_parameter.fail.test b/logictests/generated/mysql/1/greater_or_equal_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_or_equal_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/1/greater_or_equal_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,count,range_param.test b/logictests/generated/mysql/1/greater_or_equal_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,count,range_param.test rename to logictests/generated/mysql/1/greater_or_equal_filters,count,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/1/greater_or_equal_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/1/greater_or_equal_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/1/greater_or_equal_filters,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/1/greater_or_equal_filters,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/1/greater_or_equal_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/1/greater_or_equal_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,inner_join,in_parameter.test b/logictests/generated/mysql/1/greater_or_equal_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/1/greater_or_equal_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/1/greater_or_equal_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/1/greater_or_equal_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,range_param.test b/logictests/generated/mysql/1/greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/1/greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,single_parameter,range_param.test b/logictests/generated/mysql/1/greater_or_equal_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,single_parameter,range_param.test rename to logictests/generated/mysql/1/greater_or_equal_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/1/greater_or_equal_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/1/greater_or_equal_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,topk.test b/logictests/generated/mysql/1/greater_or_equal_filters,topk.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,topk.test rename to logictests/generated/mysql/1/greater_or_equal_filters,topk.test diff --git a/logictests/generated/mysql/group_concat,between_filters,inner_join.test b/logictests/generated/mysql/1/group_concat,between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,between_filters,inner_join.test rename to logictests/generated/mysql/1/group_concat,between_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,between_filters,single_parameter.test b/logictests/generated/mysql/1/group_concat,between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,between_filters,single_parameter.test rename to logictests/generated/mysql/1/group_concat,between_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,equal_filters,range_param.fail.test b/logictests/generated/mysql/1/group_concat,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/group_concat,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,equal_filters.test b/logictests/generated/mysql/1/group_concat,equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,equal_filters.test rename to logictests/generated/mysql/1/group_concat,equal_filters.test diff --git a/logictests/generated/mysql/group_concat,greater_filters,left_join.test b/logictests/generated/mysql/1/group_concat,greater_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_filters,left_join.test rename to logictests/generated/mysql/1/group_concat,greater_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,greater_or_equal_filters,distinct.test b/logictests/generated/mysql/1/group_concat,greater_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_or_equal_filters,distinct.test rename to logictests/generated/mysql/1/group_concat,greater_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/group_concat,inner_join,in_parameter.fail.test b/logictests/generated/mysql/1/group_concat,inner_join,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,inner_join,in_parameter.fail.test rename to logictests/generated/mysql/1/group_concat,inner_join,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,inner_join,single_parameter.test b/logictests/generated/mysql/1/group_concat,inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,inner_join,single_parameter.test rename to logictests/generated/mysql/1/group_concat,inner_join,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,is_null_filters,left_join.test b/logictests/generated/mysql/1/group_concat,is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,is_null_filters,left_join.test rename to logictests/generated/mysql/1/group_concat,is_null_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,left_join,range_param.fail.test b/logictests/generated/mysql/1/group_concat,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,left_join,range_param.fail.test rename to logictests/generated/mysql/1/group_concat,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,less_filters,distinct.test b/logictests/generated/mysql/1/group_concat,less_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters,distinct.test rename to logictests/generated/mysql/1/group_concat,less_filters,distinct.test diff --git a/logictests/generated/mysql/group_concat,less_filters,in_parameter.fail.test b/logictests/generated/mysql/1/group_concat,less_filters,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/group_concat,less_filters,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,less_filters,single_parameter.test b/logictests/generated/mysql/1/group_concat,less_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters,single_parameter.test rename to logictests/generated/mysql/1/group_concat,less_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,less_or_equal_filters.test b/logictests/generated/mysql/1/group_concat,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_or_equal_filters.test rename to logictests/generated/mysql/1/group_concat,less_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,max,in_parameter.fail.test b/logictests/generated/mysql/1/group_concat,max,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,in_parameter.fail.test rename to logictests/generated/mysql/1/group_concat,max,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,max,range_param.fail.test b/logictests/generated/mysql/1/group_concat,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,range_param.fail.test rename to logictests/generated/mysql/1/group_concat,max,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,min,greater_filters.test b/logictests/generated/mysql/1/group_concat,min,greater_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,greater_filters.test rename to logictests/generated/mysql/1/group_concat,min,greater_filters.test diff --git a/logictests/generated/mysql/group_concat,min,inner_join.test b/logictests/generated/mysql/1/group_concat,min,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,inner_join.test rename to logictests/generated/mysql/1/group_concat,min,inner_join.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters,distinct.test b/logictests/generated/mysql/1/group_concat,not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters,distinct.test rename to logictests/generated/mysql/1/group_concat,not_equal_filters,distinct.test diff --git a/logictests/generated/mysql/group_concat,topk,in_parameter.fail.test b/logictests/generated/mysql/1/group_concat,topk,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,topk,in_parameter.fail.test rename to logictests/generated/mysql/1/group_concat,topk,in_parameter.fail.test diff --git a/logictests/generated/mysql/in_parameter,avg,range_param.fail.test b/logictests/generated/mysql/1/in_parameter,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,avg,range_param.fail.test rename to logictests/generated/mysql/1/in_parameter,avg,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,greater_filters,range_param.fail.test b/logictests/generated/mysql/1/in_parameter,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,greater_filters,range_param.fail.test rename to logictests/generated/mysql/1/in_parameter,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,group_concat,in_parameter.fail.test b/logictests/generated/mysql/1/in_parameter,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/1/in_parameter,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/in_parameter,is_null_filters,range_param.fail.test b/logictests/generated/mysql/1/in_parameter,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/1/in_parameter,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,join_subquery,range_param.fail.test b/logictests/generated/mysql/1/in_parameter,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,join_subquery,range_param.fail.test rename to logictests/generated/mysql/1/in_parameter,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/1/in_parameter,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/in_parameter,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,multiple_range_params,range_param.test b/logictests/generated/mysql/1/in_parameter,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,multiple_range_params,range_param.test rename to logictests/generated/mysql/1/in_parameter,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/in_parameter,range_param,range_param.test b/logictests/generated/mysql/1/in_parameter,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,range_param,range_param.test rename to logictests/generated/mysql/1/in_parameter,range_param,range_param.test diff --git a/logictests/generated/mysql/in_parameter,sum,range_param.fail.test b/logictests/generated/mysql/1/in_parameter,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,sum,range_param.fail.test rename to logictests/generated/mysql/1/in_parameter,sum,range_param.test diff --git a/logictests/generated/mysql/inner_join,count,range_param.test b/logictests/generated/mysql/1/inner_join,count,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,count,range_param.test rename to logictests/generated/mysql/1/inner_join,count,range_param.test diff --git a/logictests/generated/mysql/inner_join,count_distinct,range_param.fail.test b/logictests/generated/mysql/1/inner_join,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,count_distinct,range_param.fail.test rename to logictests/generated/mysql/1/inner_join,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,cte,range_param.fail.test b/logictests/generated/mysql/1/inner_join,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,cte,range_param.fail.test rename to logictests/generated/mysql/1/inner_join,cte,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,less_filters,range_param.test b/logictests/generated/mysql/1/inner_join,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,less_filters,range_param.test rename to logictests/generated/mysql/1/inner_join,less_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/inner_join,max,in_parameter.fail.test b/logictests/generated/mysql/1/inner_join,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/inner_join,max,in_parameter.fail.test rename to logictests/generated/mysql/1/inner_join,max,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,multiple_parameters,range_param.test b/logictests/generated/mysql/1/inner_join,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,multiple_parameters,range_param.test rename to logictests/generated/mysql/1/inner_join,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/inner_join,range_param,range_param.test b/logictests/generated/mysql/1/inner_join,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,range_param,range_param.test rename to logictests/generated/mysql/1/inner_join,range_param,range_param.test diff --git a/logictests/generated/mysql/inner_join,range_param.test b/logictests/generated/mysql/1/inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,range_param.test rename to logictests/generated/mysql/1/inner_join,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,count,in_parameter.fail.test b/logictests/generated/mysql/1/is_null_filters,count,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/1/is_null_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,cte,range_param.fail.test b/logictests/generated/mysql/1/is_null_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,cte,range_param.fail.test rename to logictests/generated/mysql/1/is_null_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/1/is_null_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/1/is_null_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,equal_filters,range_param.test b/logictests/generated/mysql/1/is_null_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,equal_filters,range_param.test rename to logictests/generated/mysql/1/is_null_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/1/is_null_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/1/is_null_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,in_parameter,range_param.test b/logictests/generated/mysql/1/is_null_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,in_parameter,range_param.test rename to logictests/generated/mysql/1/is_null_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,in_parameter.test b/logictests/generated/mysql/1/is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,in_parameter.test rename to logictests/generated/mysql/1/is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,range_param,range_param.test b/logictests/generated/mysql/1/is_null_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,range_param,range_param.test rename to logictests/generated/mysql/1/is_null_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/join_subquery,in_parameter,range_param.fail.test b/logictests/generated/mysql/1/join_subquery,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,in_parameter,range_param.fail.test rename to logictests/generated/mysql/1/join_subquery,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/1/join_subquery,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/join_subquery,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,avg,range_param.fail.test b/logictests/generated/mysql/1/left_join,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,avg,range_param.fail.test rename to logictests/generated/mysql/1/left_join,avg,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,distinct,range_param.test b/logictests/generated/mysql/1/left_join,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,distinct,range_param.test rename to logictests/generated/mysql/1/left_join,distinct,range_param.test diff --git a/logictests/generated/mysql/left_join,equal_filters,in_parameter.test b/logictests/generated/mysql/1/left_join,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,equal_filters,in_parameter.test rename to logictests/generated/mysql/1/left_join,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,greater_filters,range_param.test b/logictests/generated/mysql/1/left_join,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,greater_filters,range_param.test rename to logictests/generated/mysql/1/left_join,greater_filters,range_param.test diff --git a/logictests/generated/mysql/left_join,is_null_filters,range_param.test b/logictests/generated/mysql/1/left_join,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,is_null_filters,range_param.test rename to logictests/generated/mysql/1/left_join,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/left_join,join_subquery.test b/logictests/generated/mysql/1/left_join,join_subquery.test similarity index 100% rename from logictests/generated/mysql/left_join,join_subquery.test rename to logictests/generated/mysql/1/left_join,join_subquery.test diff --git a/logictests/generated/mysql/left_join,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/1/left_join,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/1/left_join,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,multiple_range_params,range_param.test b/logictests/generated/mysql/1/left_join,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,multiple_range_params,range_param.test rename to logictests/generated/mysql/1/left_join,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/left_join,not_equal_filters,range_param.test b/logictests/generated/mysql/1/left_join,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,not_equal_filters,range_param.test rename to logictests/generated/mysql/1/left_join,not_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/left_join,sum,in_parameter.fail.test b/logictests/generated/mysql/1/left_join,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/left_join,sum,in_parameter.fail.test rename to logictests/generated/mysql/1/left_join,sum,in_parameter.test diff --git a/logictests/generated/mysql/left_join,topk,range_param.test b/logictests/generated/mysql/1/left_join,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,topk,range_param.test rename to logictests/generated/mysql/1/left_join,topk,range_param.test diff --git a/logictests/generated/mysql/left_join,topk.test b/logictests/generated/mysql/1/left_join,topk.test similarity index 100% rename from logictests/generated/mysql/left_join,topk.test rename to logictests/generated/mysql/1/left_join,topk.test diff --git a/logictests/generated/mysql/less_filters,cte,range_param.fail.test b/logictests/generated/mysql/1/less_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,cte,range_param.fail.test rename to logictests/generated/mysql/1/less_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/1/less_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/1/less_filters,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,less_or_equal_filters.test b/logictests/generated/mysql/1/less_filters,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/less_filters,less_or_equal_filters.test rename to logictests/generated/mysql/1/less_filters,less_or_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_filters,max,in_parameter.fail.test b/logictests/generated/mysql/1/less_filters,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/1/less_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,max,range_param.test b/logictests/generated/mysql/1/less_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,max,range_param.test rename to logictests/generated/mysql/1/less_filters,max,range_param.test diff --git a/logictests/generated/mysql/less_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/1/less_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/1/less_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/1/less_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/1/less_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/1/less_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/1/less_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,sum,range_param.test b/logictests/generated/mysql/1/less_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,sum,range_param.test rename to logictests/generated/mysql/1/less_filters,sum,range_param.test diff --git a/logictests/generated/mysql/less_filters,topk.test b/logictests/generated/mysql/1/less_filters,topk.test similarity index 100% rename from logictests/generated/mysql/less_filters,topk.test rename to logictests/generated/mysql/1/less_filters,topk.test diff --git a/logictests/generated/mysql/less_or_equal_filters,between_filters,in_parameter.test b/logictests/generated/mysql/1/less_or_equal_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/1/less_or_equal_filters,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/1/less_or_equal_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/1/less_or_equal_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/1/less_or_equal_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/1/less_or_equal_filters,join_subquery,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,min,in_parameter.fail.test b/logictests/generated/mysql/1/less_or_equal_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/1/less_or_equal_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/1/less_or_equal_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/1/less_or_equal_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/1/less_or_equal_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/1/less_or_equal_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/1/less_or_equal_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/1/less_or_equal_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/1/less_or_equal_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/1/less_or_equal_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,topk,range_param.test b/logictests/generated/mysql/1/less_or_equal_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,topk,range_param.test rename to logictests/generated/mysql/1/less_or_equal_filters,topk,range_param.test diff --git a/logictests/generated/mysql/max,between_filters,distinct.test b/logictests/generated/mysql/1/max,between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,between_filters,distinct.test rename to logictests/generated/mysql/1/max,between_filters,distinct.test diff --git a/logictests/generated/mysql/max,between_filters,inner_join.test b/logictests/generated/mysql/1/max,between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,between_filters,inner_join.test rename to logictests/generated/mysql/1/max,between_filters,inner_join.test diff --git a/logictests/generated/mysql/max,between_filters,is_null_filters.test b/logictests/generated/mysql/1/max,between_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,between_filters,is_null_filters.test rename to logictests/generated/mysql/1/max,between_filters,is_null_filters.test diff --git a/logictests/generated/mysql/max,between_filters,single_parameter.test b/logictests/generated/mysql/1/max,between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,between_filters,single_parameter.test rename to logictests/generated/mysql/1/max,between_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,distinct,inner_join.test b/logictests/generated/mysql/1/max,distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,distinct,inner_join.test rename to logictests/generated/mysql/1/max,distinct,inner_join.test diff --git a/logictests/generated/mysql/max,distinct,single_parameter.test b/logictests/generated/mysql/1/max,distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,distinct,single_parameter.test rename to logictests/generated/mysql/1/max,distinct,single_parameter.test diff --git a/logictests/generated/mysql/max,equal_filters,is_null_filters.test b/logictests/generated/mysql/1/max,equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,is_null_filters.test rename to logictests/generated/mysql/1/max,equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/max,greater_filters,inner_join.test b/logictests/generated/mysql/1/max,greater_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,inner_join.test rename to logictests/generated/mysql/1/max,greater_filters,inner_join.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,distinct.test b/logictests/generated/mysql/1/max,greater_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,distinct.test rename to logictests/generated/mysql/1/max,greater_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters.test b/logictests/generated/mysql/1/max,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters.test rename to logictests/generated/mysql/1/max,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/max,inner_join,single_parameter.test b/logictests/generated/mysql/1/max,inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,inner_join,single_parameter.test rename to logictests/generated/mysql/1/max,inner_join,single_parameter.test diff --git a/logictests/generated/mysql/max,is_null_filters,inner_join.test b/logictests/generated/mysql/1/max,is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,is_null_filters,inner_join.test rename to logictests/generated/mysql/1/max,is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/max,is_null_filters,left_join.test b/logictests/generated/mysql/1/max,is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,is_null_filters,left_join.test rename to logictests/generated/mysql/1/max,is_null_filters,left_join.test diff --git a/logictests/generated/mysql/max,is_null_filters,single_parameter.test b/logictests/generated/mysql/1/max,is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,is_null_filters,single_parameter.test rename to logictests/generated/mysql/1/max,is_null_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,less_filters,between_filters.test b/logictests/generated/mysql/1/max,less_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,between_filters.test rename to logictests/generated/mysql/1/max,less_filters,between_filters.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,between_filters.test b/logictests/generated/mysql/1/max,less_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,between_filters.test rename to logictests/generated/mysql/1/max,less_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,left_join.test b/logictests/generated/mysql/1/max,less_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,left_join.test rename to logictests/generated/mysql/1/max,less_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/max,min,between_filters.test b/logictests/generated/mysql/1/max,min,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,between_filters.test rename to logictests/generated/mysql/1/max,min,between_filters.test diff --git a/logictests/generated/mysql/max,min,equal_filters.test b/logictests/generated/mysql/1/max,min,equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,equal_filters.test rename to logictests/generated/mysql/1/max,min,equal_filters.test diff --git a/logictests/generated/mysql/max,min,greater_or_equal_filters.test b/logictests/generated/mysql/1/max,min,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,greater_or_equal_filters.test rename to logictests/generated/mysql/1/max,min,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/max,min,less_or_equal_filters.test b/logictests/generated/mysql/1/max,min,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,less_or_equal_filters.test rename to logictests/generated/mysql/1/max,min,less_or_equal_filters.test diff --git a/logictests/generated/mysql/max,min,not_equal_filters.test b/logictests/generated/mysql/1/max,min,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,not_equal_filters.test rename to logictests/generated/mysql/1/max,min,not_equal_filters.test diff --git a/logictests/generated/mysql/max,min,range_param.test b/logictests/generated/mysql/1/max,min,range_param.test similarity index 100% rename from logictests/generated/mysql/max,min,range_param.test rename to logictests/generated/mysql/1/max,min,range_param.test diff --git a/logictests/generated/mysql/max,multiple_parameters,in_parameter.fail.test b/logictests/generated/mysql/1/max,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/max,multiple_parameters,in_parameter.fail.test rename to logictests/generated/mysql/1/max,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/max,single_parameter.test b/logictests/generated/mysql/1/max,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,single_parameter.test rename to logictests/generated/mysql/1/max,single_parameter.test diff --git a/logictests/generated/mysql/min,between_filters,distinct.test b/logictests/generated/mysql/1/min,between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,between_filters,distinct.test rename to logictests/generated/mysql/1/min,between_filters,distinct.test diff --git a/logictests/generated/mysql/min,between_filters,range_param.test b/logictests/generated/mysql/1/min,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,between_filters,range_param.test rename to logictests/generated/mysql/1/min,between_filters,range_param.test diff --git a/logictests/generated/mysql/min,cte,join_subquery.test b/logictests/generated/mysql/1/min,cte,join_subquery.test similarity index 100% rename from logictests/generated/mysql/min,cte,join_subquery.test rename to logictests/generated/mysql/1/min,cte,join_subquery.test diff --git a/logictests/generated/mysql/min,distinct,topk.test b/logictests/generated/mysql/1/min,distinct,topk.test similarity index 100% rename from logictests/generated/mysql/min,distinct,topk.test rename to logictests/generated/mysql/1/min,distinct,topk.test diff --git a/logictests/generated/mysql/min,distinct.test b/logictests/generated/mysql/1/min,distinct.test similarity index 100% rename from logictests/generated/mysql/min,distinct.test rename to logictests/generated/mysql/1/min,distinct.test diff --git a/logictests/generated/mysql/min,equal_filters,distinct.test b/logictests/generated/mysql/1/min,equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,distinct.test rename to logictests/generated/mysql/1/min,equal_filters,distinct.test diff --git a/logictests/generated/mysql/min,equal_filters,range_param.test b/logictests/generated/mysql/1/min,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,range_param.test rename to logictests/generated/mysql/1/min,equal_filters,range_param.test diff --git a/logictests/generated/mysql/min,greater_filters.test b/logictests/generated/mysql/1/min,greater_filters.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters.test rename to logictests/generated/mysql/1/min,greater_filters.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,single_parameter.test b/logictests/generated/mysql/1/min,greater_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/1/min,greater_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/min,group_concat,range_param.fail.test b/logictests/generated/mysql/1/min,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,group_concat,range_param.fail.test rename to logictests/generated/mysql/1/min,group_concat,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,in_parameter.fail.test b/logictests/generated/mysql/1/min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,in_parameter.fail.test rename to logictests/generated/mysql/1/min,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,inner_join,in_parameter.fail.test b/logictests/generated/mysql/1/min,inner_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,inner_join,in_parameter.fail.test rename to logictests/generated/mysql/1/min,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/min,is_null_filters,single_parameter.test b/logictests/generated/mysql/1/min,is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters,single_parameter.test rename to logictests/generated/mysql/1/min,is_null_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,left_join,in_parameter.fail.test b/logictests/generated/mysql/1/min,left_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,left_join,in_parameter.fail.test rename to logictests/generated/mysql/1/min,left_join,in_parameter.test diff --git a/logictests/generated/mysql/min,less_filters,between_filters.test b/logictests/generated/mysql/1/min,less_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,between_filters.test rename to logictests/generated/mysql/1/min,less_filters,between_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,less_filters,in_parameter.fail.test b/logictests/generated/mysql/1/min,less_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,less_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/min,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,less_filters,is_null_filters.test b/logictests/generated/mysql/1/min,less_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,is_null_filters.test rename to logictests/generated/mysql/1/min,less_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters.test b/logictests/generated/mysql/1/min,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters.test rename to logictests/generated/mysql/1/min,less_or_equal_filters.test diff --git a/logictests/generated/mysql/min,multiple_range_params,range_param.test b/logictests/generated/mysql/1/min,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/min,multiple_range_params,range_param.test rename to logictests/generated/mysql/1/min,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/min,project_literal,range_param.fail.test b/logictests/generated/mysql/1/min,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,project_literal,range_param.fail.test rename to logictests/generated/mysql/1/min,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/min,single_parameter,range_param.test b/logictests/generated/mysql/1/min,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/min,single_parameter,range_param.test rename to logictests/generated/mysql/1/min,single_parameter,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,count,range_param.test b/logictests/generated/mysql/1/multiple_parameters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,count,range_param.test rename to logictests/generated/mysql/1/multiple_parameters,count,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,count_distinct,range_param.fail.test b/logictests/generated/mysql/1/multiple_parameters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/1/multiple_parameters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,equal_filters,range_param.fail.test b/logictests/generated/mysql/1/multiple_parameters,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/multiple_parameters,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,inner_join,in_parameter.test b/logictests/generated/mysql/1/multiple_parameters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,inner_join,in_parameter.test rename to logictests/generated/mysql/1/multiple_parameters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,min,range_param.test b/logictests/generated/mysql/1/multiple_parameters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,min,range_param.test rename to logictests/generated/mysql/1/multiple_parameters,min,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,range_param,range_param.test b/logictests/generated/mysql/1/multiple_parameters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,range_param,range_param.test rename to logictests/generated/mysql/1/multiple_parameters,range_param,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,range_param.test b/logictests/generated/mysql/1/multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,range_param.test rename to logictests/generated/mysql/1/multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,avg,range_param.fail.test b/logictests/generated/mysql/1/multiple_range_params,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,avg,range_param.fail.test rename to logictests/generated/mysql/1/multiple_range_params,avg,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,multiple_parameters,range_param.test b/logictests/generated/mysql/1/multiple_range_params,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,multiple_parameters,range_param.test rename to logictests/generated/mysql/1/multiple_range_params,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,between_filters.test b/logictests/generated/mysql/1/not_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,between_filters.test rename to logictests/generated/mysql/1/not_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/not_equal_filters,distinct,range_param.test b/logictests/generated/mysql/1/not_equal_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,distinct,range_param.test rename to logictests/generated/mysql/1/not_equal_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/1/not_equal_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/1/not_equal_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,in_parameter,range_param.test b/logictests/generated/mysql/1/not_equal_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,in_parameter,range_param.test rename to logictests/generated/mysql/1/not_equal_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,in_parameter.test b/logictests/generated/mysql/1/not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,in_parameter.test rename to logictests/generated/mysql/1/not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/1/not_equal_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/1/not_equal_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,is_null_filters.test b/logictests/generated/mysql/1/not_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,is_null_filters.test rename to logictests/generated/mysql/1/not_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/not_equal_filters,less_filters,range_param.test b/logictests/generated/mysql/1/not_equal_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,less_filters,range_param.test rename to logictests/generated/mysql/1/not_equal_filters,less_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/not_equal_filters,max,in_parameter.fail.test b/logictests/generated/mysql/1/not_equal_filters,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/not_equal_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/1/not_equal_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,topk.test b/logictests/generated/mysql/1/not_equal_filters,topk.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,topk.test rename to logictests/generated/mysql/1/not_equal_filters,topk.test diff --git a/logictests/generated/mysql/param,inner_join,count_distinct.test b/logictests/generated/mysql/1/param,inner_join,count_distinct.test similarity index 100% rename from logictests/generated/mysql/param,inner_join,count_distinct.test rename to logictests/generated/mysql/1/param,inner_join,count_distinct.test diff --git a/logictests/generated/mysql/project_literal,cte,range_param.fail.test b/logictests/generated/mysql/1/project_literal,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,cte,range_param.fail.test rename to logictests/generated/mysql/1/project_literal,cte,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,equal_filters,range_param.fail.test b/logictests/generated/mysql/1/project_literal,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/project_literal,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,greater_filters,range_param.fail.test b/logictests/generated/mysql/1/project_literal,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,greater_filters,range_param.fail.test rename to logictests/generated/mysql/1/project_literal,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,inner_join,range_param.fail.test b/logictests/generated/mysql/1/project_literal,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,inner_join,range_param.fail.test rename to logictests/generated/mysql/1/project_literal,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,min,range_param.fail.test b/logictests/generated/mysql/1/project_literal,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,min,range_param.fail.test rename to logictests/generated/mysql/1/project_literal,min,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,single_parameter,range_param.fail.test b/logictests/generated/mysql/1/project_literal,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,single_parameter,range_param.fail.test rename to logictests/generated/mysql/1/project_literal,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,count_distinct,range_param.fail.test b/logictests/generated/mysql/1/range_param,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,count_distinct,range_param.fail.test rename to logictests/generated/mysql/1/range_param,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,is_null_filters,range_param.fail.test b/logictests/generated/mysql/1/range_param,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/1/range_param,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,left_join,range_param.test b/logictests/generated/mysql/1/range_param,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,left_join,range_param.test rename to logictests/generated/mysql/1/range_param,left_join,range_param.test diff --git a/logictests/generated/mysql/range_param,less_filters,range_param.fail.test b/logictests/generated/mysql/1/range_param,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,less_filters,range_param.fail.test rename to logictests/generated/mysql/1/range_param,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/1/range_param,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/1/range_param,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,project_literal,range_param.fail.test b/logictests/generated/mysql/1/range_param,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,project_literal,range_param.fail.test rename to logictests/generated/mysql/1/range_param,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,sum_distinct,range_param.fail.test b/logictests/generated/mysql/1/range_param,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/1/range_param,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,distinct,range_param.test b/logictests/generated/mysql/1/single_parameter,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,distinct,range_param.test rename to logictests/generated/mysql/1/single_parameter,distinct,range_param.test diff --git a/logictests/generated/mysql/single_parameter,greater_filters,range_param.fail.test b/logictests/generated/mysql/1/single_parameter,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,greater_filters,range_param.fail.test rename to logictests/generated/mysql/1/single_parameter,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,left_join,in_parameter.test b/logictests/generated/mysql/1/single_parameter,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter,left_join,in_parameter.test rename to logictests/generated/mysql/1/single_parameter,left_join,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,max,range_param.test b/logictests/generated/mysql/1/single_parameter,max,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,max,range_param.test rename to logictests/generated/mysql/1/single_parameter,max,range_param.test diff --git a/logictests/generated/mysql/single_parameter,multiple_parameters,in_parameter.test b/logictests/generated/mysql/1/single_parameter,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/1/single_parameter,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,sum,range_param.test b/logictests/generated/mysql/1/single_parameter,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,sum,range_param.test rename to logictests/generated/mysql/1/single_parameter,sum,range_param.test diff --git a/logictests/generated/mysql/single_parameter,topk,range_param.test b/logictests/generated/mysql/1/single_parameter,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,topk,range_param.test rename to logictests/generated/mysql/1/single_parameter,topk,range_param.test diff --git a/logictests/generated/mysql/sum,avg,between_filters.test b/logictests/generated/mysql/1/sum,avg,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,avg,between_filters.test rename to logictests/generated/mysql/1/sum,avg,between_filters.test diff --git a/logictests/generated/mysql/sum,avg,equal_filters.test b/logictests/generated/mysql/1/sum,avg,equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,avg,equal_filters.test rename to logictests/generated/mysql/1/sum,avg,equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,between_filters,in_parameter.fail.test b/logictests/generated/mysql/1/sum,between_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,between_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/sum,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,between_filters,range_param.test b/logictests/generated/mysql/1/sum,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,range_param.test rename to logictests/generated/mysql/1/sum,between_filters,range_param.test diff --git a/logictests/generated/mysql/sum,between_filters.test b/logictests/generated/mysql/1/sum,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters.test rename to logictests/generated/mysql/1/sum,between_filters.test diff --git a/logictests/generated/mysql/sum,distinct,inner_join.test b/logictests/generated/mysql/1/sum,distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,distinct,inner_join.test rename to logictests/generated/mysql/1/sum,distinct,inner_join.test diff --git a/logictests/generated/mysql/sum,equal_filters,range_param.test b/logictests/generated/mysql/1/sum,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,range_param.test rename to logictests/generated/mysql/1/sum,equal_filters,range_param.test diff --git a/logictests/generated/mysql/sum,equal_filters.test b/logictests/generated/mysql/1/sum,equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters.test rename to logictests/generated/mysql/1/sum,equal_filters.test diff --git a/logictests/generated/mysql/sum,greater_filters,between_filters.test b/logictests/generated/mysql/1/sum,greater_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,between_filters.test rename to logictests/generated/mysql/1/sum,greater_filters,between_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,greater_filters,in_parameter.fail.test b/logictests/generated/mysql/1/sum,greater_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,greater_filters,in_parameter.fail.test rename to logictests/generated/mysql/1/sum,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,greater_filters,left_join.test b/logictests/generated/mysql/1/sum,greater_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,left_join.test rename to logictests/generated/mysql/1/sum,greater_filters,left_join.test diff --git a/logictests/generated/mysql/sum,greater_filters.test b/logictests/generated/mysql/1/sum,greater_filters.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters.test rename to logictests/generated/mysql/1/sum,greater_filters.test diff --git a/logictests/generated/mysql/sum,inner_join.test b/logictests/generated/mysql/1/sum,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,inner_join.test rename to logictests/generated/mysql/1/sum,inner_join.test diff --git a/logictests/generated/mysql/sum,is_null_filters,distinct.test b/logictests/generated/mysql/1/sum,is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,is_null_filters,distinct.test rename to logictests/generated/mysql/1/sum,is_null_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,left_join,in_parameter.fail.test b/logictests/generated/mysql/1/sum,left_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,left_join,in_parameter.fail.test rename to logictests/generated/mysql/1/sum,left_join,in_parameter.test diff --git a/logictests/generated/mysql/sum,left_join.test b/logictests/generated/mysql/1/sum,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,left_join.test rename to logictests/generated/mysql/1/sum,left_join.test diff --git a/logictests/generated/mysql/sum,less_filters,left_join.test b/logictests/generated/mysql/1/sum,less_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,left_join.test rename to logictests/generated/mysql/1/sum,less_filters,left_join.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,between_filters.test b/logictests/generated/mysql/1/sum,less_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,between_filters.test rename to logictests/generated/mysql/1/sum,less_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/sum,max,between_filters.test b/logictests/generated/mysql/1/sum,max,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,between_filters.test rename to logictests/generated/mysql/1/sum,max,between_filters.test diff --git a/logictests/generated/mysql/sum,max,greater_filters.test b/logictests/generated/mysql/1/sum,max,greater_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,greater_filters.test rename to logictests/generated/mysql/1/sum,max,greater_filters.test diff --git a/logictests/generated/mysql/sum,min,single_parameter.test b/logictests/generated/mysql/1/sum,min,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,min,single_parameter.test rename to logictests/generated/mysql/1/sum,min,single_parameter.test diff --git a/logictests/generated/mysql/sum,multiple_parameters,in_parameter.fail.test b/logictests/generated/mysql/1/sum,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,multiple_parameters,in_parameter.fail.test rename to logictests/generated/mysql/1/sum,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,range_param.test b/logictests/generated/mysql/1/sum,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,range_param.test rename to logictests/generated/mysql/1/sum,not_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,topk,in_parameter.fail.test b/logictests/generated/mysql/1/sum,topk,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,topk,in_parameter.fail.test rename to logictests/generated/mysql/1/sum,topk,in_parameter.test diff --git a/logictests/generated/mysql/sum_distinct,between_filters,range_param.fail.test b/logictests/generated/mysql/1/sum_distinct,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,between_filters,range_param.fail.test rename to logictests/generated/mysql/1/sum_distinct,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,count,range_param.fail.test b/logictests/generated/mysql/1/sum_distinct,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,count,range_param.fail.test rename to logictests/generated/mysql/1/sum_distinct,count,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,inner_join,range_param.fail.test b/logictests/generated/mysql/1/sum_distinct,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,inner_join,range_param.fail.test rename to logictests/generated/mysql/1/sum_distinct,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,is_null_filters,range_param.fail.test b/logictests/generated/mysql/1/sum_distinct,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/1/sum_distinct,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,max,range_param.fail.test b/logictests/generated/mysql/1/sum_distinct,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,max,range_param.fail.test rename to logictests/generated/mysql/1/sum_distinct,max,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,range_param,range_param.fail.test b/logictests/generated/mysql/1/sum_distinct,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,range_param,range_param.fail.test rename to logictests/generated/mysql/1/sum_distinct,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/topk,avg_distinct,range_param.fail.test b/logictests/generated/mysql/1/topk,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/1/topk,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/topk,count,in_parameter.fail.test b/logictests/generated/mysql/1/topk,count,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,count,in_parameter.fail.test rename to logictests/generated/mysql/1/topk,count,in_parameter.test diff --git a/logictests/generated/mysql/topk,count_distinct,range_param.fail.test b/logictests/generated/mysql/1/topk,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,count_distinct,range_param.fail.test rename to logictests/generated/mysql/1/topk,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/topk,group_concat,in_parameter.fail.test b/logictests/generated/mysql/1/topk,group_concat,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/1/topk,group_concat,in_parameter.test diff --git a/logictests/generated/mysql/topk,is_null_filters,in_parameter.test b/logictests/generated/mysql/1/topk,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,is_null_filters,in_parameter.test rename to logictests/generated/mysql/1/topk,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,is_null_filters,range_param.test b/logictests/generated/mysql/1/topk,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,is_null_filters,range_param.test rename to logictests/generated/mysql/1/topk,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/topk,max,in_parameter.fail.test b/logictests/generated/mysql/1/topk,max,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,max,in_parameter.fail.test rename to logictests/generated/mysql/1/topk,max,in_parameter.test diff --git a/logictests/generated/mysql/topk,min,range_param.test b/logictests/generated/mysql/1/topk,min,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,min,range_param.test rename to logictests/generated/mysql/1/topk,min,range_param.test diff --git a/logictests/generated/mysql/topk,multiple_parameters,in_parameter.test b/logictests/generated/mysql/1/topk,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/1/topk,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/topk,multiple_range_params,range_param.test b/logictests/generated/mysql/1/topk,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,multiple_range_params,range_param.test rename to logictests/generated/mysql/1/topk,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/topk,project_literal,range_param.fail.test b/logictests/generated/mysql/1/topk,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,project_literal,range_param.fail.test rename to logictests/generated/mysql/1/topk,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/avg,between_filters,range_param.fail.test b/logictests/generated/mysql/2/avg,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,between_filters,range_param.fail.test rename to logictests/generated/mysql/2/avg,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,distinct,topk.test b/logictests/generated/mysql/2/avg,distinct,topk.test similarity index 100% rename from logictests/generated/mysql/avg,distinct,topk.test rename to logictests/generated/mysql/2/avg,distinct,topk.test diff --git a/logictests/generated/mysql/avg,equal_filters,distinct.test b/logictests/generated/mysql/2/avg,equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,distinct.test rename to logictests/generated/mysql/2/avg,equal_filters,distinct.test diff --git a/logictests/generated/mysql/avg,equal_filters,inner_join.test b/logictests/generated/mysql/2/avg,equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,inner_join.test rename to logictests/generated/mysql/2/avg,equal_filters,inner_join.test diff --git a/logictests/generated/mysql/avg,equal_filters,range_param.fail.test b/logictests/generated/mysql/2/avg,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/avg,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,greater_filters,between_filters.fail.test b/logictests/generated/mysql/2/avg,greater_filters,between_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,between_filters.fail.test rename to logictests/generated/mysql/2/avg,greater_filters,between_filters.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,between_filters.fail.test b/logictests/generated/mysql/2/avg,greater_or_equal_filters,between_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,between_filters.fail.test rename to logictests/generated/mysql/2/avg,greater_or_equal_filters,between_filters.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,left_join.fail.test b/logictests/generated/mysql/2/avg,greater_or_equal_filters,left_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,left_join.fail.test rename to logictests/generated/mysql/2/avg,greater_or_equal_filters,left_join.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,single_parameter.fail.test b/logictests/generated/mysql/2/avg,greater_or_equal_filters,single_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,single_parameter.fail.test rename to logictests/generated/mysql/2/avg,greater_or_equal_filters,single_parameter.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,inner_join.test b/logictests/generated/mysql/2/avg,group_concat,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,inner_join.test rename to logictests/generated/mysql/2/avg,group_concat,inner_join.test diff --git a/logictests/generated/mysql/avg,group_concat,less_or_equal_filters.fail.test b/logictests/generated/mysql/2/avg,group_concat,less_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,less_or_equal_filters.fail.test rename to logictests/generated/mysql/2/avg,group_concat,less_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,group_concat.test b/logictests/generated/mysql/2/avg,group_concat.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat.test rename to logictests/generated/mysql/2/avg,group_concat.test diff --git a/logictests/generated/mysql/avg,in_parameter,range_param.fail.test b/logictests/generated/mysql/2/avg,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,in_parameter,range_param.fail.test rename to logictests/generated/mysql/2/avg,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/avg,inner_join,single_parameter.test b/logictests/generated/mysql/2/avg,inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,inner_join,single_parameter.test rename to logictests/generated/mysql/2/avg,inner_join,single_parameter.test diff --git a/logictests/generated/mysql/avg,is_null_filters,left_join.test b/logictests/generated/mysql/2/avg,is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters,left_join.test rename to logictests/generated/mysql/2/avg,is_null_filters,left_join.test diff --git a/logictests/generated/mysql/avg,less_filters,inner_join.fail.test b/logictests/generated/mysql/2/avg,less_filters,inner_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,inner_join.fail.test rename to logictests/generated/mysql/2/avg,less_filters,inner_join.fail.test diff --git a/logictests/generated/mysql/avg,less_filters,single_parameter.fail.test b/logictests/generated/mysql/2/avg,less_filters,single_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,single_parameter.fail.test rename to logictests/generated/mysql/2/avg,less_filters,single_parameter.fail.test diff --git a/logictests/generated/mysql/avg,min,less_filters.fail.test b/logictests/generated/mysql/2/avg,min,less_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,min,less_filters.fail.test rename to logictests/generated/mysql/2/avg,min,less_filters.fail.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,is_null_filters.test b/logictests/generated/mysql/2/avg,not_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,is_null_filters.test rename to logictests/generated/mysql/2/avg,not_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/avg,project_literal,range_param.fail.test b/logictests/generated/mysql/2/avg,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,project_literal,range_param.fail.test rename to logictests/generated/mysql/2/avg,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/avg,single_parameter,topk.test b/logictests/generated/mysql/2/avg,single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/avg,single_parameter,topk.test rename to logictests/generated/mysql/2/avg,single_parameter,topk.test diff --git a/logictests/generated/mysql/avg,sum,range_param.fail.test b/logictests/generated/mysql/2/avg,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,sum,range_param.fail.test rename to logictests/generated/mysql/2/avg,sum,range_param.fail.test diff --git a/logictests/generated/mysql/avg,sum_distinct,range_param.fail.test b/logictests/generated/mysql/2/avg,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/2/avg,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/avg_distinct,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/avg_distinct,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,greater_filters,range_param.fail.test b/logictests/generated/mysql/2/avg_distinct,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,greater_filters,range_param.fail.test rename to logictests/generated/mysql/2/avg_distinct,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,avg,range_param.fail.test b/logictests/generated/mysql/2/between_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,avg,range_param.fail.test rename to logictests/generated/mysql/2/between_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/2/between_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/2/between_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/2/between_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/2/between_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,inner_join,range_param.test b/logictests/generated/mysql/2/between_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,inner_join,range_param.test rename to logictests/generated/mysql/2/between_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/between_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/2/between_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/2/between_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/2/between_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/2/between_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,left_join,in_parameter.test b/logictests/generated/mysql/2/between_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,left_join,in_parameter.test rename to logictests/generated/mysql/2/between_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,less_filters,in_parameter.test b/logictests/generated/mysql/2/between_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/2/between_filters,less_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/between_filters,max,in_parameter.fail.test b/logictests/generated/mysql/2/between_filters,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/between_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/2/between_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/count,avg,distinct.test b/logictests/generated/mysql/2/count,avg,distinct.test similarity index 100% rename from logictests/generated/mysql/count,avg,distinct.test rename to logictests/generated/mysql/2/count,avg,distinct.test diff --git a/logictests/generated/mysql/count,avg,greater_filters.fail.test b/logictests/generated/mysql/2/count,avg,greater_filters.fail.test similarity index 100% rename from logictests/generated/mysql/count,avg,greater_filters.fail.test rename to logictests/generated/mysql/2/count,avg,greater_filters.fail.test diff --git a/logictests/generated/mysql/count,avg,left_join.test b/logictests/generated/mysql/2/count,avg,left_join.test similarity index 100% rename from logictests/generated/mysql/count,avg,left_join.test rename to logictests/generated/mysql/2/count,avg,left_join.test diff --git a/logictests/generated/mysql/count,between_filters,is_null_filters.test b/logictests/generated/mysql/2/count,between_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,between_filters,is_null_filters.test rename to logictests/generated/mysql/2/count,between_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,between_filters,range_param.test b/logictests/generated/mysql/2/count,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,between_filters,range_param.test rename to logictests/generated/mysql/2/count,between_filters,range_param.test diff --git a/logictests/generated/mysql/count,equal_filters,left_join.test b/logictests/generated/mysql/2/count,equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,left_join.test rename to logictests/generated/mysql/2/count,equal_filters,left_join.test diff --git a/logictests/generated/mysql/count,equal_filters.test b/logictests/generated/mysql/2/count,equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters.test rename to logictests/generated/mysql/2/count,equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,greater_filters,in_parameter.fail.test b/logictests/generated/mysql/2/count,greater_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,greater_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/count,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,greater_filters,is_null_filters.test b/logictests/generated/mysql/2/count,greater_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,is_null_filters.test rename to logictests/generated/mysql/2/count,greater_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,group_concat,equal_filters.test b/logictests/generated/mysql/2/count,group_concat,equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,equal_filters.test rename to logictests/generated/mysql/2/count,group_concat,equal_filters.test diff --git a/logictests/generated/mysql/count,group_concat,greater_filters.test b/logictests/generated/mysql/2/count,group_concat,greater_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,greater_filters.test rename to logictests/generated/mysql/2/count,group_concat,greater_filters.test diff --git a/logictests/generated/mysql/count,group_concat,inner_join.test b/logictests/generated/mysql/2/count,group_concat,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,inner_join.test rename to logictests/generated/mysql/2/count,group_concat,inner_join.test diff --git a/logictests/generated/mysql/count,group_concat,is_null_filters.test b/logictests/generated/mysql/2/count,group_concat,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,is_null_filters.test rename to logictests/generated/mysql/2/count,group_concat,is_null_filters.test diff --git a/logictests/generated/mysql/count,group_concat,min.test b/logictests/generated/mysql/2/count,group_concat,min.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,min.test rename to logictests/generated/mysql/2/count,group_concat,min.test diff --git a/logictests/generated/mysql/count,group_concat,not_equal_filters.test b/logictests/generated/mysql/2/count,group_concat,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,not_equal_filters.test rename to logictests/generated/mysql/2/count,group_concat,not_equal_filters.test diff --git a/logictests/generated/mysql/count,in_parameter,range_param.fail.test b/logictests/generated/mysql/2/count,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/count,in_parameter,range_param.fail.test rename to logictests/generated/mysql/2/count,in_parameter,range_param.test diff --git a/logictests/generated/mysql/count,inner_join.test b/logictests/generated/mysql/2/count,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,inner_join.test rename to logictests/generated/mysql/2/count,inner_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,left_join,in_parameter.fail.test b/logictests/generated/mysql/2/count,left_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,left_join,in_parameter.fail.test rename to logictests/generated/mysql/2/count,left_join,in_parameter.test diff --git a/logictests/generated/mysql/count,max,inner_join.test b/logictests/generated/mysql/2/count,max,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,max,inner_join.test rename to logictests/generated/mysql/2/count,max,inner_join.test diff --git a/logictests/generated/mysql/count,max,less_filters.test b/logictests/generated/mysql/2/count,max,less_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,less_filters.test rename to logictests/generated/mysql/2/count,max,less_filters.test diff --git a/logictests/generated/mysql/count,min,inner_join.test b/logictests/generated/mysql/2/count,min,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,min,inner_join.test rename to logictests/generated/mysql/2/count,min,inner_join.test diff --git a/logictests/generated/mysql/count,min,is_null_filters.test b/logictests/generated/mysql/2/count,min,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,is_null_filters.test rename to logictests/generated/mysql/2/count,min,is_null_filters.test diff --git a/logictests/generated/mysql/count,min,left_join.test b/logictests/generated/mysql/2/count,min,left_join.test similarity index 100% rename from logictests/generated/mysql/count,min,left_join.test rename to logictests/generated/mysql/2/count,min,left_join.test diff --git a/logictests/generated/mysql/count,min,topk.test b/logictests/generated/mysql/2/count,min,topk.test similarity index 100% rename from logictests/generated/mysql/count,min,topk.test rename to logictests/generated/mysql/2/count,min,topk.test diff --git a/logictests/generated/mysql/count,not_equal_filters,left_join.test b/logictests/generated/mysql/2/count,not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,left_join.test rename to logictests/generated/mysql/2/count,not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/count,not_equal_filters.test b/logictests/generated/mysql/2/count,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters.test rename to logictests/generated/mysql/2/count,not_equal_filters.test diff --git a/logictests/generated/mysql/count,project_literal,range_param.fail.test b/logictests/generated/mysql/2/count,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,project_literal,range_param.fail.test rename to logictests/generated/mysql/2/count,project_literal,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,single_parameter,in_parameter.fail.test b/logictests/generated/mysql/2/count,single_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,single_parameter,in_parameter.fail.test rename to logictests/generated/mysql/2/count,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/count,single_parameter.test b/logictests/generated/mysql/2/count,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,single_parameter.test rename to logictests/generated/mysql/2/count,single_parameter.test diff --git a/logictests/generated/mysql/count,sum_distinct,range_param.fail.test b/logictests/generated/mysql/2/count,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/2/count,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,cte,range_param.fail.test b/logictests/generated/mysql/2/count_distinct,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,cte,range_param.fail.test rename to logictests/generated/mysql/2/count_distinct,cte,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,distinct,range_param.fail.test b/logictests/generated/mysql/2/count_distinct,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,distinct,range_param.fail.test rename to logictests/generated/mysql/2/count_distinct,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,less_filters,range_param.fail.test b/logictests/generated/mysql/2/count_distinct,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,less_filters,range_param.fail.test rename to logictests/generated/mysql/2/count_distinct,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/2/count_distinct,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/2/count_distinct,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/cte,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/cte,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/cte,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/2/cte,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/2/cte,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/cte,sum_distinct,range_param.fail.test b/logictests/generated/mysql/2/cte,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/2/cte,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,avg,range_param.fail.test b/logictests/generated/mysql/2/distinct,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,avg,range_param.fail.test rename to logictests/generated/mysql/2/distinct,avg,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,count,range_param.fail.test b/logictests/generated/mysql/2/distinct,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,count,range_param.fail.test rename to logictests/generated/mysql/2/distinct,count,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/distinct,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/distinct,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,cte,range_param.fail.test b/logictests/generated/mysql/2/distinct,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,cte,range_param.fail.test rename to logictests/generated/mysql/2/distinct,cte,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,equal_filters,range_param.test b/logictests/generated/mysql/2/distinct,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,equal_filters,range_param.test rename to logictests/generated/mysql/2/distinct,equal_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,greater_filters,range_param.test b/logictests/generated/mysql/2/distinct,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,greater_filters,range_param.test rename to logictests/generated/mysql/2/distinct,greater_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,is_null_filters,range_param.test b/logictests/generated/mysql/2/distinct,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,is_null_filters,range_param.test rename to logictests/generated/mysql/2/distinct,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,min,range_param.fail.test b/logictests/generated/mysql/2/distinct,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,min,range_param.fail.test rename to logictests/generated/mysql/2/distinct,min,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,single_parameter,range_param.test b/logictests/generated/mysql/2/distinct,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,single_parameter,range_param.test rename to logictests/generated/mysql/2/distinct,single_parameter,range_param.test diff --git a/logictests/generated/mysql/distinct,sum,range_param.fail.test b/logictests/generated/mysql/2/distinct,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,sum,range_param.fail.test rename to logictests/generated/mysql/2/distinct,sum,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,topk.test b/logictests/generated/mysql/2/distinct,topk.test similarity index 100% rename from logictests/generated/mysql/distinct,topk.test rename to logictests/generated/mysql/2/distinct,topk.test diff --git a/logictests/generated/mysql/equal_filters,avg,in_parameter.fail.test b/logictests/generated/mysql/2/equal_filters,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,avg,in_parameter.fail.test rename to logictests/generated/mysql/2/equal_filters,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/equal_filters,between_filters,range_param.test b/logictests/generated/mysql/2/equal_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,between_filters,range_param.test rename to logictests/generated/mysql/2/equal_filters,between_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,between_filters.test b/logictests/generated/mysql/2/equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,between_filters.test rename to logictests/generated/mysql/2/equal_filters,between_filters.test diff --git a/logictests/generated/mysql/equal_filters,inner_join,range_param.test b/logictests/generated/mysql/2/equal_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,inner_join,range_param.test rename to logictests/generated/mysql/2/equal_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/equal_filters,is_null_filters.test b/logictests/generated/mysql/2/equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,is_null_filters.test rename to logictests/generated/mysql/2/equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/equal_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/2/equal_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/equal_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,single_parameter,range_param.test b/logictests/generated/mysql/2/equal_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,single_parameter,range_param.test rename to logictests/generated/mysql/2/equal_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/equal_filters,topk.test b/logictests/generated/mysql/2/equal_filters,topk.test similarity index 100% rename from logictests/generated/mysql/equal_filters,topk.test rename to logictests/generated/mysql/2/equal_filters,topk.test diff --git a/logictests/generated/mysql/equal_filters.test b/logictests/generated/mysql/2/equal_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters.test rename to logictests/generated/mysql/2/equal_filters.test diff --git a/logictests/generated/mysql/greater_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/2/greater_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/2/greater_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,cte,range_param.fail.test b/logictests/generated/mysql/2/greater_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,cte,range_param.fail.test rename to logictests/generated/mysql/2/greater_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,equal_filters,range_param.test b/logictests/generated/mysql/2/greater_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,equal_filters,range_param.test rename to logictests/generated/mysql/2/greater_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,inner_join,range_param.test b/logictests/generated/mysql/2/greater_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,inner_join,range_param.test rename to logictests/generated/mysql/2/greater_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/greater_filters,less_or_equal_filters.test b/logictests/generated/mysql/2/greater_filters,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/greater_filters,less_or_equal_filters.test rename to logictests/generated/mysql/2/greater_filters,less_or_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_filters,min,in_parameter.fail.test b/logictests/generated/mysql/2/greater_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/2/greater_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/2/greater_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/2/greater_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/greater_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/2/greater_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/2/greater_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,range_param.test b/logictests/generated/mysql/2/greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,range_param.test rename to logictests/generated/mysql/2/greater_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,sum,range_param.test b/logictests/generated/mysql/2/greater_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,sum,range_param.test rename to logictests/generated/mysql/2/greater_filters,sum,range_param.test diff --git a/logictests/generated/mysql/greater_filters.test b/logictests/generated/mysql/2/greater_filters.test similarity index 100% rename from logictests/generated/mysql/greater_filters.test rename to logictests/generated/mysql/2/greater_filters.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/2/greater_or_equal_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/2/greater_or_equal_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,cte,range_param.fail.test b/logictests/generated/mysql/2/greater_or_equal_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,cte,range_param.fail.test rename to logictests/generated/mysql/2/greater_or_equal_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,distinct,range_param.test b/logictests/generated/mysql/2/greater_or_equal_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,distinct,range_param.test rename to logictests/generated/mysql/2/greater_or_equal_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/2/greater_or_equal_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/2/greater_or_equal_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,in_parameter,range_param.test b/logictests/generated/mysql/2/greater_or_equal_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,in_parameter,range_param.test rename to logictests/generated/mysql/2/greater_or_equal_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,left_join,in_parameter.test b/logictests/generated/mysql/2/greater_or_equal_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,left_join,in_parameter.test rename to logictests/generated/mysql/2/greater_or_equal_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,left_join.test b/logictests/generated/mysql/2/greater_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,left_join.test rename to logictests/generated/mysql/2/greater_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/2/greater_or_equal_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/greater_or_equal_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/2/greater_or_equal_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/greater_or_equal_filters,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/2/greater_or_equal_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/2/greater_or_equal_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/2/greater_or_equal_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/2/greater_or_equal_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,sum,range_param.test b/logictests/generated/mysql/2/greater_or_equal_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,sum,range_param.test rename to logictests/generated/mysql/2/greater_or_equal_filters,sum,range_param.test diff --git a/logictests/generated/mysql/group_concat,between_filters,left_join.test b/logictests/generated/mysql/2/group_concat,between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,between_filters,left_join.test rename to logictests/generated/mysql/2/group_concat,between_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,count,range_param.fail.test b/logictests/generated/mysql/2/group_concat,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,count,range_param.fail.test rename to logictests/generated/mysql/2/group_concat,count,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,distinct,range_param.fail.test b/logictests/generated/mysql/2/group_concat,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,distinct,range_param.fail.test rename to logictests/generated/mysql/2/group_concat,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,equal_filters,inner_join.test b/logictests/generated/mysql/2/group_concat,equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,equal_filters,inner_join.test rename to logictests/generated/mysql/2/group_concat,equal_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,equal_filters,single_parameter.test b/logictests/generated/mysql/2/group_concat,equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,equal_filters,single_parameter.test rename to logictests/generated/mysql/2/group_concat,equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,greater_filters,single_parameter.test b/logictests/generated/mysql/2/group_concat,greater_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_filters,single_parameter.test rename to logictests/generated/mysql/2/group_concat,greater_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,inner_join,left_join.test b/logictests/generated/mysql/2/group_concat,inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,inner_join,left_join.test rename to logictests/generated/mysql/2/group_concat,inner_join,left_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/group_concat,is_null_filters,in_parameter.fail.test b/logictests/generated/mysql/2/group_concat,is_null_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/group_concat,is_null_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/group_concat,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/group_concat,is_null_filters,range_param.fail.test b/logictests/generated/mysql/2/group_concat,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/2/group_concat,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,is_null_filters.test b/logictests/generated/mysql/2/group_concat,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,is_null_filters.test rename to logictests/generated/mysql/2/group_concat,is_null_filters.test diff --git a/logictests/generated/mysql/group_concat,max,distinct.test b/logictests/generated/mysql/2/group_concat,max,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,distinct.test rename to logictests/generated/mysql/2/group_concat,max,distinct.test diff --git a/logictests/generated/mysql/group_concat,max,is_null_filters.test b/logictests/generated/mysql/2/group_concat,max,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,is_null_filters.test rename to logictests/generated/mysql/2/group_concat,max,is_null_filters.test diff --git a/logictests/generated/mysql/group_concat,min,between_filters.test b/logictests/generated/mysql/2/group_concat,min,between_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,between_filters.test rename to logictests/generated/mysql/2/group_concat,min,between_filters.test diff --git a/logictests/generated/mysql/group_concat,min,less_or_equal_filters.test b/logictests/generated/mysql/2/group_concat,min,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,less_or_equal_filters.test rename to logictests/generated/mysql/2/group_concat,min,less_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,min.test b/logictests/generated/mysql/2/group_concat,min.test similarity index 100% rename from logictests/generated/mysql/group_concat,min.test rename to logictests/generated/mysql/2/group_concat,min.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters,inner_join.test b/logictests/generated/mysql/2/group_concat,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters,inner_join.test rename to logictests/generated/mysql/2/group_concat,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters,left_join.test b/logictests/generated/mysql/2/group_concat,not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters,left_join.test rename to logictests/generated/mysql/2/group_concat,not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/2/group_concat,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/group_concat,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters,single_parameter.test b/logictests/generated/mysql/2/group_concat,not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters,single_parameter.test rename to logictests/generated/mysql/2/group_concat,not_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,single_parameter,range_param.fail.test b/logictests/generated/mysql/2/group_concat,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,single_parameter,range_param.fail.test rename to logictests/generated/mysql/2/group_concat,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,single_parameter.test b/logictests/generated/mysql/2/group_concat,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,single_parameter.test rename to logictests/generated/mysql/2/group_concat,single_parameter.test diff --git a/logictests/generated/mysql/in_parameter,avg_distinct,range_param.fail.test b/logictests/generated/mysql/2/in_parameter,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/2/in_parameter,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/in_parameter,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/in_parameter,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,cte,range_param.fail.test b/logictests/generated/mysql/2/in_parameter,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,cte,range_param.fail.test rename to logictests/generated/mysql/2/in_parameter,cte,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/2/in_parameter,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/in_parameter,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,min,range_param.fail.test b/logictests/generated/mysql/2/in_parameter,min,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,min,range_param.fail.test rename to logictests/generated/mysql/2/in_parameter,min,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/in_parameter,sum,in_parameter.fail.test b/logictests/generated/mysql/2/in_parameter,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/in_parameter,sum,in_parameter.fail.test rename to logictests/generated/mysql/2/in_parameter,sum,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,between_filters,in_parameter.test b/logictests/generated/mysql/2/inner_join,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,between_filters,in_parameter.test rename to logictests/generated/mysql/2/inner_join,between_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/inner_join,count,in_parameter.fail.test b/logictests/generated/mysql/2/inner_join,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/inner_join,count,in_parameter.fail.test rename to logictests/generated/mysql/2/inner_join,count,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,distinct,range_param.test b/logictests/generated/mysql/2/inner_join,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,distinct,range_param.test rename to logictests/generated/mysql/2/inner_join,distinct,range_param.test diff --git a/logictests/generated/mysql/inner_join,in_parameter.test b/logictests/generated/mysql/2/inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,in_parameter.test rename to logictests/generated/mysql/2/inner_join,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,join_subquery,range_param.fail.test b/logictests/generated/mysql/2/inner_join,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,join_subquery,range_param.fail.test rename to logictests/generated/mysql/2/inner_join,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,not_equal_filters,in_parameter.test b/logictests/generated/mysql/2/inner_join,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/inner_join,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,project_literal,range_param.fail.test b/logictests/generated/mysql/2/inner_join,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,project_literal,range_param.fail.test rename to logictests/generated/mysql/2/inner_join,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,single_parameter,in_parameter.test b/logictests/generated/mysql/2/inner_join,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,single_parameter,in_parameter.test rename to logictests/generated/mysql/2/inner_join,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,sum,range_param.test b/logictests/generated/mysql/2/inner_join,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,sum,range_param.test rename to logictests/generated/mysql/2/inner_join,sum,range_param.test diff --git a/logictests/generated/mysql/inner_join,topk.test b/logictests/generated/mysql/2/inner_join,topk.test similarity index 100% rename from logictests/generated/mysql/inner_join,topk.test rename to logictests/generated/mysql/2/inner_join,topk.test diff --git a/logictests/generated/mysql/is_null_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/is_null_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/is_null_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,distinct,range_param.test b/logictests/generated/mysql/2/is_null_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,distinct,range_param.test rename to logictests/generated/mysql/2/is_null_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/2/is_null_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/2/is_null_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,inner_join.test b/logictests/generated/mysql/2/is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,inner_join.test rename to logictests/generated/mysql/2/is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/is_null_filters,left_join,in_parameter.test b/logictests/generated/mysql/2/is_null_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,left_join,in_parameter.test rename to logictests/generated/mysql/2/is_null_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,left_join,range_param.test b/logictests/generated/mysql/2/is_null_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,left_join,range_param.test rename to logictests/generated/mysql/2/is_null_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,less_filters,range_param.test b/logictests/generated/mysql/2/is_null_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,less_filters,range_param.test rename to logictests/generated/mysql/2/is_null_filters,less_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,min,range_param.test b/logictests/generated/mysql/2/is_null_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,min,range_param.test rename to logictests/generated/mysql/2/is_null_filters,min,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/2/is_null_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/2/is_null_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/2/is_null_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/is_null_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/join_subquery,equal_filters,range_param.fail.test b/logictests/generated/mysql/2/join_subquery,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/join_subquery,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,less_filters,range_param.fail.test b/logictests/generated/mysql/2/join_subquery,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,less_filters,range_param.fail.test rename to logictests/generated/mysql/2/join_subquery,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,range_param,range_param.fail.test b/logictests/generated/mysql/2/join_subquery,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,range_param,range_param.fail.test rename to logictests/generated/mysql/2/join_subquery,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,single_parameter,range_param.fail.test b/logictests/generated/mysql/2/join_subquery,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,single_parameter,range_param.fail.test rename to logictests/generated/mysql/2/join_subquery,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,greater_filters,in_parameter.test b/logictests/generated/mysql/2/left_join,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,greater_filters,in_parameter.test rename to logictests/generated/mysql/2/left_join,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,group_concat,range_param.fail.test b/logictests/generated/mysql/2/left_join,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,group_concat,range_param.fail.test rename to logictests/generated/mysql/2/left_join,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,is_null_filters,in_parameter.test b/logictests/generated/mysql/2/left_join,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,is_null_filters,in_parameter.test rename to logictests/generated/mysql/2/left_join,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,multiple_parameters,in_parameter.test b/logictests/generated/mysql/2/left_join,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/2/left_join,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,not_equal_filters,in_parameter.test b/logictests/generated/mysql/2/left_join,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/left_join,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,topk,in_parameter.fail.test b/logictests/generated/mysql/2/left_join,topk,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,topk,in_parameter.fail.test rename to logictests/generated/mysql/2/left_join,topk,in_parameter.fail.test diff --git a/logictests/generated/mysql/less_filters,avg,range_param.fail.test b/logictests/generated/mysql/2/less_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,avg,range_param.fail.test rename to logictests/generated/mysql/2/less_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,between_filters,in_parameter.test b/logictests/generated/mysql/2/less_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/2/less_filters,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,greater_filters,range_param.test b/logictests/generated/mysql/2/less_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,greater_filters,range_param.test rename to logictests/generated/mysql/2/less_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,is_null_filters,range_param.test b/logictests/generated/mysql/2/less_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/2/less_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/2/less_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/2/less_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,left_join,in_parameter.test b/logictests/generated/mysql/2/less_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,left_join,in_parameter.test rename to logictests/generated/mysql/2/less_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,left_join.test b/logictests/generated/mysql/2/less_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/less_filters,left_join.test rename to logictests/generated/mysql/2/less_filters,left_join.test diff --git a/logictests/generated/mysql/less_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/2/less_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/less_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/2/less_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/2/less_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/2/less_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/2/less_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/less_filters,range_param,range_param.test b/logictests/generated/mysql/2/less_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,range_param,range_param.test rename to logictests/generated/mysql/2/less_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/less_filters,topk,range_param.test b/logictests/generated/mysql/2/less_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,topk,range_param.test rename to logictests/generated/mysql/2/less_filters,topk,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,avg,range_param.fail.test b/logictests/generated/mysql/2/less_or_equal_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,avg,range_param.fail.test rename to logictests/generated/mysql/2/less_or_equal_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/less_or_equal_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/less_or_equal_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,distinct,range_param.test b/logictests/generated/mysql/2/less_or_equal_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,distinct,range_param.test rename to logictests/generated/mysql/2/less_or_equal_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,left_join,range_param.test b/logictests/generated/mysql/2/less_or_equal_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,left_join,range_param.test rename to logictests/generated/mysql/2/less_or_equal_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,range_param.test b/logictests/generated/mysql/2/less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/less_or_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/2/less_or_equal_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/2/less_or_equal_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/2/less_or_equal_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/2/less_or_equal_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,topk,in_parameter.test b/logictests/generated/mysql/2/less_or_equal_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,topk,in_parameter.test rename to logictests/generated/mysql/2/less_or_equal_filters,topk,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,between_filters,in_parameter.fail.test b/logictests/generated/mysql/2/max,between_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,between_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/max,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,count,range_param.test b/logictests/generated/mysql/2/max,count,range_param.test similarity index 100% rename from logictests/generated/mysql/max,count,range_param.test rename to logictests/generated/mysql/2/max,count,range_param.test diff --git a/logictests/generated/mysql/max,equal_filters,range_param.test b/logictests/generated/mysql/2/max,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,range_param.test rename to logictests/generated/mysql/2/max,equal_filters,range_param.test diff --git a/logictests/generated/mysql/max,equal_filters,single_parameter.test b/logictests/generated/mysql/2/max,equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,single_parameter.test rename to logictests/generated/mysql/2/max,equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,between_filters.test b/logictests/generated/mysql/2/max,greater_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,between_filters.test rename to logictests/generated/mysql/2/max,greater_or_equal_filters,between_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,greater_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/2/max,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,greater_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/max,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,inner_join.test b/logictests/generated/mysql/2/max,greater_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,inner_join.test rename to logictests/generated/mysql/2/max,greater_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/2/max,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/max,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/max,in_parameter,range_param.fail.test b/logictests/generated/mysql/2/max,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/max,in_parameter,range_param.fail.test rename to logictests/generated/mysql/2/max,in_parameter,range_param.test diff --git a/logictests/generated/mysql/max,inner_join.test b/logictests/generated/mysql/2/max,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,inner_join.test rename to logictests/generated/mysql/2/max,inner_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,left_join,in_parameter.fail.test b/logictests/generated/mysql/2/max,left_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,left_join,in_parameter.fail.test rename to logictests/generated/mysql/2/max,left_join,in_parameter.test diff --git a/logictests/generated/mysql/max,left_join.test b/logictests/generated/mysql/2/max,left_join.test similarity index 100% rename from logictests/generated/mysql/max,left_join.test rename to logictests/generated/mysql/2/max,left_join.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters.test b/logictests/generated/mysql/2/max,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters.test rename to logictests/generated/mysql/2/max,less_or_equal_filters.test diff --git a/logictests/generated/mysql/max,min,less_filters.test b/logictests/generated/mysql/2/max,min,less_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,less_filters.test rename to logictests/generated/mysql/2/max,min,less_filters.test diff --git a/logictests/generated/mysql/max,single_parameter,range_param.test b/logictests/generated/mysql/2/max,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/max,single_parameter,range_param.test rename to logictests/generated/mysql/2/max,single_parameter,range_param.test diff --git a/logictests/generated/mysql/max.test b/logictests/generated/mysql/2/max.test similarity index 100% rename from logictests/generated/mysql/max.test rename to logictests/generated/mysql/2/max.test diff --git a/logictests/generated/mysql/min,avg_distinct,range_param.fail.test b/logictests/generated/mysql/2/min,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/2/min,avg_distinct,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,between_filters,in_parameter.fail.test b/logictests/generated/mysql/2/min,between_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,between_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/min,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,between_filters,left_join.test b/logictests/generated/mysql/2/min,between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,between_filters,left_join.test rename to logictests/generated/mysql/2/min,between_filters,left_join.test diff --git a/logictests/generated/mysql/min,between_filters,single_parameter.test b/logictests/generated/mysql/2/min,between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,between_filters,single_parameter.test rename to logictests/generated/mysql/2/min,between_filters,single_parameter.test diff --git a/logictests/generated/mysql/min,between_filters.test b/logictests/generated/mysql/2/min,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,between_filters.test rename to logictests/generated/mysql/2/min,between_filters.test diff --git a/logictests/generated/mysql/min,distinct,left_join.test b/logictests/generated/mysql/2/min,distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/min,distinct,left_join.test rename to logictests/generated/mysql/2/min,distinct,left_join.test diff --git a/logictests/generated/mysql/min,distinct,range_param.fail.test b/logictests/generated/mysql/2/min,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,distinct,range_param.fail.test rename to logictests/generated/mysql/2/min,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/min,equal_filters,is_null_filters.test b/logictests/generated/mysql/2/min,equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,is_null_filters.test rename to logictests/generated/mysql/2/min,equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,greater_filters,distinct.test b/logictests/generated/mysql/2/min,greater_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,distinct.test rename to logictests/generated/mysql/2/min,greater_filters,distinct.test diff --git a/logictests/generated/mysql/min,greater_filters,is_null_filters.test b/logictests/generated/mysql/2/min,greater_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,is_null_filters.test rename to logictests/generated/mysql/2/min,greater_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,greater_filters,range_param.test b/logictests/generated/mysql/2/min,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,range_param.test rename to logictests/generated/mysql/2/min,greater_filters,range_param.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,inner_join.test b/logictests/generated/mysql/2/min,greater_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,inner_join.test rename to logictests/generated/mysql/2/min,greater_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/2/min,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/min,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/min,is_null_filters,in_parameter.fail.test b/logictests/generated/mysql/2/min,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/min,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,left_join,single_parameter.test b/logictests/generated/mysql/2/min,left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,left_join,single_parameter.test rename to logictests/generated/mysql/2/min,left_join,single_parameter.test diff --git a/logictests/generated/mysql/min,less_filters,left_join.test b/logictests/generated/mysql/2/min,less_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,left_join.test rename to logictests/generated/mysql/2/min,less_filters,left_join.test diff --git a/logictests/generated/mysql/min,less_filters,range_param.test b/logictests/generated/mysql/2/min,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,range_param.test rename to logictests/generated/mysql/2/min,less_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,less_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/2/min,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,less_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/2/min,less_or_equal_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,max,in_parameter.fail.test b/logictests/generated/mysql/2/min,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,max,in_parameter.fail.test rename to logictests/generated/mysql/2/min,max,in_parameter.test diff --git a/logictests/generated/mysql/min,multiple_parameters,range_param.test b/logictests/generated/mysql/2/min,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,multiple_parameters,range_param.test rename to logictests/generated/mysql/2/min,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/min,not_equal_filters,between_filters.test b/logictests/generated/mysql/2/min,not_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,between_filters.test rename to logictests/generated/mysql/2/min,not_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/min,not_equal_filters,inner_join.test b/logictests/generated/mysql/2/min,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,inner_join.test rename to logictests/generated/mysql/2/min,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/min,range_param.test b/logictests/generated/mysql/2/min,range_param.test similarity index 100% rename from logictests/generated/mysql/min,range_param.test rename to logictests/generated/mysql/2/min,range_param.test diff --git a/logictests/generated/mysql/min,single_parameter,topk.test b/logictests/generated/mysql/2/min,single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/min,single_parameter,topk.test rename to logictests/generated/mysql/2/min,single_parameter,topk.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,sum,in_parameter.fail.test b/logictests/generated/mysql/2/min,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,sum,in_parameter.fail.test rename to logictests/generated/mysql/2/min,sum,in_parameter.test diff --git a/logictests/generated/mysql/min,sum,range_param.test b/logictests/generated/mysql/2/min,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/min,sum,range_param.test rename to logictests/generated/mysql/2/min,sum,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,avg,in_parameter.fail.test b/logictests/generated/mysql/2/multiple_parameters,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,avg,in_parameter.fail.test rename to logictests/generated/mysql/2/multiple_parameters,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,group_concat,range_param.fail.test b/logictests/generated/mysql/2/multiple_parameters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,group_concat,range_param.fail.test rename to logictests/generated/mysql/2/multiple_parameters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,in_parameter.test b/logictests/generated/mysql/2/multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,in_parameter.test rename to logictests/generated/mysql/2/multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,multiple_range_params,range_param.test b/logictests/generated/mysql/2/multiple_parameters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,multiple_range_params,range_param.test rename to logictests/generated/mysql/2/multiple_parameters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/2/multiple_parameters,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/multiple_parameters,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,distinct,range_param.test b/logictests/generated/mysql/2/multiple_range_params,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,distinct,range_param.test rename to logictests/generated/mysql/2/multiple_range_params,distinct,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,is_null_filters,range_param.fail.test b/logictests/generated/mysql/2/multiple_range_params,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/2/multiple_range_params,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,join_subquery,range_param.fail.test b/logictests/generated/mysql/2/multiple_range_params,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,join_subquery,range_param.fail.test rename to logictests/generated/mysql/2/multiple_range_params,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/2/not_equal_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/2/not_equal_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,cte,range_param.fail.test b/logictests/generated/mysql/2/not_equal_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,cte,range_param.fail.test rename to logictests/generated/mysql/2/not_equal_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/2/not_equal_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/not_equal_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,less_filters.test b/logictests/generated/mysql/2/not_equal_filters,less_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,less_filters.test rename to logictests/generated/mysql/2/not_equal_filters,less_filters.test diff --git a/logictests/generated/mysql/not_equal_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/2/not_equal_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/not_equal_filters,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/2/not_equal_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/2/not_equal_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,range_param.test b/logictests/generated/mysql/2/not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,range_param.test rename to logictests/generated/mysql/2/not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/2/not_equal_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/2/not_equal_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,single_parameter.test b/logictests/generated/mysql/2/not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,single_parameter.test rename to logictests/generated/mysql/2/not_equal_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/not_equal_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/2/not_equal_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/not_equal_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/2/not_equal_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,topk,range_param.test b/logictests/generated/mysql/2/not_equal_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,topk,range_param.test rename to logictests/generated/mysql/2/not_equal_filters,topk,range_param.test diff --git a/logictests/generated/mysql/project_literal,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/project_literal,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/project_literal,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,distinct,range_param.fail.test b/logictests/generated/mysql/2/project_literal,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,distinct,range_param.fail.test rename to logictests/generated/mysql/2/project_literal,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,max,range_param.fail.test b/logictests/generated/mysql/2/project_literal,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,max,range_param.fail.test rename to logictests/generated/mysql/2/project_literal,max,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,range_param,range_param.fail.test b/logictests/generated/mysql/2/project_literal,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,range_param,range_param.fail.test rename to logictests/generated/mysql/2/project_literal,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,sum,range_param.fail.test b/logictests/generated/mysql/2/project_literal,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,sum,range_param.fail.test rename to logictests/generated/mysql/2/project_literal,sum,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,avg_distinct,range_param.fail.test b/logictests/generated/mysql/2/range_param,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/2/range_param,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,count,range_param.test b/logictests/generated/mysql/2/range_param,count,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,count,range_param.test rename to logictests/generated/mysql/2/range_param,count,range_param.test diff --git a/logictests/generated/mysql/range_param,distinct,range_param.test b/logictests/generated/mysql/2/range_param,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,distinct,range_param.test rename to logictests/generated/mysql/2/range_param,distinct,range_param.test diff --git a/logictests/generated/mysql/range_param,group_concat,range_param.fail.test b/logictests/generated/mysql/2/range_param,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,group_concat,range_param.fail.test rename to logictests/generated/mysql/2/range_param,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,sum,range_param.test b/logictests/generated/mysql/2/range_param,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,sum,range_param.test rename to logictests/generated/mysql/2/range_param,sum,range_param.test diff --git a/logictests/generated/mysql/single_parameter,equal_filters,range_param.fail.test b/logictests/generated/mysql/2/single_parameter,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/single_parameter,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,in_parameter,range_param.test b/logictests/generated/mysql/2/single_parameter,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,in_parameter,range_param.test rename to logictests/generated/mysql/2/single_parameter,in_parameter,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/single_parameter,max,in_parameter.fail.test b/logictests/generated/mysql/2/single_parameter,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/single_parameter,max,in_parameter.fail.test rename to logictests/generated/mysql/2/single_parameter,max,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,min,range_param.test b/logictests/generated/mysql/2/single_parameter,min,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,min,range_param.test rename to logictests/generated/mysql/2/single_parameter,min,range_param.test diff --git a/logictests/generated/mysql/single_parameter,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/2/single_parameter,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/single_parameter,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,range_param,range_param.test b/logictests/generated/mysql/2/single_parameter,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,range_param,range_param.test rename to logictests/generated/mysql/2/single_parameter,range_param,range_param.test diff --git a/logictests/generated/mysql/single_parameter,topk,in_parameter.test b/logictests/generated/mysql/2/single_parameter,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter,topk,in_parameter.test rename to logictests/generated/mysql/2/single_parameter,topk,in_parameter.test diff --git a/logictests/generated/mysql/sum,avg,min.test b/logictests/generated/mysql/2/sum,avg,min.test similarity index 100% rename from logictests/generated/mysql/sum,avg,min.test rename to logictests/generated/mysql/2/sum,avg,min.test diff --git a/logictests/generated/mysql/sum,between_filters,left_join.test b/logictests/generated/mysql/2/sum,between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,left_join.test rename to logictests/generated/mysql/2/sum,between_filters,left_join.test diff --git a/logictests/generated/mysql/sum,between_filters,single_parameter.test b/logictests/generated/mysql/2/sum,between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,single_parameter.test rename to logictests/generated/mysql/2/sum,between_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,count,in_parameter.fail.test b/logictests/generated/mysql/2/sum,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,count,in_parameter.fail.test rename to logictests/generated/mysql/2/sum,count,in_parameter.test diff --git a/logictests/generated/mysql/sum,distinct,single_parameter.test b/logictests/generated/mysql/2/sum,distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,distinct,single_parameter.test rename to logictests/generated/mysql/2/sum,distinct,single_parameter.test diff --git a/logictests/generated/mysql/sum,distinct.test b/logictests/generated/mysql/2/sum,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,distinct.test rename to logictests/generated/mysql/2/sum,distinct.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,between_filters.test b/logictests/generated/mysql/2/sum,greater_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,between_filters.test rename to logictests/generated/mysql/2/sum,greater_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,inner_join.test b/logictests/generated/mysql/2/sum,greater_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,inner_join.test rename to logictests/generated/mysql/2/sum,greater_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,left_join.test b/logictests/generated/mysql/2/sum,greater_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,left_join.test rename to logictests/generated/mysql/2/sum,greater_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/sum,group_concat,in_parameter.fail.test b/logictests/generated/mysql/2/sum,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/2/sum,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/sum,group_concat,less_filters.test b/logictests/generated/mysql/2/sum,group_concat,less_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,less_filters.test rename to logictests/generated/mysql/2/sum,group_concat,less_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,less_or_equal_filters.test b/logictests/generated/mysql/2/sum,group_concat,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,less_or_equal_filters.test rename to logictests/generated/mysql/2/sum,group_concat,less_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,range_param.fail.test b/logictests/generated/mysql/2/sum,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,range_param.fail.test rename to logictests/generated/mysql/2/sum,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/sum,group_concat,topk.test b/logictests/generated/mysql/2/sum,group_concat,topk.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,topk.test rename to logictests/generated/mysql/2/sum,group_concat,topk.test diff --git a/logictests/generated/mysql/sum,group_concat.test b/logictests/generated/mysql/2/sum,group_concat.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat.test rename to logictests/generated/mysql/2/sum,group_concat.test diff --git a/logictests/generated/mysql/sum,inner_join,left_join.test b/logictests/generated/mysql/2/sum,inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,inner_join,left_join.test rename to logictests/generated/mysql/2/sum,inner_join,left_join.test diff --git a/logictests/generated/mysql/sum,inner_join,single_parameter.test b/logictests/generated/mysql/2/sum,inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,inner_join,single_parameter.test rename to logictests/generated/mysql/2/sum,inner_join,single_parameter.test diff --git a/logictests/generated/mysql/sum,is_null_filters,single_parameter.test b/logictests/generated/mysql/2/sum,is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,is_null_filters,single_parameter.test rename to logictests/generated/mysql/2/sum,is_null_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,less_filters,between_filters.test b/logictests/generated/mysql/2/sum,less_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,between_filters.test rename to logictests/generated/mysql/2/sum,less_filters,between_filters.test diff --git a/logictests/generated/mysql/sum,less_filters,inner_join.test b/logictests/generated/mysql/2/sum,less_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,inner_join.test rename to logictests/generated/mysql/2/sum,less_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,less_filters,range_param.test b/logictests/generated/mysql/2/sum,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,range_param.test rename to logictests/generated/mysql/2/sum,less_filters,range_param.test diff --git a/logictests/generated/mysql/sum,max,greater_or_equal_filters.test b/logictests/generated/mysql/2/sum,max,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,greater_or_equal_filters.test rename to logictests/generated/mysql/2/sum,max,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,max,less_or_equal_filters.test b/logictests/generated/mysql/2/sum,max,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,less_or_equal_filters.test rename to logictests/generated/mysql/2/sum,max,less_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,min,distinct.test b/logictests/generated/mysql/2/sum,min,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,min,distinct.test rename to logictests/generated/mysql/2/sum,min,distinct.test diff --git a/logictests/generated/mysql/sum,min,less_or_equal_filters.test b/logictests/generated/mysql/2/sum,min,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,less_or_equal_filters.test rename to logictests/generated/mysql/2/sum,min,less_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,min,not_equal_filters.test b/logictests/generated/mysql/2/sum,min,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,not_equal_filters.test rename to logictests/generated/mysql/2/sum,min,not_equal_filters.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,between_filters.test b/logictests/generated/mysql/2/sum,not_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,between_filters.test rename to logictests/generated/mysql/2/sum,not_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/sum,single_parameter,range_param.test b/logictests/generated/mysql/2/sum,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,single_parameter,range_param.test rename to logictests/generated/mysql/2/sum,single_parameter,range_param.test diff --git a/logictests/generated/mysql/sum,topk,range_param.test b/logictests/generated/mysql/2/sum,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,topk,range_param.test rename to logictests/generated/mysql/2/sum,topk,range_param.test diff --git a/logictests/generated/mysql/sum,topk.test b/logictests/generated/mysql/2/sum,topk.test similarity index 100% rename from logictests/generated/mysql/sum,topk.test rename to logictests/generated/mysql/2/sum,topk.test diff --git a/logictests/generated/mysql/sum_distinct,count_distinct,range_param.fail.test b/logictests/generated/mysql/2/sum_distinct,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,count_distinct,range_param.fail.test rename to logictests/generated/mysql/2/sum_distinct,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/2/sum_distinct,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/2/sum_distinct,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,group_concat,range_param.fail.test b/logictests/generated/mysql/2/sum_distinct,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,group_concat,range_param.fail.test rename to logictests/generated/mysql/2/sum_distinct,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/2/sum_distinct,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/2/sum_distinct,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,range_param.fail.test b/logictests/generated/mysql/2/sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,range_param.fail.test rename to logictests/generated/mysql/2/sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,topk,range_param.fail.test b/logictests/generated/mysql/2/sum_distinct,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,topk,range_param.fail.test rename to logictests/generated/mysql/2/sum_distinct,topk,range_param.fail.test diff --git a/logictests/generated/mysql/topk,count,range_param.test b/logictests/generated/mysql/2/topk,count,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,count,range_param.test rename to logictests/generated/mysql/2/topk,count,range_param.test diff --git a/logictests/generated/mysql/topk,equal_filters,range_param.test b/logictests/generated/mysql/2/topk,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,equal_filters,range_param.test rename to logictests/generated/mysql/2/topk,equal_filters,range_param.test diff --git a/logictests/generated/mysql/topk,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/2/topk,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/2/topk,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/topk,inner_join,in_parameter.fail.test b/logictests/generated/mysql/2/topk,inner_join,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/topk,inner_join,in_parameter.fail.test rename to logictests/generated/mysql/2/topk,inner_join,in_parameter.fail.test diff --git a/logictests/generated/mysql/topk,inner_join,range_param.test b/logictests/generated/mysql/2/topk,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,inner_join,range_param.test rename to logictests/generated/mysql/2/topk,inner_join,range_param.test diff --git a/logictests/generated/mysql/topk,join_subquery,range_param.fail.test b/logictests/generated/mysql/2/topk,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,join_subquery,range_param.fail.test rename to logictests/generated/mysql/2/topk,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/topk,left_join,in_parameter.fail.test b/logictests/generated/mysql/2/topk,left_join,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/topk,left_join,in_parameter.fail.test rename to logictests/generated/mysql/2/topk,left_join,in_parameter.fail.test diff --git a/logictests/generated/mysql/topk,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/2/topk,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/2/topk,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,not_equal_filters,range_param.test b/logictests/generated/mysql/2/topk,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,not_equal_filters,range_param.test rename to logictests/generated/mysql/2/topk,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/topk,range_param,range_param.test b/logictests/generated/mysql/2/topk,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,range_param,range_param.test rename to logictests/generated/mysql/2/topk,range_param,range_param.test diff --git a/logictests/generated/mysql/topk,sum_distinct,range_param.fail.test b/logictests/generated/mysql/2/topk,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/2/topk,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg,between_filters,single_parameter.test b/logictests/generated/mysql/3/avg,between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,between_filters,single_parameter.test rename to logictests/generated/mysql/3/avg,between_filters,single_parameter.test diff --git a/logictests/generated/mysql/avg,equal_filters,is_null_filters.test b/logictests/generated/mysql/3/avg,equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,is_null_filters.test rename to logictests/generated/mysql/3/avg,equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/avg,equal_filters,single_parameter.test b/logictests/generated/mysql/3/avg,equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,single_parameter.test rename to logictests/generated/mysql/3/avg,equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/avg,greater_filters,distinct.fail.test b/logictests/generated/mysql/3/avg,greater_filters,distinct.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,distinct.fail.test rename to logictests/generated/mysql/3/avg,greater_filters,distinct.fail.test diff --git a/logictests/generated/mysql/avg,greater_filters,single_parameter.fail.test b/logictests/generated/mysql/3/avg,greater_filters,single_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,single_parameter.fail.test rename to logictests/generated/mysql/3/avg,greater_filters,single_parameter.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/avg,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/avg,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,greater_or_equal_filters.fail.test b/logictests/generated/mysql/3/avg,group_concat,greater_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,greater_or_equal_filters.fail.test rename to logictests/generated/mysql/3/avg,group_concat,greater_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,is_null_filters.test b/logictests/generated/mysql/3/avg,group_concat,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,is_null_filters.test rename to logictests/generated/mysql/3/avg,group_concat,is_null_filters.test diff --git a/logictests/generated/mysql/avg,group_concat,min.test b/logictests/generated/mysql/3/avg,group_concat,min.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,min.test rename to logictests/generated/mysql/3/avg,group_concat,min.test diff --git a/logictests/generated/mysql/avg,group_concat,not_equal_filters.test b/logictests/generated/mysql/3/avg,group_concat,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,not_equal_filters.test rename to logictests/generated/mysql/3/avg,group_concat,not_equal_filters.test diff --git a/logictests/generated/mysql/avg,inner_join,left_join.test b/logictests/generated/mysql/3/avg,inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,inner_join,left_join.test rename to logictests/generated/mysql/3/avg,inner_join,left_join.test diff --git a/logictests/generated/mysql/avg,is_null_filters,inner_join.test b/logictests/generated/mysql/3/avg,is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters,inner_join.test rename to logictests/generated/mysql/3/avg,is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/avg,left_join.test b/logictests/generated/mysql/3/avg,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,left_join.test rename to logictests/generated/mysql/3/avg,left_join.test diff --git a/logictests/generated/mysql/avg,less_filters,left_join.fail.test b/logictests/generated/mysql/3/avg,less_filters,left_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,left_join.fail.test rename to logictests/generated/mysql/3/avg,less_filters,left_join.fail.test diff --git a/logictests/generated/mysql/avg,less_filters.fail.test b/logictests/generated/mysql/3/avg,less_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters.fail.test rename to logictests/generated/mysql/3/avg,less_filters.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,between_filters.fail.test b/logictests/generated/mysql/3/avg,less_or_equal_filters,between_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,between_filters.fail.test rename to logictests/generated/mysql/3/avg,less_or_equal_filters,between_filters.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,distinct.fail.test b/logictests/generated/mysql/3/avg,less_or_equal_filters,distinct.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,distinct.fail.test rename to logictests/generated/mysql/3/avg,less_or_equal_filters,distinct.fail.test diff --git a/logictests/generated/mysql/avg,max,greater_filters.fail.test b/logictests/generated/mysql/3/avg,max,greater_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,max,greater_filters.fail.test rename to logictests/generated/mysql/3/avg,max,greater_filters.fail.test diff --git a/logictests/generated/mysql/avg,max,left_join.test b/logictests/generated/mysql/3/avg,max,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,max,left_join.test rename to logictests/generated/mysql/3/avg,max,left_join.test diff --git a/logictests/generated/mysql/avg,max,less_or_equal_filters.fail.test b/logictests/generated/mysql/3/avg,max,less_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,max,less_or_equal_filters.fail.test rename to logictests/generated/mysql/3/avg,max,less_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,max,single_parameter.test b/logictests/generated/mysql/3/avg,max,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,max,single_parameter.test rename to logictests/generated/mysql/3/avg,max,single_parameter.test diff --git a/logictests/generated/mysql/avg,max,topk.test b/logictests/generated/mysql/3/avg,max,topk.test similarity index 100% rename from logictests/generated/mysql/avg,max,topk.test rename to logictests/generated/mysql/3/avg,max,topk.test diff --git a/logictests/generated/mysql/avg,min,is_null_filters.test b/logictests/generated/mysql/3/avg,min,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/avg,min,is_null_filters.test rename to logictests/generated/mysql/3/avg,min,is_null_filters.test diff --git a/logictests/generated/mysql/avg,min,left_join.test b/logictests/generated/mysql/3/avg,min,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,min,left_join.test rename to logictests/generated/mysql/3/avg,min,left_join.test diff --git a/logictests/generated/mysql/avg,min,not_equal_filters.test b/logictests/generated/mysql/3/avg,min,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,min,not_equal_filters.test rename to logictests/generated/mysql/3/avg,min,not_equal_filters.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,single_parameter.test b/logictests/generated/mysql/3/avg,not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,single_parameter.test rename to logictests/generated/mysql/3/avg,not_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/avg.test b/logictests/generated/mysql/3/avg.test similarity index 100% rename from logictests/generated/mysql/avg.test rename to logictests/generated/mysql/3/avg.test diff --git a/logictests/generated/mysql/avg_distinct,avg,range_param.fail.test b/logictests/generated/mysql/3/avg_distinct,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,avg,range_param.fail.test rename to logictests/generated/mysql/3/avg_distinct,avg,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,distinct,range_param.fail.test b/logictests/generated/mysql/3/avg_distinct,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,distinct,range_param.fail.test rename to logictests/generated/mysql/3/avg_distinct,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/avg_distinct,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/avg_distinct,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/3/avg_distinct,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/3/avg_distinct,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,project_literal,range_param.fail.test b/logictests/generated/mysql/3/avg_distinct,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,project_literal,range_param.fail.test rename to logictests/generated/mysql/3/avg_distinct,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,range_param,range_param.fail.test b/logictests/generated/mysql/3/avg_distinct,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,range_param,range_param.fail.test rename to logictests/generated/mysql/3/avg_distinct,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/3/between_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/3/between_filters,avg_distinct,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/between_filters,count,in_parameter.fail.test b/logictests/generated/mysql/3/between_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/between_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/3/between_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,cte,range_param.fail.test b/logictests/generated/mysql/3/between_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,cte,range_param.fail.test rename to logictests/generated/mysql/3/between_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/3/between_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/3/between_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,inner_join,in_parameter.test b/logictests/generated/mysql/3/between_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/3/between_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,min,range_param.test b/logictests/generated/mysql/3/between_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,min,range_param.test rename to logictests/generated/mysql/3/between_filters,min,range_param.test diff --git a/logictests/generated/mysql/between_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/3/between_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/3/between_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/3/between_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/3/between_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,topk,in_parameter.test b/logictests/generated/mysql/3/between_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,topk,in_parameter.test rename to logictests/generated/mysql/3/between_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/count,avg,topk.test b/logictests/generated/mysql/3/count,avg,topk.test similarity index 100% rename from logictests/generated/mysql/count,avg,topk.test rename to logictests/generated/mysql/3/count,avg,topk.test diff --git a/logictests/generated/mysql/count,avg.test b/logictests/generated/mysql/3/count,avg.test similarity index 100% rename from logictests/generated/mysql/count,avg.test rename to logictests/generated/mysql/3/count,avg.test diff --git a/logictests/generated/mysql/count,cte,range_param.fail.test b/logictests/generated/mysql/3/count,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,cte,range_param.fail.test rename to logictests/generated/mysql/3/count,cte,range_param.fail.test diff --git a/logictests/generated/mysql/count,distinct,inner_join.test b/logictests/generated/mysql/3/count,distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,distinct,inner_join.test rename to logictests/generated/mysql/3/count,distinct,inner_join.test diff --git a/logictests/generated/mysql/count,distinct,left_join.test b/logictests/generated/mysql/3/count,distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/count,distinct,left_join.test rename to logictests/generated/mysql/3/count,distinct,left_join.test diff --git a/logictests/generated/mysql/count,distinct,range_param.fail.test b/logictests/generated/mysql/3/count,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,distinct,range_param.fail.test rename to logictests/generated/mysql/3/count,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count,distinct,single_parameter.test b/logictests/generated/mysql/3/count,distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,distinct,single_parameter.test rename to logictests/generated/mysql/3/count,distinct,single_parameter.test diff --git a/logictests/generated/mysql/count,equal_filters,between_filters.test b/logictests/generated/mysql/3/count,equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,between_filters.test rename to logictests/generated/mysql/3/count,equal_filters,between_filters.test diff --git a/logictests/generated/mysql/count,equal_filters,range_param.test b/logictests/generated/mysql/3/count,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,range_param.test rename to logictests/generated/mysql/3/count,equal_filters,range_param.test diff --git a/logictests/generated/mysql/count,greater_filters,inner_join.test b/logictests/generated/mysql/3/count,greater_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,inner_join.test rename to logictests/generated/mysql/3/count,greater_filters,inner_join.test diff --git a/logictests/generated/mysql/count,greater_filters.test b/logictests/generated/mysql/3/count,greater_filters.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters.test rename to logictests/generated/mysql/3/count,greater_filters.test diff --git a/logictests/generated/mysql/count,group_concat,greater_or_equal_filters.test b/logictests/generated/mysql/3/count,group_concat,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,greater_or_equal_filters.test rename to logictests/generated/mysql/3/count,group_concat,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/count,group_concat,left_join.test b/logictests/generated/mysql/3/count,group_concat,left_join.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,left_join.test rename to logictests/generated/mysql/3/count,group_concat,left_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,less_filters,in_parameter.fail.test b/logictests/generated/mysql/3/count,less_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,less_filters,in_parameter.fail.test rename to logictests/generated/mysql/3/count,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,less_filters,left_join.test b/logictests/generated/mysql/3/count,less_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,left_join.test rename to logictests/generated/mysql/3/count,less_filters,left_join.test diff --git a/logictests/generated/mysql/count,less_filters.test b/logictests/generated/mysql/3/count,less_filters.test similarity index 100% rename from logictests/generated/mysql/count,less_filters.test rename to logictests/generated/mysql/3/count,less_filters.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,inner_join.test b/logictests/generated/mysql/3/count,less_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,inner_join.test rename to logictests/generated/mysql/3/count,less_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,range_param.test b/logictests/generated/mysql/3/count,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/3/count,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/count,max,equal_filters.test b/logictests/generated/mysql/3/count,max,equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,equal_filters.test rename to logictests/generated/mysql/3/count,max,equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,max,in_parameter.fail.test b/logictests/generated/mysql/3/count,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,max,in_parameter.fail.test rename to logictests/generated/mysql/3/count,max,in_parameter.test diff --git a/logictests/generated/mysql/count,max,is_null_filters.test b/logictests/generated/mysql/3/count,max,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,is_null_filters.test rename to logictests/generated/mysql/3/count,max,is_null_filters.test diff --git a/logictests/generated/mysql/count,min,greater_or_equal_filters.test b/logictests/generated/mysql/3/count,min,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,greater_or_equal_filters.test rename to logictests/generated/mysql/3/count,min,greater_or_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,min,in_parameter.fail.test b/logictests/generated/mysql/3/count,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,min,in_parameter.fail.test rename to logictests/generated/mysql/3/count,min,in_parameter.test diff --git a/logictests/generated/mysql/count,not_equal_filters,between_filters.test b/logictests/generated/mysql/3/count,not_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,between_filters.test rename to logictests/generated/mysql/3/count,not_equal_filters,between_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,not_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/3/count,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,not_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/3/count,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,not_equal_filters,single_parameter.test b/logictests/generated/mysql/3/count,not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,single_parameter.test rename to logictests/generated/mysql/3/count,not_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,range_param.test b/logictests/generated/mysql/3/count,range_param.test similarity index 100% rename from logictests/generated/mysql/count,range_param.test rename to logictests/generated/mysql/3/count,range_param.test diff --git a/logictests/generated/mysql/count,single_parameter,topk.test b/logictests/generated/mysql/3/count,single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/count,single_parameter,topk.test rename to logictests/generated/mysql/3/count,single_parameter,topk.test diff --git a/logictests/generated/mysql/count,sum,single_parameter.test b/logictests/generated/mysql/3/count,sum,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,sum,single_parameter.test rename to logictests/generated/mysql/3/count,sum,single_parameter.test diff --git a/logictests/generated/mysql/count_distinct,avg,range_param.fail.test b/logictests/generated/mysql/3/count_distinct,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,avg,range_param.fail.test rename to logictests/generated/mysql/3/count_distinct,avg,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/count_distinct,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/count_distinct,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,in_parameter,range_param.fail.test b/logictests/generated/mysql/3/count_distinct,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,in_parameter,range_param.fail.test rename to logictests/generated/mysql/3/count_distinct,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,left_join,range_param.fail.test b/logictests/generated/mysql/3/count_distinct,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,left_join,range_param.fail.test rename to logictests/generated/mysql/3/count_distinct,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,min,range_param.fail.test b/logictests/generated/mysql/3/count_distinct,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,min,range_param.fail.test rename to logictests/generated/mysql/3/count_distinct,min,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,range_param.fail.test b/logictests/generated/mysql/3/count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,range_param.fail.test rename to logictests/generated/mysql/3/count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/cte,is_null_filters,range_param.fail.test b/logictests/generated/mysql/3/cte,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/3/cte,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,left_join,range_param.fail.test b/logictests/generated/mysql/3/cte,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,left_join,range_param.fail.test rename to logictests/generated/mysql/3/cte,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/cte,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/cte,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/cte,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,avg_distinct,range_param.fail.test b/logictests/generated/mysql/3/distinct,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/3/distinct,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,join_subquery,range_param.fail.test b/logictests/generated/mysql/3/distinct,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,join_subquery,range_param.fail.test rename to logictests/generated/mysql/3/distinct,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,max,range_param.fail.test b/logictests/generated/mysql/3/distinct,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,max,range_param.fail.test rename to logictests/generated/mysql/3/distinct,max,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,not_equal_filters,range_param.test b/logictests/generated/mysql/3/distinct,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,not_equal_filters,range_param.test rename to logictests/generated/mysql/3/distinct,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,topk,range_param.test b/logictests/generated/mysql/3/distinct,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,topk,range_param.test rename to logictests/generated/mysql/3/distinct,topk,range_param.test diff --git a/logictests/generated/mysql/equal_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/3/equal_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/3/equal_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,between_filters,in_parameter.test b/logictests/generated/mysql/3/equal_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/3/equal_filters,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,count,range_param.test b/logictests/generated/mysql/3/equal_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,count,range_param.test rename to logictests/generated/mysql/3/equal_filters,count,range_param.test diff --git a/logictests/generated/mysql/equal_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/3/equal_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/3/equal_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,greater_filters,range_param.test b/logictests/generated/mysql/3/equal_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,greater_filters,range_param.test rename to logictests/generated/mysql/3/equal_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,inner_join,in_parameter.test b/logictests/generated/mysql/3/equal_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/3/equal_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,inner_join.test b/logictests/generated/mysql/3/equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/equal_filters,inner_join.test rename to logictests/generated/mysql/3/equal_filters,inner_join.test diff --git a/logictests/generated/mysql/equal_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/3/equal_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/3/equal_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/3/equal_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/3/equal_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,left_join,range_param.test b/logictests/generated/mysql/3/equal_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,left_join,range_param.test rename to logictests/generated/mysql/3/equal_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/equal_filters,left_join.test b/logictests/generated/mysql/3/equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/equal_filters,left_join.test rename to logictests/generated/mysql/3/equal_filters,left_join.test diff --git a/logictests/generated/mysql/equal_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/3/equal_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/3/equal_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,less_or_equal_filters.test b/logictests/generated/mysql/3/equal_filters,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,less_or_equal_filters.test rename to logictests/generated/mysql/3/equal_filters,less_or_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/equal_filters,min,in_parameter.fail.test b/logictests/generated/mysql/3/equal_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/equal_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/3/equal_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/3/equal_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/3/equal_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/3/equal_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/3/equal_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/3/equal_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/3/equal_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/exists.test b/logictests/generated/mysql/3/exists.test similarity index 100% rename from logictests/generated/mysql/exists.test rename to logictests/generated/mysql/3/exists.test diff --git a/logictests/generated/mysql/greater_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/3/greater_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/3/greater_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/3/greater_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/3/greater_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,in_parameter.test b/logictests/generated/mysql/3/greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,in_parameter.test rename to logictests/generated/mysql/3/greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,inner_join.test b/logictests/generated/mysql/3/greater_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/greater_filters,inner_join.test rename to logictests/generated/mysql/3/greater_filters,inner_join.test diff --git a/logictests/generated/mysql/greater_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/3/greater_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/3/greater_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/3/greater_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/3/greater_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,less_filters,range_param.test b/logictests/generated/mysql/3/greater_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,less_filters,range_param.test rename to logictests/generated/mysql/3/greater_filters,less_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,min,range_param.test b/logictests/generated/mysql/3/greater_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,min,range_param.test rename to logictests/generated/mysql/3/greater_filters,min,range_param.test diff --git a/logictests/generated/mysql/greater_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/3/greater_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/3/greater_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,single_parameter.test b/logictests/generated/mysql/3/greater_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,single_parameter.test rename to logictests/generated/mysql/3/greater_filters,single_parameter.test diff --git a/logictests/generated/mysql/greater_filters,topk,in_parameter.test b/logictests/generated/mysql/3/greater_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,topk,in_parameter.test rename to logictests/generated/mysql/3/greater_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/3/greater_or_equal_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/3/greater_or_equal_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,inner_join.test b/logictests/generated/mysql/3/greater_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,inner_join.test rename to logictests/generated/mysql/3/greater_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,left_join,range_param.test b/logictests/generated/mysql/3/greater_or_equal_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,left_join,range_param.test rename to logictests/generated/mysql/3/greater_or_equal_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,less_filters,range_param.test b/logictests/generated/mysql/3/greater_or_equal_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,less_filters,range_param.test rename to logictests/generated/mysql/3/greater_or_equal_filters,less_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,max,range_param.test b/logictests/generated/mysql/3/greater_or_equal_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,max,range_param.test rename to logictests/generated/mysql/3/greater_or_equal_filters,max,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,min,range_param.test b/logictests/generated/mysql/3/greater_or_equal_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,min,range_param.test rename to logictests/generated/mysql/3/greater_or_equal_filters,min,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/3/greater_or_equal_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/3/greater_or_equal_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/group_concat,between_filters.test b/logictests/generated/mysql/3/group_concat,between_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,between_filters.test rename to logictests/generated/mysql/3/group_concat,between_filters.test diff --git a/logictests/generated/mysql/group_concat,count_distinct,range_param.fail.test b/logictests/generated/mysql/3/group_concat,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,count_distinct,range_param.fail.test rename to logictests/generated/mysql/3/group_concat,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,cte,range_param.fail.test b/logictests/generated/mysql/3/group_concat,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,cte,range_param.fail.test rename to logictests/generated/mysql/3/group_concat,cte,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,equal_filters,left_join.test b/logictests/generated/mysql/3/group_concat,equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,equal_filters,left_join.test rename to logictests/generated/mysql/3/group_concat,equal_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,greater_filters,distinct.test b/logictests/generated/mysql/3/group_concat,greater_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_filters,distinct.test rename to logictests/generated/mysql/3/group_concat,greater_filters,distinct.test diff --git a/logictests/generated/mysql/group_concat,greater_or_equal_filters,inner_join.test b/logictests/generated/mysql/3/group_concat,greater_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_or_equal_filters,inner_join.test rename to logictests/generated/mysql/3/group_concat,greater_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,in_parameter,in_parameter.fail.test b/logictests/generated/mysql/3/group_concat,in_parameter,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,in_parameter,in_parameter.fail.test rename to logictests/generated/mysql/3/group_concat,in_parameter,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,in_parameter.fail.test b/logictests/generated/mysql/3/group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,in_parameter.fail.test rename to logictests/generated/mysql/3/group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,inner_join,range_param.fail.test b/logictests/generated/mysql/3/group_concat,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,inner_join,range_param.fail.test rename to logictests/generated/mysql/3/group_concat,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,inner_join.test b/logictests/generated/mysql/3/group_concat,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,inner_join.test rename to logictests/generated/mysql/3/group_concat,inner_join.test diff --git a/logictests/generated/mysql/group_concat,less_filters,inner_join.test b/logictests/generated/mysql/3/group_concat,less_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters,inner_join.test rename to logictests/generated/mysql/3/group_concat,less_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,less_or_equal_filters,distinct.test b/logictests/generated/mysql/3/group_concat,less_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_or_equal_filters,distinct.test rename to logictests/generated/mysql/3/group_concat,less_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/group_concat,less_or_equal_filters,inner_join.test b/logictests/generated/mysql/3/group_concat,less_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_or_equal_filters,inner_join.test rename to logictests/generated/mysql/3/group_concat,less_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,less_or_equal_filters,single_parameter.test b/logictests/generated/mysql/3/group_concat,less_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/3/group_concat,less_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,max,greater_or_equal_filters.test b/logictests/generated/mysql/3/group_concat,max,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,greater_or_equal_filters.test rename to logictests/generated/mysql/3/group_concat,max,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,max,left_join.test b/logictests/generated/mysql/3/group_concat,max,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,left_join.test rename to logictests/generated/mysql/3/group_concat,max,left_join.test diff --git a/logictests/generated/mysql/group_concat,max,less_filters.test b/logictests/generated/mysql/3/group_concat,max,less_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,less_filters.test rename to logictests/generated/mysql/3/group_concat,max,less_filters.test diff --git a/logictests/generated/mysql/group_concat,max,less_or_equal_filters.test b/logictests/generated/mysql/3/group_concat,max,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,less_or_equal_filters.test rename to logictests/generated/mysql/3/group_concat,max,less_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,max,min.test b/logictests/generated/mysql/3/group_concat,max,min.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,min.test rename to logictests/generated/mysql/3/group_concat,max,min.test diff --git a/logictests/generated/mysql/group_concat,max.test b/logictests/generated/mysql/3/group_concat,max.test similarity index 100% rename from logictests/generated/mysql/group_concat,max.test rename to logictests/generated/mysql/3/group_concat,max.test diff --git a/logictests/generated/mysql/group_concat,min,greater_or_equal_filters.test b/logictests/generated/mysql/3/group_concat,min,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,greater_or_equal_filters.test rename to logictests/generated/mysql/3/group_concat,min,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,min,single_parameter.test b/logictests/generated/mysql/3/group_concat,min,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,single_parameter.test rename to logictests/generated/mysql/3/group_concat,min,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/3/group_concat,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/3/group_concat,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/3/group_concat,not_equal_filters,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/3/group_concat,not_equal_filters,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,single_parameter,topk.test b/logictests/generated/mysql/3/group_concat,single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/group_concat,single_parameter,topk.test rename to logictests/generated/mysql/3/group_concat,single_parameter,topk.test diff --git a/logictests/generated/mysql/group_concat,sum,range_param.fail.test b/logictests/generated/mysql/3/group_concat,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,sum,range_param.fail.test rename to logictests/generated/mysql/3/group_concat,sum,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,sum_distinct,range_param.fail.test b/logictests/generated/mysql/3/group_concat,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/3/group_concat,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,topk.test b/logictests/generated/mysql/3/group_concat,topk.test similarity index 100% rename from logictests/generated/mysql/group_concat,topk.test rename to logictests/generated/mysql/3/group_concat,topk.test diff --git a/logictests/generated/mysql/in_parameter,count,range_param.fail.test b/logictests/generated/mysql/3/in_parameter,count,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,count,range_param.fail.test rename to logictests/generated/mysql/3/in_parameter,count,range_param.test diff --git a/logictests/generated/mysql/in_parameter,distinct,range_param.fail.test b/logictests/generated/mysql/3/in_parameter,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,distinct,range_param.fail.test rename to logictests/generated/mysql/3/in_parameter,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,equal_filters,in_parameter.test b/logictests/generated/mysql/3/inner_join,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,equal_filters,in_parameter.test rename to logictests/generated/mysql/3/inner_join,equal_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/inner_join,group_concat,in_parameter.fail.test b/logictests/generated/mysql/3/inner_join,group_concat,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/inner_join,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/3/inner_join,group_concat,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,join_subquery.test b/logictests/generated/mysql/3/inner_join,join_subquery.test similarity index 100% rename from logictests/generated/mysql/inner_join,join_subquery.test rename to logictests/generated/mysql/3/inner_join,join_subquery.test diff --git a/logictests/generated/mysql/inner_join,left_join.test b/logictests/generated/mysql/3/inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/inner_join,left_join.test rename to logictests/generated/mysql/3/inner_join,left_join.test diff --git a/logictests/generated/mysql/inner_join,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/3/inner_join,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/3/inner_join,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,less_or_equal_filters,range_param.test b/logictests/generated/mysql/3/inner_join,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/3/inner_join,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,min,range_param.test b/logictests/generated/mysql/3/inner_join,min,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,min,range_param.test rename to logictests/generated/mysql/3/inner_join,min,range_param.test diff --git a/logictests/generated/mysql/inner_join,single_parameter,range_param.test b/logictests/generated/mysql/3/inner_join,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,single_parameter,range_param.test rename to logictests/generated/mysql/3/inner_join,single_parameter,range_param.test diff --git a/logictests/generated/mysql/inner_join,topk,range_param.test b/logictests/generated/mysql/3/inner_join,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,topk,range_param.test rename to logictests/generated/mysql/3/inner_join,topk,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,avg,range_param.fail.test b/logictests/generated/mysql/3/is_null_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,avg,range_param.fail.test rename to logictests/generated/mysql/3/is_null_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/3/is_null_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/3/is_null_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/3/is_null_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/3/is_null_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,less_filters,in_parameter.test b/logictests/generated/mysql/3/is_null_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/3/is_null_filters,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,max,range_param.test b/logictests/generated/mysql/3/is_null_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,max,range_param.test rename to logictests/generated/mysql/3/is_null_filters,max,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/is_null_filters,min,in_parameter.fail.test b/logictests/generated/mysql/3/is_null_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/is_null_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/3/is_null_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/3/is_null_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/3/is_null_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/3/is_null_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/3/is_null_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/join_subquery,avg_distinct,range_param.fail.test b/logictests/generated/mysql/3/join_subquery,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/3/join_subquery,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,distinct,range_param.fail.test b/logictests/generated/mysql/3/join_subquery,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,distinct,range_param.fail.test rename to logictests/generated/mysql/3/join_subquery,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,is_null_filters,range_param.fail.test b/logictests/generated/mysql/3/join_subquery,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/3/join_subquery,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,min,range_param.fail.test b/logictests/generated/mysql/3/join_subquery,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,min,range_param.fail.test rename to logictests/generated/mysql/3/join_subquery,min,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,range_param.fail.test b/logictests/generated/mysql/3/join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,range_param.fail.test rename to logictests/generated/mysql/3/join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,topk,range_param.fail.test b/logictests/generated/mysql/3/join_subquery,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,topk,range_param.fail.test rename to logictests/generated/mysql/3/join_subquery,topk,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,between_filters,in_parameter.test b/logictests/generated/mysql/3/left_join,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,between_filters,in_parameter.test rename to logictests/generated/mysql/3/left_join,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,cte.test b/logictests/generated/mysql/3/left_join,cte.test similarity index 100% rename from logictests/generated/mysql/left_join,cte.test rename to logictests/generated/mysql/3/left_join,cte.test diff --git a/logictests/out-of-scope/ENG-629/mysql/left_join,max,in_parameter.fail.test b/logictests/generated/mysql/3/left_join,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/left_join,max,in_parameter.fail.test rename to logictests/generated/mysql/3/left_join,max,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/left_join,min,in_parameter.fail.test b/logictests/generated/mysql/3/left_join,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/left_join,min,in_parameter.fail.test rename to logictests/generated/mysql/3/left_join,min,in_parameter.test diff --git a/logictests/generated/mysql/left_join,project_literal,range_param.fail.test b/logictests/generated/mysql/3/left_join,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,project_literal,range_param.fail.test rename to logictests/generated/mysql/3/left_join,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,sum,range_param.test b/logictests/generated/mysql/3/left_join,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,sum,range_param.test rename to logictests/generated/mysql/3/left_join,sum,range_param.test diff --git a/logictests/generated/mysql/left_join.test b/logictests/generated/mysql/3/left_join.test similarity index 100% rename from logictests/generated/mysql/left_join.test rename to logictests/generated/mysql/3/left_join.test diff --git a/logictests/generated/mysql/less_filters,between_filters.test b/logictests/generated/mysql/3/less_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/less_filters,between_filters.test rename to logictests/generated/mysql/3/less_filters,between_filters.test diff --git a/logictests/generated/mysql/less_filters,count,range_param.test b/logictests/generated/mysql/3/less_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,count,range_param.test rename to logictests/generated/mysql/3/less_filters,count,range_param.test diff --git a/logictests/generated/mysql/less_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/3/less_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/3/less_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,equal_filters,range_param.test b/logictests/generated/mysql/3/less_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,equal_filters,range_param.test rename to logictests/generated/mysql/3/less_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,in_parameter,range_param.test b/logictests/generated/mysql/3/less_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,in_parameter,range_param.test rename to logictests/generated/mysql/3/less_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/less_filters,range_param.test b/logictests/generated/mysql/3/less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,range_param.test rename to logictests/generated/mysql/3/less_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,topk,in_parameter.test b/logictests/generated/mysql/3/less_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,topk,in_parameter.test rename to logictests/generated/mysql/3/less_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/3/less_or_equal_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/3/less_or_equal_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,inner_join,in_parameter.test b/logictests/generated/mysql/3/less_or_equal_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/3/less_or_equal_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/3/less_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/3/less_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/less_or_equal_filters,left_join,in_parameter.test b/logictests/generated/mysql/3/less_or_equal_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,left_join,in_parameter.test rename to logictests/generated/mysql/3/less_or_equal_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,less_filters,in_parameter.test b/logictests/generated/mysql/3/less_or_equal_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/3/less_or_equal_filters,less_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,max,in_parameter.fail.test b/logictests/generated/mysql/3/less_or_equal_filters,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/3/less_or_equal_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,min,range_param.test b/logictests/generated/mysql/3/less_or_equal_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,min,range_param.test rename to logictests/generated/mysql/3/less_or_equal_filters,min,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/3/less_or_equal_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/3/less_or_equal_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/3/less_or_equal_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/3/less_or_equal_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,range_param,range_param.test b/logictests/generated/mysql/3/less_or_equal_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,range_param,range_param.test rename to logictests/generated/mysql/3/less_or_equal_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,single_parameter,range_param.test b/logictests/generated/mysql/3/less_or_equal_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,single_parameter,range_param.test rename to logictests/generated/mysql/3/less_or_equal_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,single_parameter.test b/logictests/generated/mysql/3/less_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/3/less_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,cte.test b/logictests/generated/mysql/3/max,cte.test similarity index 100% rename from logictests/generated/mysql/max,cte.test rename to logictests/generated/mysql/3/max,cte.test diff --git a/logictests/generated/mysql/max,distinct.test b/logictests/generated/mysql/3/max,distinct.test similarity index 100% rename from logictests/generated/mysql/max,distinct.test rename to logictests/generated/mysql/3/max,distinct.test diff --git a/logictests/generated/mysql/max,equal_filters,left_join.test b/logictests/generated/mysql/3/max,equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,left_join.test rename to logictests/generated/mysql/3/max,equal_filters,left_join.test diff --git a/logictests/generated/mysql/max,greater_filters,between_filters.test b/logictests/generated/mysql/3/max,greater_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,between_filters.test rename to logictests/generated/mysql/3/max,greater_filters,between_filters.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,left_join.test b/logictests/generated/mysql/3/max,greater_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,left_join.test rename to logictests/generated/mysql/3/max,greater_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/max,group_concat,range_param.fail.test b/logictests/generated/mysql/3/max,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,group_concat,range_param.fail.test rename to logictests/generated/mysql/3/max,group_concat,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,in_parameter,in_parameter.fail.test b/logictests/generated/mysql/3/max,in_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,in_parameter,in_parameter.fail.test rename to logictests/generated/mysql/3/max,in_parameter,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,in_parameter.fail.test b/logictests/generated/mysql/3/max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,in_parameter.fail.test rename to logictests/generated/mysql/3/max,in_parameter.test diff --git a/logictests/generated/mysql/max,left_join,range_param.test b/logictests/generated/mysql/3/max,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/max,left_join,range_param.test rename to logictests/generated/mysql/3/max,left_join,range_param.test diff --git a/logictests/generated/mysql/max,less_filters.test b/logictests/generated/mysql/3/max,less_filters.test similarity index 100% rename from logictests/generated/mysql/max,less_filters.test rename to logictests/generated/mysql/3/max,less_filters.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/3/max,less_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/3/max,less_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,single_parameter.test b/logictests/generated/mysql/3/max,less_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/3/max,less_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,min,distinct.test b/logictests/generated/mysql/3/max,min,distinct.test similarity index 100% rename from logictests/generated/mysql/max,min,distinct.test rename to logictests/generated/mysql/3/max,min,distinct.test diff --git a/logictests/generated/mysql/max,min,greater_filters.test b/logictests/generated/mysql/3/max,min,greater_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,greater_filters.test rename to logictests/generated/mysql/3/max,min,greater_filters.test diff --git a/logictests/generated/mysql/max,min.test b/logictests/generated/mysql/3/max,min.test similarity index 100% rename from logictests/generated/mysql/max,min.test rename to logictests/generated/mysql/3/max,min.test diff --git a/logictests/generated/mysql/max,multiple_range_params,range_param.test b/logictests/generated/mysql/3/max,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/max,multiple_range_params,range_param.test rename to logictests/generated/mysql/3/max,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/max,not_equal_filters,single_parameter.test b/logictests/generated/mysql/3/max,not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,single_parameter.test rename to logictests/generated/mysql/3/max,not_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,range_param,range_param.test b/logictests/generated/mysql/3/max,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/max,range_param,range_param.test rename to logictests/generated/mysql/3/max,range_param,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,single_parameter,in_parameter.fail.test b/logictests/generated/mysql/3/max,single_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,single_parameter,in_parameter.fail.test rename to logictests/generated/mysql/3/max,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/min,equal_filters,between_filters.test b/logictests/generated/mysql/3/min,equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,between_filters.test rename to logictests/generated/mysql/3/min,equal_filters,between_filters.test diff --git a/logictests/generated/mysql/min,greater_filters,left_join.test b/logictests/generated/mysql/3/min,greater_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,left_join.test rename to logictests/generated/mysql/3/min,greater_filters,left_join.test diff --git a/logictests/generated/mysql/min,greater_filters,single_parameter.test b/logictests/generated/mysql/3/min,greater_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,single_parameter.test rename to logictests/generated/mysql/3/min,greater_filters,single_parameter.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,left_join.test b/logictests/generated/mysql/3/min,greater_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,left_join.test rename to logictests/generated/mysql/3/min,greater_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters.test b/logictests/generated/mysql/3/min,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters.test rename to logictests/generated/mysql/3/min,greater_or_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,in_parameter,in_parameter.fail.test b/logictests/generated/mysql/3/min,in_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,in_parameter,in_parameter.fail.test rename to logictests/generated/mysql/3/min,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/min,inner_join,left_join.test b/logictests/generated/mysql/3/min,inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/min,inner_join,left_join.test rename to logictests/generated/mysql/3/min,inner_join,left_join.test diff --git a/logictests/generated/mysql/min,inner_join,single_parameter.test b/logictests/generated/mysql/3/min,inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,inner_join,single_parameter.test rename to logictests/generated/mysql/3/min,inner_join,single_parameter.test diff --git a/logictests/generated/mysql/min,is_null_filters,distinct.test b/logictests/generated/mysql/3/min,is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters,distinct.test rename to logictests/generated/mysql/3/min,is_null_filters,distinct.test diff --git a/logictests/generated/mysql/min,left_join.test b/logictests/generated/mysql/3/min,left_join.test similarity index 100% rename from logictests/generated/mysql/min,left_join.test rename to logictests/generated/mysql/3/min,left_join.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,distinct.test b/logictests/generated/mysql/3/min,less_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,distinct.test rename to logictests/generated/mysql/3/min,less_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/min,not_equal_filters,is_null_filters.test b/logictests/generated/mysql/3/min,not_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,is_null_filters.test rename to logictests/generated/mysql/3/min,not_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,range_param,range_param.test b/logictests/generated/mysql/3/min,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/min,range_param,range_param.test rename to logictests/generated/mysql/3/min,range_param,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,topk,in_parameter.fail.test b/logictests/generated/mysql/3/min,topk,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,topk,in_parameter.fail.test rename to logictests/generated/mysql/3/min,topk,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,avg,range_param.fail.test b/logictests/generated/mysql/3/multiple_parameters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,avg,range_param.fail.test rename to logictests/generated/mysql/3/multiple_parameters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/3/multiple_parameters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/3/multiple_parameters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/multiple_parameters,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/multiple_parameters,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,in_parameter,in_parameter.test b/logictests/generated/mysql/3/multiple_parameters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,in_parameter,in_parameter.test rename to logictests/generated/mysql/3/multiple_parameters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,in_parameter,range_param.test b/logictests/generated/mysql/3/multiple_parameters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,in_parameter,range_param.test rename to logictests/generated/mysql/3/multiple_parameters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,project_literal,range_param.fail.test b/logictests/generated/mysql/3/multiple_parameters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,project_literal,range_param.fail.test rename to logictests/generated/mysql/3/multiple_parameters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,sum,in_parameter.fail.test b/logictests/generated/mysql/3/multiple_parameters,sum,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,sum,in_parameter.fail.test rename to logictests/generated/mysql/3/multiple_parameters,sum,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,topk,in_parameter.test b/logictests/generated/mysql/3/multiple_parameters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,topk,in_parameter.test rename to logictests/generated/mysql/3/multiple_parameters,topk,in_parameter.test diff --git a/logictests/generated/mysql/multiple_range_params,equal_filters,range_param.fail.test b/logictests/generated/mysql/3/multiple_range_params,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/multiple_range_params,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,greater_filters,range_param.fail.test b/logictests/generated/mysql/3/multiple_range_params,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,greater_filters,range_param.fail.test rename to logictests/generated/mysql/3/multiple_range_params,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,min,range_param.test b/logictests/generated/mysql/3/multiple_range_params,min,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,min,range_param.test rename to logictests/generated/mysql/3/multiple_range_params,min,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,sum_distinct,range_param.fail.test b/logictests/generated/mysql/3/multiple_range_params,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/3/multiple_range_params,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,topk,range_param.test b/logictests/generated/mysql/3/multiple_range_params,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,topk,range_param.test rename to logictests/generated/mysql/3/multiple_range_params,topk,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,avg,range_param.fail.test b/logictests/generated/mysql/3/not_equal_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,avg,range_param.fail.test rename to logictests/generated/mysql/3/not_equal_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/3/not_equal_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/3/not_equal_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,distinct.test b/logictests/generated/mysql/3/not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,distinct.test rename to logictests/generated/mysql/3/not_equal_filters,distinct.test diff --git a/logictests/generated/mysql/not_equal_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/3/not_equal_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/3/not_equal_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/3/not_equal_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/3/not_equal_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,inner_join,in_parameter.test b/logictests/generated/mysql/3/not_equal_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/3/not_equal_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,is_null_filters,range_param.test b/logictests/generated/mysql/3/not_equal_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/3/not_equal_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,less_or_equal_filters.test b/logictests/generated/mysql/3/not_equal_filters,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,less_or_equal_filters.test rename to logictests/generated/mysql/3/not_equal_filters,less_or_equal_filters.test diff --git a/logictests/generated/mysql/not_equal_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/3/not_equal_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/3/not_equal_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/3/not_equal_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/3/not_equal_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,topk,in_parameter.test b/logictests/generated/mysql/3/not_equal_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,topk,in_parameter.test rename to logictests/generated/mysql/3/not_equal_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/project_literal,avg,range_param.fail.test b/logictests/generated/mysql/3/project_literal,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,avg,range_param.fail.test rename to logictests/generated/mysql/3/project_literal,avg,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,between_filters,range_param.fail.test b/logictests/generated/mysql/3/project_literal,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,between_filters,range_param.fail.test rename to logictests/generated/mysql/3/project_literal,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,left_join,range_param.fail.test b/logictests/generated/mysql/3/project_literal,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,left_join,range_param.fail.test rename to logictests/generated/mysql/3/project_literal,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/project_literal,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/project_literal,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,range_param.fail.test b/logictests/generated/mysql/3/project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,range_param.fail.test rename to logictests/generated/mysql/3/project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,between_filters,range_param.fail.test b/logictests/generated/mysql/3/range_param,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,between_filters,range_param.fail.test rename to logictests/generated/mysql/3/range_param,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,equal_filters,range_param.fail.test b/logictests/generated/mysql/3/range_param,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/range_param,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,min,range_param.test b/logictests/generated/mysql/3/range_param,min,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,min,range_param.test rename to logictests/generated/mysql/3/range_param,min,range_param.test diff --git a/logictests/generated/mysql/range_param,single_parameter,range_param.test b/logictests/generated/mysql/3/range_param,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,single_parameter,range_param.test rename to logictests/generated/mysql/3/range_param,single_parameter,range_param.test diff --git a/logictests/generated/mysql/single_parameter,group_concat,range_param.fail.test b/logictests/generated/mysql/3/single_parameter,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,group_concat,range_param.fail.test rename to logictests/generated/mysql/3/single_parameter,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,in_parameter,in_parameter.test b/logictests/generated/mysql/3/single_parameter,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter,in_parameter,in_parameter.test rename to logictests/generated/mysql/3/single_parameter,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,in_parameter.test b/logictests/generated/mysql/3/single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter,in_parameter.test rename to logictests/generated/mysql/3/single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,is_null_filters,range_param.fail.test b/logictests/generated/mysql/3/single_parameter,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/3/single_parameter,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,left_join,range_param.test b/logictests/generated/mysql/3/single_parameter,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,left_join,range_param.test rename to logictests/generated/mysql/3/single_parameter,left_join,range_param.test diff --git a/logictests/generated/mysql/single_parameter,multiple_parameters,range_param.test b/logictests/generated/mysql/3/single_parameter,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,multiple_parameters,range_param.test rename to logictests/generated/mysql/3/single_parameter,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/single_parameter.test b/logictests/generated/mysql/3/single_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter.test rename to logictests/generated/mysql/3/single_parameter.test diff --git a/logictests/generated/mysql/sum,avg,group_concat.test b/logictests/generated/mysql/3/sum,avg,group_concat.test similarity index 100% rename from logictests/generated/mysql/sum,avg,group_concat.test rename to logictests/generated/mysql/3/sum,avg,group_concat.test diff --git a/logictests/generated/mysql/sum,avg,inner_join.test b/logictests/generated/mysql/3/sum,avg,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,avg,inner_join.test rename to logictests/generated/mysql/3/sum,avg,inner_join.test diff --git a/logictests/generated/mysql/sum,avg,range_param.fail.test b/logictests/generated/mysql/3/sum,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,avg,range_param.fail.test rename to logictests/generated/mysql/3/sum,avg,range_param.fail.test diff --git a/logictests/generated/mysql/sum,between_filters,is_null_filters.test b/logictests/generated/mysql/3/sum,between_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,is_null_filters.test rename to logictests/generated/mysql/3/sum,between_filters,is_null_filters.test diff --git a/logictests/generated/mysql/sum,count,range_param.test b/logictests/generated/mysql/3/sum,count,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,count,range_param.test rename to logictests/generated/mysql/3/sum,count,range_param.test diff --git a/logictests/generated/mysql/sum,distinct,left_join.test b/logictests/generated/mysql/3/sum,distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,distinct,left_join.test rename to logictests/generated/mysql/3/sum,distinct,left_join.test diff --git a/logictests/generated/mysql/sum,greater_filters,inner_join.test b/logictests/generated/mysql/3/sum,greater_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,inner_join.test rename to logictests/generated/mysql/3/sum,greater_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,greater_filters,is_null_filters.test b/logictests/generated/mysql/3/sum,greater_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,is_null_filters.test rename to logictests/generated/mysql/3/sum,greater_filters,is_null_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,between_filters.test b/logictests/generated/mysql/3/sum,group_concat,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,between_filters.test rename to logictests/generated/mysql/3/sum,group_concat,between_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,equal_filters.test b/logictests/generated/mysql/3/sum,group_concat,equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,equal_filters.test rename to logictests/generated/mysql/3/sum,group_concat,equal_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,not_equal_filters.test b/logictests/generated/mysql/3/sum,group_concat,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,not_equal_filters.test rename to logictests/generated/mysql/3/sum,group_concat,not_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,in_parameter,in_parameter.fail.test b/logictests/generated/mysql/3/sum,in_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,in_parameter,in_parameter.fail.test rename to logictests/generated/mysql/3/sum,in_parameter,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,in_parameter.fail.test b/logictests/generated/mysql/3/sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,in_parameter.fail.test rename to logictests/generated/mysql/3/sum,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,is_null_filters,in_parameter.fail.test b/logictests/generated/mysql/3/sum,is_null_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,is_null_filters,in_parameter.fail.test rename to logictests/generated/mysql/3/sum,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,is_null_filters,left_join.test b/logictests/generated/mysql/3/sum,is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,is_null_filters,left_join.test rename to logictests/generated/mysql/3/sum,is_null_filters,left_join.test diff --git a/logictests/generated/mysql/sum,is_null_filters,range_param.test b/logictests/generated/mysql/3/sum,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,is_null_filters,range_param.test rename to logictests/generated/mysql/3/sum,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/sum,is_null_filters.test b/logictests/generated/mysql/3/sum,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,is_null_filters.test rename to logictests/generated/mysql/3/sum,is_null_filters.test diff --git a/logictests/generated/mysql/sum,join_subquery,range_param.fail.test b/logictests/generated/mysql/3/sum,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,join_subquery,range_param.fail.test rename to logictests/generated/mysql/3/sum,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/sum,left_join,range_param.test b/logictests/generated/mysql/3/sum,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,left_join,range_param.test rename to logictests/generated/mysql/3/sum,left_join,range_param.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/3/sum,less_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/3/sum,less_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/sum,max,distinct.test b/logictests/generated/mysql/3/sum,max,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,max,distinct.test rename to logictests/generated/mysql/3/sum,max,distinct.test diff --git a/logictests/generated/mysql/sum,max,equal_filters.test b/logictests/generated/mysql/3/sum,max,equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,equal_filters.test rename to logictests/generated/mysql/3/sum,max,equal_filters.test diff --git a/logictests/generated/mysql/sum,min,greater_filters.test b/logictests/generated/mysql/3/sum,min,greater_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,greater_filters.test rename to logictests/generated/mysql/3/sum,min,greater_filters.test diff --git a/logictests/generated/mysql/sum,min,left_join.test b/logictests/generated/mysql/3/sum,min,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,min,left_join.test rename to logictests/generated/mysql/3/sum,min,left_join.test diff --git a/logictests/generated/mysql/sum,min,range_param.test b/logictests/generated/mysql/3/sum,min,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,min,range_param.test rename to logictests/generated/mysql/3/sum,min,range_param.test diff --git a/logictests/generated/mysql/sum,min.test b/logictests/generated/mysql/3/sum,min.test similarity index 100% rename from logictests/generated/mysql/sum,min.test rename to logictests/generated/mysql/3/sum,min.test diff --git a/logictests/generated/mysql/sum,multiple_range_params,range_param.test b/logictests/generated/mysql/3/sum,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,multiple_range_params,range_param.test rename to logictests/generated/mysql/3/sum,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,distinct.test b/logictests/generated/mysql/3/sum,not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,distinct.test rename to logictests/generated/mysql/3/sum,not_equal_filters,distinct.test diff --git a/logictests/generated/mysql/sum,range_param.test b/logictests/generated/mysql/3/sum,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,range_param.test rename to logictests/generated/mysql/3/sum,range_param.test diff --git a/logictests/generated/mysql/sum,single_parameter,topk.test b/logictests/generated/mysql/3/sum,single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/sum,single_parameter,topk.test rename to logictests/generated/mysql/3/sum,single_parameter,topk.test diff --git a/logictests/generated/mysql/sum,single_parameter.test b/logictests/generated/mysql/3/sum,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,single_parameter.test rename to logictests/generated/mysql/3/sum,single_parameter.test diff --git a/logictests/generated/mysql/sum_distinct,cte,range_param.fail.test b/logictests/generated/mysql/3/sum_distinct,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,cte,range_param.fail.test rename to logictests/generated/mysql/3/sum_distinct,cte,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,greater_filters,range_param.fail.test b/logictests/generated/mysql/3/sum_distinct,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,greater_filters,range_param.fail.test rename to logictests/generated/mysql/3/sum_distinct,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,join_subquery,range_param.fail.test b/logictests/generated/mysql/3/sum_distinct,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,join_subquery,range_param.fail.test rename to logictests/generated/mysql/3/sum_distinct,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/3/sum_distinct,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/3/sum_distinct,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,single_parameter,range_param.fail.test b/logictests/generated/mysql/3/sum_distinct,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,single_parameter,range_param.fail.test rename to logictests/generated/mysql/3/sum_distinct,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/topk,avg,in_parameter.fail.test b/logictests/generated/mysql/3/topk,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/topk,avg,in_parameter.fail.test rename to logictests/generated/mysql/3/topk,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/topk,between_filters,range_param.test b/logictests/generated/mysql/3/topk,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,between_filters,range_param.test rename to logictests/generated/mysql/3/topk,between_filters,range_param.test diff --git a/logictests/generated/mysql/topk,distinct,range_param.test b/logictests/generated/mysql/3/topk,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,distinct,range_param.test rename to logictests/generated/mysql/3/topk,distinct,range_param.test diff --git a/logictests/generated/mysql/topk,equal_filters,in_parameter.test b/logictests/generated/mysql/3/topk,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,equal_filters,in_parameter.test rename to logictests/generated/mysql/3/topk,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,greater_filters,in_parameter.test b/logictests/generated/mysql/3/topk,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,greater_filters,in_parameter.test rename to logictests/generated/mysql/3/topk,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,less_filters,in_parameter.test b/logictests/generated/mysql/3/topk,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,less_filters,in_parameter.test rename to logictests/generated/mysql/3/topk,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,multiple_parameters,range_param.test b/logictests/generated/mysql/3/topk,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,multiple_parameters,range_param.test rename to logictests/generated/mysql/3/topk,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/avg,between_filters,left_join.test b/logictests/generated/mysql/4/avg,between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,between_filters,left_join.test rename to logictests/generated/mysql/4/avg,between_filters,left_join.test diff --git a/logictests/generated/mysql/avg,count,range_param.fail.test b/logictests/generated/mysql/4/avg,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,count,range_param.fail.test rename to logictests/generated/mysql/4/avg,count,range_param.fail.test diff --git a/logictests/generated/mysql/avg,count_distinct,range_param.fail.test b/logictests/generated/mysql/4/avg,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,count_distinct,range_param.fail.test rename to logictests/generated/mysql/4/avg,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg,greater_filters,range_param.fail.test b/logictests/generated/mysql/4/avg,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,range_param.fail.test rename to logictests/generated/mysql/4/avg,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,between_filters.test b/logictests/generated/mysql/4/avg,group_concat,between_filters.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,between_filters.test rename to logictests/generated/mysql/4/avg,group_concat,between_filters.test diff --git a/logictests/generated/mysql/avg,group_concat,greater_filters.fail.test b/logictests/generated/mysql/4/avg,group_concat,greater_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,greater_filters.fail.test rename to logictests/generated/mysql/4/avg,group_concat,greater_filters.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,max.test b/logictests/generated/mysql/4/avg,group_concat,max.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,max.test rename to logictests/generated/mysql/4/avg,group_concat,max.test diff --git a/logictests/generated/mysql/avg,group_concat,single_parameter.test b/logictests/generated/mysql/4/avg,group_concat,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,single_parameter.test rename to logictests/generated/mysql/4/avg,group_concat,single_parameter.test diff --git a/logictests/generated/mysql/avg,group_concat,topk.test b/logictests/generated/mysql/4/avg,group_concat,topk.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,topk.test rename to logictests/generated/mysql/4/avg,group_concat,topk.test diff --git a/logictests/generated/mysql/avg,inner_join,range_param.fail.test b/logictests/generated/mysql/4/avg,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,inner_join,range_param.fail.test rename to logictests/generated/mysql/4/avg,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/avg,inner_join.test b/logictests/generated/mysql/4/avg,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,inner_join.test rename to logictests/generated/mysql/4/avg,inner_join.test diff --git a/logictests/generated/mysql/avg,is_null_filters,in_parameter.fail.test b/logictests/generated/mysql/4/avg,is_null_filters,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/avg,is_null_filters,in_parameter.fail.test diff --git a/logictests/generated/mysql/avg,less_filters,distinct.fail.test b/logictests/generated/mysql/4/avg,less_filters,distinct.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,distinct.fail.test rename to logictests/generated/mysql/4/avg,less_filters,distinct.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,is_null_filters.fail.test b/logictests/generated/mysql/4/avg,less_or_equal_filters,is_null_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,is_null_filters.fail.test rename to logictests/generated/mysql/4/avg,less_or_equal_filters,is_null_filters.fail.test diff --git a/logictests/generated/mysql/avg,max,inner_join.test b/logictests/generated/mysql/4/avg,max,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,max,inner_join.test rename to logictests/generated/mysql/4/avg,max,inner_join.test diff --git a/logictests/generated/mysql/avg,max,less_filters.fail.test b/logictests/generated/mysql/4/avg,max,less_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,max,less_filters.fail.test rename to logictests/generated/mysql/4/avg,max,less_filters.fail.test diff --git a/logictests/generated/mysql/avg,min,inner_join.test b/logictests/generated/mysql/4/avg,min,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,min,inner_join.test rename to logictests/generated/mysql/4/avg,min,inner_join.test diff --git a/logictests/generated/mysql/avg,min.test b/logictests/generated/mysql/4/avg,min.test similarity index 100% rename from logictests/generated/mysql/avg,min.test rename to logictests/generated/mysql/4/avg,min.test diff --git a/logictests/generated/mysql/avg,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/4/avg,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/4/avg,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,inner_join.test b/logictests/generated/mysql/4/avg,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,inner_join.test rename to logictests/generated/mysql/4/avg,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,left_join.test b/logictests/generated/mysql/4/avg,not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,left_join.test rename to logictests/generated/mysql/4/avg,not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/avg,range_param,range_param.fail.test b/logictests/generated/mysql/4/avg,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,range_param,range_param.fail.test rename to logictests/generated/mysql/4/avg,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/avg,topk.test b/logictests/generated/mysql/4/avg,topk.test similarity index 100% rename from logictests/generated/mysql/avg,topk.test rename to logictests/generated/mysql/4/avg,topk.test diff --git a/logictests/generated/mysql/avg_distinct,inner_join,range_param.fail.test b/logictests/generated/mysql/4/avg_distinct,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,inner_join,range_param.fail.test rename to logictests/generated/mysql/4/avg_distinct,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,is_null_filters,range_param.fail.test b/logictests/generated/mysql/4/avg_distinct,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/4/avg_distinct,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,join_subquery,range_param.fail.test b/logictests/generated/mysql/4/avg_distinct,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,join_subquery,range_param.fail.test rename to logictests/generated/mysql/4/avg_distinct,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,less_filters,range_param.fail.test b/logictests/generated/mysql/4/avg_distinct,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,less_filters,range_param.fail.test rename to logictests/generated/mysql/4/avg_distinct,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/4/avg_distinct,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/4/avg_distinct,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,greater_filters,range_param.test b/logictests/generated/mysql/4/between_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,greater_filters,range_param.test rename to logictests/generated/mysql/4/between_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,left_join.test b/logictests/generated/mysql/4/between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/between_filters,left_join.test rename to logictests/generated/mysql/4/between_filters,left_join.test diff --git a/logictests/generated/mysql/between_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/4/between_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/4/between_filters,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/4/between_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/between_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/between_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/4/between_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/4/between_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/between_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/4/between_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/4/between_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,avg,max.test b/logictests/generated/mysql/4/count,avg,max.test similarity index 100% rename from logictests/generated/mysql/count,avg,max.test rename to logictests/generated/mysql/4/count,avg,max.test diff --git a/logictests/generated/mysql/count,avg,not_equal_filters.test b/logictests/generated/mysql/4/count,avg,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,avg,not_equal_filters.test rename to logictests/generated/mysql/4/count,avg,not_equal_filters.test diff --git a/logictests/generated/mysql/count,avg,range_param.fail.test b/logictests/generated/mysql/4/count,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,avg,range_param.fail.test rename to logictests/generated/mysql/4/count,avg,range_param.fail.test diff --git a/logictests/generated/mysql/count,avg,single_parameter.test b/logictests/generated/mysql/4/count,avg,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,avg,single_parameter.test rename to logictests/generated/mysql/4/count,avg,single_parameter.test diff --git a/logictests/generated/mysql/count,between_filters,left_join.test b/logictests/generated/mysql/4/count,between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,between_filters,left_join.test rename to logictests/generated/mysql/4/count,between_filters,left_join.test diff --git a/logictests/generated/mysql/count,distinct,topk.test b/logictests/generated/mysql/4/count,distinct,topk.test similarity index 100% rename from logictests/generated/mysql/count,distinct,topk.test rename to logictests/generated/mysql/4/count,distinct,topk.test diff --git a/logictests/generated/mysql/count,greater_filters,left_join.test b/logictests/generated/mysql/4/count,greater_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,left_join.test rename to logictests/generated/mysql/4/count,greater_filters,left_join.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,between_filters.test b/logictests/generated/mysql/4/count,greater_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,between_filters.test rename to logictests/generated/mysql/4/count,greater_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/4/count,greater_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/4/count,greater_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,single_parameter.test b/logictests/generated/mysql/4/count,greater_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/4/count,greater_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters.test b/logictests/generated/mysql/4/count,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters.test rename to logictests/generated/mysql/4/count,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/count,group_concat,less_or_equal_filters.test b/logictests/generated/mysql/4/count,group_concat,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,less_or_equal_filters.test rename to logictests/generated/mysql/4/count,group_concat,less_or_equal_filters.test diff --git a/logictests/generated/mysql/count,group_concat,max.test b/logictests/generated/mysql/4/count,group_concat,max.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,max.test rename to logictests/generated/mysql/4/count,group_concat,max.test diff --git a/logictests/generated/mysql/count,is_null_filters,inner_join.test b/logictests/generated/mysql/4/count,is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters,inner_join.test rename to logictests/generated/mysql/4/count,is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/count,is_null_filters,left_join.test b/logictests/generated/mysql/4/count,is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters,left_join.test rename to logictests/generated/mysql/4/count,is_null_filters,left_join.test diff --git a/logictests/generated/mysql/count,is_null_filters,single_parameter.test b/logictests/generated/mysql/4/count,is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters,single_parameter.test rename to logictests/generated/mysql/4/count,is_null_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,left_join,single_parameter.test b/logictests/generated/mysql/4/count,left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,left_join,single_parameter.test rename to logictests/generated/mysql/4/count,left_join,single_parameter.test diff --git a/logictests/generated/mysql/count,less_filters,distinct.test b/logictests/generated/mysql/4/count,less_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,distinct.test rename to logictests/generated/mysql/4/count,less_filters,distinct.test diff --git a/logictests/generated/mysql/count,less_filters,inner_join.test b/logictests/generated/mysql/4/count,less_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,inner_join.test rename to logictests/generated/mysql/4/count,less_filters,inner_join.test diff --git a/logictests/generated/mysql/count,less_filters,range_param.test b/logictests/generated/mysql/4/count,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,range_param.test rename to logictests/generated/mysql/4/count,less_filters,range_param.test diff --git a/logictests/generated/mysql/count,max,distinct.test b/logictests/generated/mysql/4/count,max,distinct.test similarity index 100% rename from logictests/generated/mysql/count,max,distinct.test rename to logictests/generated/mysql/4/count,max,distinct.test diff --git a/logictests/generated/mysql/count,min,not_equal_filters.test b/logictests/generated/mysql/4/count,min,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,not_equal_filters.test rename to logictests/generated/mysql/4/count,min,not_equal_filters.test diff --git a/logictests/generated/mysql/count,min,single_parameter.test b/logictests/generated/mysql/4/count,min,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,min,single_parameter.test rename to logictests/generated/mysql/4/count,min,single_parameter.test diff --git a/logictests/generated/mysql/count,multiple_parameters,range_param.test b/logictests/generated/mysql/4/count,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/count,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/count,not_equal_filters,distinct.test b/logictests/generated/mysql/4/count,not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,distinct.test rename to logictests/generated/mysql/4/count,not_equal_filters,distinct.test diff --git a/logictests/generated/mysql/count,not_equal_filters,is_null_filters.test b/logictests/generated/mysql/4/count,not_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,is_null_filters.test rename to logictests/generated/mysql/4/count,not_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,not_equal_filters,range_param.test b/logictests/generated/mysql/4/count,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,range_param.test rename to logictests/generated/mysql/4/count,not_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,sum,in_parameter.fail.test b/logictests/generated/mysql/4/count,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,sum,in_parameter.fail.test rename to logictests/generated/mysql/4/count,sum,in_parameter.test diff --git a/logictests/generated/mysql/count,sum.test b/logictests/generated/mysql/4/count,sum.test similarity index 100% rename from logictests/generated/mysql/count,sum.test rename to logictests/generated/mysql/4/count,sum.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,topk,in_parameter.fail.test b/logictests/generated/mysql/4/count,topk,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,topk,in_parameter.fail.test rename to logictests/generated/mysql/4/count,topk,in_parameter.test diff --git a/logictests/generated/mysql/count,topk,range_param.test b/logictests/generated/mysql/4/count,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/count,topk,range_param.test rename to logictests/generated/mysql/4/count,topk,range_param.test diff --git a/logictests/generated/mysql/count.test b/logictests/generated/mysql/4/count.test similarity index 100% rename from logictests/generated/mysql/count.test rename to logictests/generated/mysql/4/count.test diff --git a/logictests/generated/mysql/count_distinct,avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/count_distinct,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/count_distinct,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,count,range_param.fail.test b/logictests/generated/mysql/4/count_distinct,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,count,range_param.fail.test rename to logictests/generated/mysql/4/count_distinct,count,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,group_concat,range_param.fail.test b/logictests/generated/mysql/4/count_distinct,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,group_concat,range_param.fail.test rename to logictests/generated/mysql/4/count_distinct,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,max,range_param.fail.test b/logictests/generated/mysql/4/count_distinct,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,max,range_param.fail.test rename to logictests/generated/mysql/4/count_distinct,max,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/4/count_distinct,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/4/count_distinct,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,sum,range_param.fail.test b/logictests/generated/mysql/4/count_distinct,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,sum,range_param.fail.test rename to logictests/generated/mysql/4/count_distinct,sum,range_param.fail.test diff --git a/logictests/generated/mysql/cte,group_concat,range_param.fail.test b/logictests/generated/mysql/4/cte,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,group_concat,range_param.fail.test rename to logictests/generated/mysql/4/cte,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/cte,in_parameter,range_param.fail.test b/logictests/generated/mysql/4/cte,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,in_parameter,range_param.fail.test rename to logictests/generated/mysql/4/cte,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/cte,less_filters,range_param.fail.test b/logictests/generated/mysql/4/cte,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,less_filters,range_param.fail.test rename to logictests/generated/mysql/4/cte,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,min,range_param.fail.test b/logictests/generated/mysql/4/cte,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,min,range_param.fail.test rename to logictests/generated/mysql/4/cte,min,range_param.fail.test diff --git a/logictests/generated/mysql/cte,range_param.fail.test b/logictests/generated/mysql/4/cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,range_param.fail.test rename to logictests/generated/mysql/4/cte,range_param.fail.test diff --git a/logictests/generated/mysql/cte,topk,range_param.fail.test b/logictests/generated/mysql/4/cte,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,topk,range_param.fail.test rename to logictests/generated/mysql/4/cte,topk,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,inner_join,range_param.test b/logictests/generated/mysql/4/distinct,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,inner_join,range_param.test rename to logictests/generated/mysql/4/distinct,inner_join,range_param.test diff --git a/logictests/generated/mysql/distinct,multiple_parameters,range_param.test b/logictests/generated/mysql/4/distinct,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/distinct,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/distinct,multiple_range_params,range_param.test b/logictests/generated/mysql/4/distinct,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,multiple_range_params,range_param.test rename to logictests/generated/mysql/4/distinct,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/distinct.test b/logictests/generated/mysql/4/distinct.test similarity index 100% rename from logictests/generated/mysql/distinct.test rename to logictests/generated/mysql/4/distinct.test diff --git a/logictests/generated/mysql/equal_filters,avg,range_param.fail.test b/logictests/generated/mysql/4/equal_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,avg,range_param.fail.test rename to logictests/generated/mysql/4/equal_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,cte,range_param.fail.test b/logictests/generated/mysql/4/equal_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,cte,range_param.fail.test rename to logictests/generated/mysql/4/equal_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,distinct.test b/logictests/generated/mysql/4/equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/equal_filters,distinct.test rename to logictests/generated/mysql/4/equal_filters,distinct.test diff --git a/logictests/generated/mysql/equal_filters,greater_filters.test b/logictests/generated/mysql/4/equal_filters,greater_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,greater_filters.test rename to logictests/generated/mysql/4/equal_filters,greater_filters.test diff --git a/logictests/generated/mysql/equal_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/4/equal_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/4/equal_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/4/equal_filters,group_concat,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/4/equal_filters,group_concat,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/4/equal_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/4/equal_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,is_null_filters,range_param.test b/logictests/generated/mysql/4/equal_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/4/equal_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,left_join,in_parameter.test b/logictests/generated/mysql/4/equal_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,left_join,in_parameter.test rename to logictests/generated/mysql/4/equal_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,max,range_param.test b/logictests/generated/mysql/4/equal_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,max,range_param.test rename to logictests/generated/mysql/4/equal_filters,max,range_param.test diff --git a/logictests/generated/mysql/equal_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/4/equal_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/equal_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/4/equal_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/4/equal_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/equal_filters,not_equal_filters.test b/logictests/generated/mysql/4/equal_filters,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,not_equal_filters.test rename to logictests/generated/mysql/4/equal_filters,not_equal_filters.test diff --git a/logictests/generated/mysql/equal_filters,range_param,range_param.test b/logictests/generated/mysql/4/equal_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,range_param,range_param.test rename to logictests/generated/mysql/4/equal_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/equal_filters,range_param.test b/logictests/generated/mysql/4/equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,range_param.test rename to logictests/generated/mysql/4/equal_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,single_parameter.test b/logictests/generated/mysql/4/equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,single_parameter.test rename to logictests/generated/mysql/4/equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/greater_filters,between_filters,in_parameter.test b/logictests/generated/mysql/4/greater_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/4/greater_filters,between_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_filters,count,in_parameter.fail.test b/logictests/generated/mysql/4/greater_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/4/greater_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,count,range_param.test b/logictests/generated/mysql/4/greater_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,count,range_param.test rename to logictests/generated/mysql/4/greater_filters,count,range_param.test diff --git a/logictests/generated/mysql/greater_filters,distinct,range_param.test b/logictests/generated/mysql/4/greater_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,distinct,range_param.test rename to logictests/generated/mysql/4/greater_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/greater_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/4/greater_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/4/greater_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/4/greater_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/4/greater_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/4/greater_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/4/greater_filters,less_or_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_filters,max,in_parameter.fail.test b/logictests/generated/mysql/4/greater_filters,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/4/greater_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,max,range_param.test b/logictests/generated/mysql/4/greater_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,max,range_param.test rename to logictests/generated/mysql/4/greater_filters,max,range_param.test diff --git a/logictests/generated/mysql/greater_filters,topk.test b/logictests/generated/mysql/4/greater_filters,topk.test similarity index 100% rename from logictests/generated/mysql/greater_filters,topk.test rename to logictests/generated/mysql/4/greater_filters,topk.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,between_filters.test b/logictests/generated/mysql/4/greater_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,between_filters.test rename to logictests/generated/mysql/4/greater_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,equal_filters,range_param.test b/logictests/generated/mysql/4/greater_or_equal_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,equal_filters,range_param.test rename to logictests/generated/mysql/4/greater_or_equal_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/4/greater_or_equal_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/4/greater_or_equal_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,greater_filters,range_param.test b/logictests/generated/mysql/4/greater_or_equal_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,greater_filters,range_param.test rename to logictests/generated/mysql/4/greater_or_equal_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/4/greater_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/4/greater_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,less_filters.test b/logictests/generated/mysql/4/greater_or_equal_filters,less_filters.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,less_filters.test rename to logictests/generated/mysql/4/greater_or_equal_filters,less_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_or_equal_filters,min,in_parameter.fail.test b/logictests/generated/mysql/4/greater_or_equal_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_or_equal_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/4/greater_or_equal_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,multiple_range_params,range_param.test b/logictests/generated/mysql/4/greater_or_equal_filters,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,multiple_range_params,range_param.test rename to logictests/generated/mysql/4/greater_or_equal_filters,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,single_parameter.test b/logictests/generated/mysql/4/greater_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/4/greater_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,topk,in_parameter.test b/logictests/generated/mysql/4/greater_or_equal_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,topk,in_parameter.test rename to logictests/generated/mysql/4/greater_or_equal_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters.test b/logictests/generated/mysql/4/greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters.test rename to logictests/generated/mysql/4/greater_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,avg,range_param.fail.test b/logictests/generated/mysql/4/group_concat,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,avg,range_param.fail.test rename to logictests/generated/mysql/4/group_concat,avg,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,between_filters,range_param.fail.test b/logictests/generated/mysql/4/group_concat,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,between_filters,range_param.fail.test rename to logictests/generated/mysql/4/group_concat,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,distinct,single_parameter.test b/logictests/generated/mysql/4/group_concat,distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,distinct,single_parameter.test rename to logictests/generated/mysql/4/group_concat,distinct,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/group_concat,equal_filters,in_parameter.fail.test b/logictests/generated/mysql/4/group_concat,equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/group_concat,equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/group_concat,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/group_concat,greater_filters,inner_join.test b/logictests/generated/mysql/4/group_concat,greater_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_filters,inner_join.test rename to logictests/generated/mysql/4/group_concat,greater_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,greater_filters.test b/logictests/generated/mysql/4/group_concat,greater_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_filters.test rename to logictests/generated/mysql/4/group_concat,greater_filters.test diff --git a/logictests/generated/mysql/group_concat,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/4/group_concat,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/4/group_concat,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,is_null_filters,distinct.test b/logictests/generated/mysql/4/group_concat,is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,is_null_filters,distinct.test rename to logictests/generated/mysql/4/group_concat,is_null_filters,distinct.test diff --git a/logictests/generated/mysql/group_concat,is_null_filters,inner_join.test b/logictests/generated/mysql/4/group_concat,is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,is_null_filters,inner_join.test rename to logictests/generated/mysql/4/group_concat,is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/group_concat,left_join.test b/logictests/generated/mysql/4/group_concat,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,left_join.test rename to logictests/generated/mysql/4/group_concat,left_join.test diff --git a/logictests/generated/mysql/group_concat,less_filters,range_param.fail.test b/logictests/generated/mysql/4/group_concat,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters,range_param.fail.test rename to logictests/generated/mysql/4/group_concat,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,less_or_equal_filters,left_join.test b/logictests/generated/mysql/4/group_concat,less_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_or_equal_filters,left_join.test rename to logictests/generated/mysql/4/group_concat,less_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,max,inner_join.test b/logictests/generated/mysql/4/group_concat,max,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,inner_join.test rename to logictests/generated/mysql/4/group_concat,max,inner_join.test diff --git a/logictests/generated/mysql/group_concat,max,single_parameter.test b/logictests/generated/mysql/4/group_concat,max,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,single_parameter.test rename to logictests/generated/mysql/4/group_concat,max,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,min,is_null_filters.test b/logictests/generated/mysql/4/group_concat,min,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,is_null_filters.test rename to logictests/generated/mysql/4/group_concat,min,is_null_filters.test diff --git a/logictests/generated/mysql/group_concat,min,less_filters.test b/logictests/generated/mysql/4/group_concat,min,less_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,less_filters.test rename to logictests/generated/mysql/4/group_concat,min,less_filters.test diff --git a/logictests/generated/mysql/group_concat,project_literal,in_parameter.fail.test b/logictests/generated/mysql/4/group_concat,project_literal,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,project_literal,in_parameter.fail.test rename to logictests/generated/mysql/4/group_concat,project_literal,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,range_param.fail.test b/logictests/generated/mysql/4/group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,range_param.fail.test rename to logictests/generated/mysql/4/group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,single_parameter,in_parameter.fail.test b/logictests/generated/mysql/4/group_concat,single_parameter,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,single_parameter,in_parameter.fail.test rename to logictests/generated/mysql/4/group_concat,single_parameter,in_parameter.fail.test diff --git a/logictests/generated/mysql/in_parameter,between_filters,range_param.fail.test b/logictests/generated/mysql/4/in_parameter,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,between_filters,range_param.fail.test rename to logictests/generated/mysql/4/in_parameter,between_filters,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/in_parameter,count,in_parameter.fail.test b/logictests/generated/mysql/4/in_parameter,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/in_parameter,count,in_parameter.fail.test rename to logictests/generated/mysql/4/in_parameter,count,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,left_join,in_parameter.test b/logictests/generated/mysql/4/in_parameter,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter,left_join,in_parameter.test rename to logictests/generated/mysql/4/in_parameter,left_join,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,max,range_param.fail.test b/logictests/generated/mysql/4/in_parameter,max,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,max,range_param.fail.test rename to logictests/generated/mysql/4/in_parameter,max,range_param.test diff --git a/logictests/generated/mysql/in_parameter,multiple_parameters,range_param.test b/logictests/generated/mysql/4/in_parameter,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/in_parameter,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/in_parameter,topk,range_param.test b/logictests/generated/mysql/4/in_parameter,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,topk,range_param.test rename to logictests/generated/mysql/4/in_parameter,topk,range_param.test diff --git a/logictests/generated/mysql/inner_join,cte.test b/logictests/generated/mysql/4/inner_join,cte.test similarity index 100% rename from logictests/generated/mysql/inner_join,cte.test rename to logictests/generated/mysql/4/inner_join,cte.test diff --git a/logictests/generated/mysql/inner_join,greater_filters,range_param.test b/logictests/generated/mysql/4/inner_join,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,greater_filters,range_param.test rename to logictests/generated/mysql/4/inner_join,greater_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/4/inner_join,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/4/inner_join,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,left_join,in_parameter.test b/logictests/generated/mysql/4/inner_join,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,left_join,in_parameter.test rename to logictests/generated/mysql/4/inner_join,left_join,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,less_filters,in_parameter.test b/logictests/generated/mysql/4/inner_join,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,less_filters,in_parameter.test rename to logictests/generated/mysql/4/inner_join,less_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/inner_join,sum,in_parameter.fail.test b/logictests/generated/mysql/4/inner_join,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/inner_join,sum,in_parameter.fail.test rename to logictests/generated/mysql/4/inner_join,sum,in_parameter.test diff --git a/logictests/generated/mysql/inner_join.test b/logictests/generated/mysql/4/inner_join.test similarity index 100% rename from logictests/generated/mysql/inner_join.test rename to logictests/generated/mysql/4/inner_join.test diff --git a/logictests/generated/mysql/is_null_filters,greater_filters,range_param.test b/logictests/generated/mysql/4/is_null_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,greater_filters,range_param.test rename to logictests/generated/mysql/4/is_null_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/4/is_null_filters,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/4/is_null_filters,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/is_null_filters,left_join.test b/logictests/generated/mysql/4/is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,left_join.test rename to logictests/generated/mysql/4/is_null_filters,left_join.test diff --git a/logictests/generated/mysql/is_null_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/4/is_null_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/4/is_null_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,sum,range_param.test b/logictests/generated/mysql/4/is_null_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,sum,range_param.test rename to logictests/generated/mysql/4/is_null_filters,sum,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,topk.test b/logictests/generated/mysql/4/is_null_filters,topk.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,topk.test rename to logictests/generated/mysql/4/is_null_filters,topk.test diff --git a/logictests/generated/mysql/join_subquery,count,range_param.fail.test b/logictests/generated/mysql/4/join_subquery,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,count,range_param.fail.test rename to logictests/generated/mysql/4/join_subquery,count,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,count_distinct,range_param.fail.test b/logictests/generated/mysql/4/join_subquery,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,count_distinct,range_param.fail.test rename to logictests/generated/mysql/4/join_subquery,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,greater_filters,range_param.fail.test b/logictests/generated/mysql/4/join_subquery,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,greater_filters,range_param.fail.test rename to logictests/generated/mysql/4/join_subquery,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,group_concat,range_param.fail.test b/logictests/generated/mysql/4/join_subquery,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,group_concat,range_param.fail.test rename to logictests/generated/mysql/4/join_subquery,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,project_literal,in_parameter.fail.test b/logictests/generated/mysql/4/join_subquery,project_literal,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,project_literal,in_parameter.fail.test rename to logictests/generated/mysql/4/join_subquery,project_literal,in_parameter.fail.test diff --git a/logictests/generated/mysql/join_subquery,project_literal,range_param.fail.test b/logictests/generated/mysql/4/join_subquery,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,project_literal,range_param.fail.test rename to logictests/generated/mysql/4/join_subquery,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,sum_distinct,range_param.fail.test b/logictests/generated/mysql/4/join_subquery,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/4/join_subquery,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,between_filters,range_param.test b/logictests/generated/mysql/4/left_join,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,between_filters,range_param.test rename to logictests/generated/mysql/4/left_join,between_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/left_join,count,in_parameter.fail.test b/logictests/generated/mysql/4/left_join,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/left_join,count,in_parameter.fail.test rename to logictests/generated/mysql/4/left_join,count,in_parameter.test diff --git a/logictests/generated/mysql/left_join,equal_filters,range_param.test b/logictests/generated/mysql/4/left_join,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,equal_filters,range_param.test rename to logictests/generated/mysql/4/left_join,equal_filters,range_param.test diff --git a/logictests/generated/mysql/left_join,in_parameter,in_parameter.test b/logictests/generated/mysql/4/left_join,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,in_parameter,in_parameter.test rename to logictests/generated/mysql/4/left_join,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/left_join,less_filters,range_param.test b/logictests/generated/mysql/4/left_join,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,less_filters,range_param.test rename to logictests/generated/mysql/4/left_join,less_filters,range_param.test diff --git a/logictests/generated/mysql/left_join,less_or_equal_filters,range_param.test b/logictests/generated/mysql/4/left_join,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/4/left_join,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/left_join,max,range_param.test b/logictests/generated/mysql/4/left_join,max,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,max,range_param.test rename to logictests/generated/mysql/4/left_join,max,range_param.test diff --git a/logictests/generated/mysql/left_join,min,range_param.test b/logictests/generated/mysql/4/left_join,min,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,min,range_param.test rename to logictests/generated/mysql/4/left_join,min,range_param.test diff --git a/logictests/generated/mysql/left_join,multiple_parameters,range_param.test b/logictests/generated/mysql/4/left_join,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/left_join,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/left_join,range_param,range_param.test b/logictests/generated/mysql/4/left_join,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,range_param,range_param.test rename to logictests/generated/mysql/4/left_join,range_param,range_param.test diff --git a/logictests/generated/mysql/left_join,single_parameter,in_parameter.test b/logictests/generated/mysql/4/left_join,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,single_parameter,in_parameter.test rename to logictests/generated/mysql/4/left_join,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/left_join,single_parameter,range_param.test b/logictests/generated/mysql/4/left_join,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,single_parameter,range_param.test rename to logictests/generated/mysql/4/left_join,single_parameter,range_param.test diff --git a/logictests/generated/mysql/less_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/less_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/less_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,inner_join,range_param.test b/logictests/generated/mysql/4/less_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,inner_join,range_param.test rename to logictests/generated/mysql/4/less_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/less_filters,inner_join.test b/logictests/generated/mysql/4/less_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/less_filters,inner_join.test rename to logictests/generated/mysql/4/less_filters,inner_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_filters,min,in_parameter.fail.test b/logictests/generated/mysql/4/less_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/4/less_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,min,range_param.test b/logictests/generated/mysql/4/less_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,min,range_param.test rename to logictests/generated/mysql/4/less_filters,min,range_param.test diff --git a/logictests/generated/mysql/less_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/4/less_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/less_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/less_filters,not_equal_filters,range_param.test b/logictests/generated/mysql/4/less_filters,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,not_equal_filters,range_param.test rename to logictests/generated/mysql/4/less_filters,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/4/less_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/4/less_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/less_or_equal_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/less_or_equal_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/4/less_or_equal_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/4/less_or_equal_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/4/less_or_equal_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/4/less_or_equal_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/4/less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/4/less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,inner_join,range_param.test b/logictests/generated/mysql/4/less_or_equal_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,inner_join,range_param.test rename to logictests/generated/mysql/4/less_or_equal_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,is_null_filters,range_param.test b/logictests/generated/mysql/4/less_or_equal_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/4/less_or_equal_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,left_join.test b/logictests/generated/mysql/4/less_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,left_join.test rename to logictests/generated/mysql/4/less_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/less_or_equal_filters,less_filters,range_param.test b/logictests/generated/mysql/4/less_or_equal_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,less_filters,range_param.test rename to logictests/generated/mysql/4/less_or_equal_filters,less_filters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,sum,range_param.test b/logictests/generated/mysql/4/less_or_equal_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,sum,range_param.test rename to logictests/generated/mysql/4/less_or_equal_filters,sum,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters.test b/logictests/generated/mysql/4/less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters.test rename to logictests/generated/mysql/4/less_or_equal_filters.test diff --git a/logictests/generated/mysql/max,avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/max,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/max,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/max,between_filters.test b/logictests/generated/mysql/4/max,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,between_filters.test rename to logictests/generated/mysql/4/max,between_filters.test diff --git a/logictests/generated/mysql/max,equal_filters,between_filters.test b/logictests/generated/mysql/4/max,equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,between_filters.test rename to logictests/generated/mysql/4/max,equal_filters,between_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,greater_filters,in_parameter.fail.test b/logictests/generated/mysql/4/max,greater_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,greater_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/max,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,greater_filters,left_join.test b/logictests/generated/mysql/4/max,greater_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,left_join.test rename to logictests/generated/mysql/4/max,greater_filters,left_join.test diff --git a/logictests/generated/mysql/max,greater_filters,single_parameter.test b/logictests/generated/mysql/4/max,greater_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,single_parameter.test rename to logictests/generated/mysql/4/max,greater_filters,single_parameter.test diff --git a/logictests/generated/mysql/max,greater_filters.test b/logictests/generated/mysql/4/max,greater_filters.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters.test rename to logictests/generated/mysql/4/max,greater_filters.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/4/max,greater_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/4/max,greater_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/max,inner_join,left_join.test b/logictests/generated/mysql/4/max,inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/max,inner_join,left_join.test rename to logictests/generated/mysql/4/max,inner_join,left_join.test diff --git a/logictests/generated/mysql/max,is_null_filters,distinct.test b/logictests/generated/mysql/4/max,is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,is_null_filters,distinct.test rename to logictests/generated/mysql/4/max,is_null_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,is_null_filters,in_parameter.fail.test b/logictests/generated/mysql/4/max,is_null_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,is_null_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/max,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,join_subquery.test b/logictests/generated/mysql/4/max,join_subquery.test similarity index 100% rename from logictests/generated/mysql/max,join_subquery.test rename to logictests/generated/mysql/4/max,join_subquery.test diff --git a/logictests/generated/mysql/max,less_filters,distinct.test b/logictests/generated/mysql/4/max,less_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,distinct.test rename to logictests/generated/mysql/4/max,less_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,less_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/4/max,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,less_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/max,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,inner_join.test b/logictests/generated/mysql/4/max,less_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,inner_join.test rename to logictests/generated/mysql/4/max,less_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/max,min,cte.test b/logictests/generated/mysql/4/max,min,cte.test similarity index 100% rename from logictests/generated/mysql/max,min,cte.test rename to logictests/generated/mysql/4/max,min,cte.test diff --git a/logictests/generated/mysql/max,min,is_null_filters.test b/logictests/generated/mysql/4/max,min,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,min,is_null_filters.test rename to logictests/generated/mysql/4/max,min,is_null_filters.test diff --git a/logictests/generated/mysql/max,min,left_join.test b/logictests/generated/mysql/4/max,min,left_join.test similarity index 100% rename from logictests/generated/mysql/max,min,left_join.test rename to logictests/generated/mysql/4/max,min,left_join.test diff --git a/logictests/generated/mysql/max,multiple_parameters,range_param.test b/logictests/generated/mysql/4/max,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/max,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/max,not_equal_filters,between_filters.test b/logictests/generated/mysql/4/max,not_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,between_filters.test rename to logictests/generated/mysql/4/max,not_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/max,not_equal_filters,is_null_filters.test b/logictests/generated/mysql/4/max,not_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,is_null_filters.test rename to logictests/generated/mysql/4/max,not_equal_filters,is_null_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,sum,in_parameter.fail.test b/logictests/generated/mysql/4/max,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,sum,in_parameter.fail.test rename to logictests/generated/mysql/4/max,sum,in_parameter.test diff --git a/logictests/generated/mysql/min,avg,range_param.fail.test b/logictests/generated/mysql/4/min,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,avg,range_param.fail.test rename to logictests/generated/mysql/4/min,avg,range_param.fail.test diff --git a/logictests/generated/mysql/min,between_filters,inner_join.test b/logictests/generated/mysql/4/min,between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,between_filters,inner_join.test rename to logictests/generated/mysql/4/min,between_filters,inner_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,count,in_parameter.fail.test b/logictests/generated/mysql/4/min,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,count,in_parameter.fail.test rename to logictests/generated/mysql/4/min,count,in_parameter.test diff --git a/logictests/generated/mysql/min,count,range_param.test b/logictests/generated/mysql/4/min,count,range_param.test similarity index 100% rename from logictests/generated/mysql/min,count,range_param.test rename to logictests/generated/mysql/4/min,count,range_param.test diff --git a/logictests/generated/mysql/min,count_distinct,range_param.fail.test b/logictests/generated/mysql/4/min,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,count_distinct,range_param.fail.test rename to logictests/generated/mysql/4/min,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/min,equal_filters.test b/logictests/generated/mysql/4/min,equal_filters.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters.test rename to logictests/generated/mysql/4/min,equal_filters.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,distinct.test b/logictests/generated/mysql/4/min,greater_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,distinct.test rename to logictests/generated/mysql/4/min,greater_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/min,inner_join,range_param.test b/logictests/generated/mysql/4/min,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/min,inner_join,range_param.test rename to logictests/generated/mysql/4/min,inner_join,range_param.test diff --git a/logictests/generated/mysql/min,is_null_filters,range_param.test b/logictests/generated/mysql/4/min,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters,range_param.test rename to logictests/generated/mysql/4/min,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/min,join_subquery,range_param.fail.test b/logictests/generated/mysql/4/min,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,join_subquery,range_param.fail.test rename to logictests/generated/mysql/4/min,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/min,less_filters,inner_join.test b/logictests/generated/mysql/4/min,less_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,inner_join.test rename to logictests/generated/mysql/4/min,less_filters,inner_join.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,single_parameter.test b/logictests/generated/mysql/4/min,less_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/4/min,less_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/min,max,range_param.test b/logictests/generated/mysql/4/min,max,range_param.test similarity index 100% rename from logictests/generated/mysql/min,max,range_param.test rename to logictests/generated/mysql/4/min,max,range_param.test diff --git a/logictests/generated/mysql/min,multiple_parameters,in_parameter.fail.test b/logictests/generated/mysql/4/min,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/min,multiple_parameters,in_parameter.fail.test rename to logictests/generated/mysql/4/min,multiple_parameters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,not_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/4/min,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,not_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/min,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,not_equal_filters,range_param.test b/logictests/generated/mysql/4/min,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,range_param.test rename to logictests/generated/mysql/4/min,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/min,not_equal_filters.test b/logictests/generated/mysql/4/min,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters.test rename to logictests/generated/mysql/4/min,not_equal_filters.test diff --git a/logictests/generated/mysql/min,sum_distinct,range_param.fail.test b/logictests/generated/mysql/4/min,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/4/min,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/min,topk.test b/logictests/generated/mysql/4/min,topk.test similarity index 100% rename from logictests/generated/mysql/min,topk.test rename to logictests/generated/mysql/4/min,topk.test diff --git a/logictests/generated/mysql/min.test b/logictests/generated/mysql/4/min.test similarity index 100% rename from logictests/generated/mysql/min.test rename to logictests/generated/mysql/4/min.test diff --git a/logictests/generated/mysql/multiple_parameters,cte,range_param.fail.test b/logictests/generated/mysql/4/multiple_parameters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,cte,range_param.fail.test rename to logictests/generated/mysql/4/multiple_parameters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,is_null_filters,range_param.fail.test b/logictests/generated/mysql/4/multiple_parameters,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/4/multiple_parameters,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,max,range_param.test b/logictests/generated/mysql/4/multiple_parameters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,max,range_param.test rename to logictests/generated/mysql/4/multiple_parameters,max,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,topk,range_param.test b/logictests/generated/mysql/4/multiple_parameters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,topk,range_param.test rename to logictests/generated/mysql/4/multiple_parameters,topk,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,count,range_param.test b/logictests/generated/mysql/4/multiple_range_params,count,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,count,range_param.test rename to logictests/generated/mysql/4/multiple_range_params,count,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,count_distinct,range_param.fail.test b/logictests/generated/mysql/4/multiple_range_params,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,count_distinct,range_param.fail.test rename to logictests/generated/mysql/4/multiple_range_params,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/4/multiple_range_params,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/4/multiple_range_params,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/4/multiple_range_params,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/4/multiple_range_params,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,range_param,range_param.test b/logictests/generated/mysql/4/multiple_range_params,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,range_param,range_param.test rename to logictests/generated/mysql/4/multiple_range_params,range_param,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,between_filters,in_parameter.test b/logictests/generated/mysql/4/not_equal_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/4/not_equal_filters,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/4/not_equal_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/4/not_equal_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,inner_join,range_param.test b/logictests/generated/mysql/4/not_equal_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,inner_join,range_param.test rename to logictests/generated/mysql/4/not_equal_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,inner_join.test b/logictests/generated/mysql/4/not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,inner_join.test rename to logictests/generated/mysql/4/not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/not_equal_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/4/not_equal_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/4/not_equal_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/not_equal_filters,less_filters,in_parameter.test b/logictests/generated/mysql/4/not_equal_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/4/not_equal_filters,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,max,range_param.test b/logictests/generated/mysql/4/not_equal_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,max,range_param.test rename to logictests/generated/mysql/4/not_equal_filters,max,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/4/not_equal_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/4/not_equal_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,range_param,range_param.test b/logictests/generated/mysql/4/not_equal_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,range_param,range_param.test rename to logictests/generated/mysql/4/not_equal_filters,range_param,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters.test b/logictests/generated/mysql/4/not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters.test rename to logictests/generated/mysql/4/not_equal_filters.test diff --git a/logictests/generated/mysql/project_literal,avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/project_literal,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/project_literal,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,count,range_param.fail.test b/logictests/generated/mysql/4/project_literal,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,count,range_param.fail.test rename to logictests/generated/mysql/4/project_literal,count,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,is_null_filters,range_param.fail.test b/logictests/generated/mysql/4/project_literal,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/4/project_literal,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,less_filters,range_param.fail.test b/logictests/generated/mysql/4/project_literal,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,less_filters,range_param.fail.test rename to logictests/generated/mysql/4/project_literal,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/4/project_literal,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/4/project_literal,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,join_subquery,range_param.fail.test b/logictests/generated/mysql/4/range_param,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,join_subquery,range_param.fail.test rename to logictests/generated/mysql/4/range_param,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,max,range_param.test b/logictests/generated/mysql/4/range_param,max,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,max,range_param.test rename to logictests/generated/mysql/4/range_param,max,range_param.test diff --git a/logictests/generated/mysql/range_param,multiple_range_params,range_param.test b/logictests/generated/mysql/4/range_param,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,multiple_range_params,range_param.test rename to logictests/generated/mysql/4/range_param,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/range_param,topk,range_param.test b/logictests/generated/mysql/4/range_param,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,topk,range_param.test rename to logictests/generated/mysql/4/range_param,topk,range_param.test diff --git a/logictests/generated/mysql/range_param.test b/logictests/generated/mysql/4/range_param.test similarity index 100% rename from logictests/generated/mysql/range_param.test rename to logictests/generated/mysql/4/range_param.test diff --git a/logictests/generated/mysql/single_parameter,between_filters,range_param.fail.test b/logictests/generated/mysql/4/single_parameter,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,between_filters,range_param.fail.test rename to logictests/generated/mysql/4/single_parameter,between_filters,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/single_parameter,count,in_parameter.fail.test b/logictests/generated/mysql/4/single_parameter,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/single_parameter,count,in_parameter.fail.test rename to logictests/generated/mysql/4/single_parameter,count,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,count,range_param.test b/logictests/generated/mysql/4/single_parameter,count,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,count,range_param.test rename to logictests/generated/mysql/4/single_parameter,count,range_param.test diff --git a/logictests/generated/mysql/single_parameter,count_distinct,range_param.fail.test b/logictests/generated/mysql/4/single_parameter,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,count_distinct,range_param.fail.test rename to logictests/generated/mysql/4/single_parameter,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,inner_join,in_parameter.test b/logictests/generated/mysql/4/single_parameter,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/single_parameter,inner_join,in_parameter.test rename to logictests/generated/mysql/4/single_parameter,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,inner_join,range_param.test b/logictests/generated/mysql/4/single_parameter,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,inner_join,range_param.test rename to logictests/generated/mysql/4/single_parameter,inner_join,range_param.test diff --git a/logictests/generated/mysql/single_parameter,join_subquery,range_param.fail.test b/logictests/generated/mysql/4/single_parameter,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,join_subquery,range_param.fail.test rename to logictests/generated/mysql/4/single_parameter,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,multiple_range_params,range_param.test b/logictests/generated/mysql/4/single_parameter,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,multiple_range_params,range_param.test rename to logictests/generated/mysql/4/single_parameter,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/sum,avg,distinct.test b/logictests/generated/mysql/4/sum,avg,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,avg,distinct.test rename to logictests/generated/mysql/4/sum,avg,distinct.test diff --git a/logictests/generated/mysql/sum,avg,less_filters.fail.test b/logictests/generated/mysql/4/sum,avg,less_filters.fail.test similarity index 100% rename from logictests/generated/mysql/sum,avg,less_filters.fail.test rename to logictests/generated/mysql/4/sum,avg,less_filters.fail.test diff --git a/logictests/generated/mysql/sum,avg,topk.test b/logictests/generated/mysql/4/sum,avg,topk.test similarity index 100% rename from logictests/generated/mysql/sum,avg,topk.test rename to logictests/generated/mysql/4/sum,avg,topk.test diff --git a/logictests/generated/mysql/sum,avg.test b/logictests/generated/mysql/4/sum,avg.test similarity index 100% rename from logictests/generated/mysql/sum,avg.test rename to logictests/generated/mysql/4/sum,avg.test diff --git a/logictests/generated/mysql/sum,avg_distinct,range_param.fail.test b/logictests/generated/mysql/4/sum,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/4/sum,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum,between_filters,distinct.test b/logictests/generated/mysql/4/sum,between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,distinct.test rename to logictests/generated/mysql/4/sum,between_filters,distinct.test diff --git a/logictests/generated/mysql/sum,between_filters,inner_join.test b/logictests/generated/mysql/4/sum,between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,inner_join.test rename to logictests/generated/mysql/4/sum,between_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,cte,range_param.fail.test b/logictests/generated/mysql/4/sum,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,cte,range_param.fail.test rename to logictests/generated/mysql/4/sum,cte,range_param.fail.test diff --git a/logictests/generated/mysql/sum,distinct,topk.test b/logictests/generated/mysql/4/sum,distinct,topk.test similarity index 100% rename from logictests/generated/mysql/sum,distinct,topk.test rename to logictests/generated/mysql/4/sum,distinct,topk.test diff --git a/logictests/generated/mysql/sum,equal_filters,between_filters.test b/logictests/generated/mysql/4/sum,equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,between_filters.test rename to logictests/generated/mysql/4/sum,equal_filters,between_filters.test diff --git a/logictests/generated/mysql/sum,equal_filters,inner_join.test b/logictests/generated/mysql/4/sum,equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,inner_join.test rename to logictests/generated/mysql/4/sum,equal_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,greater_filters,distinct.test b/logictests/generated/mysql/4/sum,greater_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,distinct.test rename to logictests/generated/mysql/4/sum,greater_filters,distinct.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,distinct.test b/logictests/generated/mysql/4/sum,greater_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,distinct.test rename to logictests/generated/mysql/4/sum,greater_or_equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,greater_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/4/sum,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,greater_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/sum,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,group_concat,greater_or_equal_filters.test b/logictests/generated/mysql/4/sum,group_concat,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,greater_or_equal_filters.test rename to logictests/generated/mysql/4/sum,group_concat,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,min.test b/logictests/generated/mysql/4/sum,group_concat,min.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,min.test rename to logictests/generated/mysql/4/sum,group_concat,min.test diff --git a/logictests/generated/mysql/sum,left_join,single_parameter.test b/logictests/generated/mysql/4/sum,left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,left_join,single_parameter.test rename to logictests/generated/mysql/4/sum,left_join,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,less_filters,in_parameter.fail.test b/logictests/generated/mysql/4/sum,less_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,less_filters,in_parameter.fail.test rename to logictests/generated/mysql/4/sum,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,less_filters,is_null_filters.test b/logictests/generated/mysql/4/sum,less_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,is_null_filters.test rename to logictests/generated/mysql/4/sum,less_filters,is_null_filters.test diff --git a/logictests/generated/mysql/sum,less_filters,single_parameter.test b/logictests/generated/mysql/4/sum,less_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,single_parameter.test rename to logictests/generated/mysql/4/sum,less_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,single_parameter.test b/logictests/generated/mysql/4/sum,less_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/4/sum,less_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters.test b/logictests/generated/mysql/4/sum,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters.test rename to logictests/generated/mysql/4/sum,less_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,max,range_param.test b/logictests/generated/mysql/4/sum,max,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,max,range_param.test rename to logictests/generated/mysql/4/sum,max,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,min,in_parameter.fail.test b/logictests/generated/mysql/4/sum,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,min,in_parameter.fail.test rename to logictests/generated/mysql/4/sum,min,in_parameter.test diff --git a/logictests/generated/mysql/sum,min,inner_join.test b/logictests/generated/mysql/4/sum,min,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,min,inner_join.test rename to logictests/generated/mysql/4/sum,min,inner_join.test diff --git a/logictests/generated/mysql/sum,multiple_parameters,range_param.test b/logictests/generated/mysql/4/sum,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,multiple_parameters,range_param.test rename to logictests/generated/mysql/4/sum,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,inner_join.test b/logictests/generated/mysql/4/sum,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,inner_join.test rename to logictests/generated/mysql/4/sum,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,left_join.test b/logictests/generated/mysql/4/sum,not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,left_join.test rename to logictests/generated/mysql/4/sum,not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/sum,not_equal_filters.test b/logictests/generated/mysql/4/sum,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters.test rename to logictests/generated/mysql/4/sum,not_equal_filters.test diff --git a/logictests/generated/mysql/sum,range_param,range_param.test b/logictests/generated/mysql/4/sum,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,range_param,range_param.test rename to logictests/generated/mysql/4/sum,range_param,range_param.test diff --git a/logictests/generated/mysql/sum,sum_distinct,range_param.fail.test b/logictests/generated/mysql/4/sum,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/4/sum,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,equal_filters,range_param.fail.test b/logictests/generated/mysql/4/sum_distinct,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,equal_filters,range_param.fail.test rename to logictests/generated/mysql/4/sum_distinct,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,less_filters,range_param.fail.test b/logictests/generated/mysql/4/sum_distinct,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,less_filters,range_param.fail.test rename to logictests/generated/mysql/4/sum_distinct,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/4/sum_distinct,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/4/sum_distinct,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,project_literal,range_param.fail.test b/logictests/generated/mysql/4/sum_distinct,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,project_literal,range_param.fail.test rename to logictests/generated/mysql/4/sum_distinct,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/topk,between_filters,in_parameter.test b/logictests/generated/mysql/4/topk,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,between_filters,in_parameter.test rename to logictests/generated/mysql/4/topk,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,cte,range_param.fail.test b/logictests/generated/mysql/4/topk,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,cte,range_param.fail.test rename to logictests/generated/mysql/4/topk,cte,range_param.fail.test diff --git a/logictests/generated/mysql/topk,greater_filters,range_param.test b/logictests/generated/mysql/4/topk,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,greater_filters,range_param.test rename to logictests/generated/mysql/4/topk,greater_filters,range_param.test diff --git a/logictests/generated/mysql/topk,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/4/topk,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/4/topk,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,in_parameter,range_param.test b/logictests/generated/mysql/4/topk,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,in_parameter,range_param.test rename to logictests/generated/mysql/4/topk,in_parameter,range_param.test diff --git a/logictests/generated/mysql/topk,left_join,range_param.test b/logictests/generated/mysql/4/topk,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,left_join,range_param.test rename to logictests/generated/mysql/4/topk,left_join,range_param.test diff --git a/logictests/generated/mysql/topk,single_parameter,range_param.test b/logictests/generated/mysql/4/topk,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,single_parameter,range_param.test rename to logictests/generated/mysql/4/topk,single_parameter,range_param.test diff --git a/logictests/generated/mysql/avg,between_filters,inner_join.test b/logictests/generated/mysql/5/avg,between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/avg,between_filters,inner_join.test rename to logictests/generated/mysql/5/avg,between_filters,inner_join.test diff --git a/logictests/generated/mysql/avg,equal_filters,between_filters.test b/logictests/generated/mysql/5/avg,equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters,between_filters.test rename to logictests/generated/mysql/5/avg,equal_filters,between_filters.test diff --git a/logictests/generated/mysql/avg,equal_filters.test b/logictests/generated/mysql/5/avg,equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,equal_filters.test rename to logictests/generated/mysql/5/avg,equal_filters.test diff --git a/logictests/generated/mysql/avg,greater_filters,inner_join.fail.test b/logictests/generated/mysql/5/avg,greater_filters,inner_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,inner_join.fail.test rename to logictests/generated/mysql/5/avg,greater_filters,inner_join.fail.test diff --git a/logictests/generated/mysql/avg,greater_filters.fail.test b/logictests/generated/mysql/5/avg,greater_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters.fail.test rename to logictests/generated/mysql/5/avg,greater_filters.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,distinct.fail.test b/logictests/generated/mysql/5/avg,greater_or_equal_filters,distinct.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,distinct.fail.test rename to logictests/generated/mysql/5/avg,greater_or_equal_filters,distinct.fail.test diff --git a/logictests/generated/mysql/avg,greater_or_equal_filters,inner_join.fail.test b/logictests/generated/mysql/5/avg,greater_or_equal_filters,inner_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_or_equal_filters,inner_join.fail.test rename to logictests/generated/mysql/5/avg,greater_or_equal_filters,inner_join.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,distinct.test b/logictests/generated/mysql/5/avg,group_concat,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,distinct.test rename to logictests/generated/mysql/5/avg,group_concat,distinct.test diff --git a/logictests/generated/mysql/avg,group_concat,left_join.test b/logictests/generated/mysql/5/avg,group_concat,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,left_join.test rename to logictests/generated/mysql/5/avg,group_concat,left_join.test diff --git a/logictests/generated/mysql/avg,is_null_filters,distinct.test b/logictests/generated/mysql/5/avg,is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters,distinct.test rename to logictests/generated/mysql/5/avg,is_null_filters,distinct.test diff --git a/logictests/generated/mysql/avg,is_null_filters,range_param.fail.test b/logictests/generated/mysql/5/avg,is_null_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters,range_param.fail.test rename to logictests/generated/mysql/5/avg,is_null_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,is_null_filters.test b/logictests/generated/mysql/5/avg,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters.test rename to logictests/generated/mysql/5/avg,is_null_filters.test diff --git a/logictests/generated/mysql/avg,left_join,range_param.fail.test b/logictests/generated/mysql/5/avg,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,left_join,range_param.fail.test rename to logictests/generated/mysql/5/avg,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/avg,less_filters,is_null_filters.fail.test b/logictests/generated/mysql/5/avg,less_filters,is_null_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,is_null_filters.fail.test rename to logictests/generated/mysql/5/avg,less_filters,is_null_filters.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters.fail.test b/logictests/generated/mysql/5/avg,less_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters.fail.test rename to logictests/generated/mysql/5/avg,less_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,max,between_filters.test b/logictests/generated/mysql/5/avg,max,between_filters.test similarity index 100% rename from logictests/generated/mysql/avg,max,between_filters.test rename to logictests/generated/mysql/5/avg,max,between_filters.test diff --git a/logictests/generated/mysql/avg,min,distinct.test b/logictests/generated/mysql/5/avg,min,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,min,distinct.test rename to logictests/generated/mysql/5/avg,min,distinct.test diff --git a/logictests/generated/mysql/avg,min,equal_filters.test b/logictests/generated/mysql/5/avg,min,equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,min,equal_filters.test rename to logictests/generated/mysql/5/avg,min,equal_filters.test diff --git a/logictests/generated/mysql/avg,min,greater_or_equal_filters.fail.test b/logictests/generated/mysql/5/avg,min,greater_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,min,greater_or_equal_filters.fail.test rename to logictests/generated/mysql/5/avg,min,greater_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/avg,min,range_param.fail.test b/logictests/generated/mysql/5/avg,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,min,range_param.fail.test rename to logictests/generated/mysql/5/avg,min,range_param.fail.test diff --git a/logictests/generated/mysql/avg,min,single_parameter.test b/logictests/generated/mysql/5/avg,min,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,min,single_parameter.test rename to logictests/generated/mysql/5/avg,min,single_parameter.test diff --git a/logictests/generated/mysql/avg,multiple_parameters,in_parameter.fail.test b/logictests/generated/mysql/5/avg,multiple_parameters,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/avg,multiple_parameters,in_parameter.fail.test rename to logictests/generated/mysql/5/avg,multiple_parameters,in_parameter.fail.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,distinct.test b/logictests/generated/mysql/5/avg,not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,distinct.test rename to logictests/generated/mysql/5/avg,not_equal_filters,distinct.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/avg,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/avg,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,range_param.fail.test b/logictests/generated/mysql/5/avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,range_param.fail.test rename to logictests/generated/mysql/5/avg,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,count,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,count,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,count,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,in_parameter,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,in_parameter,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,max,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,max,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,max,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,single_parameter,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,single_parameter,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,sum_distinct,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,topk,range_param.fail.test b/logictests/generated/mysql/5/avg_distinct,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,topk,range_param.fail.test rename to logictests/generated/mysql/5/avg_distinct,topk,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,distinct.test b/logictests/generated/mysql/5/between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/between_filters,distinct.test rename to logictests/generated/mysql/5/between_filters,distinct.test diff --git a/logictests/generated/mysql/between_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/5/between_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/5/between_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/5/between_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/5/between_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,inner_join.test b/logictests/generated/mysql/5/between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/between_filters,inner_join.test rename to logictests/generated/mysql/5/between_filters,inner_join.test diff --git a/logictests/generated/mysql/between_filters,left_join,range_param.test b/logictests/generated/mysql/5/between_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,left_join,range_param.test rename to logictests/generated/mysql/5/between_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/between_filters,range_param.test b/logictests/generated/mysql/5/between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,range_param.test rename to logictests/generated/mysql/5/between_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,single_parameter,range_param.test b/logictests/generated/mysql/5/between_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,single_parameter,range_param.test rename to logictests/generated/mysql/5/between_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/between_filters,single_parameter.test b/logictests/generated/mysql/5/between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,single_parameter.test rename to logictests/generated/mysql/5/between_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/between_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/5/between_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/between_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/5/between_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,sum,range_param.test b/logictests/generated/mysql/5/between_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,sum,range_param.test rename to logictests/generated/mysql/5/between_filters,sum,range_param.test diff --git a/logictests/generated/mysql/between_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/5/between_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/5/between_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count,avg,equal_filters.test b/logictests/generated/mysql/5/count,avg,equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,avg,equal_filters.test rename to logictests/generated/mysql/5/count,avg,equal_filters.test diff --git a/logictests/generated/mysql/count,avg,inner_join.test b/logictests/generated/mysql/5/count,avg,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,avg,inner_join.test rename to logictests/generated/mysql/5/count,avg,inner_join.test diff --git a/logictests/generated/mysql/count,between_filters,inner_join.test b/logictests/generated/mysql/5/count,between_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,between_filters,inner_join.test rename to logictests/generated/mysql/5/count,between_filters,inner_join.test diff --git a/logictests/generated/mysql/count,between_filters,single_parameter.test b/logictests/generated/mysql/5/count,between_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,between_filters,single_parameter.test rename to logictests/generated/mysql/5/count,between_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,between_filters.test b/logictests/generated/mysql/5/count,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,between_filters.test rename to logictests/generated/mysql/5/count,between_filters.test diff --git a/logictests/generated/mysql/count,count_distinct,range_param.fail.test b/logictests/generated/mysql/5/count,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,count_distinct,range_param.fail.test rename to logictests/generated/mysql/5/count,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count,equal_filters,is_null_filters.test b/logictests/generated/mysql/5/count,equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,is_null_filters.test rename to logictests/generated/mysql/5/count,equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/count,greater_filters,distinct.test b/logictests/generated/mysql/5/count,greater_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,distinct.test rename to logictests/generated/mysql/5/count,greater_filters,distinct.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,left_join.test b/logictests/generated/mysql/5/count,greater_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,left_join.test rename to logictests/generated/mysql/5/count,greater_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/5/count,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/count,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/count,group_concat,range_param.fail.test b/logictests/generated/mysql/5/count,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,range_param.fail.test rename to logictests/generated/mysql/5/count,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/count,group_concat.test b/logictests/generated/mysql/5/count,group_concat.test similarity index 100% rename from logictests/generated/mysql/count,group_concat.test rename to logictests/generated/mysql/5/count,group_concat.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,in_parameter,in_parameter.fail.test b/logictests/generated/mysql/5/count,in_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,in_parameter,in_parameter.fail.test rename to logictests/generated/mysql/5/count,in_parameter,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,in_parameter.fail.test b/logictests/generated/mysql/5/count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,in_parameter.fail.test rename to logictests/generated/mysql/5/count,in_parameter.test diff --git a/logictests/generated/mysql/count,inner_join,range_param.test b/logictests/generated/mysql/5/count,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/count,inner_join,range_param.test rename to logictests/generated/mysql/5/count,inner_join,range_param.test diff --git a/logictests/generated/mysql/count,is_null_filters,range_param.test b/logictests/generated/mysql/5/count,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters,range_param.test rename to logictests/generated/mysql/5/count,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/count,left_join,range_param.test b/logictests/generated/mysql/5/count,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/count,left_join,range_param.test rename to logictests/generated/mysql/5/count,left_join,range_param.test diff --git a/logictests/generated/mysql/count,left_join.test b/logictests/generated/mysql/5/count,left_join.test similarity index 100% rename from logictests/generated/mysql/count,left_join.test rename to logictests/generated/mysql/5/count,left_join.test diff --git a/logictests/generated/mysql/count,less_filters,between_filters.test b/logictests/generated/mysql/5/count,less_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,between_filters.test rename to logictests/generated/mysql/5/count,less_filters,between_filters.test diff --git a/logictests/generated/mysql/count,less_filters,single_parameter.test b/logictests/generated/mysql/5/count,less_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,less_filters,single_parameter.test rename to logictests/generated/mysql/5/count,less_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,between_filters.test b/logictests/generated/mysql/5/count,less_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,between_filters.test rename to logictests/generated/mysql/5/count,less_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,single_parameter.test b/logictests/generated/mysql/5/count,less_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/5/count,less_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,max,greater_or_equal_filters.test b/logictests/generated/mysql/5/count,max,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,greater_or_equal_filters.test rename to logictests/generated/mysql/5/count,max,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/count,min,less_or_equal_filters.test b/logictests/generated/mysql/5/count,min,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,less_or_equal_filters.test rename to logictests/generated/mysql/5/count,min,less_or_equal_filters.test diff --git a/logictests/generated/mysql/count,min,range_param.test b/logictests/generated/mysql/5/count,min,range_param.test similarity index 100% rename from logictests/generated/mysql/count,min,range_param.test rename to logictests/generated/mysql/5/count,min,range_param.test diff --git a/logictests/generated/mysql/count,min.test b/logictests/generated/mysql/5/count,min.test similarity index 100% rename from logictests/generated/mysql/count,min.test rename to logictests/generated/mysql/5/count,min.test diff --git a/logictests/generated/mysql/count,not_equal_filters,inner_join.test b/logictests/generated/mysql/5/count,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,not_equal_filters,inner_join.test rename to logictests/generated/mysql/5/count,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/count,single_parameter,range_param.test b/logictests/generated/mysql/5/count,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/count,single_parameter,range_param.test rename to logictests/generated/mysql/5/count,single_parameter,range_param.test diff --git a/logictests/generated/mysql/count,sum,distinct.test b/logictests/generated/mysql/5/count,sum,distinct.test similarity index 100% rename from logictests/generated/mysql/count,sum,distinct.test rename to logictests/generated/mysql/5/count,sum,distinct.test diff --git a/logictests/generated/mysql/count,sum,is_null_filters.test b/logictests/generated/mysql/5/count,sum,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,sum,is_null_filters.test rename to logictests/generated/mysql/5/count,sum,is_null_filters.test diff --git a/logictests/generated/mysql/count,topk.test b/logictests/generated/mysql/5/count,topk.test similarity index 100% rename from logictests/generated/mysql/count,topk.test rename to logictests/generated/mysql/5/count,topk.test diff --git a/logictests/generated/mysql/count_distinct,between_filters,range_param.fail.test b/logictests/generated/mysql/5/count_distinct,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,between_filters,range_param.fail.test rename to logictests/generated/mysql/5/count_distinct,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/count_distinct,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/count_distinct,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,topk,range_param.fail.test b/logictests/generated/mysql/5/count_distinct,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,topk,range_param.fail.test rename to logictests/generated/mysql/5/count_distinct,topk,range_param.fail.test diff --git a/logictests/generated/mysql/cte,avg_distinct,range_param.fail.test b/logictests/generated/mysql/5/cte,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/5/cte,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/cte,count,range_param.fail.test b/logictests/generated/mysql/5/cte,count,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,count,range_param.fail.test rename to logictests/generated/mysql/5/cte,count,range_param.fail.test diff --git a/logictests/generated/mysql/cte,inner_join,range_param.fail.test b/logictests/generated/mysql/5/cte,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,inner_join,range_param.fail.test rename to logictests/generated/mysql/5/cte,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/cte,join_subquery,range_param.fail.test b/logictests/generated/mysql/5/cte,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,join_subquery,range_param.fail.test rename to logictests/generated/mysql/5/cte,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/cte,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/5/cte,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/5/cte,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,range_param,range_param.fail.test b/logictests/generated/mysql/5/cte,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,range_param,range_param.fail.test rename to logictests/generated/mysql/5/cte,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/cte,single_parameter,range_param.fail.test b/logictests/generated/mysql/5/cte,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,single_parameter,range_param.fail.test rename to logictests/generated/mysql/5/cte,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,group_concat,range_param.fail.test b/logictests/generated/mysql/5/distinct,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,group_concat,range_param.fail.test rename to logictests/generated/mysql/5/distinct,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,left_join.test b/logictests/generated/mysql/5/distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/distinct,left_join.test rename to logictests/generated/mysql/5/distinct,left_join.test diff --git a/logictests/generated/mysql/distinct,less_filters,range_param.test b/logictests/generated/mysql/5/distinct,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,less_filters,range_param.test rename to logictests/generated/mysql/5/distinct,less_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,less_or_equal_filters,range_param.test b/logictests/generated/mysql/5/distinct,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/distinct,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,project_literal,range_param.fail.test b/logictests/generated/mysql/5/distinct,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/distinct,project_literal,range_param.fail.test rename to logictests/generated/mysql/5/distinct,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,single_parameter.test b/logictests/generated/mysql/5/distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/distinct,single_parameter.test rename to logictests/generated/mysql/5/distinct,single_parameter.test diff --git a/logictests/generated/mysql/equal_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/5/equal_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/5/equal_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,greater_or_equal_filters.test b/logictests/generated/mysql/5/equal_filters,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/equal_filters,greater_or_equal_filters.test rename to logictests/generated/mysql/5/equal_filters,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/equal_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/5/equal_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/5/equal_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/5/equal_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/equal_filters,less_or_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/equal_filters,max,in_parameter.fail.test b/logictests/generated/mysql/5/equal_filters,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/equal_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/5/equal_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,min,range_param.test b/logictests/generated/mysql/5/equal_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,min,range_param.test rename to logictests/generated/mysql/5/equal_filters,min,range_param.test diff --git a/logictests/generated/mysql/equal_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/5/equal_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/equal_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/5/equal_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,not_equal_filters,inner_join.test b/logictests/generated/mysql/5/equal_filters,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/equal_filters,not_equal_filters,inner_join.test rename to logictests/generated/mysql/5/equal_filters,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/greater_filters,between_filters,range_param.test b/logictests/generated/mysql/5/greater_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,between_filters,range_param.test rename to logictests/generated/mysql/5/greater_filters,between_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/5/greater_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/5/greater_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/greater_filters,greater_or_equal_filters.test b/logictests/generated/mysql/5/greater_filters,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/greater_filters,greater_or_equal_filters.test rename to logictests/generated/mysql/5/greater_filters,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/greater_filters,is_null_filters,range_param.test b/logictests/generated/mysql/5/greater_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/5/greater_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/greater_filters,left_join,range_param.test b/logictests/generated/mysql/5/greater_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,left_join,range_param.test rename to logictests/generated/mysql/5/greater_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/greater_filters,left_join.test b/logictests/generated/mysql/5/greater_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/greater_filters,left_join.test rename to logictests/generated/mysql/5/greater_filters,left_join.test diff --git a/logictests/generated/mysql/greater_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/5/greater_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/5/greater_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/5/greater_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/5/greater_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,topk,range_param.test b/logictests/generated/mysql/5/greater_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,topk,range_param.test rename to logictests/generated/mysql/5/greater_filters,topk,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,avg,range_param.fail.test b/logictests/generated/mysql/5/greater_or_equal_filters,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,avg,range_param.fail.test rename to logictests/generated/mysql/5/greater_or_equal_filters,avg,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,between_filters,range_param.test b/logictests/generated/mysql/5/greater_or_equal_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,between_filters,range_param.test rename to logictests/generated/mysql/5/greater_or_equal_filters,between_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,is_null_filters,range_param.test b/logictests/generated/mysql/5/greater_or_equal_filters,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,is_null_filters,range_param.test rename to logictests/generated/mysql/5/greater_or_equal_filters,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,multiple_parameters,in_parameter.test b/logictests/generated/mysql/5/greater_or_equal_filters,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/5/greater_or_equal_filters,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,range_param,range_param.test b/logictests/generated/mysql/5/greater_or_equal_filters,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,range_param,range_param.test rename to logictests/generated/mysql/5/greater_or_equal_filters,range_param,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_or_equal_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/5/greater_or_equal_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_or_equal_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/5/greater_or_equal_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/group_concat,avg_distinct,range_param.fail.test b/logictests/generated/mysql/5/group_concat,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/5/group_concat,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,between_filters,distinct.test b/logictests/generated/mysql/5/group_concat,between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,between_filters,distinct.test rename to logictests/generated/mysql/5/group_concat,between_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/group_concat,between_filters,in_parameter.fail.test b/logictests/generated/mysql/5/group_concat,between_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/group_concat,between_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/group_concat,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/group_concat,distinct,inner_join.test b/logictests/generated/mysql/5/group_concat,distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,distinct,inner_join.test rename to logictests/generated/mysql/5/group_concat,distinct,inner_join.test diff --git a/logictests/generated/mysql/group_concat,distinct,topk.test b/logictests/generated/mysql/5/group_concat,distinct,topk.test similarity index 100% rename from logictests/generated/mysql/group_concat,distinct,topk.test rename to logictests/generated/mysql/5/group_concat,distinct,topk.test diff --git a/logictests/generated/mysql/group_concat,greater_or_equal_filters,left_join.test b/logictests/generated/mysql/5/group_concat,greater_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_or_equal_filters,left_join.test rename to logictests/generated/mysql/5/group_concat,greater_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,in_parameter,range_param.fail.test b/logictests/generated/mysql/5/group_concat,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,in_parameter,range_param.fail.test rename to logictests/generated/mysql/5/group_concat,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,is_null_filters,single_parameter.test b/logictests/generated/mysql/5/group_concat,is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,is_null_filters,single_parameter.test rename to logictests/generated/mysql/5/group_concat,is_null_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,left_join,single_parameter.test b/logictests/generated/mysql/5/group_concat,left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,left_join,single_parameter.test rename to logictests/generated/mysql/5/group_concat,left_join,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,less_filters,left_join.test b/logictests/generated/mysql/5/group_concat,less_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters,left_join.test rename to logictests/generated/mysql/5/group_concat,less_filters,left_join.test diff --git a/logictests/generated/mysql/group_concat,max,between_filters.test b/logictests/generated/mysql/5/group_concat,max,between_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,between_filters.test rename to logictests/generated/mysql/5/group_concat,max,between_filters.test diff --git a/logictests/generated/mysql/group_concat,multiple_parameters,in_parameter.fail.test b/logictests/generated/mysql/5/group_concat,multiple_parameters,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,multiple_parameters,in_parameter.fail.test rename to logictests/generated/mysql/5/group_concat,multiple_parameters,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/5/group_concat,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/5/group_concat,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,project_literal,range_param.fail.test b/logictests/generated/mysql/5/group_concat,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,project_literal,range_param.fail.test rename to logictests/generated/mysql/5/group_concat,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,range_param,range_param.fail.test b/logictests/generated/mysql/5/group_concat,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,range_param,range_param.fail.test rename to logictests/generated/mysql/5/group_concat,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,sum,in_parameter.fail.test b/logictests/generated/mysql/5/group_concat,sum,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,sum,in_parameter.fail.test rename to logictests/generated/mysql/5/group_concat,sum,in_parameter.fail.test diff --git a/logictests/generated/mysql/in_parameter,inner_join,range_param.test b/logictests/generated/mysql/5/in_parameter,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,inner_join,range_param.test rename to logictests/generated/mysql/5/in_parameter,inner_join,range_param.test diff --git a/logictests/generated/mysql/in_parameter,left_join,range_param.test b/logictests/generated/mysql/5/in_parameter,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,left_join,range_param.test rename to logictests/generated/mysql/5/in_parameter,left_join,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/in_parameter,max,in_parameter.fail.test b/logictests/generated/mysql/5/in_parameter,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/in_parameter,max,in_parameter.fail.test rename to logictests/generated/mysql/5/in_parameter,max,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/in_parameter,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/in_parameter,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,single_parameter,range_param.test b/logictests/generated/mysql/5/in_parameter,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,single_parameter,range_param.test rename to logictests/generated/mysql/5/in_parameter,single_parameter,range_param.test diff --git a/logictests/generated/mysql/in_parameter,sum_distinct,range_param.fail.test b/logictests/generated/mysql/5/in_parameter,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/5/in_parameter,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,topk,in_parameter.test b/logictests/generated/mysql/5/in_parameter,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter,topk,in_parameter.test rename to logictests/generated/mysql/5/in_parameter,topk,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter.test b/logictests/generated/mysql/5/in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter.test rename to logictests/generated/mysql/5/in_parameter.test diff --git a/logictests/generated/mysql/inner_join,avg_distinct,range_param.fail.test b/logictests/generated/mysql/5/inner_join,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/5/inner_join,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,between_filters,range_param.test b/logictests/generated/mysql/5/inner_join,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,between_filters,range_param.test rename to logictests/generated/mysql/5/inner_join,between_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,equal_filters,range_param.test b/logictests/generated/mysql/5/inner_join,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,equal_filters,range_param.test rename to logictests/generated/mysql/5/inner_join,equal_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,greater_filters,in_parameter.test b/logictests/generated/mysql/5/inner_join,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,greater_filters,in_parameter.test rename to logictests/generated/mysql/5/inner_join,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,is_null_filters,in_parameter.test b/logictests/generated/mysql/5/inner_join,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,is_null_filters,in_parameter.test rename to logictests/generated/mysql/5/inner_join,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,is_null_filters,range_param.test b/logictests/generated/mysql/5/inner_join,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,is_null_filters,range_param.test rename to logictests/generated/mysql/5/inner_join,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,max,range_param.test b/logictests/generated/mysql/5/inner_join,max,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,max,range_param.test rename to logictests/generated/mysql/5/inner_join,max,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/inner_join,min,in_parameter.fail.test b/logictests/generated/mysql/5/inner_join,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/inner_join,min,in_parameter.fail.test rename to logictests/generated/mysql/5/inner_join,min,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,not_equal_filters,range_param.test b/logictests/generated/mysql/5/inner_join,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,not_equal_filters,range_param.test rename to logictests/generated/mysql/5/inner_join,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,topk,in_parameter.fail.test b/logictests/generated/mysql/5/inner_join,topk,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,topk,in_parameter.fail.test rename to logictests/generated/mysql/5/inner_join,topk,in_parameter.fail.test diff --git a/logictests/generated/mysql/is_null_filters,avg_distinct,range_param.fail.test b/logictests/generated/mysql/5/is_null_filters,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/5/is_null_filters,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,between_filters,range_param.test b/logictests/generated/mysql/5/is_null_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,between_filters,range_param.test rename to logictests/generated/mysql/5/is_null_filters,between_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,count,range_param.test b/logictests/generated/mysql/5/is_null_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,count,range_param.test rename to logictests/generated/mysql/5/is_null_filters,count,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,distinct.test b/logictests/generated/mysql/5/is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,distinct.test rename to logictests/generated/mysql/5/is_null_filters,distinct.test diff --git a/logictests/generated/mysql/is_null_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/5/is_null_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/5/is_null_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,inner_join,range_param.test b/logictests/generated/mysql/5/is_null_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,inner_join,range_param.test rename to logictests/generated/mysql/5/is_null_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,join_subquery,range_param.fail.test b/logictests/generated/mysql/5/is_null_filters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/5/is_null_filters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,less_or_equal_filters,range_param.test b/logictests/generated/mysql/5/is_null_filters,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/is_null_filters,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,max,in_parameter.fail.test b/logictests/generated/mysql/5/is_null_filters,max,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,max,in_parameter.fail.test rename to logictests/generated/mysql/5/is_null_filters,max,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,single_parameter,range_param.test b/logictests/generated/mysql/5/is_null_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,single_parameter,range_param.test rename to logictests/generated/mysql/5/is_null_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,single_parameter.test b/logictests/generated/mysql/5/is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,single_parameter.test rename to logictests/generated/mysql/5/is_null_filters,single_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/5/is_null_filters,sum,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/5/is_null_filters,sum,in_parameter.fail.test diff --git a/logictests/generated/mysql/is_null_filters,topk,range_param.test b/logictests/generated/mysql/5/is_null_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,topk,range_param.test rename to logictests/generated/mysql/5/is_null_filters,topk,range_param.test diff --git a/logictests/generated/mysql/join_subquery,between_filters,range_param.fail.test b/logictests/generated/mysql/5/join_subquery,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,between_filters,range_param.fail.test rename to logictests/generated/mysql/5/join_subquery,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/join_subquery,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/join_subquery,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,left_join,range_param.fail.test b/logictests/generated/mysql/5/join_subquery,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,left_join,range_param.fail.test rename to logictests/generated/mysql/5/join_subquery,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/5/join_subquery,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/5/join_subquery,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/join_subquery,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/join_subquery,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,sum,range_param.fail.test b/logictests/generated/mysql/5/join_subquery,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,sum,range_param.fail.test rename to logictests/generated/mysql/5/join_subquery,sum,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,avg_distinct,range_param.fail.test b/logictests/generated/mysql/5/left_join,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/5/left_join,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,count,range_param.test b/logictests/generated/mysql/5/left_join,count,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,count,range_param.test rename to logictests/generated/mysql/5/left_join,count,range_param.test diff --git a/logictests/generated/mysql/left_join,count_distinct,range_param.fail.test b/logictests/generated/mysql/5/left_join,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,count_distinct,range_param.fail.test rename to logictests/generated/mysql/5/left_join,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/5/left_join,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/left_join,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/left_join,in_parameter,range_param.test b/logictests/generated/mysql/5/left_join,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,in_parameter,range_param.test rename to logictests/generated/mysql/5/left_join,in_parameter,range_param.test diff --git a/logictests/generated/mysql/left_join,inner_join,in_parameter.test b/logictests/generated/mysql/5/left_join,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,inner_join,in_parameter.test rename to logictests/generated/mysql/5/left_join,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/left_join,inner_join,range_param.test b/logictests/generated/mysql/5/left_join,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,inner_join,range_param.test rename to logictests/generated/mysql/5/left_join,inner_join,range_param.test diff --git a/logictests/generated/mysql/left_join,join_subquery,range_param.fail.test b/logictests/generated/mysql/5/left_join,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,join_subquery,range_param.fail.test rename to logictests/generated/mysql/5/left_join,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,single_parameter.test b/logictests/generated/mysql/5/left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,single_parameter.test rename to logictests/generated/mysql/5/left_join,single_parameter.test diff --git a/logictests/generated/mysql/left_join,sum_distinct,range_param.fail.test b/logictests/generated/mysql/5/left_join,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/5/left_join,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,distinct.test b/logictests/generated/mysql/5/less_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/less_filters,distinct.test rename to logictests/generated/mysql/5/less_filters,distinct.test diff --git a/logictests/generated/mysql/less_filters,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/5/less_filters,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/5/less_filters,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/5/less_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/less_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/5/less_filters,group_concat,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/5/less_filters,group_concat,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,group_concat,range_param.fail.test b/logictests/generated/mysql/5/less_filters,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_filters,group_concat,range_param.fail.test rename to logictests/generated/mysql/5/less_filters,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/less_filters,in_parameter.test b/logictests/generated/mysql/5/less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,in_parameter.test rename to logictests/generated/mysql/5/less_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,inner_join,in_parameter.test b/logictests/generated/mysql/5/less_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/5/less_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,is_null_filters.test b/logictests/generated/mysql/5/less_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/less_filters,is_null_filters.test rename to logictests/generated/mysql/5/less_filters,is_null_filters.test diff --git a/logictests/generated/mysql/less_filters,left_join,range_param.test b/logictests/generated/mysql/5/less_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,left_join,range_param.test rename to logictests/generated/mysql/5/less_filters,left_join,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/5/less_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/5/less_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,between_filters.test b/logictests/generated/mysql/5/less_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,between_filters.test rename to logictests/generated/mysql/5/less_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/less_or_equal_filters,distinct.test b/logictests/generated/mysql/5/less_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,distinct.test rename to logictests/generated/mysql/5/less_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/less_or_equal_filters,equal_filters,range_param.test b/logictests/generated/mysql/5/less_or_equal_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,equal_filters,range_param.test rename to logictests/generated/mysql/5/less_or_equal_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,greater_filters,range_param.test b/logictests/generated/mysql/5/less_or_equal_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,greater_filters,range_param.test rename to logictests/generated/mysql/5/less_or_equal_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/5/less_or_equal_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/5/less_or_equal_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,in_parameter,range_param.test b/logictests/generated/mysql/5/less_or_equal_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,in_parameter,range_param.test rename to logictests/generated/mysql/5/less_or_equal_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,inner_join.test b/logictests/generated/mysql/5/less_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,inner_join.test rename to logictests/generated/mysql/5/less_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/less_or_equal_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/5/less_or_equal_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/5/less_or_equal_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,max,range_param.test b/logictests/generated/mysql/5/less_or_equal_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,max,range_param.test rename to logictests/generated/mysql/5/less_or_equal_filters,max,range_param.test diff --git a/logictests/generated/mysql/max,between_filters,left_join.test b/logictests/generated/mysql/5/max,between_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,between_filters,left_join.test rename to logictests/generated/mysql/5/max,between_filters,left_join.test diff --git a/logictests/generated/mysql/max,between_filters,range_param.test b/logictests/generated/mysql/5/max,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,between_filters,range_param.test rename to logictests/generated/mysql/5/max,between_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,count,in_parameter.fail.test b/logictests/generated/mysql/5/max,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,count,in_parameter.fail.test rename to logictests/generated/mysql/5/max,count,in_parameter.test diff --git a/logictests/generated/mysql/max,count_distinct,range_param.fail.test b/logictests/generated/mysql/5/max,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,count_distinct,range_param.fail.test rename to logictests/generated/mysql/5/max,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/max,cte,range_param.fail.test b/logictests/generated/mysql/5/max,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,cte,range_param.fail.test rename to logictests/generated/mysql/5/max,cte,range_param.fail.test diff --git a/logictests/generated/mysql/max,distinct,left_join.test b/logictests/generated/mysql/5/max,distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/max,distinct,left_join.test rename to logictests/generated/mysql/5/max,distinct,left_join.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,equal_filters,in_parameter.fail.test b/logictests/generated/mysql/5/max,equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/max,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,greater_filters,distinct.test b/logictests/generated/mysql/5/max,greater_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,distinct.test rename to logictests/generated/mysql/5/max,greater_filters,distinct.test diff --git a/logictests/generated/mysql/max,inner_join,range_param.test b/logictests/generated/mysql/5/max,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/max,inner_join,range_param.test rename to logictests/generated/mysql/5/max,inner_join,range_param.test diff --git a/logictests/generated/mysql/max,is_null_filters,range_param.test b/logictests/generated/mysql/5/max,is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,is_null_filters,range_param.test rename to logictests/generated/mysql/5/max,is_null_filters,range_param.test diff --git a/logictests/generated/mysql/max,left_join,single_parameter.test b/logictests/generated/mysql/5/max,left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,left_join,single_parameter.test rename to logictests/generated/mysql/5/max,left_join,single_parameter.test diff --git a/logictests/generated/mysql/max,less_filters,inner_join.test b/logictests/generated/mysql/5/max,less_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,inner_join.test rename to logictests/generated/mysql/5/max,less_filters,inner_join.test diff --git a/logictests/generated/mysql/max,less_filters,is_null_filters.test b/logictests/generated/mysql/5/max,less_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,is_null_filters.test rename to logictests/generated/mysql/5/max,less_filters,is_null_filters.test diff --git a/logictests/generated/mysql/max,less_filters,left_join.test b/logictests/generated/mysql/5/max,less_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,left_join.test rename to logictests/generated/mysql/5/max,less_filters,left_join.test diff --git a/logictests/generated/mysql/max,less_filters,range_param.test b/logictests/generated/mysql/5/max,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,range_param.test rename to logictests/generated/mysql/5/max,less_filters,range_param.test diff --git a/logictests/generated/mysql/max,less_filters,single_parameter.test b/logictests/generated/mysql/5/max,less_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,less_filters,single_parameter.test rename to logictests/generated/mysql/5/max,less_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,min,in_parameter.fail.test b/logictests/generated/mysql/5/max,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,min,in_parameter.fail.test rename to logictests/generated/mysql/5/max,min,in_parameter.test diff --git a/logictests/generated/mysql/max,min,inner_join.test b/logictests/generated/mysql/5/max,min,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,min,inner_join.test rename to logictests/generated/mysql/5/max,min,inner_join.test diff --git a/logictests/generated/mysql/max,min,topk.test b/logictests/generated/mysql/5/max,min,topk.test similarity index 100% rename from logictests/generated/mysql/max,min,topk.test rename to logictests/generated/mysql/5/max,min,topk.test diff --git a/logictests/generated/mysql/max,not_equal_filters,range_param.test b/logictests/generated/mysql/5/max,not_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,range_param.test rename to logictests/generated/mysql/5/max,not_equal_filters,range_param.test diff --git a/logictests/generated/mysql/max,project_literal,range_param.fail.test b/logictests/generated/mysql/5/max,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,project_literal,range_param.fail.test rename to logictests/generated/mysql/5/max,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/max,sum,range_param.test b/logictests/generated/mysql/5/max,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/max,sum,range_param.test rename to logictests/generated/mysql/5/max,sum,range_param.test diff --git a/logictests/generated/mysql/max,topk.test b/logictests/generated/mysql/5/max,topk.test similarity index 100% rename from logictests/generated/mysql/max,topk.test rename to logictests/generated/mysql/5/max,topk.test diff --git a/logictests/generated/mysql/min,cte.test b/logictests/generated/mysql/5/min,cte.test similarity index 100% rename from logictests/generated/mysql/min,cte.test rename to logictests/generated/mysql/5/min,cte.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,equal_filters,in_parameter.fail.test b/logictests/generated/mysql/5/min,equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/min,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,equal_filters,left_join.test b/logictests/generated/mysql/5/min,equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,left_join.test rename to logictests/generated/mysql/5/min,equal_filters,left_join.test diff --git a/logictests/generated/mysql/min,equal_filters,single_parameter.test b/logictests/generated/mysql/5/min,equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,single_parameter.test rename to logictests/generated/mysql/5/min,equal_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,greater_filters,in_parameter.fail.test b/logictests/generated/mysql/5/min,greater_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,greater_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/min,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,greater_filters,inner_join.test b/logictests/generated/mysql/5/min,greater_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,inner_join.test rename to logictests/generated/mysql/5/min,greater_filters,inner_join.test diff --git a/logictests/generated/mysql/min,group_concat,in_parameter.fail.test b/logictests/generated/mysql/5/min,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/min,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/5/min,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/min,inner_join.test b/logictests/generated/mysql/5/min,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,inner_join.test rename to logictests/generated/mysql/5/min,inner_join.test diff --git a/logictests/generated/mysql/min,left_join,range_param.test b/logictests/generated/mysql/5/min,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/min,left_join,range_param.test rename to logictests/generated/mysql/5/min,left_join,range_param.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,between_filters.test b/logictests/generated/mysql/5/min,less_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,between_filters.test rename to logictests/generated/mysql/5/min,less_or_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,inner_join.test b/logictests/generated/mysql/5/min,less_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,inner_join.test rename to logictests/generated/mysql/5/min,less_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/5/min,less_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/5/min,less_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,range_param.test b/logictests/generated/mysql/5/min,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/min,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/min,not_equal_filters,left_join.test b/logictests/generated/mysql/5/min,not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,left_join.test rename to logictests/generated/mysql/5/min,not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/min,not_equal_filters,single_parameter.test b/logictests/generated/mysql/5/min,not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,single_parameter.test rename to logictests/generated/mysql/5/min,not_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/min,single_parameter.test b/logictests/generated/mysql/5/min,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,single_parameter.test rename to logictests/generated/mysql/5/min,single_parameter.test diff --git a/logictests/generated/mysql/min,topk,range_param.test b/logictests/generated/mysql/5/min,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/min,topk,range_param.test rename to logictests/generated/mysql/5/min,topk,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,between_filters,range_param.fail.test b/logictests/generated/mysql/5/multiple_parameters,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,between_filters,range_param.fail.test rename to logictests/generated/mysql/5/multiple_parameters,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,left_join,range_param.test b/logictests/generated/mysql/5/multiple_parameters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,left_join,range_param.test rename to logictests/generated/mysql/5/multiple_parameters,left_join,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,max,in_parameter.fail.test b/logictests/generated/mysql/5/multiple_parameters,max,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,max,in_parameter.fail.test rename to logictests/generated/mysql/5/multiple_parameters,max,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,min,in_parameter.fail.test b/logictests/generated/mysql/5/multiple_parameters,min,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,min,in_parameter.fail.test rename to logictests/generated/mysql/5/multiple_parameters,min,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,single_parameter,range_param.test b/logictests/generated/mysql/5/multiple_parameters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,single_parameter,range_param.test rename to logictests/generated/mysql/5/multiple_parameters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,sum,range_param.test b/logictests/generated/mysql/5/multiple_parameters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,sum,range_param.test rename to logictests/generated/mysql/5/multiple_parameters,sum,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/5/multiple_parameters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/5/multiple_parameters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,avg_distinct,range_param.fail.test b/logictests/generated/mysql/5/multiple_range_params,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/5/multiple_range_params,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,cte,range_param.fail.test b/logictests/generated/mysql/5/multiple_range_params,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,cte,range_param.fail.test rename to logictests/generated/mysql/5/multiple_range_params,cte,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,group_concat,range_param.fail.test b/logictests/generated/mysql/5/multiple_range_params,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,group_concat,range_param.fail.test rename to logictests/generated/mysql/5/multiple_range_params,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,in_parameter,range_param.test b/logictests/generated/mysql/5/multiple_range_params,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,in_parameter,range_param.test rename to logictests/generated/mysql/5/multiple_range_params,in_parameter,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,left_join,range_param.test b/logictests/generated/mysql/5/multiple_range_params,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,left_join,range_param.test rename to logictests/generated/mysql/5/multiple_range_params,left_join,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,less_filters,range_param.fail.test b/logictests/generated/mysql/5/multiple_range_params,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,less_filters,range_param.fail.test rename to logictests/generated/mysql/5/multiple_range_params,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,project_literal,range_param.fail.test b/logictests/generated/mysql/5/multiple_range_params,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,project_literal,range_param.fail.test rename to logictests/generated/mysql/5/multiple_range_params,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,single_parameter,range_param.test b/logictests/generated/mysql/5/multiple_range_params,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,single_parameter,range_param.test rename to logictests/generated/mysql/5/multiple_range_params,single_parameter,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,sum,range_param.test b/logictests/generated/mysql/5/multiple_range_params,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,sum,range_param.test rename to logictests/generated/mysql/5/multiple_range_params,sum,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/5/not_equal_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/5/not_equal_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,greater_filters.test b/logictests/generated/mysql/5/not_equal_filters,greater_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,greater_filters.test rename to logictests/generated/mysql/5/not_equal_filters,greater_filters.test diff --git a/logictests/generated/mysql/not_equal_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/5/not_equal_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/5/not_equal_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/not_equal_filters,min,in_parameter.fail.test b/logictests/generated/mysql/5/not_equal_filters,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/not_equal_filters,min,in_parameter.fail.test rename to logictests/generated/mysql/5/not_equal_filters,min,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,min,range_param.test b/logictests/generated/mysql/5/not_equal_filters,min,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,min,range_param.test rename to logictests/generated/mysql/5/not_equal_filters,min,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,sum,range_param.test b/logictests/generated/mysql/5/not_equal_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,sum,range_param.test rename to logictests/generated/mysql/5/not_equal_filters,sum,range_param.test diff --git a/logictests/generated/mysql/project_literal,group_concat,range_param.fail.test b/logictests/generated/mysql/5/project_literal,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,group_concat,range_param.fail.test rename to logictests/generated/mysql/5/project_literal,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,join_subquery,range_param.fail.test b/logictests/generated/mysql/5/project_literal,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,join_subquery,range_param.fail.test rename to logictests/generated/mysql/5/project_literal,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/5/project_literal,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/5/project_literal,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,topk,range_param.fail.test b/logictests/generated/mysql/5/project_literal,topk,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,topk,range_param.fail.test rename to logictests/generated/mysql/5/project_literal,topk,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,cte,range_param.fail.test b/logictests/generated/mysql/5/range_param,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,cte,range_param.fail.test rename to logictests/generated/mysql/5/range_param,cte,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/range_param,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/range_param,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,inner_join,range_param.test b/logictests/generated/mysql/5/range_param,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,inner_join,range_param.test rename to logictests/generated/mysql/5/range_param,inner_join,range_param.test diff --git a/logictests/generated/mysql/range_param,multiple_parameters,range_param.test b/logictests/generated/mysql/5/range_param,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,multiple_parameters,range_param.test rename to logictests/generated/mysql/5/range_param,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/range_param,range_param.test b/logictests/generated/mysql/5/range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,range_param.test rename to logictests/generated/mysql/5/range_param,range_param.test diff --git a/logictests/generated/mysql/single_parameter,avg,in_parameter.fail.test b/logictests/generated/mysql/5/single_parameter,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,avg,in_parameter.fail.test rename to logictests/generated/mysql/5/single_parameter,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/single_parameter,avg,range_param.fail.test b/logictests/generated/mysql/5/single_parameter,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,avg,range_param.fail.test rename to logictests/generated/mysql/5/single_parameter,avg,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,less_filters,range_param.fail.test b/logictests/generated/mysql/5/single_parameter,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,less_filters,range_param.fail.test rename to logictests/generated/mysql/5/single_parameter,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/single_parameter,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/single_parameter,less_or_equal_filters,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/single_parameter,min,in_parameter.fail.test b/logictests/generated/mysql/5/single_parameter,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/single_parameter,min,in_parameter.fail.test rename to logictests/generated/mysql/5/single_parameter,min,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,project_literal,range_param.fail.test b/logictests/generated/mysql/5/single_parameter,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,project_literal,range_param.fail.test rename to logictests/generated/mysql/5/single_parameter,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,sum_distinct,range_param.fail.test b/logictests/generated/mysql/5/single_parameter,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/5/single_parameter,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum,avg,greater_filters.fail.test b/logictests/generated/mysql/5/sum,avg,greater_filters.fail.test similarity index 100% rename from logictests/generated/mysql/sum,avg,greater_filters.fail.test rename to logictests/generated/mysql/5/sum,avg,greater_filters.fail.test diff --git a/logictests/generated/mysql/sum,avg,less_or_equal_filters.fail.test b/logictests/generated/mysql/5/sum,avg,less_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/sum,avg,less_or_equal_filters.fail.test rename to logictests/generated/mysql/5/sum,avg,less_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/sum,between_filters,topk.test b/logictests/generated/mysql/5/sum,between_filters,topk.test similarity index 100% rename from logictests/generated/mysql/sum,between_filters,topk.test rename to logictests/generated/mysql/5/sum,between_filters,topk.test diff --git a/logictests/generated/mysql/sum,count_distinct,range_param.fail.test b/logictests/generated/mysql/5/sum,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,count_distinct,range_param.fail.test rename to logictests/generated/mysql/5/sum,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum,equal_filters,distinct.test b/logictests/generated/mysql/5/sum,equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,distinct.test rename to logictests/generated/mysql/5/sum,equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,equal_filters,in_parameter.fail.test b/logictests/generated/mysql/5/sum,equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/sum,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,greater_filters,range_param.test b/logictests/generated/mysql/5/sum,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,range_param.test rename to logictests/generated/mysql/5/sum,greater_filters,range_param.test diff --git a/logictests/generated/mysql/sum,greater_filters,single_parameter.test b/logictests/generated/mysql/5/sum,greater_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,greater_filters,single_parameter.test rename to logictests/generated/mysql/5/sum,greater_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,single_parameter.test b/logictests/generated/mysql/5/sum,greater_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/5/sum,greater_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,group_concat,greater_filters.test b/logictests/generated/mysql/5/sum,group_concat,greater_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,greater_filters.test rename to logictests/generated/mysql/5/sum,group_concat,greater_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,inner_join.test b/logictests/generated/mysql/5/sum,group_concat,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,inner_join.test rename to logictests/generated/mysql/5/sum,group_concat,inner_join.test diff --git a/logictests/generated/mysql/sum,group_concat,left_join.test b/logictests/generated/mysql/5/sum,group_concat,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,left_join.test rename to logictests/generated/mysql/5/sum,group_concat,left_join.test diff --git a/logictests/generated/mysql/sum,group_concat,max.test b/logictests/generated/mysql/5/sum,group_concat,max.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,max.test rename to logictests/generated/mysql/5/sum,group_concat,max.test diff --git a/logictests/generated/mysql/sum,group_concat,single_parameter.test b/logictests/generated/mysql/5/sum,group_concat,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,single_parameter.test rename to logictests/generated/mysql/5/sum,group_concat,single_parameter.test diff --git a/logictests/generated/mysql/sum,inner_join,range_param.test b/logictests/generated/mysql/5/sum,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,inner_join,range_param.test rename to logictests/generated/mysql/5/sum,inner_join,range_param.test diff --git a/logictests/generated/mysql/sum,left_join,topk.test b/logictests/generated/mysql/5/sum,left_join,topk.test similarity index 100% rename from logictests/generated/mysql/sum,left_join,topk.test rename to logictests/generated/mysql/5/sum,left_join,topk.test diff --git a/logictests/generated/mysql/sum,less_filters.test b/logictests/generated/mysql/5/sum,less_filters.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters.test rename to logictests/generated/mysql/5/sum,less_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,less_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/5/sum,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,less_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/sum,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,inner_join.test b/logictests/generated/mysql/5/sum,less_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,inner_join.test rename to logictests/generated/mysql/5/sum,less_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,max,inner_join.test b/logictests/generated/mysql/5/sum,max,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,max,inner_join.test rename to logictests/generated/mysql/5/sum,max,inner_join.test diff --git a/logictests/generated/mysql/sum,max,is_null_filters.test b/logictests/generated/mysql/5/sum,max,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,is_null_filters.test rename to logictests/generated/mysql/5/sum,max,is_null_filters.test diff --git a/logictests/generated/mysql/sum,max,left_join.test b/logictests/generated/mysql/5/sum,max,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,max,left_join.test rename to logictests/generated/mysql/5/sum,max,left_join.test diff --git a/logictests/generated/mysql/sum,max,min.test b/logictests/generated/mysql/5/sum,max,min.test similarity index 100% rename from logictests/generated/mysql/sum,max,min.test rename to logictests/generated/mysql/5/sum,max,min.test diff --git a/logictests/generated/mysql/sum,max,not_equal_filters.test b/logictests/generated/mysql/5/sum,max,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,not_equal_filters.test rename to logictests/generated/mysql/5/sum,max,not_equal_filters.test diff --git a/logictests/generated/mysql/sum,max.test b/logictests/generated/mysql/5/sum,max.test similarity index 100% rename from logictests/generated/mysql/sum,max.test rename to logictests/generated/mysql/5/sum,max.test diff --git a/logictests/generated/mysql/sum,min,between_filters.test b/logictests/generated/mysql/5/sum,min,between_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,between_filters.test rename to logictests/generated/mysql/5/sum,min,between_filters.test diff --git a/logictests/generated/mysql/sum,min,equal_filters.test b/logictests/generated/mysql/5/sum,min,equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,equal_filters.test rename to logictests/generated/mysql/5/sum,min,equal_filters.test diff --git a/logictests/generated/mysql/sum,min,less_filters.test b/logictests/generated/mysql/5/sum,min,less_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,less_filters.test rename to logictests/generated/mysql/5/sum,min,less_filters.test diff --git a/logictests/generated/mysql/sum,min,topk.test b/logictests/generated/mysql/5/sum,min,topk.test similarity index 100% rename from logictests/generated/mysql/sum,min,topk.test rename to logictests/generated/mysql/5/sum,min,topk.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,not_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/5/sum,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,not_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/5/sum,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,is_null_filters.test b/logictests/generated/mysql/5/sum,not_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,is_null_filters.test rename to logictests/generated/mysql/5/sum,not_equal_filters,is_null_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,single_parameter,in_parameter.fail.test b/logictests/generated/mysql/5/sum,single_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,single_parameter,in_parameter.fail.test rename to logictests/generated/mysql/5/sum,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/sum_distinct,distinct,range_param.fail.test b/logictests/generated/mysql/5/sum_distinct,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,distinct,range_param.fail.test rename to logictests/generated/mysql/5/sum_distinct,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,in_parameter,range_param.fail.test b/logictests/generated/mysql/5/sum_distinct,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,in_parameter,range_param.fail.test rename to logictests/generated/mysql/5/sum_distinct,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,left_join,range_param.fail.test b/logictests/generated/mysql/5/sum_distinct,left_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,left_join,range_param.fail.test rename to logictests/generated/mysql/5/sum_distinct,left_join,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,not_equal_filters,range_param.fail.test b/logictests/generated/mysql/5/sum_distinct,not_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,not_equal_filters,range_param.fail.test rename to logictests/generated/mysql/5/sum_distinct,not_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,sum,range_param.fail.test b/logictests/generated/mysql/5/sum_distinct,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,sum,range_param.fail.test rename to logictests/generated/mysql/5/sum_distinct,sum,range_param.fail.test diff --git a/logictests/generated/mysql/topk,in_parameter,in_parameter.test b/logictests/generated/mysql/5/topk,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,in_parameter,in_parameter.test rename to logictests/generated/mysql/5/topk,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/topk,less_or_equal_filters,range_param.test b/logictests/generated/mysql/5/topk,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/5/topk,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/topk,not_equal_filters,in_parameter.test b/logictests/generated/mysql/5/topk,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/5/topk,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/topk,single_parameter,in_parameter.test b/logictests/generated/mysql/5/topk,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,single_parameter,in_parameter.test rename to logictests/generated/mysql/5/topk,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/topk,sum,range_param.test b/logictests/generated/mysql/5/topk,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,sum,range_param.test rename to logictests/generated/mysql/5/topk,sum,range_param.test diff --git a/logictests/generated/mysql/avg,between_filters,distinct.test b/logictests/generated/mysql/6/avg,between_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,between_filters,distinct.test rename to logictests/generated/mysql/6/avg,between_filters,distinct.test diff --git a/logictests/generated/mysql/avg,cte,range_param.fail.test b/logictests/generated/mysql/6/avg,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,cte,range_param.fail.test rename to logictests/generated/mysql/6/avg,cte,range_param.fail.test diff --git a/logictests/generated/mysql/avg,distinct,left_join.test b/logictests/generated/mysql/6/avg,distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/avg,distinct,left_join.test rename to logictests/generated/mysql/6/avg,distinct,left_join.test diff --git a/logictests/generated/mysql/avg,distinct,range_param.fail.test b/logictests/generated/mysql/6/avg,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,distinct,range_param.fail.test rename to logictests/generated/mysql/6/avg,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/avg,distinct,single_parameter.test b/logictests/generated/mysql/6/avg,distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,distinct,single_parameter.test rename to logictests/generated/mysql/6/avg,distinct,single_parameter.test diff --git a/logictests/generated/mysql/avg,distinct.test b/logictests/generated/mysql/6/avg,distinct.test similarity index 100% rename from logictests/generated/mysql/avg,distinct.test rename to logictests/generated/mysql/6/avg,distinct.test diff --git a/logictests/generated/mysql/avg,greater_filters,left_join.fail.test b/logictests/generated/mysql/6/avg,greater_filters,left_join.fail.test similarity index 100% rename from logictests/generated/mysql/avg,greater_filters,left_join.fail.test rename to logictests/generated/mysql/6/avg,greater_filters,left_join.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,less_filters.fail.test b/logictests/generated/mysql/6/avg,group_concat,less_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,less_filters.fail.test rename to logictests/generated/mysql/6/avg,group_concat,less_filters.fail.test diff --git a/logictests/generated/mysql/avg,group_concat,range_param.fail.test b/logictests/generated/mysql/6/avg,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,group_concat,range_param.fail.test rename to logictests/generated/mysql/6/avg,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/avg,is_null_filters,single_parameter.test b/logictests/generated/mysql/6/avg,is_null_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,is_null_filters,single_parameter.test rename to logictests/generated/mysql/6/avg,is_null_filters,single_parameter.test diff --git a/logictests/generated/mysql/avg,left_join,single_parameter.test b/logictests/generated/mysql/6/avg,left_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,left_join,single_parameter.test rename to logictests/generated/mysql/6/avg,left_join,single_parameter.test diff --git a/logictests/generated/mysql/avg,less_filters,between_filters.fail.test b/logictests/generated/mysql/6/avg,less_filters,between_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,between_filters.fail.test rename to logictests/generated/mysql/6/avg,less_filters,between_filters.fail.test diff --git a/logictests/generated/mysql/avg,less_filters,range_param.fail.test b/logictests/generated/mysql/6/avg,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_filters,range_param.fail.test rename to logictests/generated/mysql/6/avg,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/avg,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/avg,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/avg,max,min.test b/logictests/generated/mysql/6/avg,max,min.test similarity index 100% rename from logictests/generated/mysql/avg,max,min.test rename to logictests/generated/mysql/6/avg,max,min.test diff --git a/logictests/generated/mysql/avg,max.test b/logictests/generated/mysql/6/avg,max.test similarity index 100% rename from logictests/generated/mysql/avg,max.test rename to logictests/generated/mysql/6/avg,max.test diff --git a/logictests/generated/mysql/avg,min,greater_filters.fail.test b/logictests/generated/mysql/6/avg,min,greater_filters.fail.test similarity index 100% rename from logictests/generated/mysql/avg,min,greater_filters.fail.test rename to logictests/generated/mysql/6/avg,min,greater_filters.fail.test diff --git a/logictests/generated/mysql/avg,multiple_range_params,range_param.fail.test b/logictests/generated/mysql/6/avg,multiple_range_params,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg,multiple_range_params,range_param.fail.test rename to logictests/generated/mysql/6/avg,multiple_range_params,range_param.fail.test diff --git a/logictests/generated/mysql/avg,not_equal_filters,between_filters.test b/logictests/generated/mysql/6/avg,not_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters,between_filters.test rename to logictests/generated/mysql/6/avg,not_equal_filters,between_filters.test diff --git a/logictests/generated/mysql/avg,not_equal_filters.test b/logictests/generated/mysql/6/avg,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/avg,not_equal_filters.test rename to logictests/generated/mysql/6/avg,not_equal_filters.test diff --git a/logictests/generated/mysql/avg,single_parameter.test b/logictests/generated/mysql/6/avg,single_parameter.test similarity index 100% rename from logictests/generated/mysql/avg,single_parameter.test rename to logictests/generated/mysql/6/avg,single_parameter.test diff --git a/logictests/generated/mysql/avg_distinct,cte,range_param.fail.test b/logictests/generated/mysql/6/avg_distinct,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,cte,range_param.fail.test rename to logictests/generated/mysql/6/avg_distinct,cte,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,group_concat,range_param.fail.test b/logictests/generated/mysql/6/avg_distinct,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,group_concat,range_param.fail.test rename to logictests/generated/mysql/6/avg_distinct,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/avg_distinct,min,range_param.fail.test b/logictests/generated/mysql/6/avg_distinct,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/avg_distinct,min,range_param.fail.test rename to logictests/generated/mysql/6/avg_distinct,min,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,count_distinct,range_param.fail.test b/logictests/generated/mysql/6/between_filters,count_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,count_distinct,range_param.fail.test rename to logictests/generated/mysql/6/between_filters,count_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/between_filters,distinct,range_param.test b/logictests/generated/mysql/6/between_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,distinct,range_param.test rename to logictests/generated/mysql/6/between_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/between_filters,equal_filters,range_param.test b/logictests/generated/mysql/6/between_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,equal_filters,range_param.test rename to logictests/generated/mysql/6/between_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/between_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/6/between_filters,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/between_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/6/between_filters,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/between_filters,in_parameter.test b/logictests/generated/mysql/6/between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,in_parameter.test rename to logictests/generated/mysql/6/between_filters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,less_or_equal_filters,in_parameter.test b/logictests/generated/mysql/6/between_filters,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,less_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/6/between_filters,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,max,range_param.test b/logictests/generated/mysql/6/between_filters,max,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,max,range_param.test rename to logictests/generated/mysql/6/between_filters,max,range_param.test diff --git a/logictests/generated/mysql/between_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/6/between_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/between_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/6/between_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/between_filters,topk,range_param.test b/logictests/generated/mysql/6/between_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/between_filters,topk,range_param.test rename to logictests/generated/mysql/6/between_filters,topk,range_param.test diff --git a/logictests/generated/mysql/between_filters.test b/logictests/generated/mysql/6/between_filters.test similarity index 100% rename from logictests/generated/mysql/between_filters.test rename to logictests/generated/mysql/6/between_filters.test diff --git a/logictests/generated/mysql/count,avg,between_filters.test b/logictests/generated/mysql/6/count,avg,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,avg,between_filters.test rename to logictests/generated/mysql/6/count,avg,between_filters.test diff --git a/logictests/generated/mysql/count,avg,group_concat.test b/logictests/generated/mysql/6/count,avg,group_concat.test similarity index 100% rename from logictests/generated/mysql/count,avg,group_concat.test rename to logictests/generated/mysql/6/count,avg,group_concat.test diff --git a/logictests/generated/mysql/count,avg,is_null_filters.test b/logictests/generated/mysql/6/count,avg,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/count,avg,is_null_filters.test rename to logictests/generated/mysql/6/count,avg,is_null_filters.test diff --git a/logictests/generated/mysql/count,avg,less_filters.fail.test b/logictests/generated/mysql/6/count,avg,less_filters.fail.test similarity index 100% rename from logictests/generated/mysql/count,avg,less_filters.fail.test rename to logictests/generated/mysql/6/count,avg,less_filters.fail.test diff --git a/logictests/generated/mysql/count,avg,less_or_equal_filters.fail.test b/logictests/generated/mysql/6/count,avg,less_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/count,avg,less_or_equal_filters.fail.test rename to logictests/generated/mysql/6/count,avg,less_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/count,avg_distinct,range_param.fail.test b/logictests/generated/mysql/6/count,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/6/count,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/count,equal_filters,distinct.test b/logictests/generated/mysql/6/count,equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,distinct.test rename to logictests/generated/mysql/6/count,equal_filters,distinct.test diff --git a/logictests/generated/mysql/count,equal_filters,inner_join.test b/logictests/generated/mysql/6/count,equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,inner_join.test rename to logictests/generated/mysql/6/count,equal_filters,inner_join.test diff --git a/logictests/generated/mysql/count,equal_filters,single_parameter.test b/logictests/generated/mysql/6/count,equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/count,equal_filters,single_parameter.test rename to logictests/generated/mysql/6/count,equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/count,greater_filters,between_filters.test b/logictests/generated/mysql/6/count,greater_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,greater_filters,between_filters.test rename to logictests/generated/mysql/6/count,greater_filters,between_filters.test diff --git a/logictests/generated/mysql/count,greater_or_equal_filters,inner_join.test b/logictests/generated/mysql/6/count,greater_or_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/count,greater_or_equal_filters,inner_join.test rename to logictests/generated/mysql/6/count,greater_or_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/count,group_concat,in_parameter.fail.test b/logictests/generated/mysql/6/count,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/count,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/6/count,group_concat,in_parameter.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,inner_join,in_parameter.fail.test b/logictests/generated/mysql/6/count,inner_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,inner_join,in_parameter.fail.test rename to logictests/generated/mysql/6/count,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/count,inner_join,left_join.test b/logictests/generated/mysql/6/count,inner_join,left_join.test similarity index 100% rename from logictests/generated/mysql/count,inner_join,left_join.test rename to logictests/generated/mysql/6/count,inner_join,left_join.test diff --git a/logictests/generated/mysql/count,is_null_filters,distinct.test b/logictests/generated/mysql/6/count,is_null_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters,distinct.test rename to logictests/generated/mysql/6/count,is_null_filters,distinct.test diff --git a/logictests/generated/mysql/count,is_null_filters,in_parameter.fail.test b/logictests/generated/mysql/6/count,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/count,is_null_filters,in_parameter.fail.test rename to logictests/generated/mysql/6/count,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,join_subquery,range_param.fail.test b/logictests/generated/mysql/6/count,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count,join_subquery,range_param.fail.test rename to logictests/generated/mysql/6/count,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/count,less_or_equal_filters,distinct.test b/logictests/generated/mysql/6/count,less_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/count,less_or_equal_filters,distinct.test rename to logictests/generated/mysql/6/count,less_or_equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/count,less_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/6/count,less_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/count,less_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/6/count,less_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/count,max,between_filters.test b/logictests/generated/mysql/6/count,max,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,max,between_filters.test rename to logictests/generated/mysql/6/count,max,between_filters.test diff --git a/logictests/generated/mysql/count,max.test b/logictests/generated/mysql/6/count,max.test similarity index 100% rename from logictests/generated/mysql/count,max.test rename to logictests/generated/mysql/6/count,max.test diff --git a/logictests/generated/mysql/count,min,between_filters.test b/logictests/generated/mysql/6/count,min,between_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,between_filters.test rename to logictests/generated/mysql/6/count,min,between_filters.test diff --git a/logictests/generated/mysql/count,min,distinct.test b/logictests/generated/mysql/6/count,min,distinct.test similarity index 100% rename from logictests/generated/mysql/count,min,distinct.test rename to logictests/generated/mysql/6/count,min,distinct.test diff --git a/logictests/generated/mysql/count,min,equal_filters.test b/logictests/generated/mysql/6/count,min,equal_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,equal_filters.test rename to logictests/generated/mysql/6/count,min,equal_filters.test diff --git a/logictests/generated/mysql/count,min,less_filters.test b/logictests/generated/mysql/6/count,min,less_filters.test similarity index 100% rename from logictests/generated/mysql/count,min,less_filters.test rename to logictests/generated/mysql/6/count,min,less_filters.test diff --git a/logictests/generated/mysql/count,multiple_parameters,in_parameter.fail.test b/logictests/generated/mysql/6/count,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/count,multiple_parameters,in_parameter.fail.test rename to logictests/generated/mysql/6/count,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/count,range_param,range_param.test b/logictests/generated/mysql/6/count,range_param,range_param.test similarity index 100% rename from logictests/generated/mysql/count,range_param,range_param.test rename to logictests/generated/mysql/6/count,range_param,range_param.test diff --git a/logictests/generated/mysql/count,sum,left_join.test b/logictests/generated/mysql/6/count,sum,left_join.test similarity index 100% rename from logictests/generated/mysql/count,sum,left_join.test rename to logictests/generated/mysql/6/count,sum,left_join.test diff --git a/logictests/generated/mysql/count,sum,range_param.test b/logictests/generated/mysql/6/count,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/count,sum,range_param.test rename to logictests/generated/mysql/6/count,sum,range_param.test diff --git a/logictests/generated/mysql/count,sum,topk.test b/logictests/generated/mysql/6/count,sum,topk.test similarity index 100% rename from logictests/generated/mysql/count,sum,topk.test rename to logictests/generated/mysql/6/count,sum,topk.test diff --git a/logictests/generated/mysql/count_distinct,greater_filters,range_param.fail.test b/logictests/generated/mysql/6/count_distinct,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,greater_filters,range_param.fail.test rename to logictests/generated/mysql/6/count_distinct,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,inner_join,range_param.fail.test b/logictests/generated/mysql/6/count_distinct,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,inner_join,range_param.fail.test rename to logictests/generated/mysql/6/count_distinct,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,project_literal,range_param.fail.test b/logictests/generated/mysql/6/count_distinct,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/count_distinct,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,range_param,range_param.fail.test b/logictests/generated/mysql/6/count_distinct,range_param,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,range_param,range_param.fail.test rename to logictests/generated/mysql/6/count_distinct,range_param,range_param.fail.test diff --git a/logictests/generated/mysql/count_distinct,single_parameter,range_param.fail.test b/logictests/generated/mysql/6/count_distinct,single_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/count_distinct,single_parameter,range_param.fail.test rename to logictests/generated/mysql/6/count_distinct,single_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/cte,distinct,range_param.fail.test b/logictests/generated/mysql/6/cte,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,distinct,range_param.fail.test rename to logictests/generated/mysql/6/cte,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/cte,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/cte,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/cte,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/cte,max,range_param.fail.test b/logictests/generated/mysql/6/cte,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,max,range_param.fail.test rename to logictests/generated/mysql/6/cte,max,range_param.fail.test diff --git a/logictests/generated/mysql/cte,project_literal,range_param.fail.test b/logictests/generated/mysql/6/cte,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/cte,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/cte,sum,range_param.fail.test b/logictests/generated/mysql/6/cte,sum,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/cte,sum,range_param.fail.test rename to logictests/generated/mysql/6/cte,sum,range_param.fail.test diff --git a/logictests/generated/mysql/distinct,between_filters,range_param.test b/logictests/generated/mysql/6/distinct,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,between_filters,range_param.test rename to logictests/generated/mysql/6/distinct,between_filters,range_param.test diff --git a/logictests/generated/mysql/distinct,inner_join.test b/logictests/generated/mysql/6/distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/distinct,inner_join.test rename to logictests/generated/mysql/6/distinct,inner_join.test diff --git a/logictests/generated/mysql/distinct,left_join,range_param.test b/logictests/generated/mysql/6/distinct,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,left_join,range_param.test rename to logictests/generated/mysql/6/distinct,left_join,range_param.test diff --git a/logictests/generated/mysql/distinct,range_param.test b/logictests/generated/mysql/6/distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/distinct,range_param.test rename to logictests/generated/mysql/6/distinct,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/equal_filters,count,in_parameter.fail.test b/logictests/generated/mysql/6/equal_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/equal_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/6/equal_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/equal_filters,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/6/equal_filters,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/6/equal_filters,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,in_parameter,range_param.test b/logictests/generated/mysql/6/equal_filters,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,in_parameter,range_param.test rename to logictests/generated/mysql/6/equal_filters,in_parameter,range_param.test diff --git a/logictests/generated/mysql/equal_filters,less_filters,range_param.test b/logictests/generated/mysql/6/equal_filters,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,less_filters,range_param.test rename to logictests/generated/mysql/6/equal_filters,less_filters,range_param.test diff --git a/logictests/generated/mysql/equal_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/6/equal_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/equal_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/equal_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/equal_filters,sum,range_param.test b/logictests/generated/mysql/6/equal_filters,sum,range_param.test similarity index 100% rename from logictests/generated/mysql/equal_filters,sum,range_param.test rename to logictests/generated/mysql/6/equal_filters,sum,range_param.test diff --git a/logictests/generated/mysql/greater_filters,between_filters.test b/logictests/generated/mysql/6/greater_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/greater_filters,between_filters.test rename to logictests/generated/mysql/6/greater_filters,between_filters.test diff --git a/logictests/generated/mysql/greater_filters,distinct.test b/logictests/generated/mysql/6/greater_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/greater_filters,distinct.test rename to logictests/generated/mysql/6/greater_filters,distinct.test diff --git a/logictests/generated/mysql/greater_filters,inner_join,in_parameter.test b/logictests/generated/mysql/6/greater_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/6/greater_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,is_null_filters.test b/logictests/generated/mysql/6/greater_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/greater_filters,is_null_filters.test rename to logictests/generated/mysql/6/greater_filters,is_null_filters.test diff --git a/logictests/generated/mysql/greater_filters,less_filters.test b/logictests/generated/mysql/6/greater_filters,less_filters.test similarity index 100% rename from logictests/generated/mysql/greater_filters,less_filters.test rename to logictests/generated/mysql/6/greater_filters,less_filters.test diff --git a/logictests/generated/mysql/greater_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/6/greater_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/6/greater_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/6/greater_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/6/greater_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/greater_filters,single_parameter,range_param.test b/logictests/generated/mysql/6/greater_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_filters,single_parameter,range_param.test rename to logictests/generated/mysql/6/greater_filters,single_parameter,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/greater_filters,sum,in_parameter.fail.test b/logictests/generated/mysql/6/greater_filters,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/greater_filters,sum,in_parameter.fail.test rename to logictests/generated/mysql/6/greater_filters,sum,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,avg,in_parameter.fail.test b/logictests/generated/mysql/6/greater_or_equal_filters,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,avg,in_parameter.fail.test rename to logictests/generated/mysql/6/greater_or_equal_filters,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,distinct.test b/logictests/generated/mysql/6/greater_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,distinct.test rename to logictests/generated/mysql/6/greater_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/6/greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/6/greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,inner_join,range_param.test b/logictests/generated/mysql/6/greater_or_equal_filters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,inner_join,range_param.test rename to logictests/generated/mysql/6/greater_or_equal_filters,inner_join,range_param.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/6/greater_or_equal_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/6/greater_or_equal_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,less_filters,in_parameter.test b/logictests/generated/mysql/6/greater_or_equal_filters,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,less_filters,in_parameter.test rename to logictests/generated/mysql/6/greater_or_equal_filters,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,less_or_equal_filters.test b/logictests/generated/mysql/6/greater_or_equal_filters,less_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,less_or_equal_filters.test rename to logictests/generated/mysql/6/greater_or_equal_filters,less_or_equal_filters.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,not_equal_filters,in_parameter.test b/logictests/generated/mysql/6/greater_or_equal_filters,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,not_equal_filters,in_parameter.test rename to logictests/generated/mysql/6/greater_or_equal_filters,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/6/greater_or_equal_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/greater_or_equal_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/greater_or_equal_filters,topk,range_param.test b/logictests/generated/mysql/6/greater_or_equal_filters,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/greater_or_equal_filters,topk,range_param.test rename to logictests/generated/mysql/6/greater_or_equal_filters,topk,range_param.test diff --git a/logictests/generated/mysql/group_concat,avg,in_parameter.fail.test b/logictests/generated/mysql/6/group_concat,avg,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,avg,in_parameter.fail.test rename to logictests/generated/mysql/6/group_concat,avg,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,count,in_parameter.fail.test b/logictests/generated/mysql/6/group_concat,count,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,count,in_parameter.fail.test rename to logictests/generated/mysql/6/group_concat,count,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,distinct,left_join.test b/logictests/generated/mysql/6/group_concat,distinct,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,distinct,left_join.test rename to logictests/generated/mysql/6/group_concat,distinct,left_join.test diff --git a/logictests/generated/mysql/group_concat,distinct.test b/logictests/generated/mysql/6/group_concat,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,distinct.test rename to logictests/generated/mysql/6/group_concat,distinct.test diff --git a/logictests/generated/mysql/group_concat,equal_filters,distinct.test b/logictests/generated/mysql/6/group_concat,equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,equal_filters,distinct.test rename to logictests/generated/mysql/6/group_concat,equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/group_concat,greater_filters,in_parameter.fail.test b/logictests/generated/mysql/6/group_concat,greater_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/group_concat,greater_filters,in_parameter.fail.test rename to logictests/generated/mysql/6/group_concat,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/group_concat,greater_filters,range_param.fail.test b/logictests/generated/mysql/6/group_concat,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_filters,range_param.fail.test rename to logictests/generated/mysql/6/group_concat,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,greater_or_equal_filters,single_parameter.test b/logictests/generated/mysql/6/group_concat,greater_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/6/group_concat,greater_or_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/group_concat,greater_or_equal_filters.test b/logictests/generated/mysql/6/group_concat,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,greater_or_equal_filters.test rename to logictests/generated/mysql/6/group_concat,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,join_subquery,range_param.fail.test b/logictests/generated/mysql/6/group_concat,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,join_subquery,range_param.fail.test rename to logictests/generated/mysql/6/group_concat,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,less_filters.test b/logictests/generated/mysql/6/group_concat,less_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_filters.test rename to logictests/generated/mysql/6/group_concat,less_filters.test diff --git a/logictests/generated/mysql/group_concat,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/group_concat,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/group_concat,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,max,equal_filters.test b/logictests/generated/mysql/6/group_concat,max,equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,equal_filters.test rename to logictests/generated/mysql/6/group_concat,max,equal_filters.test diff --git a/logictests/generated/mysql/group_concat,max,greater_filters.test b/logictests/generated/mysql/6/group_concat,max,greater_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,greater_filters.test rename to logictests/generated/mysql/6/group_concat,max,greater_filters.test diff --git a/logictests/generated/mysql/group_concat,max,not_equal_filters.test b/logictests/generated/mysql/6/group_concat,max,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,not_equal_filters.test rename to logictests/generated/mysql/6/group_concat,max,not_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,max,topk.test b/logictests/generated/mysql/6/group_concat,max,topk.test similarity index 100% rename from logictests/generated/mysql/group_concat,max,topk.test rename to logictests/generated/mysql/6/group_concat,max,topk.test diff --git a/logictests/generated/mysql/group_concat,min,distinct.test b/logictests/generated/mysql/6/group_concat,min,distinct.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,distinct.test rename to logictests/generated/mysql/6/group_concat,min,distinct.test diff --git a/logictests/generated/mysql/group_concat,min,equal_filters.test b/logictests/generated/mysql/6/group_concat,min,equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,equal_filters.test rename to logictests/generated/mysql/6/group_concat,min,equal_filters.test diff --git a/logictests/generated/mysql/group_concat,min,in_parameter.fail.test b/logictests/generated/mysql/6/group_concat,min,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,in_parameter.fail.test rename to logictests/generated/mysql/6/group_concat,min,in_parameter.fail.test diff --git a/logictests/generated/mysql/group_concat,min,left_join.test b/logictests/generated/mysql/6/group_concat,min,left_join.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,left_join.test rename to logictests/generated/mysql/6/group_concat,min,left_join.test diff --git a/logictests/generated/mysql/group_concat,min,not_equal_filters.test b/logictests/generated/mysql/6/group_concat,min,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,not_equal_filters.test rename to logictests/generated/mysql/6/group_concat,min,not_equal_filters.test diff --git a/logictests/generated/mysql/group_concat,min,range_param.fail.test b/logictests/generated/mysql/6/group_concat,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,range_param.fail.test rename to logictests/generated/mysql/6/group_concat,min,range_param.fail.test diff --git a/logictests/generated/mysql/group_concat,min,topk.test b/logictests/generated/mysql/6/group_concat,min,topk.test similarity index 100% rename from logictests/generated/mysql/group_concat,min,topk.test rename to logictests/generated/mysql/6/group_concat,min,topk.test diff --git a/logictests/generated/mysql/group_concat,not_equal_filters.test b/logictests/generated/mysql/6/group_concat,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/group_concat,not_equal_filters.test rename to logictests/generated/mysql/6/group_concat,not_equal_filters.test diff --git a/logictests/generated/mysql/group_concat.test b/logictests/generated/mysql/6/group_concat.test similarity index 100% rename from logictests/generated/mysql/group_concat.test rename to logictests/generated/mysql/6/group_concat.test diff --git a/logictests/generated/mysql/in_parameter,equal_filters,range_param.fail.test b/logictests/generated/mysql/6/in_parameter,equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/in_parameter,equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,group_concat,range_param.fail.test b/logictests/generated/mysql/6/in_parameter,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,group_concat,range_param.fail.test rename to logictests/generated/mysql/6/in_parameter,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,in_parameter.test b/logictests/generated/mysql/6/in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter,in_parameter.test rename to logictests/generated/mysql/6/in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,inner_join,in_parameter.test b/logictests/generated/mysql/6/in_parameter,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter,inner_join,in_parameter.test rename to logictests/generated/mysql/6/in_parameter,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,less_filters,range_param.fail.test b/logictests/generated/mysql/6/in_parameter,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,less_filters,range_param.fail.test rename to logictests/generated/mysql/6/in_parameter,less_filters,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/in_parameter,min,in_parameter.fail.test b/logictests/generated/mysql/6/in_parameter,min,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/in_parameter,min,in_parameter.fail.test rename to logictests/generated/mysql/6/in_parameter,min,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,multiple_parameters,in_parameter.test b/logictests/generated/mysql/6/in_parameter,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/6/in_parameter,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/in_parameter,project_literal,range_param.fail.test b/logictests/generated/mysql/6/in_parameter,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/in_parameter,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/in_parameter,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/in_parameter,range_param.test b/logictests/generated/mysql/6/in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/in_parameter,range_param.test rename to logictests/generated/mysql/6/in_parameter,range_param.test diff --git a/logictests/generated/mysql/in_parameter,single_parameter,in_parameter.test b/logictests/generated/mysql/6/in_parameter,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/in_parameter,single_parameter,in_parameter.test rename to logictests/generated/mysql/6/in_parameter,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,avg,range_param.fail.test b/logictests/generated/mysql/6/inner_join,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,avg,range_param.fail.test rename to logictests/generated/mysql/6/inner_join,avg,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/6/inner_join,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/6/inner_join,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/inner_join,group_concat,range_param.fail.test b/logictests/generated/mysql/6/inner_join,group_concat,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,group_concat,range_param.fail.test rename to logictests/generated/mysql/6/inner_join,group_concat,range_param.fail.test diff --git a/logictests/generated/mysql/inner_join,in_parameter,in_parameter.test b/logictests/generated/mysql/6/inner_join,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,in_parameter,in_parameter.test rename to logictests/generated/mysql/6/inner_join,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,in_parameter,range_param.test b/logictests/generated/mysql/6/inner_join,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,in_parameter,range_param.test rename to logictests/generated/mysql/6/inner_join,in_parameter,range_param.test diff --git a/logictests/generated/mysql/inner_join,left_join,range_param.test b/logictests/generated/mysql/6/inner_join,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,left_join,range_param.test rename to logictests/generated/mysql/6/inner_join,left_join,range_param.test diff --git a/logictests/generated/mysql/inner_join,multiple_parameters,in_parameter.test b/logictests/generated/mysql/6/inner_join,multiple_parameters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,multiple_parameters,in_parameter.test rename to logictests/generated/mysql/6/inner_join,multiple_parameters,in_parameter.test diff --git a/logictests/generated/mysql/inner_join,multiple_range_params,range_param.test b/logictests/generated/mysql/6/inner_join,multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/inner_join,multiple_range_params,range_param.test rename to logictests/generated/mysql/6/inner_join,multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/inner_join,single_parameter.test b/logictests/generated/mysql/6/inner_join,single_parameter.test similarity index 100% rename from logictests/generated/mysql/inner_join,single_parameter.test rename to logictests/generated/mysql/6/inner_join,single_parameter.test diff --git a/logictests/generated/mysql/inner_join,sum_distinct,range_param.fail.test b/logictests/generated/mysql/6/inner_join,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/inner_join,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/6/inner_join,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,between_filters,in_parameter.test b/logictests/generated/mysql/6/is_null_filters,between_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,between_filters,in_parameter.test rename to logictests/generated/mysql/6/is_null_filters,between_filters,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,inner_join,in_parameter.test b/logictests/generated/mysql/6/is_null_filters,inner_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,inner_join,in_parameter.test rename to logictests/generated/mysql/6/is_null_filters,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/6/is_null_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/6/is_null_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,project_literal,range_param.fail.test b/logictests/generated/mysql/6/is_null_filters,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/is_null_filters,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,range_param.test b/logictests/generated/mysql/6/is_null_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,range_param.test rename to logictests/generated/mysql/6/is_null_filters,range_param.test diff --git a/logictests/generated/mysql/is_null_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/6/is_null_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/6/is_null_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters,sum_distinct,range_param.fail.test b/logictests/generated/mysql/6/is_null_filters,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/6/is_null_filters,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/is_null_filters,topk,in_parameter.test b/logictests/generated/mysql/6/is_null_filters,topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/is_null_filters,topk,in_parameter.test rename to logictests/generated/mysql/6/is_null_filters,topk,in_parameter.test diff --git a/logictests/generated/mysql/is_null_filters.test b/logictests/generated/mysql/6/is_null_filters.test similarity index 100% rename from logictests/generated/mysql/is_null_filters.test rename to logictests/generated/mysql/6/is_null_filters.test diff --git a/logictests/generated/mysql/join_subquery,avg,range_param.fail.test b/logictests/generated/mysql/6/join_subquery,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,avg,range_param.fail.test rename to logictests/generated/mysql/6/join_subquery,avg,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,cte,range_param.fail.test b/logictests/generated/mysql/6/join_subquery,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,cte,range_param.fail.test rename to logictests/generated/mysql/6/join_subquery,cte,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,inner_join,range_param.fail.test b/logictests/generated/mysql/6/join_subquery,inner_join,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,inner_join,range_param.fail.test rename to logictests/generated/mysql/6/join_subquery,inner_join,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,max,range_param.fail.test b/logictests/generated/mysql/6/join_subquery,max,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,max,range_param.fail.test rename to logictests/generated/mysql/6/join_subquery,max,range_param.fail.test diff --git a/logictests/generated/mysql/join_subquery,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/6/join_subquery,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/join_subquery,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/6/join_subquery,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,cte,range_param.fail.test b/logictests/generated/mysql/6/left_join,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/left_join,cte,range_param.fail.test rename to logictests/generated/mysql/6/left_join,cte,range_param.fail.test diff --git a/logictests/generated/mysql/left_join,greater_or_equal_filters,in_parameter.test b/logictests/generated/mysql/6/left_join,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,greater_or_equal_filters,in_parameter.test rename to logictests/generated/mysql/6/left_join,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,in_parameter.test b/logictests/generated/mysql/6/left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,in_parameter.test rename to logictests/generated/mysql/6/left_join,in_parameter.test diff --git a/logictests/generated/mysql/left_join,less_filters,in_parameter.test b/logictests/generated/mysql/6/left_join,less_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/left_join,less_filters,in_parameter.test rename to logictests/generated/mysql/6/left_join,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/left_join,range_param.test b/logictests/generated/mysql/6/left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/left_join,range_param.test rename to logictests/generated/mysql/6/left_join,range_param.test diff --git a/logictests/generated/mysql/less_filters,between_filters,range_param.test b/logictests/generated/mysql/6/less_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,between_filters,range_param.test rename to logictests/generated/mysql/6/less_filters,between_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_filters,count,in_parameter.fail.test b/logictests/generated/mysql/6/less_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/6/less_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,distinct,range_param.test b/logictests/generated/mysql/6/less_filters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,distinct,range_param.test rename to logictests/generated/mysql/6/less_filters,distinct,range_param.test diff --git a/logictests/generated/mysql/less_filters,equal_filters,in_parameter.test b/logictests/generated/mysql/6/less_filters,equal_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,equal_filters,in_parameter.test rename to logictests/generated/mysql/6/less_filters,equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/6/less_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/6/less_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,in_parameter,in_parameter.test b/logictests/generated/mysql/6/less_filters,in_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,in_parameter,in_parameter.test rename to logictests/generated/mysql/6/less_filters,in_parameter,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,is_null_filters,in_parameter.test b/logictests/generated/mysql/6/less_filters,is_null_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,is_null_filters,in_parameter.test rename to logictests/generated/mysql/6/less_filters,is_null_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_filters,single_parameter,range_param.test b/logictests/generated/mysql/6/less_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/less_filters,single_parameter,range_param.test rename to logictests/generated/mysql/6/less_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/less_filters,single_parameter.test b/logictests/generated/mysql/6/less_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/less_filters,single_parameter.test rename to logictests/generated/mysql/6/less_filters,single_parameter.test diff --git a/logictests/generated/mysql/less_filters.test b/logictests/generated/mysql/6/less_filters.test similarity index 100% rename from logictests/generated/mysql/less_filters.test rename to logictests/generated/mysql/6/less_filters.test diff --git a/logictests/generated/mysql/less_or_equal_filters,between_filters,range_param.test b/logictests/generated/mysql/6/less_or_equal_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,between_filters,range_param.test rename to logictests/generated/mysql/6/less_or_equal_filters,between_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,count,in_parameter.fail.test b/logictests/generated/mysql/6/less_or_equal_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/less_or_equal_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/6/less_or_equal_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,count,range_param.test b/logictests/generated/mysql/6/less_or_equal_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,count,range_param.test rename to logictests/generated/mysql/6/less_or_equal_filters,count,range_param.test diff --git a/logictests/generated/mysql/less_or_equal_filters,cte,range_param.fail.test b/logictests/generated/mysql/6/less_or_equal_filters,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,cte,range_param.fail.test rename to logictests/generated/mysql/6/less_or_equal_filters,cte,range_param.fail.test diff --git a/logictests/generated/mysql/less_or_equal_filters,greater_filters,in_parameter.test b/logictests/generated/mysql/6/less_or_equal_filters,greater_filters,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,greater_filters,in_parameter.test rename to logictests/generated/mysql/6/less_or_equal_filters,greater_filters,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,single_parameter,in_parameter.test b/logictests/generated/mysql/6/less_or_equal_filters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,single_parameter,in_parameter.test rename to logictests/generated/mysql/6/less_or_equal_filters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/less_or_equal_filters,topk.test b/logictests/generated/mysql/6/less_or_equal_filters,topk.test similarity index 100% rename from logictests/generated/mysql/less_or_equal_filters,topk.test rename to logictests/generated/mysql/6/less_or_equal_filters,topk.test diff --git a/logictests/generated/mysql/max,avg,range_param.fail.test b/logictests/generated/mysql/6/max,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,avg,range_param.fail.test rename to logictests/generated/mysql/6/max,avg,range_param.fail.test diff --git a/logictests/generated/mysql/max,distinct,range_param.fail.test b/logictests/generated/mysql/6/max,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,distinct,range_param.fail.test rename to logictests/generated/mysql/6/max,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/max,distinct,topk.test b/logictests/generated/mysql/6/max,distinct,topk.test similarity index 100% rename from logictests/generated/mysql/max,distinct,topk.test rename to logictests/generated/mysql/6/max,distinct,topk.test diff --git a/logictests/generated/mysql/max,equal_filters,distinct.test b/logictests/generated/mysql/6/max,equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,distinct.test rename to logictests/generated/mysql/6/max,equal_filters,distinct.test diff --git a/logictests/generated/mysql/max,equal_filters,inner_join.test b/logictests/generated/mysql/6/max,equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters,inner_join.test rename to logictests/generated/mysql/6/max,equal_filters,inner_join.test diff --git a/logictests/generated/mysql/max,equal_filters.test b/logictests/generated/mysql/6/max,equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,equal_filters.test rename to logictests/generated/mysql/6/max,equal_filters.test diff --git a/logictests/generated/mysql/max,greater_filters,is_null_filters.test b/logictests/generated/mysql/6/max,greater_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,is_null_filters.test rename to logictests/generated/mysql/6/max,greater_filters,is_null_filters.test diff --git a/logictests/generated/mysql/max,greater_filters,range_param.test b/logictests/generated/mysql/6/max,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,greater_filters,range_param.test rename to logictests/generated/mysql/6/max,greater_filters,range_param.test diff --git a/logictests/generated/mysql/max,greater_or_equal_filters,single_parameter.test b/logictests/generated/mysql/6/max,greater_or_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,greater_or_equal_filters,single_parameter.test rename to logictests/generated/mysql/6/max,greater_or_equal_filters,single_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,group_concat,in_parameter.fail.test b/logictests/generated/mysql/6/max,group_concat,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/6/max,group_concat,in_parameter.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,inner_join,in_parameter.fail.test b/logictests/generated/mysql/6/max,inner_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,inner_join,in_parameter.fail.test rename to logictests/generated/mysql/6/max,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/max,is_null_filters.test b/logictests/generated/mysql/6/max,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/max,is_null_filters.test rename to logictests/generated/mysql/6/max,is_null_filters.test diff --git a/logictests/generated/mysql/max,join_subquery,range_param.fail.test b/logictests/generated/mysql/6/max,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,join_subquery,range_param.fail.test rename to logictests/generated/mysql/6/max,join_subquery,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,less_filters,in_parameter.fail.test b/logictests/generated/mysql/6/max,less_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,less_filters,in_parameter.fail.test rename to logictests/generated/mysql/6/max,less_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,distinct.test b/logictests/generated/mysql/6/max,less_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,distinct.test rename to logictests/generated/mysql/6/max,less_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/max,less_or_equal_filters,range_param.test b/logictests/generated/mysql/6/max,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/max,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/6/max,less_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/max,min,single_parameter.test b/logictests/generated/mysql/6/max,min,single_parameter.test similarity index 100% rename from logictests/generated/mysql/max,min,single_parameter.test rename to logictests/generated/mysql/6/max,min,single_parameter.test diff --git a/logictests/generated/mysql/max,not_equal_filters,distinct.test b/logictests/generated/mysql/6/max,not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,distinct.test rename to logictests/generated/mysql/6/max,not_equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,not_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/6/max,not_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,not_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/6/max,not_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/max,not_equal_filters,inner_join.test b/logictests/generated/mysql/6/max,not_equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,inner_join.test rename to logictests/generated/mysql/6/max,not_equal_filters,inner_join.test diff --git a/logictests/generated/mysql/max,not_equal_filters,left_join.test b/logictests/generated/mysql/6/max,not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters,left_join.test rename to logictests/generated/mysql/6/max,not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/max,not_equal_filters.test b/logictests/generated/mysql/6/max,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/max,not_equal_filters.test rename to logictests/generated/mysql/6/max,not_equal_filters.test diff --git a/logictests/generated/mysql/max,range_param.test b/logictests/generated/mysql/6/max,range_param.test similarity index 100% rename from logictests/generated/mysql/max,range_param.test rename to logictests/generated/mysql/6/max,range_param.test diff --git a/logictests/generated/mysql/max,single_parameter,topk.test b/logictests/generated/mysql/6/max,single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/max,single_parameter,topk.test rename to logictests/generated/mysql/6/max,single_parameter,topk.test diff --git a/logictests/generated/mysql/max,sum_distinct,range_param.fail.test b/logictests/generated/mysql/6/max,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/max,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/6/max,sum_distinct,range_param.fail.test diff --git a/logictests/out-of-scope/ENG-629/mysql/max,topk,in_parameter.fail.test b/logictests/generated/mysql/6/max,topk,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/max,topk,in_parameter.fail.test rename to logictests/generated/mysql/6/max,topk,in_parameter.test diff --git a/logictests/generated/mysql/max,topk,range_param.test b/logictests/generated/mysql/6/max,topk,range_param.test similarity index 100% rename from logictests/generated/mysql/max,topk,range_param.test rename to logictests/generated/mysql/6/max,topk,range_param.test diff --git a/logictests/generated/mysql/min,between_filters,is_null_filters.test b/logictests/generated/mysql/6/min,between_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,between_filters,is_null_filters.test rename to logictests/generated/mysql/6/min,between_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,cte,range_param.fail.test b/logictests/generated/mysql/6/min,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/min,cte,range_param.fail.test rename to logictests/generated/mysql/6/min,cte,range_param.fail.test diff --git a/logictests/generated/mysql/min,distinct,inner_join.test b/logictests/generated/mysql/6/min,distinct,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,distinct,inner_join.test rename to logictests/generated/mysql/6/min,distinct,inner_join.test diff --git a/logictests/generated/mysql/min,distinct,single_parameter.test b/logictests/generated/mysql/6/min,distinct,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,distinct,single_parameter.test rename to logictests/generated/mysql/6/min,distinct,single_parameter.test diff --git a/logictests/generated/mysql/min,equal_filters,inner_join.test b/logictests/generated/mysql/6/min,equal_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,equal_filters,inner_join.test rename to logictests/generated/mysql/6/min,equal_filters,inner_join.test diff --git a/logictests/generated/mysql/min,greater_filters,between_filters.test b/logictests/generated/mysql/6/min,greater_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,greater_filters,between_filters.test rename to logictests/generated/mysql/6/min,greater_filters,between_filters.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,between_filters.test b/logictests/generated/mysql/6/min,greater_or_equal_filters,between_filters.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,between_filters.test rename to logictests/generated/mysql/6/min,greater_or_equal_filters,between_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,greater_or_equal_filters,in_parameter.fail.test b/logictests/generated/mysql/6/min,greater_or_equal_filters,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,greater_or_equal_filters,in_parameter.fail.test rename to logictests/generated/mysql/6/min,greater_or_equal_filters,in_parameter.test diff --git a/logictests/generated/mysql/min,greater_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/6/min,greater_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,greater_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/6/min,greater_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/min,in_parameter,range_param.fail.test b/logictests/generated/mysql/6/min,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/min,in_parameter,range_param.fail.test rename to logictests/generated/mysql/6/min,in_parameter,range_param.test diff --git a/logictests/generated/mysql/min,is_null_filters,inner_join.test b/logictests/generated/mysql/6/min,is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters,inner_join.test rename to logictests/generated/mysql/6/min,is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/min,is_null_filters,left_join.test b/logictests/generated/mysql/6/min,is_null_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters,left_join.test rename to logictests/generated/mysql/6/min,is_null_filters,left_join.test diff --git a/logictests/generated/mysql/min,is_null_filters.test b/logictests/generated/mysql/6/min,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/min,is_null_filters.test rename to logictests/generated/mysql/6/min,is_null_filters.test diff --git a/logictests/generated/mysql/min,join_subquery.test b/logictests/generated/mysql/6/min,join_subquery.test similarity index 100% rename from logictests/generated/mysql/min,join_subquery.test rename to logictests/generated/mysql/6/min,join_subquery.test diff --git a/logictests/generated/mysql/min,left_join,join_subquery.test b/logictests/generated/mysql/6/min,left_join,join_subquery.test similarity index 100% rename from logictests/generated/mysql/min,left_join,join_subquery.test rename to logictests/generated/mysql/6/min,left_join,join_subquery.test diff --git a/logictests/generated/mysql/min,less_filters,distinct.test b/logictests/generated/mysql/6/min,less_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,distinct.test rename to logictests/generated/mysql/6/min,less_filters,distinct.test diff --git a/logictests/generated/mysql/min,less_filters,single_parameter.test b/logictests/generated/mysql/6/min,less_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/min,less_filters,single_parameter.test rename to logictests/generated/mysql/6/min,less_filters,single_parameter.test diff --git a/logictests/generated/mysql/min,less_filters.test b/logictests/generated/mysql/6/min,less_filters.test similarity index 100% rename from logictests/generated/mysql/min,less_filters.test rename to logictests/generated/mysql/6/min,less_filters.test diff --git a/logictests/generated/mysql/min,less_or_equal_filters,left_join.test b/logictests/generated/mysql/6/min,less_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/min,less_or_equal_filters,left_join.test rename to logictests/generated/mysql/6/min,less_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/min,not_equal_filters,distinct.test b/logictests/generated/mysql/6/min,not_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/min,not_equal_filters,distinct.test rename to logictests/generated/mysql/6/min,not_equal_filters,distinct.test diff --git a/logictests/out-of-scope/ENG-629/mysql/min,single_parameter,in_parameter.fail.test b/logictests/generated/mysql/6/min,single_parameter,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/min,single_parameter,in_parameter.fail.test rename to logictests/generated/mysql/6/min,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,count,in_parameter.fail.test b/logictests/generated/mysql/6/multiple_parameters,count,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,count,in_parameter.fail.test rename to logictests/generated/mysql/6/multiple_parameters,count,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,distinct,range_param.test b/logictests/generated/mysql/6/multiple_parameters,distinct,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,distinct,range_param.test rename to logictests/generated/mysql/6/multiple_parameters,distinct,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,greater_filters,range_param.fail.test b/logictests/generated/mysql/6/multiple_parameters,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,greater_filters,range_param.fail.test rename to logictests/generated/mysql/6/multiple_parameters,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/6/multiple_parameters,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/6/multiple_parameters,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,inner_join,range_param.test b/logictests/generated/mysql/6/multiple_parameters,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,inner_join,range_param.test rename to logictests/generated/mysql/6/multiple_parameters,inner_join,range_param.test diff --git a/logictests/generated/mysql/multiple_parameters,join_subquery,range_param.fail.test b/logictests/generated/mysql/6/multiple_parameters,join_subquery,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,join_subquery,range_param.fail.test rename to logictests/generated/mysql/6/multiple_parameters,join_subquery,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,left_join,in_parameter.test b/logictests/generated/mysql/6/multiple_parameters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,left_join,in_parameter.test rename to logictests/generated/mysql/6/multiple_parameters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/multiple_parameters,less_filters,range_param.fail.test b/logictests/generated/mysql/6/multiple_parameters,less_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,less_filters,range_param.fail.test rename to logictests/generated/mysql/6/multiple_parameters,less_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/multiple_parameters,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/multiple_parameters,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_parameters,single_parameter,in_parameter.test b/logictests/generated/mysql/6/multiple_parameters,single_parameter,in_parameter.test similarity index 100% rename from logictests/generated/mysql/multiple_parameters,single_parameter,in_parameter.test rename to logictests/generated/mysql/6/multiple_parameters,single_parameter,in_parameter.test diff --git a/logictests/generated/mysql/multiple_range_params,between_filters,range_param.fail.test b/logictests/generated/mysql/6/multiple_range_params,between_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,between_filters,range_param.fail.test rename to logictests/generated/mysql/6/multiple_range_params,between_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/multiple_range_params,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/multiple_range_params,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/multiple_range_params,inner_join,range_param.test b/logictests/generated/mysql/6/multiple_range_params,inner_join,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,inner_join,range_param.test rename to logictests/generated/mysql/6/multiple_range_params,inner_join,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,max,range_param.test b/logictests/generated/mysql/6/multiple_range_params,max,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,max,range_param.test rename to logictests/generated/mysql/6/multiple_range_params,max,range_param.test diff --git a/logictests/generated/mysql/multiple_range_params,range_param.test b/logictests/generated/mysql/6/multiple_range_params,range_param.test similarity index 100% rename from logictests/generated/mysql/multiple_range_params,range_param.test rename to logictests/generated/mysql/6/multiple_range_params,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,between_filters,range_param.test b/logictests/generated/mysql/6/not_equal_filters,between_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,between_filters,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,between_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/not_equal_filters,count,in_parameter.fail.test b/logictests/generated/mysql/6/not_equal_filters,count,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/not_equal_filters,count,in_parameter.fail.test rename to logictests/generated/mysql/6/not_equal_filters,count,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,count,range_param.test b/logictests/generated/mysql/6/not_equal_filters,count,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,count,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,count,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,equal_filters,range_param.test b/logictests/generated/mysql/6/not_equal_filters,equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,equal_filters,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,equal_filters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,greater_filters,range_param.test b/logictests/generated/mysql/6/not_equal_filters,greater_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,greater_filters,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,greater_filters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,greater_or_equal_filters.test b/logictests/generated/mysql/6/not_equal_filters,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,greater_or_equal_filters.test rename to logictests/generated/mysql/6/not_equal_filters,greater_or_equal_filters.test diff --git a/logictests/out-of-scope/ENG-629/mysql/not_equal_filters,group_concat,in_parameter.fail.test b/logictests/generated/mysql/6/not_equal_filters,group_concat,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/not_equal_filters,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/6/not_equal_filters,group_concat,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,left_join,in_parameter.test b/logictests/generated/mysql/6/not_equal_filters,left_join,in_parameter.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,left_join,in_parameter.test rename to logictests/generated/mysql/6/not_equal_filters,left_join,in_parameter.test diff --git a/logictests/generated/mysql/not_equal_filters,left_join,range_param.test b/logictests/generated/mysql/6/not_equal_filters,left_join,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,left_join,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,left_join,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,left_join.test b/logictests/generated/mysql/6/not_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,left_join.test rename to logictests/generated/mysql/6/not_equal_filters,left_join.test diff --git a/logictests/generated/mysql/not_equal_filters,multiple_parameters,range_param.test b/logictests/generated/mysql/6/not_equal_filters,multiple_parameters,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,multiple_parameters,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,multiple_parameters,range_param.test diff --git a/logictests/generated/mysql/not_equal_filters,single_parameter,range_param.test b/logictests/generated/mysql/6/not_equal_filters,single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/not_equal_filters,single_parameter,range_param.test rename to logictests/generated/mysql/6/not_equal_filters,single_parameter,range_param.test diff --git a/logictests/generated/mysql/project_literal,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/project_literal,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/project_literal,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,in_parameter,range_param.fail.test b/logictests/generated/mysql/6/project_literal,in_parameter,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,in_parameter,range_param.fail.test rename to logictests/generated/mysql/6/project_literal,in_parameter,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,join_subquery,in_parameter.fail.test b/logictests/generated/mysql/6/project_literal,join_subquery,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,join_subquery,in_parameter.fail.test rename to logictests/generated/mysql/6/project_literal,join_subquery,in_parameter.fail.test diff --git a/logictests/generated/mysql/project_literal,multiple_parameters,range_param.fail.test b/logictests/generated/mysql/6/project_literal,multiple_parameters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,multiple_parameters,range_param.fail.test rename to logictests/generated/mysql/6/project_literal,multiple_parameters,range_param.fail.test diff --git a/logictests/generated/mysql/project_literal,sum_distinct,range_param.fail.test b/logictests/generated/mysql/6/project_literal,sum_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/project_literal,sum_distinct,range_param.fail.test rename to logictests/generated/mysql/6/project_literal,sum_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,avg,range_param.fail.test b/logictests/generated/mysql/6/range_param,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,avg,range_param.fail.test rename to logictests/generated/mysql/6/range_param,avg,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,greater_filters,range_param.fail.test b/logictests/generated/mysql/6/range_param,greater_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,greater_filters,range_param.fail.test rename to logictests/generated/mysql/6/range_param,greater_filters,range_param.fail.test diff --git a/logictests/generated/mysql/range_param,in_parameter,range_param.test b/logictests/generated/mysql/6/range_param,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/range_param,in_parameter,range_param.test rename to logictests/generated/mysql/6/range_param,in_parameter,range_param.test diff --git a/logictests/generated/mysql/range_param,less_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/range_param,less_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/range_param,less_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/range_param,less_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,avg_distinct,range_param.fail.test b/logictests/generated/mysql/6/single_parameter,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/6/single_parameter,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,cte,range_param.fail.test b/logictests/generated/mysql/6/single_parameter,cte,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,cte,range_param.fail.test rename to logictests/generated/mysql/6/single_parameter,cte,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,greater_or_equal_filters,range_param.fail.test b/logictests/generated/mysql/6/single_parameter,greater_or_equal_filters,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,greater_or_equal_filters,range_param.fail.test rename to logictests/generated/mysql/6/single_parameter,greater_or_equal_filters,range_param.fail.test diff --git a/logictests/generated/mysql/single_parameter,group_concat,in_parameter.fail.test b/logictests/generated/mysql/6/single_parameter,group_concat,in_parameter.fail.test similarity index 100% rename from logictests/generated/mysql/single_parameter,group_concat,in_parameter.fail.test rename to logictests/generated/mysql/6/single_parameter,group_concat,in_parameter.fail.test diff --git a/logictests/generated/mysql/single_parameter,range_param.test b/logictests/generated/mysql/6/single_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/single_parameter,range_param.test rename to logictests/generated/mysql/6/single_parameter,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/single_parameter,sum,in_parameter.fail.test b/logictests/generated/mysql/6/single_parameter,sum,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/single_parameter,sum,in_parameter.fail.test rename to logictests/generated/mysql/6/single_parameter,sum,in_parameter.test diff --git a/logictests/generated/mysql/single_parameter,topk.test b/logictests/generated/mysql/6/single_parameter,topk.test similarity index 100% rename from logictests/generated/mysql/single_parameter,topk.test rename to logictests/generated/mysql/6/single_parameter,topk.test diff --git a/logictests/generated/mysql/sum,avg,greater_or_equal_filters.fail.test b/logictests/generated/mysql/6/sum,avg,greater_or_equal_filters.fail.test similarity index 100% rename from logictests/generated/mysql/sum,avg,greater_or_equal_filters.fail.test rename to logictests/generated/mysql/6/sum,avg,greater_or_equal_filters.fail.test diff --git a/logictests/generated/mysql/sum,avg,is_null_filters.test b/logictests/generated/mysql/6/sum,avg,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,avg,is_null_filters.test rename to logictests/generated/mysql/6/sum,avg,is_null_filters.test diff --git a/logictests/generated/mysql/sum,avg,left_join.test b/logictests/generated/mysql/6/sum,avg,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,avg,left_join.test rename to logictests/generated/mysql/6/sum,avg,left_join.test diff --git a/logictests/generated/mysql/sum,avg,max.test b/logictests/generated/mysql/6/sum,avg,max.test similarity index 100% rename from logictests/generated/mysql/sum,avg,max.test rename to logictests/generated/mysql/6/sum,avg,max.test diff --git a/logictests/generated/mysql/sum,avg,not_equal_filters.test b/logictests/generated/mysql/6/sum,avg,not_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,avg,not_equal_filters.test rename to logictests/generated/mysql/6/sum,avg,not_equal_filters.test diff --git a/logictests/generated/mysql/sum,avg,single_parameter.test b/logictests/generated/mysql/6/sum,avg,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,avg,single_parameter.test rename to logictests/generated/mysql/6/sum,avg,single_parameter.test diff --git a/logictests/generated/mysql/sum,distinct,range_param.fail.test b/logictests/generated/mysql/6/sum,distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,distinct,range_param.fail.test rename to logictests/generated/mysql/6/sum,distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum,equal_filters,is_null_filters.test b/logictests/generated/mysql/6/sum,equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,is_null_filters.test rename to logictests/generated/mysql/6/sum,equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/sum,equal_filters,left_join.test b/logictests/generated/mysql/6/sum,equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,left_join.test rename to logictests/generated/mysql/6/sum,equal_filters,left_join.test diff --git a/logictests/generated/mysql/sum,equal_filters,single_parameter.test b/logictests/generated/mysql/6/sum,equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,equal_filters,single_parameter.test rename to logictests/generated/mysql/6/sum,equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,is_null_filters.test b/logictests/generated/mysql/6/sum,greater_or_equal_filters,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,is_null_filters.test rename to logictests/generated/mysql/6/sum,greater_or_equal_filters,is_null_filters.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters,range_param.test b/logictests/generated/mysql/6/sum,greater_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters,range_param.test rename to logictests/generated/mysql/6/sum,greater_or_equal_filters,range_param.test diff --git a/logictests/generated/mysql/sum,greater_or_equal_filters.test b/logictests/generated/mysql/6/sum,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,greater_or_equal_filters.test rename to logictests/generated/mysql/6/sum,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,group_concat,distinct.test b/logictests/generated/mysql/6/sum,group_concat,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,distinct.test rename to logictests/generated/mysql/6/sum,group_concat,distinct.test diff --git a/logictests/generated/mysql/sum,group_concat,is_null_filters.test b/logictests/generated/mysql/6/sum,group_concat,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,group_concat,is_null_filters.test rename to logictests/generated/mysql/6/sum,group_concat,is_null_filters.test diff --git a/logictests/generated/mysql/sum,in_parameter,range_param.fail.test b/logictests/generated/mysql/6/sum,in_parameter,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,in_parameter,range_param.fail.test rename to logictests/generated/mysql/6/sum,in_parameter,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,inner_join,in_parameter.fail.test b/logictests/generated/mysql/6/sum,inner_join,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,inner_join,in_parameter.fail.test rename to logictests/generated/mysql/6/sum,inner_join,in_parameter.test diff --git a/logictests/generated/mysql/sum,is_null_filters,inner_join.test b/logictests/generated/mysql/6/sum,is_null_filters,inner_join.test similarity index 100% rename from logictests/generated/mysql/sum,is_null_filters,inner_join.test rename to logictests/generated/mysql/6/sum,is_null_filters,inner_join.test diff --git a/logictests/generated/mysql/sum,less_filters,distinct.test b/logictests/generated/mysql/6/sum,less_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,less_filters,distinct.test rename to logictests/generated/mysql/6/sum,less_filters,distinct.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,distinct.test b/logictests/generated/mysql/6/sum,less_or_equal_filters,distinct.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,distinct.test rename to logictests/generated/mysql/6/sum,less_or_equal_filters,distinct.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,left_join.test b/logictests/generated/mysql/6/sum,less_or_equal_filters,left_join.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,left_join.test rename to logictests/generated/mysql/6/sum,less_or_equal_filters,left_join.test diff --git a/logictests/generated/mysql/sum,less_or_equal_filters,range_param.test b/logictests/generated/mysql/6/sum,less_or_equal_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/sum,less_or_equal_filters,range_param.test rename to logictests/generated/mysql/6/sum,less_or_equal_filters,range_param.test diff --git a/logictests/out-of-scope/ENG-629/mysql/sum,max,in_parameter.fail.test b/logictests/generated/mysql/6/sum,max,in_parameter.test similarity index 100% rename from logictests/out-of-scope/ENG-629/mysql/sum,max,in_parameter.fail.test rename to logictests/generated/mysql/6/sum,max,in_parameter.test diff --git a/logictests/generated/mysql/sum,max,less_filters.test b/logictests/generated/mysql/6/sum,max,less_filters.test similarity index 100% rename from logictests/generated/mysql/sum,max,less_filters.test rename to logictests/generated/mysql/6/sum,max,less_filters.test diff --git a/logictests/generated/mysql/sum,max,single_parameter.test b/logictests/generated/mysql/6/sum,max,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,max,single_parameter.test rename to logictests/generated/mysql/6/sum,max,single_parameter.test diff --git a/logictests/generated/mysql/sum,max,topk.test b/logictests/generated/mysql/6/sum,max,topk.test similarity index 100% rename from logictests/generated/mysql/sum,max,topk.test rename to logictests/generated/mysql/6/sum,max,topk.test diff --git a/logictests/generated/mysql/sum,min,greater_or_equal_filters.test b/logictests/generated/mysql/6/sum,min,greater_or_equal_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,greater_or_equal_filters.test rename to logictests/generated/mysql/6/sum,min,greater_or_equal_filters.test diff --git a/logictests/generated/mysql/sum,min,is_null_filters.test b/logictests/generated/mysql/6/sum,min,is_null_filters.test similarity index 100% rename from logictests/generated/mysql/sum,min,is_null_filters.test rename to logictests/generated/mysql/6/sum,min,is_null_filters.test diff --git a/logictests/generated/mysql/sum,not_equal_filters,single_parameter.test b/logictests/generated/mysql/6/sum,not_equal_filters,single_parameter.test similarity index 100% rename from logictests/generated/mysql/sum,not_equal_filters,single_parameter.test rename to logictests/generated/mysql/6/sum,not_equal_filters,single_parameter.test diff --git a/logictests/generated/mysql/sum,project_literal,range_param.fail.test b/logictests/generated/mysql/6/sum,project_literal,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum,project_literal,range_param.fail.test rename to logictests/generated/mysql/6/sum,project_literal,range_param.fail.test diff --git a/logictests/generated/mysql/sum.test b/logictests/generated/mysql/6/sum.test similarity index 100% rename from logictests/generated/mysql/sum.test rename to logictests/generated/mysql/6/sum.test diff --git a/logictests/generated/mysql/sum_distinct,avg,range_param.fail.test b/logictests/generated/mysql/6/sum_distinct,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,avg,range_param.fail.test rename to logictests/generated/mysql/6/sum_distinct,avg,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,avg_distinct,range_param.fail.test b/logictests/generated/mysql/6/sum_distinct,avg_distinct,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,avg_distinct,range_param.fail.test rename to logictests/generated/mysql/6/sum_distinct,avg_distinct,range_param.fail.test diff --git a/logictests/generated/mysql/sum_distinct,min,range_param.fail.test b/logictests/generated/mysql/6/sum_distinct,min,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/sum_distinct,min,range_param.fail.test rename to logictests/generated/mysql/6/sum_distinct,min,range_param.fail.test diff --git a/logictests/generated/mysql/topk,avg,range_param.fail.test b/logictests/generated/mysql/6/topk,avg,range_param.fail.test similarity index 100% rename from logictests/generated/mysql/topk,avg,range_param.fail.test rename to logictests/generated/mysql/6/topk,avg,range_param.fail.test diff --git a/logictests/generated/mysql/topk,in_parameter.test b/logictests/generated/mysql/6/topk,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,in_parameter.test rename to logictests/generated/mysql/6/topk,in_parameter.test diff --git a/logictests/generated/mysql/topk,less_filters,range_param.test b/logictests/generated/mysql/6/topk,less_filters,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,less_filters,range_param.test rename to logictests/generated/mysql/6/topk,less_filters,range_param.test diff --git a/logictests/generated/mysql/topk,max,range_param.test b/logictests/generated/mysql/6/topk,max,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,max,range_param.test rename to logictests/generated/mysql/6/topk,max,range_param.test diff --git a/logictests/generated/mysql/topk,min,in_parameter.fail.test b/logictests/generated/mysql/6/topk,min,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,min,in_parameter.fail.test rename to logictests/generated/mysql/6/topk,min,in_parameter.test diff --git a/logictests/generated/mysql/topk,range_param.test b/logictests/generated/mysql/6/topk,range_param.test similarity index 100% rename from logictests/generated/mysql/topk,range_param.test rename to logictests/generated/mysql/6/topk,range_param.test diff --git a/logictests/generated/mysql/topk,sum,in_parameter.fail.test b/logictests/generated/mysql/6/topk,sum,in_parameter.test similarity index 100% rename from logictests/generated/mysql/topk,sum,in_parameter.fail.test rename to logictests/generated/mysql/6/topk,sum,in_parameter.test diff --git a/logictests/generated/mysql/queries b/logictests/generated/mysql/queries new file mode 100644 index 0000000000..5bff571829 --- /dev/null +++ b/logictests/generated/mysql/queries @@ -0,0 +1,1000 @@ +SELECT sum(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT sum(table_1.column_2) AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT sum(table_1.column_3) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT sum(table_1.column_4) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT sum(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT sum(table_1.column_2) AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT sum(table_1.column_3) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT sum(table_1.column_4) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT sum(table_1.column_1) AS alias_1 FROM table_1 +SELECT group_concat(table_1.column_2 separator ', ') AS alias_1 FROM table_1 +SELECT sum(table_1.column_3) AS alias_1, group_concat(table_1.column_4 separator ', ') AS alias_2 FROM table_1 +SELECT sum(table_1.column_1) AS alias_1 FROM table_1 +SELECT group_concat(table_1.column_2 separator ', ') AS alias_1 FROM table_1 +SELECT sum(table_1.column_3) AS alias_1, group_concat(table_1.column_4 separator ', ') AS alias_2 FROM table_1 +SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`) +SELECT min(`table_1`.`column_3`) AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT `table_1`.`column_4` AS `alias_1`, `table_3`.`column_2` AS `alias_2`, min(`table_1`.`column_5`) AS `alias_3` FROM `table_1` INNER JOIN `table_3` ON (`table_1`.`column_1` = `table_3`.`column_1`) GROUP BY `table_1`.`column_4`, `table_3`.`column_2` +SELECT `table_3`.`column_3` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_4` ON (`table_3`.`column_1` = `table_4`.`column_1`) WHERE (`table_3`.`column_3` > ?) +SELECT min(`table_2`.`column_3`) AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_3` > ?) +SELECT `table_2`.`column_4` AS `alias_1`, `table_5`.`column_2` AS `alias_2`, min(`table_2`.`column_5`) AS `alias_3` FROM `table_2` INNER JOIN `table_5` ON (`table_2`.`column_3` = `table_5`.`column_1`) WHERE (`table_2`.`column_1` > ?) GROUP BY `table_2`.`column_4`, `table_5`.`column_2` +SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`) +SELECT min(`table_1`.`column_3`) AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT `table_1`.`column_4` AS `alias_1`, `table_3`.`column_2` AS `alias_2`, min(`table_1`.`column_5`) AS `alias_3` FROM `table_1` INNER JOIN `table_3` ON (`table_1`.`column_1` = `table_3`.`column_1`) GROUP BY `table_1`.`column_4`, `table_3`.`column_2` +SELECT `table_3`.`column_3` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_4` ON (`table_3`.`column_1` = `table_4`.`column_1`) WHERE (`table_3`.`column_3` > ?) +SELECT min(`table_2`.`column_3`) AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_3` > ?) +SELECT `table_2`.`column_4` AS `alias_1`, `table_5`.`column_2` AS `alias_2`, min(`table_2`.`column_5`) AS `alias_3` FROM `table_2` INNER JOIN `table_5` ON (`table_2`.`column_3` = `table_5`.`column_1`) WHERE (`table_2`.`column_1` > ?) GROUP BY `table_2`.`column_4`, `table_5`.`column_2` +SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`) +SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE `table_2`.`column_1` IN (?, ?, ?) +SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_1` > ?) +SELECT `table_2`.`column_3` AS `alias_1`, `table_3`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_3` ON (`table_2`.`column_1` = `table_3`.`column_1`) WHERE `table_2`.`column_1` IN (?, ?, ?) +SELECT `table_2`.`column_4` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_4` ON (`table_2`.`column_1` = `table_4`.`column_1`) WHERE (`table_2`.`column_1` > ?) +SELECT `table_3`.`column_2` AS `alias_1` FROM `table_3` WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?)) +SELECT `table_3`.`column_3` AS `alias_1`, `table_5`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_5` ON (`table_3`.`column_2` = `table_5`.`column_1`) WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`) +SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE `table_2`.`column_1` IN (?, ?, ?) +SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_1` > ?) +SELECT `table_2`.`column_3` AS `alias_1`, `table_3`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_3` ON (`table_2`.`column_1` = `table_3`.`column_1`) WHERE `table_2`.`column_1` IN (?, ?, ?) +SELECT `table_2`.`column_4` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_4` ON (`table_2`.`column_1` = `table_4`.`column_1`) WHERE (`table_2`.`column_1` > ?) +SELECT `table_3`.`column_2` AS `alias_1` FROM `table_3` WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?)) +SELECT `table_3`.`column_3` AS `alias_1`, `table_5`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_5` ON (`table_3`.`column_2` = `table_5`.`column_1`) WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?)) +SELECT count(table_1.column_1) AS alias_1 FROM table_1 +SELECT sum(table_1.column_2) AS alias_1 FROM table_1 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT count(table_1.column_3) AS alias_1, sum(table_1.column_4) AS alias_2 FROM table_1 +SELECT count(table_1.column_5) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10 +SELECT count(table_1.column_6) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT sum(table_1.column_7) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10 +SELECT sum(table_1.column_8) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT table_1.column_5 AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_9) AS alias_1, sum(table_1.column_10) AS alias_2 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10 +SELECT count(table_1.column_11) AS alias_1, sum(table_1.column_12) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_13) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT sum(table_1.column_14) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_15) AS alias_1, sum(table_1.column_16) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_1) AS alias_1 FROM table_1 +SELECT sum(table_1.column_2) AS alias_1 FROM table_1 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10 +SELECT count(table_1.column_3) AS alias_1, sum(table_1.column_4) AS alias_2 FROM table_1 +SELECT count(table_1.column_5) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10 +SELECT count(table_1.column_6) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT sum(table_1.column_7) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10 +SELECT sum(table_1.column_8) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT table_1.column_5 AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_9) AS alias_1, sum(table_1.column_10) AS alias_2 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10 +SELECT count(table_1.column_11) AS alias_1, sum(table_1.column_12) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_13) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT sum(table_1.column_14) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT count(table_1.column_15) AS alias_1, sum(table_1.column_16) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10 +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` < `table_1`.`column_2`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < `table_1`.`column_1`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` < `table_1`.`column_2`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < `table_1`.`column_1`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = `table_1`.`column_2`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = `table_1`.`column_2`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?)) +SELECT min(`table_1`.`column_1`) AS `alias_1` FROM `table_1` +SELECT max(`table_1`.`column_2`) AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT min(`table_1`.`column_3`) AS `alias_1`, max(`table_1`.`column_4`) AS `alias_2` FROM `table_1` +SELECT min(`table_1`.`column_5`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT max(`table_1`.`column_6`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT min(`table_1`.`column_7`) AS `alias_1`, max(`table_1`.`column_8`) AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_4` > ?) +SELECT min(`table_1`.`column_1`) AS `alias_1` FROM `table_1` +SELECT max(`table_1`.`column_2`) AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT min(`table_1`.`column_3`) AS `alias_1`, max(`table_1`.`column_4`) AS `alias_2` FROM `table_1` +SELECT min(`table_1`.`column_5`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT max(`table_1`.`column_6`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT min(`table_1`.`column_7`) AS `alias_1`, max(`table_1`.`column_8`) AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_4` > ?) +SELECT max(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4) +SELECT table_1.column_5 AS alias_1, table_2.column_2 AS alias_2 FROM table_1 INNER JOIN table_2 ON (table_1.column_1 = table_2.column_1) +SELECT max(table_2.column_3) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4 +SELECT max(table_2.column_5) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4 +SELECT max(table_2.column_6) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_7) GROUP BY table_2.column_4 +SELECT max(table_2.column_8) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_9) GROUP BY table_2.column_4 +SELECT max(table_2.column_10) AS alias_1, table_2.column_11 AS alias_2, table_3.column_2 AS alias_3 FROM table_2 INNER JOIN table_3 ON (table_2.column_5 = table_3.column_1) GROUP BY table_2.column_11, table_3.column_2 +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_12)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_13)) +SELECT table_2.column_4 AS alias_1, table_2.column_14 AS alias_2, table_4.column_2 AS alias_3 FROM table_2 INNER JOIN table_4 ON (table_2.column_12 = table_4.column_1) WHERE (table_2.column_4 <= 1) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_15)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_16)) +SELECT table_2.column_4 AS alias_1, table_2.column_17 AS alias_2, table_5.column_2 AS alias_3 FROM table_2 INNER JOIN table_5 ON (table_2.column_5 = table_5.column_1) WHERE (table_2.column_4 <= 1) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= table_2.column_18) OR (table_2.column_4 <= table_2.column_19)) +SELECT table_2.column_4 AS alias_1, table_2.column_21 AS alias_2, table_6.column_2 AS alias_3 FROM table_2 INNER JOIN table_6 ON (table_2.column_20 = table_6.column_1) WHERE (table_2.column_4 <= table_2.column_20) +SELECT table_2.column_4 AS alias_1, table_2.column_23 AS alias_2, table_7.column_2 AS alias_3 FROM table_2 INNER JOIN table_7 ON (table_2.column_20 = table_7.column_1) WHERE (table_2.column_4 <= table_2.column_22) +SELECT max(table_7.column_3) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= 1)) GROUP BY table_7.column_4, table_7.column_4 +SELECT max(table_7.column_5) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) AND (table_7.column_4 <= table_7.column_6)) GROUP BY table_7.column_4, table_7.column_4 +SELECT max(table_7.column_7) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= table_7.column_8)) GROUP BY table_7.column_4, table_7.column_4 +SELECT max(table_7.column_9) AS alias_1, table_7.column_4 AS alias_2, table_7.column_10 AS alias_3, table_8.column_2 AS alias_4 FROM table_7 INNER JOIN table_8 ON (table_7.column_2 = table_8.column_1) WHERE (table_7.column_4 <= 1) GROUP BY table_7.column_4, table_7.column_10, table_8.column_2 +SELECT max(table_3.column_3) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_5)) GROUP BY table_3.column_4, table_3.column_4 +SELECT max(table_3.column_6) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_7)) GROUP BY table_3.column_4, table_3.column_4 +SELECT max(table_3.column_8) AS alias_1, table_3.column_4 AS alias_2, table_3.column_9 AS alias_3, table_9.column_2 AS alias_4 FROM table_3 INNER JOIN table_9 ON (table_3.column_6 = table_9.column_1) WHERE (table_3.column_4 <= 1) GROUP BY table_3.column_4, table_3.column_9, table_9.column_2 +SELECT max(table_3.column_10) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= table_3.column_11) OR (table_3.column_4 <= table_3.column_12)) GROUP BY table_3.column_4, table_3.column_4 +SELECT max(table_3.column_13) AS alias_1, table_3.column_4 AS alias_2, table_3.column_15 AS alias_3, table_10.column_2 AS alias_4 FROM table_3 INNER JOIN table_10 ON (table_3.column_11 = table_10.column_1) WHERE (table_3.column_4 <= table_3.column_14) GROUP BY table_3.column_4, table_3.column_15, table_10.column_2 +SELECT max(table_3.column_16) AS alias_1, table_3.column_4 AS alias_2, table_3.column_18 AS alias_3, table_11.column_2 AS alias_4 FROM table_3 INNER JOIN table_11 ON (table_3.column_10 = table_11.column_1) WHERE (table_3.column_4 <= table_3.column_17) GROUP BY table_3.column_4, table_3.column_18, table_11.column_2 +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) AND (table_3.column_4 <= table_3.column_19)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) OR (table_3.column_4 <= table_3.column_20)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_21 AS alias_3, table_12.column_2 AS alias_4 FROM table_3 INNER JOIN table_12 ON (table_3.column_20 = table_12.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_22)) OR (table_3.column_4 <= table_3.column_23)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_25 AS alias_3, table_13.column_2 AS alias_4 FROM table_3 INNER JOIN table_13 ON (table_3.column_20 = table_13.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_24)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_27 AS alias_3, table_14.column_2 AS alias_4 FROM table_3 INNER JOIN table_14 ON (table_3.column_20 = table_14.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_26)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_28)) OR (table_3.column_4 <= table_3.column_29)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_31 AS alias_3, table_15.column_2 AS alias_4 FROM table_3 INNER JOIN table_15 ON (table_3.column_20 = table_15.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_30)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_25 AS alias_3, table_16.column_2 AS alias_4 FROM table_2 INNER JOIN table_16 ON (table_2.column_20 = table_16.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_24)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_28 AS alias_3, table_17.column_2 AS alias_4 FROM table_2 INNER JOIN table_17 ON (table_2.column_20 = table_17.column_1) WHERE ((table_2.column_4 <= table_2.column_26) OR (table_2.column_4 <= table_2.column_27)) +SELECT max(table_2.column_29) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_30)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_31) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_32)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_33) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_34 AS alias_4, table_18.column_2 AS alias_5 FROM table_2 INNER JOIN table_18 ON (table_2.column_31 = table_18.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_34, table_18.column_2 +SELECT max(table_2.column_35) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_36)) OR (table_2.column_4 <= table_2.column_37)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_38) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_40 AS alias_4, table_19.column_2 AS alias_5 FROM table_2 INNER JOIN table_19 ON (table_2.column_31 = table_19.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_39)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_40, table_19.column_2 +SELECT max(table_2.column_41) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_43 AS alias_4, table_20.column_2 AS alias_5 FROM table_2 INNER JOIN table_20 ON (table_2.column_31 = table_20.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_42)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_43, table_20.column_2 +SELECT max(table_2.column_44) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_45)) OR (table_2.column_4 <= table_2.column_46)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_47) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_49 AS alias_4, table_21.column_2 AS alias_5 FROM table_2 INNER JOIN table_21 ON (table_2.column_31 = table_21.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_48)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_49, table_21.column_2 +SELECT max(table_2.column_50) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_52 AS alias_4, table_22.column_2 AS alias_5 FROM table_2 INNER JOIN table_22 ON (table_2.column_31 = table_22.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_51)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_52, table_22.column_2 +SELECT max(table_2.column_53) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_56 AS alias_4, table_23.column_2 AS alias_5 FROM table_2 INNER JOIN table_23 ON (table_2.column_31 = table_23.column_1) WHERE ((table_2.column_4 <= table_2.column_54) OR (table_2.column_4 <= table_2.column_55)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_56, table_23.column_2 +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_57)) OR (table_2.column_4 <= table_2.column_58)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_60 AS alias_4, table_24.column_2 AS alias_5 FROM table_2 INNER JOIN table_24 ON (table_2.column_42 = table_24.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_59)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_62 AS alias_4, table_25.column_2 AS alias_5 FROM table_2 INNER JOIN table_25 ON (table_2.column_42 = table_25.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_61)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_65 AS alias_4, table_26.column_2 AS alias_5 FROM table_2 INNER JOIN table_26 ON (table_2.column_42 = table_26.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_63)) OR (table_2.column_4 <= table_2.column_64)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_68 AS alias_4, table_27.column_2 AS alias_5 FROM table_2 INNER JOIN table_27 ON (table_2.column_42 = table_27.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_66)) OR (table_2.column_4 <= table_2.column_67)) +SELECT max(table_2.column_69) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_70)) OR (table_2.column_4 <= table_2.column_71)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_72) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_74 AS alias_5, table_28.column_2 AS alias_6 FROM table_2 INNER JOIN table_28 ON (table_2.column_42 = table_28.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_73)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_74, table_28.column_2 +SELECT max(table_2.column_75) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_77 AS alias_5, table_29.column_2 AS alias_6 FROM table_2 INNER JOIN table_29 ON (table_2.column_42 = table_29.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_76)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_77, table_29.column_2 +SELECT max(table_2.column_78) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_81 AS alias_5, table_30.column_2 AS alias_6 FROM table_2 INNER JOIN table_30 ON (table_2.column_42 = table_30.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_79)) OR (table_2.column_4 <= table_2.column_80)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_81, table_30.column_2 +SELECT max(table_2.column_82) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_85 AS alias_5, table_31.column_2 AS alias_6 FROM table_2 INNER JOIN table_31 ON (table_2.column_83 = table_31.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_83)) OR (table_2.column_4 <= table_2.column_84)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_85, table_31.column_2 +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_88 AS alias_5, table_32.column_2 AS alias_6 FROM table_2 INNER JOIN table_32 ON (table_2.column_83 = table_32.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_86)) OR (table_2.column_4 <= table_2.column_87)) +SELECT max(table_2.column_89) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5, table_2.column_92 AS alias_6, table_33.column_2 AS alias_7 FROM table_2 INNER JOIN table_33 ON (table_2.column_83 = table_33.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_90)) OR (table_2.column_4 <= table_2.column_91)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_92, table_33.column_2 +SELECT max(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4) +SELECT table_1.column_5 AS alias_1, table_2.column_2 AS alias_2 FROM table_1 INNER JOIN table_2 ON (table_1.column_1 = table_2.column_1) +SELECT max(table_2.column_3) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4 +SELECT max(table_2.column_5) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4 +SELECT max(table_2.column_6) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_7) GROUP BY table_2.column_4 +SELECT max(table_2.column_8) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_9) GROUP BY table_2.column_4 +SELECT max(table_2.column_10) AS alias_1, table_2.column_11 AS alias_2, table_3.column_2 AS alias_3 FROM table_2 INNER JOIN table_3 ON (table_2.column_5 = table_3.column_1) GROUP BY table_2.column_11, table_3.column_2 +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_12)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_13)) +SELECT table_2.column_4 AS alias_1, table_2.column_14 AS alias_2, table_4.column_2 AS alias_3 FROM table_2 INNER JOIN table_4 ON (table_2.column_12 = table_4.column_1) WHERE (table_2.column_4 <= 1) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_15)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_16)) +SELECT table_2.column_4 AS alias_1, table_2.column_17 AS alias_2, table_5.column_2 AS alias_3 FROM table_2 INNER JOIN table_5 ON (table_2.column_5 = table_5.column_1) WHERE (table_2.column_4 <= 1) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= table_2.column_18) OR (table_2.column_4 <= table_2.column_19)) +SELECT table_2.column_4 AS alias_1, table_2.column_21 AS alias_2, table_6.column_2 AS alias_3 FROM table_2 INNER JOIN table_6 ON (table_2.column_20 = table_6.column_1) WHERE (table_2.column_4 <= table_2.column_20) +SELECT table_2.column_4 AS alias_1, table_2.column_23 AS alias_2, table_7.column_2 AS alias_3 FROM table_2 INNER JOIN table_7 ON (table_2.column_20 = table_7.column_1) WHERE (table_2.column_4 <= table_2.column_22) +SELECT max(table_7.column_3) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= 1)) GROUP BY table_7.column_4, table_7.column_4 +SELECT max(table_7.column_5) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) AND (table_7.column_4 <= table_7.column_6)) GROUP BY table_7.column_4, table_7.column_4 +SELECT max(table_7.column_7) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= table_7.column_8)) GROUP BY table_7.column_4, table_7.column_4 +SELECT max(table_7.column_9) AS alias_1, table_7.column_4 AS alias_2, table_7.column_10 AS alias_3, table_8.column_2 AS alias_4 FROM table_7 INNER JOIN table_8 ON (table_7.column_2 = table_8.column_1) WHERE (table_7.column_4 <= 1) GROUP BY table_7.column_4, table_7.column_10, table_8.column_2 +SELECT max(table_3.column_3) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_5)) GROUP BY table_3.column_4, table_3.column_4 +SELECT max(table_3.column_6) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_7)) GROUP BY table_3.column_4, table_3.column_4 +SELECT max(table_3.column_8) AS alias_1, table_3.column_4 AS alias_2, table_3.column_9 AS alias_3, table_9.column_2 AS alias_4 FROM table_3 INNER JOIN table_9 ON (table_3.column_6 = table_9.column_1) WHERE (table_3.column_4 <= 1) GROUP BY table_3.column_4, table_3.column_9, table_9.column_2 +SELECT max(table_3.column_10) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= table_3.column_11) OR (table_3.column_4 <= table_3.column_12)) GROUP BY table_3.column_4, table_3.column_4 +SELECT max(table_3.column_13) AS alias_1, table_3.column_4 AS alias_2, table_3.column_15 AS alias_3, table_10.column_2 AS alias_4 FROM table_3 INNER JOIN table_10 ON (table_3.column_11 = table_10.column_1) WHERE (table_3.column_4 <= table_3.column_14) GROUP BY table_3.column_4, table_3.column_15, table_10.column_2 +SELECT max(table_3.column_16) AS alias_1, table_3.column_4 AS alias_2, table_3.column_18 AS alias_3, table_11.column_2 AS alias_4 FROM table_3 INNER JOIN table_11 ON (table_3.column_10 = table_11.column_1) WHERE (table_3.column_4 <= table_3.column_17) GROUP BY table_3.column_4, table_3.column_18, table_11.column_2 +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) AND (table_3.column_4 <= table_3.column_19)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) OR (table_3.column_4 <= table_3.column_20)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_21 AS alias_3, table_12.column_2 AS alias_4 FROM table_3 INNER JOIN table_12 ON (table_3.column_20 = table_12.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_22)) OR (table_3.column_4 <= table_3.column_23)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_25 AS alias_3, table_13.column_2 AS alias_4 FROM table_3 INNER JOIN table_13 ON (table_3.column_20 = table_13.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_24)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_27 AS alias_3, table_14.column_2 AS alias_4 FROM table_3 INNER JOIN table_14 ON (table_3.column_20 = table_14.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_26)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_28)) OR (table_3.column_4 <= table_3.column_29)) +SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_31 AS alias_3, table_15.column_2 AS alias_4 FROM table_3 INNER JOIN table_15 ON (table_3.column_20 = table_15.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_30)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_25 AS alias_3, table_16.column_2 AS alias_4 FROM table_2 INNER JOIN table_16 ON (table_2.column_20 = table_16.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_24)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_28 AS alias_3, table_17.column_2 AS alias_4 FROM table_2 INNER JOIN table_17 ON (table_2.column_20 = table_17.column_1) WHERE ((table_2.column_4 <= table_2.column_26) OR (table_2.column_4 <= table_2.column_27)) +SELECT max(table_2.column_29) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_30)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_31) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_32)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_33) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_34 AS alias_4, table_18.column_2 AS alias_5 FROM table_2 INNER JOIN table_18 ON (table_2.column_31 = table_18.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_34, table_18.column_2 +SELECT max(table_2.column_35) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_36)) OR (table_2.column_4 <= table_2.column_37)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_38) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_40 AS alias_4, table_19.column_2 AS alias_5 FROM table_2 INNER JOIN table_19 ON (table_2.column_31 = table_19.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_39)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_40, table_19.column_2 +SELECT max(table_2.column_41) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_43 AS alias_4, table_20.column_2 AS alias_5 FROM table_2 INNER JOIN table_20 ON (table_2.column_31 = table_20.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_42)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_43, table_20.column_2 +SELECT max(table_2.column_44) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_45)) OR (table_2.column_4 <= table_2.column_46)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_47) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_49 AS alias_4, table_21.column_2 AS alias_5 FROM table_2 INNER JOIN table_21 ON (table_2.column_31 = table_21.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_48)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_49, table_21.column_2 +SELECT max(table_2.column_50) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_52 AS alias_4, table_22.column_2 AS alias_5 FROM table_2 INNER JOIN table_22 ON (table_2.column_31 = table_22.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_51)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_52, table_22.column_2 +SELECT max(table_2.column_53) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_56 AS alias_4, table_23.column_2 AS alias_5 FROM table_2 INNER JOIN table_23 ON (table_2.column_31 = table_23.column_1) WHERE ((table_2.column_4 <= table_2.column_54) OR (table_2.column_4 <= table_2.column_55)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_56, table_23.column_2 +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_57)) OR (table_2.column_4 <= table_2.column_58)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_60 AS alias_4, table_24.column_2 AS alias_5 FROM table_2 INNER JOIN table_24 ON (table_2.column_42 = table_24.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_59)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_62 AS alias_4, table_25.column_2 AS alias_5 FROM table_2 INNER JOIN table_25 ON (table_2.column_42 = table_25.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_61)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_65 AS alias_4, table_26.column_2 AS alias_5 FROM table_2 INNER JOIN table_26 ON (table_2.column_42 = table_26.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_63)) OR (table_2.column_4 <= table_2.column_64)) +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_68 AS alias_4, table_27.column_2 AS alias_5 FROM table_2 INNER JOIN table_27 ON (table_2.column_42 = table_27.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_66)) OR (table_2.column_4 <= table_2.column_67)) +SELECT max(table_2.column_69) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_70)) OR (table_2.column_4 <= table_2.column_71)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4 +SELECT max(table_2.column_72) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_74 AS alias_5, table_28.column_2 AS alias_6 FROM table_2 INNER JOIN table_28 ON (table_2.column_42 = table_28.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_73)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_74, table_28.column_2 +SELECT max(table_2.column_75) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_77 AS alias_5, table_29.column_2 AS alias_6 FROM table_2 INNER JOIN table_29 ON (table_2.column_42 = table_29.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_76)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_77, table_29.column_2 +SELECT max(table_2.column_78) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_81 AS alias_5, table_30.column_2 AS alias_6 FROM table_2 INNER JOIN table_30 ON (table_2.column_42 = table_30.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_79)) OR (table_2.column_4 <= table_2.column_80)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_81, table_30.column_2 +SELECT max(table_2.column_82) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_85 AS alias_5, table_31.column_2 AS alias_6 FROM table_2 INNER JOIN table_31 ON (table_2.column_83 = table_31.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_83)) OR (table_2.column_4 <= table_2.column_84)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_85, table_31.column_2 +SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_88 AS alias_5, table_32.column_2 AS alias_6 FROM table_2 INNER JOIN table_32 ON (table_2.column_83 = table_32.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_86)) OR (table_2.column_4 <= table_2.column_87)) +SELECT max(table_2.column_89) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5, table_2.column_92 AS alias_6, table_33.column_2 AS alias_7 FROM table_2 INNER JOIN table_33 ON (table_2.column_83 = table_33.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_90)) OR (table_2.column_4 <= table_2.column_91)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_92, table_33.column_2 +SELECT count(distinct `table_1`.`column_1`) AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT count(distinct `table_1`.`column_3`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_4`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_4`) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_5`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_6`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_7`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= `table_1`.`column_4`)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) OR (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?)) +SELECT count(distinct `table_1`.`column_8`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_9`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_10`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_11`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_12`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_13`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_14`) AS `alias_1`, `table_1`.`column_14` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_14` <= `table_1`.`column_8`) AND (`table_1`.`column_14` > ?)) GROUP BY `table_1`.`column_14` +SELECT count(distinct `table_1`.`column_15`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_16`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_17`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8` +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT count(distinct `table_1`.`column_18`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_19`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_20`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_21`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_22`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_23`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_24`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_25`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_26`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_27`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_27` <= 1) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27` +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT count(distinct `table_1`.`column_28`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4`, `table_1`.`column_27` AS `alias_5` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27` +SELECT count(distinct `table_1`.`column_29`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_30`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_31`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_32`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT count(distinct `table_1`.`column_33`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4`, `table_1`.`column_8` AS `alias_5` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_1`) AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT count(distinct `table_1`.`column_3`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_4`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_4`) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_5`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_6`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1` +SELECT count(distinct `table_1`.`column_7`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= `table_1`.`column_4`)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?)) +SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) OR (`table_1`.`column_1` <= 1)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?)) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?)) +SELECT count(distinct `table_1`.`column_8`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_9`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_10`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_11`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_12`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_13`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_14`) AS `alias_1`, `table_1`.`column_14` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_14` <= `table_1`.`column_8`) AND (`table_1`.`column_14` > ?)) GROUP BY `table_1`.`column_14` +SELECT count(distinct `table_1`.`column_15`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_16`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_17`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8` +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT count(distinct `table_1`.`column_18`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_19`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_20`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_21`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_22`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_23`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_24`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_25`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_26`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_27`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_27` <= 1) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27` +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) +SELECT count(distinct `table_1`.`column_28`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4`, `table_1`.`column_27` AS `alias_5` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27` +SELECT count(distinct `table_1`.`column_29`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_30`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_31`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT count(distinct `table_1`.`column_32`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) +SELECT count(distinct `table_1`.`column_33`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4`, `table_1`.`column_8` AS `alias_5` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8` +SELECT avg(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4) +SELECT avg(table_1.column_5) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2 +SELECT avg(table_1.column_6) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2 +SELECT avg(table_1.column_7) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_8) GROUP BY table_1.column_2 +SELECT avg(table_1.column_9) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_10) GROUP BY table_1.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_11)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_12)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_13)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_14)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_15) OR (table_1.column_2 <= table_1.column_16)) +SELECT avg(table_1.column_17) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_18) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_19)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_20) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_21)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_22) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_23)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_24) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_25)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_26) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_27) OR (table_1.column_2 <= table_1.column_28)) GROUP BY table_1.column_2, table_1.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_29)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_30)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_31)) OR (table_1.column_2 <= table_1.column_32)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_33)) OR (table_1.column_2 <= table_1.column_34)) +SELECT avg(table_1.column_35) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_36)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_37) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_38)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_39) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_40)) OR (table_1.column_2 <= table_1.column_41)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_42) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_43)) OR (table_1.column_2 <= table_1.column_44)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_45)) OR (table_1.column_2 <= table_1.column_46)) +SELECT avg(table_1.column_47) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4, table_1.column_2 AS alias_5 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_48)) OR (table_1.column_2 <= table_1.column_49)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4) +SELECT avg(table_1.column_5) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2 +SELECT avg(table_1.column_6) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2 +SELECT avg(table_1.column_7) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_8) GROUP BY table_1.column_2 +SELECT avg(table_1.column_9) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_10) GROUP BY table_1.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_11)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_12)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_13)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_14)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_15) OR (table_1.column_2 <= table_1.column_16)) +SELECT avg(table_1.column_17) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_18) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_19)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_20) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_21)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_22) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_23)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_24) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_25)) GROUP BY table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_26) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_27) OR (table_1.column_2 <= table_1.column_28)) GROUP BY table_1.column_2, table_1.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_29)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_30)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_31)) OR (table_1.column_2 <= table_1.column_32)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_33)) OR (table_1.column_2 <= table_1.column_34)) +SELECT avg(table_1.column_35) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_36)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_37) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_38)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_39) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_40)) OR (table_1.column_2 <= table_1.column_41)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT avg(table_1.column_42) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_43)) OR (table_1.column_2 <= table_1.column_44)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_45)) OR (table_1.column_2 <= table_1.column_46)) +SELECT avg(table_1.column_47) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4, table_1.column_2 AS alias_5 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_48)) OR (table_1.column_2 <= table_1.column_49)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2, table_1.column_2 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (table_1.column_1 <= table_1.column_2) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (table_1.column_1 <= table_1.column_2) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) +SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10 +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?)) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?)) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?) +SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?)) +SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?)) +SELECT sum(table_1.column_1) AS alias_1 FROM table_1 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5 +SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5 +SELECT table_1.column_3 AS alias_1, table_2.column_2 AS alias_2 FROM table_1 LEFT JOIN table_2 ON (table_1.column_1 = table_2.column_1) +SELECT sum(table_1.column_4) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5 GROUP BY table_1.column_2 +SELECT sum(table_1.column_5) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5 GROUP BY table_1.column_2 +SELECT sum(table_1.column_6) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5 GROUP BY table_1.column_2 +SELECT sum(table_1.column_7) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5 GROUP BY table_1.column_2 +SELECT sum(table_1.column_8) AS alias_1, table_1.column_9 AS alias_2, table_3.column_2 AS alias_3 FROM table_1 LEFT JOIN table_3 ON (table_1.column_3 = table_3.column_1) GROUP BY table_1.column_9, table_3.column_2 +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 NOT BETWEEN 1 AND 5 AND table_1.column_2 BETWEEN 1 AND 5) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 NOT BETWEEN 1 AND 5 OR table_1.column_2 NOT BETWEEN 1 AND 5) +SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 NOT BETWEEN 1 AND 5 OR table_1.column_2 BETWEEN 1 AND 5) +SELECT table_1.column_2 AS alias_1, table_1.column_10 AS alias_2, table_4.column_2 AS alias_3 FROM table_1 LEFT JOIN table_4 ON (table_1.column_3 = table_4.column_1) WHERE table_1.column_2 NOT BETWEEN 1 AND 5 +SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2 FROM table_2 WHERE (table_2.column_3 BETWEEN 1 AND 5 OR table_2.column_3 NOT BETWEEN 1 AND 5) +SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2 FROM table_2 WHERE (table_2.column_3 BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5) +SELECT table_2.column_3 AS alias_1, table_2.column_4 AS alias_2, table_5.column_2 AS alias_3 FROM table_2 LEFT JOIN table_5 ON (table_2.column_1 = table_5.column_1) WHERE table_2.column_3 BETWEEN 1 AND 5 +SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2 FROM table_2 WHERE (table_2.column_3 NOT BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5) +SELECT table_2.column_3 AS alias_1, table_2.column_5 AS alias_2, table_6.column_2 AS alias_3 FROM table_2 LEFT JOIN table_6 ON (table_2.column_1 = table_6.column_1) WHERE table_2.column_3 NOT BETWEEN 1 AND 5 +SELECT table_2.column_3 AS alias_1, table_2.column_6 AS alias_2, table_7.column_2 AS alias_3 FROM table_2 LEFT JOIN table_7 ON (table_2.column_1 = table_7.column_1) WHERE table_2.column_3 BETWEEN 1 AND 5 +SELECT sum(table_7.column_3) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE (table_7.column_4 NOT BETWEEN 1 AND 5 AND table_7.column_4 BETWEEN 1 AND 5) GROUP BY table_7.column_4, table_7.column_4 +SELECT sum(table_7.column_5) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE (table_7.column_4 NOT BETWEEN 1 AND 5 OR table_7.column_4 NOT BETWEEN 1 AND 5) GROUP BY table_7.column_4, table_7.column_4 +SELECT sum(table_7.column_6) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE (table_7.column_4 NOT BETWEEN 1 AND 5 OR table_7.column_4 BETWEEN 1 AND 5) GROUP BY table_7.column_4, table_7.column_4 +SELECT sum(table_7.column_7) AS alias_1, table_7.column_4 AS alias_2, table_7.column_8 AS alias_3, table_8.column_2 AS alias_4 FROM table_7 LEFT JOIN table_8 ON (table_7.column_2 = table_8.column_1) WHERE table_7.column_4 NOT BETWEEN 1 AND 5 GROUP BY table_7.column_4, table_7.column_8, table_8.column_2 +SELECT sum(table_8.column_3) AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE (table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) GROUP BY table_8.column_4, table_8.column_4 +SELECT sum(table_8.column_5) AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE (table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 BETWEEN 1 AND 5) GROUP BY table_8.column_4, table_8.column_4 +SELECT sum(table_8.column_6) AS alias_1, table_8.column_4 AS alias_2, table_8.column_7 AS alias_3, table_9.column_2 AS alias_4 FROM table_8 LEFT JOIN table_9 ON (table_8.column_5 = table_9.column_1) WHERE table_8.column_4 BETWEEN 1 AND 5 GROUP BY table_8.column_4, table_8.column_7, table_9.column_2 +SELECT sum(table_8.column_8) AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 BETWEEN 1 AND 5) GROUP BY table_8.column_4, table_8.column_4 +SELECT sum(table_8.column_9) AS alias_1, table_8.column_4 AS alias_2, table_8.column_10 AS alias_3, table_10.column_2 AS alias_4 FROM table_8 LEFT JOIN table_10 ON (table_8.column_5 = table_10.column_1) WHERE table_8.column_4 NOT BETWEEN 1 AND 5 GROUP BY table_8.column_4, table_8.column_10, table_10.column_2 +SELECT sum(table_8.column_11) AS alias_1, table_8.column_4 AS alias_2, table_8.column_12 AS alias_3, table_11.column_2 AS alias_4 FROM table_8 LEFT JOIN table_11 ON (table_8.column_5 = table_11.column_1) WHERE table_8.column_4 BETWEEN 1 AND 5 GROUP BY table_8.column_4, table_8.column_12, table_11.column_2 +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 NOT BETWEEN 1 AND 5 AND table_8.column_4 BETWEEN 1 AND 5) OR table_8.column_4 NOT BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 NOT BETWEEN 1 AND 5 AND table_8.column_4 BETWEEN 1 AND 5) OR table_8.column_4 BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_13 AS alias_3, table_12.column_2 AS alias_4 FROM table_8 LEFT JOIN table_12 ON (table_8.column_5 = table_12.column_1) WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 AND table_8.column_4 BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) OR table_8.column_4 BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_14 AS alias_3, table_13.column_2 AS alias_4 FROM table_8 LEFT JOIN table_13 ON (table_8.column_5 = table_13.column_1) WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_15 AS alias_3, table_14.column_2 AS alias_4 FROM table_8 LEFT JOIN table_14 ON (table_8.column_5 = table_14.column_1) WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) OR table_8.column_4 BETWEEN 1 AND 5) +SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_16 AS alias_3, table_15.column_2 AS alias_4 FROM table_8 LEFT JOIN table_15 ON (table_8.column_6 = table_15.column_1) WHERE (table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) +SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2, table_2.column_7 AS alias_3, table_16.column_2 AS alias_4 FROM table_2 LEFT JOIN table_16 ON (table_2.column_1 = table_16.column_1) WHERE (table_2.column_3 BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5) +SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2, table_2.column_8 AS alias_3, table_17.column_2 AS alias_4 FROM table_2 LEFT JOIN table_17 ON (table_2.column_1 = table_17.column_1) WHERE (table_2.column_3 NOT BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5) +SELECT sum(table_2.column_9) AS alias_1, table_2.column_3 AS alias_2, table_2.column_3 AS alias_3, table_2.column_3 AS alias_4 FROM table_2 WHERE ((table_2.column_3 NOT BETWEEN 1 AND 5 AND table_2.column_3 BETWEEN 1 AND 5) OR table_2.column_3 NOT BETWEEN 1 AND 5) GROUP BY table_2.column_3, table_2.column_3, table_2.column_3 +SELECT sum(table_2.column_10) AS alias_1, table_2.column_3 AS alias_2, table_2.column_3 AS alias_3, table_2.column_3 AS alias_4 FROM table_2 WHERE ((table_2.column_3 NOT BETWEEN 1 AND 5 AND table_2.column_3 BETWEEN 1 AND 5) OR table_2.column_3 BETWEEN 1 AND 5) GROUP BY table_2.column_3, table_2.column_3, table_2.column_3 +SELECT sum(table_2.column_11) AS alias_1, table_2.column_3 AS alias_2, table_2.column_3 AS alias_3, table_2.column_12 AS alias_4, table_18.column_2 AS alias_5 FROM table_2 LEFT JOIN table_18 ON (table_2.column_1 = table_18.column_1) WHERE (table_2.column_3 NOT BETWEEN 1 AND 5 AND table_2.column_3 BETWEEN 1 AND 5) GROUP BY table_2.column_3, table_2.column_3, table_2.column_12, table_18.column_2 diff --git a/logictests/mysql/mediumint.test b/logictests/mysql/mediumint.test new file mode 100644 index 0000000000..2c72f8504e --- /dev/null +++ b/logictests/mysql/mediumint.test @@ -0,0 +1,23 @@ +statement ok +create table t1 (mint mediumint, umint mediumint unsigned); + +statement ok +insert into t1 values (-8388608, 0), (8388607, 16777215); + +statement error +insert into t1 values (-8388609, 0); + +statement error +insert into t1 values (8388608, 0); + +statement error +insert into t1 values (0, -1); + +statement error +insert into t1 values (0, 16777216); + +query I +select umint from t1 where mint = ?; +? = 8388607 +---- +16777215 diff --git a/logictests/psql/bit.test b/logictests/psql/bit.test new file mode 100644 index 0000000000..a3b6b50fb2 --- /dev/null +++ b/logictests/psql/bit.test @@ -0,0 +1,20 @@ +statement ok +create table t1 (b bit(3)); + +statement ok +insert into t1 values (b'111'); + +statement ok +insert into t1 values (b'010'); + +query BV +select * from t1 where b = $1 +? = b'111' +---- +b'111' + +query BV +select * from t1 where b = $1 +? = b'010' +---- +b'010' diff --git a/logictests/truncate.test b/logictests/truncate.test new file mode 100644 index 0000000000..05dff3cebd --- /dev/null +++ b/logictests/truncate.test @@ -0,0 +1,12 @@ +statement ok +create table t (x int); + +statement ok +insert into t (x) values (1); + +statement ok +truncate t; + +query +select * from t where x = 1; +---- diff --git a/merging-interval-tree/Cargo.toml b/merging-interval-tree/Cargo.toml index b90685e796..d5191b96c5 100644 --- a/merging-interval-tree/Cargo.toml +++ b/merging-interval-tree/Cargo.toml @@ -9,5 +9,5 @@ description = "An efficient non-overlapping interval tree that merges overlappin [dependencies] [dev-dependencies] -test-strategy = "0.2" -proptest = "1.0" +test-strategy = { workspace = true } +proptest = { workspace = true } diff --git a/mysql-srv/Cargo.toml b/mysql-srv/Cargo.toml index ac71d9bb53..340e1f0bc2 100644 --- a/mysql-srv/Cargo.toml +++ b/mysql-srv/Cargo.toml @@ -12,28 +12,27 @@ keywords = ["api-bindings", "database", "sql", "mock"] categories = ["api-bindings", "network-programming", "database-implementations"] [dependencies] -nom = "7.1" +nom = { workspace = true } mysql_async = { workspace = true } -mysql_common = { version = "0.32", features = ["chrono"] } -byteorder = "1" -chrono = "0.4" -time = "0.3" -getrandom = "0.2.2" -async-trait = "0.1" +mysql_common = { workspace = true, features = ["chrono"] } +byteorder = { workspace = true } +chrono = { workspace = true } +time = { workspace = true } +getrandom = { workspace = true } tokio = { workspace = true, features = ["full"] } -thiserror = "1.0.26" -sha-1 = "0.10.0" +thiserror = { workspace = true } +sha-1 = { workspace = true } mysql-time = { path = "../mysql-time" } -tracing = "0.1.35" +tracing = { workspace = true } readyset-adapter-types = { path = "../readyset-adapter-types" } readyset-data = { path = "../readyset-data" } [dev-dependencies] tokio-postgres = { workspace = true } -mysql = "25" +mysql = { workspace = true } -slab = "0.4.2" -futures = "0.3" +slab = { workspace = true } +futures = { workspace = true } test-utils = { path = "../test-utils" } diff --git a/mysql-srv/src/commands.rs b/mysql-srv/src/commands.rs index c3431fc2ab..f23300e211 100644 --- a/mysql-srv/src/commands.rs +++ b/mysql-srv/src/commands.rs @@ -11,7 +11,9 @@ use crate::myc::constants::{CapabilityFlags, Command as CommandByte, UTF8MB4_GEN #[derive(Debug)] pub struct ClientHandshake<'a> { pub capabilities: CapabilityFlags, + #[allow(dead_code)] pub maxps: u32, + #[allow(dead_code)] pub charset: u16, pub username: &'a str, pub password: &'a [u8], @@ -24,6 +26,7 @@ pub struct ClientChangeUser<'a> { pub username: &'a str, pub password: &'a [u8], pub database: Option<&'a str>, + #[allow(dead_code)] pub charset: u16, pub auth_plugin_name: &'a str, } diff --git a/mysql-srv/src/lib.rs b/mysql-srv/src/lib.rs index e449c6cafa..021376f368 100644 --- a/mysql-srv/src/lib.rs +++ b/mysql-srv/src/lib.rs @@ -22,14 +22,12 @@ //! use std::collections::HashMap; //! use std::iter; //! -//! use async_trait::async_trait; //! use mysql::prelude::*; //! use mysql_srv::*; //! use readyset_adapter_types::DeallocateId; //! use tokio::io::AsyncWrite; //! //! struct Backend; -//! #[async_trait] //! impl MySqlShim for Backend { //! async fn on_prepare( //! &mut self, @@ -171,7 +169,6 @@ use std::collections::HashMap; use std::io; use std::sync::Arc; -use async_trait::async_trait; use constants::{CLIENT_PLUGIN_AUTH, CONNECT_WITH_DB, PROTOCOL_41, RESERVED, SECURE_CONNECTION}; use error::{other_error, OtherErrorKind}; use mysql_common::constants::CapabilityFlags; @@ -250,7 +247,8 @@ pub enum QueryResultsResponse { } /// Implementors of this trait can be used to drive a MySQL-compatible database backend. -#[async_trait] +// Only used internally +#[allow(async_fn_in_trait)] pub trait MySqlShim { /// Called when the client issues a request to prepare `query` for later execution. /// @@ -711,6 +709,7 @@ impl + Send, R: AsyncRead + Unpin, W: AsyncWrite + Unpin + Send> self.shim.on_close(dealloc_id.clone()).await; if let DeallocateId::Numeric(id) = dealloc_id { stmts.remove(&id); + self.schema_cache.remove(&id); } writers::write_ok_packet( &mut self.writer, @@ -786,6 +785,7 @@ impl + Send, R: AsyncRead + Unpin, W: AsyncWrite + Unpin + Send> Command::Close(stmt) => { self.shim.on_close(DeallocateId::Numeric(stmt)).await; stmts.remove(&stmt); + self.schema_cache.remove(&stmt); // NOTE: spec dictates no response from server } Command::ListFields(_) => { diff --git a/mysql-srv/src/value/decode.rs b/mysql-srv/src/value/decode.rs index bfe78b59ed..5e44bfea1f 100644 --- a/mysql-srv/src/value/decode.rs +++ b/mysql-srv/src/value/decode.rs @@ -456,59 +456,23 @@ mod tests { );*/ rt!(f64_one, f64, 1.0, ColumnType::MYSQL_TYPE_DOUBLE, false); - rt!( - u8_max, - u8, - u8::max_value(), - ColumnType::MYSQL_TYPE_TINY, - false - ); - rt!( - i8_max, - i8, - i8::max_value(), - ColumnType::MYSQL_TYPE_TINY, - true - ); - rt!( - u16_max, - u16, - u16::max_value(), - ColumnType::MYSQL_TYPE_SHORT, - false - ); - rt!( - i16_max, - i16, - i16::max_value(), - ColumnType::MYSQL_TYPE_SHORT, - true - ); - rt!( - u32_max, - u32, - u32::max_value(), - ColumnType::MYSQL_TYPE_LONG, - false - ); - rt!( - i32_max, - i32, - i32::max_value(), - ColumnType::MYSQL_TYPE_LONG, - true - ); + rt!(u8_max, u8, u8::MAX, ColumnType::MYSQL_TYPE_TINY, false); + rt!(i8_max, i8, i8::MAX, ColumnType::MYSQL_TYPE_TINY, true); + rt!(u16_max, u16, u16::MAX, ColumnType::MYSQL_TYPE_SHORT, false); + rt!(i16_max, i16, i16::MAX, ColumnType::MYSQL_TYPE_SHORT, true); + rt!(u32_max, u32, u32::MAX, ColumnType::MYSQL_TYPE_LONG, false); + rt!(i32_max, i32, i32::MAX, ColumnType::MYSQL_TYPE_LONG, true); rt!( u64_max, u64, - u64::max_value(), + u64::MAX, ColumnType::MYSQL_TYPE_LONGLONG, false ); rt!( i64_max, i64, - i64::max_value(), + i64::MAX, ColumnType::MYSQL_TYPE_LONGLONG, true ); diff --git a/mysql-srv/src/value/encode.rs b/mysql-srv/src/value/encode.rs index 1cd4017ac1..9765eadb59 100644 --- a/mysql-srv/src/value/encode.rs +++ b/mysql-srv/src/value/encode.rs @@ -2,6 +2,7 @@ use std::io::{self, Write}; use byteorder::{LittleEndian, WriteBytesExt}; use mysql_time::MySqlTime; +use readyset_data::TimestampTz; use crate::error::{other_error, OtherErrorKind}; use crate::myc::constants::{ColumnFlags, ColumnType}; @@ -71,8 +72,8 @@ where // NOTE: yes, I know the = / => distinction is ugly macro_rules! like_try_into { ($self:ident, $source:ty = $target:ty, $w:ident, $m:ident, $c:ident) => {{ - let min = <$target>::min_value() as $source; - let max = <$target>::max_value() as $source; + let min = <$target>::MIN as $source; + let max = <$target>::MAX as $source; if *$self <= max && *$self >= min { $w.$m(*$self as $target) } else { @@ -80,8 +81,8 @@ macro_rules! like_try_into { } }}; ($self:ident, $source:ty => $target:ty, $w:ident, $m:ident, $c:ident) => {{ - let min = <$target>::min_value() as $source; - let max = <$target>::max_value() as $source; + let min = <$target>::MIN as $source; + let max = <$target>::MAX as $source; if *$self <= max && *$self >= min { $w.$m::(*$self as $target) } else { @@ -506,6 +507,71 @@ impl ToMySqlValue for MySqlTime { } } +impl ToMySqlValue for TimestampTz { + fn to_mysql_text(&self, w: &mut W) -> io::Result<()> { + w.write_lenenc_str(self.to_string().as_bytes()).map(|_| ()) + } + + fn to_mysql_bin(&self, w: &mut W, c: &Column) -> io::Result<()> { + let ts = self.to_chrono(); + match c.coltype { + ColumnType::MYSQL_TYPE_DATETIME | ColumnType::MYSQL_TYPE_TIMESTAMP => { + // https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_binary_resultset.html + // To save space the packet can be compressed: + // if year, month, day, hour, minutes, seconds and microseconds are all 0, length is + // 0 and no other field is sent. if hour, seconds and microseconds + // are all 0, length is 4 and no other field is sent. + // if microseconds is 0, length is 7 and micro_seconds is not sent. + // otherwise the length is 11 + // TODO(marce): Currently TimestampTZ will produce NULL for zero/invalid dates. + let us = ts.nanosecond() / 1_000; + let packet_len = if us != 0 { + 11 + } else if (ts.hour(), ts.minute(), ts.second()) != (0, 0, 0) { + 7 + } else if (ts.year(), ts.month(), ts.day()) != (0, 0, 0) { + 4 + } else { + 0 + }; + + w.write_u8(packet_len)?; + + if packet_len == 0 { + return Ok(()); // no need to write anything else + } + + w.write_u16::(ts.year() as u16)?; + w.write_u8(ts.month() as u8)?; + w.write_u8(ts.day() as u8)?; + + if packet_len == 4 { + return Ok(()); // no need to write time + } + + w.write_u8(ts.hour() as u8)?; + w.write_u8(ts.minute() as u8)?; + w.write_u8(ts.second() as u8)?; + + if packet_len == 7 { + return Ok(()); // no need to write microseconds + } + + w.write_u32::(us)?; + + Ok(()) + } + ColumnType::MYSQL_TYPE_DATE => { + if ts.time() != NaiveTime::from_hms_opt(0, 0, 0).unwrap() { + return Err(bad(self, c)); + } + ts.date_naive().to_mysql_bin(w, c) + } + _ => Err(bad(self, c)), + } + } +} + impl ToMySqlValue for NaiveDateTime { fn to_mysql_text(&self, w: &mut W) -> io::Result<()> { let us = self.nanosecond() / 1_000; @@ -684,25 +750,25 @@ impl ToMySqlValue for myc::value::Value { // smallest containing type, and then call on that let signed = !c.colflags.contains(ColumnFlags::UNSIGNED_FLAG); if signed { - if n >= i64::from(i8::min_value()) && n <= i64::from(i8::max_value()) { + if n >= i64::from(i8::MIN) && n <= i64::from(i8::MAX) { (n as i8).to_mysql_bin(w, c) - } else if n >= i64::from(i16::min_value()) && n <= i64::from(i16::max_value()) { + } else if n >= i64::from(i16::MIN) && n <= i64::from(i16::MAX) { (n as i16).to_mysql_bin(w, c) - } else if n >= i64::from(i32::min_value()) && n <= i64::from(i32::max_value()) { + } else if n >= i64::from(i32::MIN) && n <= i64::from(i32::MAX) { (n as i32).to_mysql_bin(w, c) } else { n.to_mysql_bin(w, c) } } else if n < 0 { Err(bad(self, c)) - } else if n <= i64::from(u8::max_value()) { + } else if n <= i64::from(u8::MAX) { (n as u8).to_mysql_bin(w, c) - } else if n <= i64::from(u16::max_value()) { + } else if n <= i64::from(u16::MAX) { (n as u16).to_mysql_bin(w, c) - } else if n <= i64::from(u32::max_value()) { + } else if n <= i64::from(u32::MAX) { (n as u32).to_mysql_bin(w, c) } else { - // must work since u64::max_value() > i64::max_value(), and n >= 0 + // must work since u64::MAX > i64::MAX, and n >= 0 (n as u64).to_mysql_bin(w, c) } } @@ -793,14 +859,14 @@ mod tests { rt!(f32_one, f32, 1.0); rt!(f64_one, f64, 1.0); - rt!(u8_max, u8, u8::max_value()); - rt!(i8_max, i8, i8::max_value()); - rt!(u16_max, u16, u16::max_value()); - rt!(i16_max, i16, i16::max_value()); - rt!(u32_max, u32, u32::max_value()); - rt!(i32_max, i32, i32::max_value()); - rt!(u64_max, u64, u64::max_value()); - rt!(i64_max, i64, i64::max_value()); + rt!(u8_max, u8, u8::MAX); + rt!(i8_max, i8, i8::MAX); + rt!(u16_max, u16, u16::MAX); + rt!(i16_max, i16, i16::MAX); + rt!(u32_max, u32, u32::MAX); + rt!(i32_max, i32, i32::MAX); + rt!(u64_max, u64, u64::MAX); + rt!(i64_max, i64, i64::MAX); rt!(opt_none, Option, None); rt!(opt_some, Option, Some(1)); @@ -927,59 +993,23 @@ mod tests { );*/ rt!(f64_one, f64, 1.0, ColumnType::MYSQL_TYPE_DOUBLE, false); - rt!( - u8_max, - u8, - u8::max_value(), - ColumnType::MYSQL_TYPE_TINY, - false - ); - rt!( - i8_max, - i8, - i8::max_value(), - ColumnType::MYSQL_TYPE_TINY, - true - ); - rt!( - u16_max, - u16, - u16::max_value(), - ColumnType::MYSQL_TYPE_SHORT, - false - ); - rt!( - i16_max, - i16, - i16::max_value(), - ColumnType::MYSQL_TYPE_SHORT, - true - ); - rt!( - u32_max, - u32, - u32::max_value(), - ColumnType::MYSQL_TYPE_LONG, - false - ); - rt!( - i32_max, - i32, - i32::max_value(), - ColumnType::MYSQL_TYPE_LONG, - true - ); + rt!(u8_max, u8, u8::MAX, ColumnType::MYSQL_TYPE_TINY, false); + rt!(i8_max, i8, i8::MAX, ColumnType::MYSQL_TYPE_TINY, true); + rt!(u16_max, u16, u16::MAX, ColumnType::MYSQL_TYPE_SHORT, false); + rt!(i16_max, i16, i16::MAX, ColumnType::MYSQL_TYPE_SHORT, true); + rt!(u32_max, u32, u32::MAX, ColumnType::MYSQL_TYPE_LONG, false); + rt!(i32_max, i32, i32::MAX, ColumnType::MYSQL_TYPE_LONG, true); rt!( u64_max, u64, - u64::max_value(), + u64::MAX, ColumnType::MYSQL_TYPE_LONGLONG, false ); rt!( i64_max, i64, - i64::max_value(), + i64::MAX, ColumnType::MYSQL_TYPE_LONGLONG, true ); diff --git a/mysql-srv/tests/main.rs b/mysql-srv/tests/main.rs index a77ebb6862..b873b98bb9 100644 --- a/mysql-srv/tests/main.rs +++ b/mysql-srv/tests/main.rs @@ -14,7 +14,6 @@ use std::marker::PhantomData; use std::pin::Pin; use std::{io, net, thread}; -use async_trait::async_trait; use mysql::prelude::Queryable; use mysql::Row; use mysql_srv::{ @@ -38,7 +37,6 @@ struct TestingShim { _phantom: PhantomData, } -#[async_trait] impl MySqlShim for TestingShim where Q: for<'a> FnMut( @@ -118,7 +116,7 @@ where ) -> QueryResultsResponse { if query.starts_with("SELECT @@") || query.starts_with("select @@") { let var = &query.get(b"SELECT @@".len()..); - return match var { + match var { Some("max_allowed_packet") => { let cols = &[Column { table: String::new(), @@ -133,7 +131,7 @@ where QueryResultsResponse::IoResult(w.finish().await) } _ => QueryResultsResponse::IoResult(results.completed(0, 0, None).await), - }; + } } else { QueryResultsResponse::IoResult((self.on_q)(query, results).await) } diff --git a/mysql-time/Cargo.toml b/mysql-time/Cargo.toml index f1f35afa5a..6b49d8f053 100644 --- a/mysql-time/Cargo.toml +++ b/mysql-time/Cargo.toml @@ -6,15 +6,15 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -nom = "7.1" -regex = "1.4.3" -serde = { version = "1.0.8", features = ["rc"] } +nom = { workspace = true } +regex = { workspace = true } +serde = { workspace = true, features = ["rc"] } readyset-util = { path = "../readyset-util" } -proptest = "1.0.0" -thiserror = "1.0.26" -chrono = "0.4" -mysql_common = "0.32" +proptest = { workspace = true } +thiserror = { workspace = true } +chrono = { workspace = true } +mysql_common = { workspace = true } [dev-dependencies] -test-strategy = "0.2.0" +test-strategy = { workspace = true } diff --git a/mysql-time/src/lib.rs b/mysql-time/src/lib.rs index 471693d548..d3991c892c 100644 --- a/mysql-time/src/lib.rs +++ b/mysql-time/src/lib.rs @@ -51,9 +51,19 @@ pub struct MySqlTime { } impl MySqlTime { + /// The maximum value that a [`MySqlTime`] can represent: `838:59:59`. + pub const MAX: MySqlTime = MySqlTime { + nanos: MAX_MYSQL_TIME_SECONDS * 10i64.pow(9), + }; + + /// The minimum value that a [`MySqlTime`] can represent: `-838:59:59`. + pub const MIN: MySqlTime = MySqlTime { + nanos: -MAX_MYSQL_TIME_SECONDS * 10i64.pow(9), + }; + /// Creates a new [`MySqlTime`] with the given [`chrono::Duration`]. /// Note that if the [`chrono::Duration`] surpasses the MySQL's TIME max value, then - /// the [`MySqlTime::max_value()`] is used (resp. [`MySqlTime::min_value()`] if the + /// the [`MySqlTime::MAX`] is used (resp. [`MySqlTime::MIN`] if the /// [`chrono::Duration`] falls below the MySQL's TIME min value). /// /// # Example @@ -82,10 +92,10 @@ impl MySqlTime { pub fn new(duration: Duration) -> MySqlTime { let secs = duration.num_seconds(); if secs > MAX_MYSQL_TIME_SECONDS { - return MySqlTime::max_value(); + return MySqlTime::MAX; } if secs < (-MAX_MYSQL_TIME_SECONDS) { - return MySqlTime::min_value(); + return MySqlTime::MIN; } MySqlTime { nanos: duration.num_nanoseconds().expect("Limit checked above"), @@ -192,32 +202,6 @@ impl MySqlTime { )) } - /// Returns the maximum value that a [`MySqlTime`] can represent: `838:59:59`. - /// - /// # Example - /// - /// ```rust - /// use mysql_time::MySqlTime; - /// - /// let mysql_time_max: MySqlTime = MySqlTime::max_value(); // 838:59:59 - /// ``` - pub fn max_value() -> MySqlTime { - MySqlTime::new(Duration::seconds(MAX_MYSQL_TIME_SECONDS)) - } - - /// Returns the minimum value that a [`MySqlTime`] can represent: `-838:59:59`. - /// - /// # Example - /// - /// ``` - /// use mysql_time::MySqlTime; - /// - /// let mysql_time_min: MySqlTime = MySqlTime::min_value(); // -838:59:59 - /// ``` - pub fn min_value() -> MySqlTime { - MySqlTime::new(Duration::seconds(-MAX_MYSQL_TIME_SECONDS)) - } - /// Returns the sign of the [`MySqlTime`] as 1 if it's positive, or -1 if it's negative. /// /// # Example @@ -747,7 +731,7 @@ mod tests { #[proptest] fn from_microseconds(#[strategy(arbitrary_duration())] duration: Duration) { let mysql_time = - MySqlTime::from_microseconds(duration.num_microseconds().unwrap_or(i64::max_value())); + MySqlTime::from_microseconds(duration.num_microseconds().unwrap_or(i64::MAX)); let total_secs = duration.num_seconds(); assert_valid!(mysql_time, total_secs); } diff --git a/nom-sql-arbitrary/Cargo.toml b/nom-sql-arbitrary/Cargo.toml index 4ac020e953..e2683b1a34 100644 --- a/nom-sql-arbitrary/Cargo.toml +++ b/nom-sql-arbitrary/Cargo.toml @@ -12,5 +12,5 @@ description = "A library with proptest utility to generate AST structs." [dependencies] nom-sql = { path = "../nom-sql" } -proptest = "1.0.0" +proptest = { workspace = true } readyset-util = { path = "../readyset-util" } diff --git a/nom-sql/Cargo.toml b/nom-sql/Cargo.toml index 517cadce3e..8ca39f113d 100644 --- a/nom-sql/Cargo.toml +++ b/nom-sql/Cargo.toml @@ -12,38 +12,38 @@ description = "A SQL parser written using nom." [dependencies] clap = { workspace = true, features = ["derive"] } -serde = { version = "1.0", features = ["derive"] } -nom = "7.1" -itertools = "0.10" -derive_more = "0.99.13" -pratt = "0.3.0" -proptest = "1.0.0" -test-strategy = "0.2.0" +serde = { workspace = true, features = ["derive"] } +nom = { workspace = true } +itertools = { workspace = true } +derive_more = { workspace = true } +pratt = { workspace = true } +proptest = { workspace = true } +test-strategy = { workspace = true } readyset-util = { path = "../readyset-util" } -thiserror = "1.0.26" -hex = "0.4.3" -rust_decimal = { version = "1.26", features = ["db-tokio-postgres"] } +thiserror = { workspace = true } +hex = { workspace = true } +rust_decimal = { workspace = true, features = ["db-tokio-postgres"] } eui48 = { workspace = true } -uuid = { version = "0.8", features = ["v4"] } -serde_json = { version = "1", features = ["arbitrary_precision"] } -bit-vec = { version = "0.6", features = ["serde"] } -triomphe = "0.1" -lazy_static = "1.4" -nom_locate = "4.0.0" -fail = "0.5.0" -chrono = "0.4" +uuid = { workspace = true, features = ["v4"] } +serde_json = { workspace = true, features = ["arbitrary_precision"] } +bit-vec = { workspace = true, features = ["serde"] } +triomphe = { workspace = true } +lazy_static = { workspace = true } +nom_locate = { workspace = true } +fail = { workspace = true } +chrono = { workspace = true } concrete-iter = { path = "../concrete-iter" } failpoint-macros = { path = "../failpoint-macros" } [dev-dependencies] -assert_approx_eq = "1.1.0" -pretty_assertions = "1.4.0" -bincode = "1.3" +assert_approx_eq = { workspace = true } +pretty_assertions = { workspace = true } +bincode = { workspace = true } criterion = { workspace = true, features = ["html_reports"] } -pprof = { version = "0.13", features = ["flamegraph", "criterion"] } -sqlparser = "0.41.0" +pprof = { workspace = true, features = ["flamegraph", "criterion"] } +sqlparser = { workspace = true } [[bench]] name = "analysis" diff --git a/nom-sql/src/analysis.rs b/nom-sql/src/analysis.rs index bb22dd0993..e37fb70d51 100644 --- a/nom-sql/src/analysis.rs +++ b/nom-sql/src/analysis.rs @@ -95,6 +95,7 @@ impl<'a> ReferredColumnsIter<'a> { Avg { expr, .. } => self.visit_expr(expr), Count { expr, .. } => self.visit_expr(expr), CountStar => None, + Extract { expr, .. } => self.visit_expr(expr), Sum { expr, .. } => self.visit_expr(expr), Max(arg) => self.visit_expr(arg), Min(arg) => self.visit_expr(arg), @@ -206,6 +207,7 @@ impl<'a> ReferredColumnsMut<'a> { Avg { expr, .. } => self.visit_expr(expr), Count { expr, .. } => self.visit_expr(expr), CountStar => None, + Extract { expr, .. } => self.visit_expr(expr), Sum { expr, .. } => self.visit_expr(expr), Max(arg) => self.visit_expr(arg), Min(arg) => self.visit_expr(arg), @@ -345,7 +347,8 @@ pub fn is_aggregate(function: &FunctionExpr) -> bool { | FunctionExpr::Max(_) | FunctionExpr::Min(_) | FunctionExpr::GroupConcat { .. } => true, - FunctionExpr::Substring { .. } + FunctionExpr::Extract { .. } + | FunctionExpr::Substring { .. } // For now, assume all "generic" function calls are not aggregates | FunctionExpr::Call { .. } => false, } diff --git a/nom-sql/src/analysis/visit.rs b/nom-sql/src/analysis/visit.rs index 82751a0467..d0c08d581e 100644 --- a/nom-sql/src/analysis/visit.rs +++ b/nom-sql/src/analysis/visit.rs @@ -10,11 +10,13 @@ #![warn(clippy::todo, clippy::unimplemented)] +use crate::create::{CreateDatabaseOption, CreateDatabaseStatement}; use crate::create_table_options::CreateTableOption; use crate::rename::{RenameTableOperation, RenameTableStatement}; use crate::select::LimitClause; use crate::set::Variable; use crate::transaction::{CommitStatement, RollbackStatement, StartTransactionStatement}; +use crate::truncate::TruncateStatement; use crate::{ AlterColumnOperation, AlterTableDefinition, AlterTableStatement, CacheInner, CaseWhenBranch, Column, ColumnConstraint, ColumnSpecification, CommentStatement, CommonTableExpr, @@ -90,6 +92,10 @@ pub trait Visitor<'ast>: Sized { walk_relation(self, table) } + fn visit_target_table_fk(&mut self, table: &'ast Relation) -> Result<(), Self::Error> { + walk_relation(self, table) + } + fn visit_literal(&mut self, _literal: &'ast Literal) -> Result<(), Self::Error> { Ok(()) } @@ -204,6 +210,13 @@ pub trait Visitor<'ast>: Sized { walk_create_table_statement(self, create_table_statement) } + fn visit_create_database_statement( + &mut self, + create_database_statement: &'ast CreateDatabaseStatement, + ) -> Result<(), Self::Error> { + walk_create_database_statement(self, create_database_statement) + } + fn visit_column_specification( &mut self, column_specification: &'ast ColumnSpecification, @@ -222,6 +235,13 @@ pub trait Visitor<'ast>: Sized { Ok(()) } + fn visit_create_database_option( + &mut self, + _create_database_option: &'ast CreateDatabaseOption, + ) -> Result<(), Self::Error> { + Ok(()) + } + fn visit_column_constraint( &mut self, column_constraint: &'ast ColumnConstraint, @@ -422,6 +442,13 @@ pub trait Visitor<'ast>: Sized { Ok(()) } + fn visit_truncate_statement( + &mut self, + truncate_statement: &'ast TruncateStatement, + ) -> Result<(), Self::Error> { + walk_truncate_statement(self, truncate_statement) + } + fn visit_sql_query(&mut self, sql_query: &'ast SqlQuery) -> Result<(), Self::Error> { walk_sql_query(self, sql_query) } @@ -508,6 +535,7 @@ pub fn walk_function_expr<'ast, V: Visitor<'ast>>( FunctionExpr::Max(expr) => visitor.visit_expr(expr.as_ref()), FunctionExpr::Min(expr) => visitor.visit_expr(expr.as_ref()), FunctionExpr::GroupConcat { expr, .. } => visitor.visit_expr(expr.as_ref()), + FunctionExpr::Extract { expr, .. } => visitor.visit_expr(expr.as_ref()), FunctionExpr::Call { arguments, .. } => { for arg in arguments { visitor.visit_expr(arg)?; @@ -770,6 +798,20 @@ pub fn walk_create_table_statement<'a, V: Visitor<'a>>( Ok(()) } +pub fn walk_create_database_statement<'a, V: Visitor<'a>>( + visitor: &mut V, + create_database_statement: &'a CreateDatabaseStatement, +) -> Result<(), V::Error> { + visitor.visit_sql_identifier(&create_database_statement.name)?; + if let Ok(options) = &create_database_statement.options { + for option in options { + visitor.visit_create_database_option(option)?; + } + } + + Ok(()) +} + pub fn walk_column_specification<'a, V: Visitor<'a>>( visitor: &mut V, column_specification: &'a ColumnSpecification, @@ -866,7 +908,7 @@ pub fn walk_table_key<'a, V: Visitor<'a>>( for column in columns { visitor.visit_column(column)?; } - visitor.visit_table(target_table)?; + visitor.visit_target_table_fk(target_table)?; for column in target_columns { visitor.visit_column(column)?; } @@ -1123,6 +1165,17 @@ pub fn walk_drop_view_statement<'a, V: Visitor<'a>>( Ok(()) } +pub fn walk_truncate_statement<'a, V: Visitor<'a>>( + visitor: &mut V, + truncate_statement: &'a TruncateStatement, +) -> Result<(), V::Error> { + for table in &truncate_statement.tables { + visitor.visit_table(&table.relation)?; + } + + Ok(()) +} + pub fn walk_sql_query<'a, V: Visitor<'a>>( visitor: &mut V, sql_query: &'a SqlQuery, @@ -1156,6 +1209,8 @@ pub fn walk_sql_query<'a, V: Visitor<'a>>( SqlQuery::Explain(statement) => visitor.visit_explain_statement(statement), SqlQuery::Comment(statement) => visitor.visit_comment_statement(statement), SqlQuery::Deallocate(statement) => visitor.visit_deallocate_statement(statement), + SqlQuery::Truncate(statement) => visitor.visit_truncate_statement(statement), + SqlQuery::CreateDatabase(statement) => visitor.visit_create_database_statement(statement), } } diff --git a/nom-sql/src/analysis/visit_mut.rs b/nom-sql/src/analysis/visit_mut.rs index d183b456a9..bb82b37518 100644 --- a/nom-sql/src/analysis/visit_mut.rs +++ b/nom-sql/src/analysis/visit_mut.rs @@ -10,11 +10,13 @@ #![warn(clippy::todo, clippy::unimplemented)] +use crate::create::{CreateDatabaseOption, CreateDatabaseStatement}; use crate::create_table_options::CreateTableOption; use crate::rename::{RenameTableOperation, RenameTableStatement}; use crate::select::{LimitClause, LimitValue}; use crate::set::Variable; use crate::transaction::{CommitStatement, RollbackStatement, StartTransactionStatement}; +use crate::truncate::TruncateStatement; use crate::{ AlterColumnOperation, AlterTableDefinition, AlterTableStatement, CacheInner, CaseWhenBranch, Column, ColumnConstraint, ColumnSpecification, CommentStatement, CommonTableExpr, @@ -93,6 +95,10 @@ pub trait VisitorMut<'ast>: Sized { walk_relation(self, table) } + fn visit_target_table_fk(&mut self, table: &'ast mut Relation) -> Result<(), Self::Error> { + walk_relation(self, table) + } + fn visit_literal(&mut self, _literal: &'ast mut Literal) -> Result<(), Self::Error> { Ok(()) } @@ -219,6 +225,13 @@ pub trait VisitorMut<'ast>: Sized { walk_create_table_statement(self, create_table_statement) } + fn visit_create_database_statement( + &mut self, + create_database_statement: &'ast mut CreateDatabaseStatement, + ) -> Result<(), Self::Error> { + walk_create_database_statement(self, create_database_statement) + } + fn visit_column_specification( &mut self, column_specification: &'ast mut ColumnSpecification, @@ -237,6 +250,13 @@ pub trait VisitorMut<'ast>: Sized { Ok(()) } + fn visit_create_database_option( + &mut self, + _create_database_option: &'ast mut CreateDatabaseOption, + ) -> Result<(), Self::Error> { + Ok(()) + } + fn visit_column_constraint( &mut self, column_constraint: &'ast mut ColumnConstraint, @@ -437,6 +457,13 @@ pub trait VisitorMut<'ast>: Sized { Ok(()) } + fn visit_truncate_statement( + &mut self, + truncate_statement: &'ast mut TruncateStatement, + ) -> Result<(), Self::Error> { + walk_truncate_statement(self, truncate_statement) + } + fn visit_sql_query(&mut self, sql_query: &'ast mut SqlQuery) -> Result<(), Self::Error> { walk_sql_query(self, sql_query) } @@ -519,6 +546,7 @@ pub fn walk_function_expr<'ast, V: VisitorMut<'ast>>( FunctionExpr::Avg { expr, .. } => visitor.visit_expr(expr.as_mut()), FunctionExpr::Count { expr, .. } => visitor.visit_expr(expr.as_mut()), FunctionExpr::CountStar => Ok(()), + FunctionExpr::Extract { expr, .. } => visitor.visit_expr(expr.as_mut()), FunctionExpr::Sum { expr, .. } => visitor.visit_expr(expr.as_mut()), FunctionExpr::Max(expr) => visitor.visit_expr(expr.as_mut()), FunctionExpr::Min(expr) => visitor.visit_expr(expr.as_mut()), @@ -790,6 +818,20 @@ pub fn walk_create_table_statement<'a, V: VisitorMut<'a>>( Ok(()) } +pub fn walk_create_database_statement<'a, V: VisitorMut<'a>>( + visitor: &mut V, + create_database_statement: &'a mut CreateDatabaseStatement, +) -> Result<(), V::Error> { + visitor.visit_sql_identifier(&mut create_database_statement.name)?; + if let Ok(options) = &mut create_database_statement.options { + for option in options { + visitor.visit_create_database_option(option)?; + } + } + + Ok(()) +} + pub fn walk_column_specification<'a, V: VisitorMut<'a>>( visitor: &mut V, column_specification: &'a mut ColumnSpecification, @@ -886,7 +928,7 @@ pub fn walk_table_key<'a, V: VisitorMut<'a>>( for column in columns { visitor.visit_column(column)?; } - visitor.visit_table(target_table)?; + visitor.visit_target_table_fk(target_table)?; for column in target_columns { visitor.visit_column(column)?; } @@ -1143,6 +1185,17 @@ pub fn walk_drop_view_statement<'a, V: VisitorMut<'a>>( Ok(()) } +pub fn walk_truncate_statement<'a, V: VisitorMut<'a>>( + visitor: &mut V, + truncate_statement: &'a mut TruncateStatement, +) -> Result<(), V::Error> { + for table in &mut truncate_statement.tables { + visitor.visit_table(&mut table.relation)?; + } + + Ok(()) +} + pub fn walk_sql_query<'a, V: VisitorMut<'a>>( visitor: &mut V, sql_query: &'a mut SqlQuery, @@ -1176,6 +1229,8 @@ pub fn walk_sql_query<'a, V: VisitorMut<'a>>( SqlQuery::Explain(statement) => visitor.visit_explain_statement(statement), SqlQuery::Comment(statement) => visitor.visit_comment_statement(statement), SqlQuery::Deallocate(statement) => visitor.visit_deallocate_statement(statement), + SqlQuery::Truncate(statement) => visitor.visit_truncate_statement(statement), + SqlQuery::CreateDatabase(statement) => visitor.visit_create_database_statement(statement), } } diff --git a/nom-sql/src/column.rs b/nom-sql/src/column.rs index 49012c3ae2..3203303d99 100644 --- a/nom-sql/src/column.rs +++ b/nom-sql/src/column.rs @@ -292,7 +292,7 @@ pub fn column_specification( dialect: Dialect, ) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], ColumnSpecification> { move |i| { - let (remaining_input, (column, field_type, constraints, comment)) = tuple(( + let (i, (column, field_type, constraints)) = tuple(( column_identifier_no_alias(dialect), opt(delimited( whitespace1, @@ -300,16 +300,21 @@ pub fn column_specification( whitespace0, )), many0(column_constraint(dialect)), - opt(parse_comment), ))(i)?; + let (i, comment) = if matches!(dialect, Dialect::MySQL) { + opt(parse_comment(dialect))(i)? + } else { + (i, None) + }; + let sql_type = match field_type { None => SqlType::Text, Some(ref t) => t.clone(), }; Ok(( - remaining_input, + i, ColumnSpecification { column, sql_type, diff --git a/nom-sql/src/common.rs b/nom-sql/src/common.rs index dd2e61f630..0fcbea4967 100644 --- a/nom-sql/src/common.rs +++ b/nom-sql/src/common.rs @@ -6,8 +6,8 @@ use std::str::FromStr; use itertools::Itertools; use nom::branch::alt; -use nom::bytes::complete::{tag, tag_no_case, take_until}; -use nom::character::complete::{digit1, line_ending}; +use nom::bytes::complete::{tag, tag_no_case}; +use nom::character::complete::{char, digit1, line_ending}; use nom::combinator::{map, map_res, not, opt, peek}; use nom::error::{ErrorKind, ParseError}; use nom::multi::{separated_list0, separated_list1}; @@ -134,6 +134,28 @@ impl TableKey { TableKey::FulltextKey { .. } => &None, } } + + /// Check if the key is a primary key + pub fn is_primary_key(&self) -> bool { + matches!(self, TableKey::PrimaryKey { .. }) + } + + /// Check if the key is a unique key + pub fn is_unique_key(&self) -> bool { + matches!(self, TableKey::UniqueKey { .. }) + } + + /// Get the columns that the key is defined on + pub fn get_columns(&self) -> &[Column] { + match self { + TableKey::PrimaryKey { columns, .. } + | TableKey::UniqueKey { columns, .. } + | TableKey::FulltextKey { columns, .. } + | TableKey::Key { columns, .. } + | TableKey::ForeignKey { columns, .. } => columns, + TableKey::CheckConstraint { .. } => &[], + } + } } impl DialectDisplay for TableKey { @@ -477,6 +499,127 @@ fn function_call_without_parens(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Fu )) } +#[derive( + Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash, Serialize, Deserialize, Arbitrary, +)] +pub enum TimestampField { + Century, + Day, + Decade, + Dow, + Doy, + Epoch, + Hour, + Isodow, + Isoyear, + Julian, + Microseconds, + Millennium, + Milliseconds, + Minute, + Month, + Quarter, + Second, + Timezone, + TimezoneHour, + TimezoneMinute, + Week, + Year, +} + +impl fmt::Display for TimestampField { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Self::Century => write!(f, "CENTURY"), + Self::Day => write!(f, "DAY"), + Self::Decade => write!(f, "DECADE"), + Self::Dow => write!(f, "DOW"), + Self::Doy => write!(f, "DOY"), + Self::Epoch => write!(f, "EPOCH"), + Self::Hour => write!(f, "HOUR"), + Self::Isodow => write!(f, "ISODOW"), + Self::Isoyear => write!(f, "ISOYEAR"), + Self::Julian => write!(f, "JULIAN"), + Self::Microseconds => write!(f, "MICROSECONDS"), + Self::Millennium => write!(f, "MILLENNIUM"), + Self::Milliseconds => write!(f, "MILLISECONDS"), + Self::Minute => write!(f, "MINUTE"), + Self::Month => write!(f, "MONTH"), + Self::Quarter => write!(f, "QUARTER"), + Self::Second => write!(f, "SECOND"), + Self::Timezone => write!(f, "TIMEZONE"), + Self::TimezoneHour => write!(f, "TIMEZONE_HOUR"), + Self::TimezoneMinute => write!(f, "TIMEZONE_MINUTE"), + Self::Week => write!(f, "WEEK"), + Self::Year => write!(f, "YEAR"), + } + } +} + +fn timestamp_field() -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], TimestampField> { + move |i| { + let alt1 = alt(( + map(tag_no_case("century"), |_| TimestampField::Century), + map(tag_no_case("day"), |_| TimestampField::Day), + map(tag_no_case("decade"), |_| TimestampField::Decade), + map(tag_no_case("dow"), |_| TimestampField::Dow), + map(tag_no_case("doy"), |_| TimestampField::Doy), + map(tag_no_case("epoch"), |_| TimestampField::Epoch), + map(tag_no_case("hour"), |_| TimestampField::Hour), + map(tag_no_case("isodow"), |_| TimestampField::Isodow), + map(tag_no_case("isoyear"), |_| TimestampField::Isoyear), + map(tag_no_case("julian"), |_| TimestampField::Julian), + map(tag_no_case("microseconds"), |_| { + TimestampField::Microseconds + }), + map(tag_no_case("millennium"), |_| TimestampField::Millennium), + map(tag_no_case("milliseconds"), |_| { + TimestampField::Milliseconds + }), + map(tag_no_case("minute"), |_| TimestampField::Minute), + map(tag_no_case("month"), |_| TimestampField::Month), + map(tag_no_case("quarter"), |_| TimestampField::Quarter), + map(tag_no_case("second"), |_| TimestampField::Second), + map(tag_no_case("timezone_hour"), |_| { + TimestampField::TimezoneHour + }), + map(tag_no_case("timezone_minute"), |_| { + TimestampField::TimezoneMinute + }), + map(tag_no_case("timezone"), |_| TimestampField::Timezone), + map(tag_no_case("week"), |_| TimestampField::Week), + )); + + // `alt` has an upper limit on the number of items it supports in tuples, so we have to + // split the parsing for these fields into separate invocations + alt((alt1, map(tag_no_case("year"), |_| TimestampField::Year)))(i) + } +} + +fn extract(dialect: Dialect) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], FunctionExpr> { + move |i| { + let (i, _) = tag_no_case("EXTRACT")(i)?; + let (i, _) = whitespace0(i)?; + let (i, _) = char('(')(i)?; + let (i, _) = whitespace0(i)?; + let (i, field) = timestamp_field()(i)?; + let (i, _) = whitespace1(i)?; + let (i, _) = tag_no_case("FROM")(i)?; + let (i, _) = whitespace1(i)?; + let (i, expr) = expression(dialect)(i)?; + let (i, _) = whitespace0(i)?; + let (i, _) = char(')')(i)?; + + Ok(( + i, + FunctionExpr::Extract { + field, + expr: Box::new(expr), + }, + )) + } +} + fn substring(dialect: Dialect) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], FunctionExpr> { move |i| { let (i, _) = alt((tag_no_case("substring"), tag_no_case("substr")))(i)?; @@ -581,6 +724,7 @@ pub fn function_expr( separator, }, ), + extract(dialect), substring(dialect), function_call(dialect), function_call_without_parens, @@ -810,17 +954,18 @@ pub(crate) fn if_not_exists(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], bool> } // Parse rule for a comment part. -pub fn parse_comment(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], String> { - map( - preceded( - delimited(whitespace0, tag_no_case("comment"), whitespace1), - map_res( - delimited(tag("'"), take_until("'"), tag("'")), - |i: LocatedSpan<&[u8]>| str::from_utf8(&i), +pub fn parse_comment( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], String> { + move |i| { + map( + preceded( + delimited(whitespace0, tag_no_case("comment"), whitespace1), + map_res(move |i| dialect.string_literal()(i), String::from_utf8), ), - ), - String::from, - )(i) + String::from, + )(i) + } } pub fn field_reference( @@ -980,12 +1125,6 @@ mod tests { ); } - #[test] - fn comment_data() { - let res = parse_comment(LocatedSpan::new(b" COMMENT 'test'")); - assert_eq!(res.unwrap().1, "test"); - } - #[test] fn terminated_by_semicolon() { let res = to_nom_result(statement_terminator(LocatedSpan::new(b" ; "))); @@ -1204,6 +1343,22 @@ mod tests { } ); } + + #[test] + fn table_column_comment() { + let res = test_parse!(parse_comment(Dialect::MySQL), b"comment 'foo'"); + assert_eq!(res, "foo"); + let res = test_parse!(parse_comment(Dialect::MySQL), b"comment \"foo\""); + assert_eq!(res, "foo"); + let res = test_parse!(parse_comment(Dialect::MySQL), b"comment 'f''oo'"); + assert_eq!(res, "f'oo"); + let res = test_parse!(parse_comment(Dialect::MySQL), b"comment 'f\"\"oo'"); + assert_eq!(res, "f\"\"oo"); + let res = test_parse!(parse_comment(Dialect::MySQL), b"comment \"f\"\"oo\""); + assert_eq!(res, "f\"oo"); + let res = test_parse!(parse_comment(Dialect::MySQL), b"comment \"f''oo\""); + assert_eq!(res, "f''oo"); + } } mod postgres { @@ -1283,4 +1438,63 @@ mod tests { assert_eq!(res2, expected); } } + + mod extract { + use super::*; + + macro_rules! extract_test { + ($field:ident, $field_variant:ident, $field_expr:expr) => { + mod $field { + use super::*; + + #[test] + fn parse_extract_expr() { + let expr = format!("EXTRACT({} FROM \"col\")", $field_expr); + assert_eq!( + test_parse!(extract(Dialect::PostgreSQL), expr.as_bytes()), + FunctionExpr::Extract { + field: TimestampField::$field_variant, + expr: Box::new(Expr::Column(Column { + name: "col".into(), + table: None, + })), + }, + ); + } + + #[test] + fn format_round_trip() { + let expected = format!("EXTRACT({} FROM \"col\")", $field_expr); + let actual = test_parse!(extract(Dialect::PostgreSQL), expected.as_bytes()) + .display(Dialect::PostgreSQL) + .to_string(); + + assert_eq!(expected, actual); + } + } + }; + } + + extract_test!(century, Century, "CENTURY"); + extract_test!(decade, Decade, "DECADE"); + extract_test!(dow, Dow, "DOW"); + extract_test!(doy, Doy, "DOY"); + extract_test!(epoch, Epoch, "EPOCH"); + extract_test!(hour, Hour, "HOUR"); + extract_test!(isodow, Isodow, "ISODOW"); + extract_test!(isoyear, Isoyear, "ISOYEAR"); + extract_test!(julian, Julian, "JULIAN"); + extract_test!(microseconds, Microseconds, "MICROSECONDS"); + extract_test!(millennium, Millennium, "MILLENNIUM"); + extract_test!(milliseconds, Milliseconds, "MILLISECONDS"); + extract_test!(minute, Minute, "MINUTE"); + extract_test!(month, Month, "MONTH"); + extract_test!(quarter, Quarter, "QUARTER"); + extract_test!(second, Second, "SECOND"); + extract_test!(timezone_hour, TimezoneHour, "TIMEZONE_HOUR"); + extract_test!(timezone_minute, TimezoneMinute, "TIMEZONE_MINUTE"); + extract_test!(timezone, Timezone, "TIMEZONE"); + extract_test!(week, Week, "WEEK"); + extract_test!(year, Year, "YEAR"); + } } diff --git a/nom-sql/src/create.rs b/nom-sql/src/create.rs index 5baa85b8b0..51efc91e78 100644 --- a/nom-sql/src/create.rs +++ b/nom-sql/src/create.rs @@ -9,7 +9,8 @@ use nom::character::complete::digit1; use nom::combinator::{map, map_res, opt}; use nom::error::{ErrorKind, ParseError}; use nom::multi::{separated_list0, separated_list1}; -use nom::sequence::{delimited, preceded, terminated, tuple}; +use nom::sequence::{delimited, preceded, separated_pair, terminated, tuple}; +use nom::{Compare, CompareResult}; use nom_locate::LocatedSpan; use readyset_util::fmt::fmt_with; use serde::{Deserialize, Serialize}; @@ -21,7 +22,9 @@ use crate::common::{ until_statement_terminator, ws_sep_comma, IndexType, ReferentialAction, TableKey, }; use crate::compound_select::{nested_compound_selection, CompoundSelectStatement}; -use crate::create_table_options::{table_options, CreateTableOption}; +use crate::create_table_options::{ + create_option_equals_pair, create_option_spaced_pair, table_options, CreateTableOption, +}; use crate::expression::expression; use crate::order::{order_type, OrderType}; use crate::select::{selection, SelectStatement}; @@ -29,12 +32,129 @@ use crate::table::{relation, Relation}; use crate::whitespace::{whitespace0, whitespace1}; use crate::{Dialect, DialectDisplay, NomSqlError, NomSqlResult, SqlIdentifier}; +#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, Arbitrary)] +pub enum CharsetName { + Quoted(SqlIdentifier), + Unquoted(SqlIdentifier), +} + +impl fmt::Display for CharsetName { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + CharsetName::Quoted(i) | CharsetName::Unquoted(i) => write!(f, "{i}"), + } + } +} + +#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, Arbitrary)] +pub enum CollationName { + Quoted(SqlIdentifier), + Unquoted(SqlIdentifier), +} + +impl fmt::Display for CollationName { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + CollationName::Quoted(i) | CollationName::Unquoted(i) => write!(f, "{i}"), + } + } +} + +#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Arbitrary)] +pub enum CreateDatabaseOption { + CharsetName { default: bool, name: CharsetName }, + CollationName { default: bool, name: CollationName }, + Encryption { default: bool, encrypted: bool }, +} + +impl fmt::Display for CreateDatabaseOption { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + CreateDatabaseOption::CharsetName { default, name } => write!( + f, + "{}CHARACTER SET = {}", + if *default { "DEFAULT " } else { "" }, + name + ), + CreateDatabaseOption::CollationName { default, name } => write!( + f, + "{}COLLATE = {}", + if *default { "DEFAULT " } else { "" }, + name + ), + CreateDatabaseOption::Encryption { default, encrypted } => write!( + f, + "{}ENCRYPTION = {}", + if *default { "DEFAULT " } else { "" }, + if *encrypted { "Y" } else { "N" } + ), + } + } +} + +#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Arbitrary)] +pub struct CreateDatabaseStatement { + pub is_schema: bool, + pub if_not_exists: bool, + pub name: SqlIdentifier, + /// The result of parsing the `CREATE DATABASE` statement's options. If no options were + /// present, the Vec will be empty. + /// If parsing succeeded, then this will be an `Ok` result with the create options. If + /// it failed to parse, this will be an `Err` with the remainder [`String`] that could not + /// be parsed. + pub options: Result, String>, +} + +impl DialectDisplay for CreateDatabaseStatement { + fn display(&self, dialect: Dialect) -> impl fmt::Display + '_ { + fmt_with(move |f| { + assert_eq!(dialect, Dialect::MySQL); + write!( + f, + "CREATE {} ", + if self.is_schema { "SCHEMA" } else { "DATABASE" } + )?; + if self.if_not_exists { + write!(f, "IF NOT EXISTS ")?; + } + write!(f, "{}", self.name.as_str())?; + match &self.options { + Ok(ref opts) => { + for opt in opts.iter() { + write!(f, " {opt}")?; + } + } + Err(unparsed) => write!(f, "{unparsed}")?, + } + Ok(()) + }) + } +} + #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Arbitrary)] pub struct CreateTableBody { pub fields: Vec, pub keys: Option>, } +impl CreateTableBody { + /// Returns the primary key of the table, if one exists. + pub fn get_primary_key(&self) -> Option<&TableKey> { + self.keys + .as_ref()? + .iter() + .find(|key| matches!(key, TableKey::PrimaryKey { .. })) + } + + /// Returns the first unique key of the table, if one exists. + pub fn get_first_unique_key(&self) -> Option<&TableKey> { + self.keys + .as_ref()? + .iter() + .find(|key| matches!(key, TableKey::UniqueKey { .. })) + } +} + impl DialectDisplay for CreateTableBody { fn display(&self, dialect: Dialect) -> impl fmt::Display + '_ { fmt_with(move |f| { @@ -664,6 +784,178 @@ pub fn create_table( } } +pub(crate) fn charset_name( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CharsetName> { + move |i| { + alt(( + map(dialect.identifier(), CharsetName::Unquoted), + map(map_res(dialect.string_literal(), String::from_utf8), |s| { + CharsetName::Quoted(SqlIdentifier::from(s)) + }), + ))(i) + } +} + +pub(crate) fn collation_name( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CollationName> { + move |i| { + alt(( + map(dialect.identifier(), CollationName::Unquoted), + map(map_res(dialect.string_literal(), String::from_utf8), |s| { + CollationName::Quoted(SqlIdentifier::from(s)) + }), + ))(i) + } +} + +fn is_default(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], bool> { + let (i, s) = opt(map(tuple((tag_no_case("default"), whitespace1)), |_| ()))(i)?; + Ok((i, s.is_some())) +} + +fn yes_no_value(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], bool> { + map( + alt((tag_no_case("y"), tag_no_case("n"))), + |i: LocatedSpan<&[u8]>| *i == b"y" || *i == b"Y", + )(i) +} + +fn charset_attribute_name(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], ()> { + map( + separated_pair(tag_no_case("character"), whitespace1, tag_no_case("set")), + |_| (), + )(i) +} + +fn charset_option( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CreateDatabaseOption> { + move |i| { + map( + alt(( + create_option_spaced_pair(charset_attribute_name, charset_name(dialect)), + create_option_equals_pair(charset_attribute_name, charset_name(dialect)), + )), + |name| CreateDatabaseOption::CharsetName { + default: false, + name, + }, + )(i) + } +} + +fn collate_option( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CreateDatabaseOption> { + move |i| { + map( + alt(( + create_option_spaced_pair(tag_no_case("collate"), collation_name(dialect)), + create_option_equals_pair(tag_no_case("collate"), collation_name(dialect)), + )), + |name| CreateDatabaseOption::CollationName { + default: false, + name, + }, + )(i) + } +} + +fn encryption_option(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CreateDatabaseOption> { + map( + alt(( + create_option_spaced_pair(tag_no_case("encryption"), yes_no_value), + create_option_equals_pair(tag_no_case("encryption"), yes_no_value), + )), + |encrypted| CreateDatabaseOption::Encryption { + default: false, + encrypted, + }, + )(i) +} + +fn database_option( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CreateDatabaseOption> { + move |i| { + let (i, _) = whitespace0(i)?; + let (i, is_default) = is_default(i)?; + let (i, option) = alt(( + charset_option(dialect), + collate_option(dialect), + encryption_option, + ))(i)?; + Ok(( + i, + match option { + CreateDatabaseOption::CharsetName { default: _, name } => { + CreateDatabaseOption::CharsetName { + default: is_default, + name, + } + } + CreateDatabaseOption::CollationName { default: _, name } => { + CreateDatabaseOption::CollationName { + default: is_default, + name, + } + } + CreateDatabaseOption::Encryption { + default: _, + encrypted, + } => CreateDatabaseOption::Encryption { + default: is_default, + encrypted, + }, + }, + )) + } +} + +fn database_options( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Vec> { + move |i| separated_list0(whitespace1, database_option(dialect))(i) +} + +/// Parse rule for a SQL CREATE DATABASE statement. +pub fn create_database( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CreateDatabaseStatement> { + move |i| { + if dialect != Dialect::MySQL { + return Err(nom::Err::Error(NomSqlError { + input: i, + kind: ErrorKind::Fail, + })); + } + let (i, _) = tag_no_case("create")(i)?; + let (i, _) = whitespace1(i)?; + let (i, what) = map_res( + alt((tag_no_case("database"), tag_no_case("schema"))), + |i: LocatedSpan<&[u8]>| str::from_utf8(&i), + )(i)?; + let (i, _) = whitespace1(i)?; + let (i, if_not_exists) = if_not_exists(i)?; + let (i, name) = dialect.identifier()(i)?; + let (i, options) = + parse_fallible(database_options(dialect), until_statement_terminator)(i)?; + let (i, _) = statement_terminator(i)?; + + Ok(( + i, + CreateDatabaseStatement { + is_schema: what.compare_no_case("schema") == CompareResult::Ok, + if_not_exists, + name, + options, + }, + )) + } +} + // Parse the optional CREATE VIEW parameters and discard, ideally we would want to check user // permissions pub fn create_view_params(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], ()> { @@ -854,9 +1146,10 @@ pub fn create_cached_query( #[cfg(test)] mod tests { + use bit_vec::BitVec; + use super::*; use crate::column::Column; - use crate::create_table_options::{CharsetName, CollationName}; use crate::table::Relation; use crate::{ BinaryOperator, ColumnConstraint, Expr, FunctionExpr, LimitClause, Literal, SqlType, @@ -1889,6 +2182,57 @@ mod tests { GROUP BY emp_no" ); } + + #[test] + fn create_database_with_options() { + let queries = vec![ + // No create options, with trailing ws + ("Create databasE if not Exists noria ", + "CREATE DATABASE IF NOT EXISTS noria"), + + // No create options, no trailing ws + ("Create databasE noria", + "CREATE DATABASE noria"), + + // Use instead of , no create options, with trailing ws + ("Create schema noria ", + "CREATE SCHEMA noria"), + + // Use instead of , no create options, no trailing ws + ("Create scheMA if not Exists noria", + "CREATE SCHEMA IF NOT EXISTS noria"), + + // Use single, eq separated create option, with attribute, no trailing ws + ("create databasE If NOT exists noria default character Set = utf16", + "CREATE DATABASE IF NOT EXISTS noria DEFAULT CHARACTER SET = utf16"), + + // Use subset of eq separated create options, no attribute for any, with trailing ws + ("create schema noria character Set = utf16 Collate utf16_collation Encryption= Y ", + "CREATE SCHEMA noria CHARACTER SET = utf16 COLLATE = utf16_collation ENCRYPTION = Y"), + + // Use subset of eq and ws separated create options, with attribute for some, with trailing ws + ("create databasE If not exists noria DEfault Collate utf16_collation Character Set = utf16 ", + "CREATE DATABASE IF NOT EXISTS noria DEFAULT COLLATE = utf16_collation CHARACTER SET = utf16"), + + // Use subset of eq and ws separated create options, with attribute for some, with trailing ws + ("Create schema noria default Encryption=Y Collate utf16_collation ", + "CREATE SCHEMA noria DEFAULT ENCRYPTION = Y COLLATE = utf16_collation"), + + // Use all available eq and ws separated create options, with attribute for all, with trailing ws + ("Create databasE if not exists noria default Encryption=N defaULT Collate utf16_collation default character Set = utf16 ", + "CREATE DATABASE IF NOT EXISTS noria DEFAULT ENCRYPTION = N DEFAULT COLLATE = utf16_collation DEFAULT CHARACTER SET = utf16"), + + // Use all available eq and ws separated create options, no attribute for all, no trailing ws + ("Create databasE noria Collate utf16_collation Encryption=N character set = utf16", + "CREATE DATABASE noria COLLATE = utf16_collation ENCRYPTION = N CHARACTER SET = utf16"), + ]; + + for (query_str, expected_str) in queries { + let res = test_parse!(create_database(Dialect::MySQL), query_str.as_bytes()); + assert_eq!(expected_str, res.display(Dialect::MySQL).to_string()); + test_parse_expect_err!(create_database(Dialect::PostgreSQL), query_str.as_bytes()); + } + } } mod postgres { @@ -2558,7 +2902,7 @@ PRIMARY KEY (`id`));"; vec![ ColumnConstraint::NotNull, ColumnConstraint::DefaultValue(Expr::Literal(Literal::BitVector( - vec![0] + BitVec::from_elem(1, false) ))), ], ),], diff --git a/nom-sql/src/create_table_options.rs b/nom-sql/src/create_table_options.rs index bf5ff24d56..556b220d59 100644 --- a/nom-sql/src/create_table_options.rs +++ b/nom-sql/src/create_table_options.rs @@ -13,37 +13,10 @@ use serde::{Deserialize, Serialize}; use test_strategy::Arbitrary; use crate::common::{ws_sep_comma, ws_sep_equals}; +use crate::create::{charset_name, collation_name, CharsetName, CollationName}; use crate::literal::integer_literal; use crate::whitespace::{whitespace0, whitespace1}; -use crate::{Dialect, Literal, NomSqlResult, SqlIdentifier}; - -#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, Arbitrary)] -pub enum CharsetName { - Quoted(SqlIdentifier), - Unquoted(SqlIdentifier), -} - -impl fmt::Display for CharsetName { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - CharsetName::Quoted(i) | CharsetName::Unquoted(i) => write!(f, "{i}"), - } - } -} - -#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, Arbitrary)] -pub enum CollationName { - Quoted(SqlIdentifier), - Unquoted(SqlIdentifier), -} - -impl fmt::Display for CollationName { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - CollationName::Quoted(i) | CollationName::Unquoted(i) => write!(f, "{i}"), - } - } -} +use crate::{Dialect, Literal, NomSqlResult}; #[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, Arbitrary)] pub enum CreateTableOption { @@ -217,19 +190,6 @@ fn create_option_auto_increment(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Cr )(i) } -fn charset_name( - dialect: Dialect, -) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CharsetName> { - move |i| { - alt(( - map(dialect.identifier(), CharsetName::Unquoted), - map(map_res(dialect.string_literal(), String::from_utf8), |s| { - CharsetName::Quoted(SqlIdentifier::from(s)) - }), - ))(i) - } -} - fn charset_prefix(i: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], &[u8]> { let (i, _) = whitespace0(i)?; let (i, _) = tag_no_case("default")(i)?; @@ -258,19 +218,6 @@ fn create_option_default_charset( } } -fn collation_name( - dialect: Dialect, -) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CollationName> { - move |i| { - alt(( - map(dialect.identifier(), CollationName::Unquoted), - map(map_res(dialect.string_literal(), String::from_utf8), |s| { - CollationName::Quoted(SqlIdentifier::from(s)) - }), - ))(i) - } -} - fn create_option_collate( dialect: Dialect, ) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], CreateTableOption> { @@ -474,4 +421,24 @@ mod tests { vec![CreateTableOption::Comment("foobar".to_string())], ); } + + #[test] + fn create_table_option_comment_escape() { + should_parse_all( + "COMMENT='foo''bar'", + vec![CreateTableOption::Comment("foo'bar".to_string())], + ); + should_parse_all( + "COMMENT=\"foo\"\"bar\"", + vec![CreateTableOption::Comment("foo\"bar".to_string())], + ); + should_parse_all( + "COMMENT='foo\"\"bar'", + vec![CreateTableOption::Comment("foo\"\"bar".to_string())], + ); + should_parse_all( + "COMMENT=\"foo''bar\"", + vec![CreateTableOption::Comment("foo''bar".to_string())], + ); + } } diff --git a/nom-sql/src/dialect.rs b/nom-sql/src/dialect.rs index 8d76bea156..2584a0eccc 100644 --- a/nom-sql/src/dialect.rs +++ b/nom-sql/src/dialect.rs @@ -4,11 +4,11 @@ use std::str::{self, FromStr}; use clap::ValueEnum; use itertools::Itertools; use nom::branch::alt; -use nom::bytes::complete::{tag, tag_no_case, take, take_while1}; +use nom::bytes::complete::{tag, tag_no_case, take_while1}; +use nom::character::complete::hex_digit0; use nom::character::is_alphanumeric; -use nom::combinator::{map, map_res, not, opt, peek}; +use nom::combinator::{map, map_res, not, opt, peek, verify}; use nom::error::ErrorKind; -use nom::multi::fold_many0; use nom::sequence::{delimited, preceded}; use nom::{InputLength, InputTake}; use nom_locate::LocatedSpan; @@ -22,6 +22,15 @@ use crate::select::{LimitClause, LimitValue}; use crate::whitespace::whitespace0; use crate::{literal, Literal, NomSqlError, NomSqlResult, SqlIdentifier}; +macro_rules! failed { + ($input:expr) => { + return Err(nom::Err::Error(NomSqlError { + input: $input, + kind: ErrorKind::Fail, + })) + }; +} + pub trait DialectDisplay { fn display(&self, dialect: Dialect) -> impl fmt::Display + '_; } @@ -70,23 +79,27 @@ pub(crate) fn is_sql_identifier(chr: u8) -> bool { /// Byte array literal value (PostgreSQL) fn raw_hex_bytes_psql(input: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Vec> { - delimited(tag("E'\\\\x"), hex_bytes, tag("'::bytea"))(input) + alt(( + delimited(tag("E'\\\\x"), hex_bytes(1), tag("'::bytea")), + delimited(tag_no_case("x'"), hex_bytes(1), tag("'")), + ))(input) } /// Blob literal value (MySQL) fn raw_hex_bytes_mysql(input: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Vec> { - delimited(tag("X'"), hex_bytes, tag("'"))(input) + alt(( + delimited(tag_no_case("x'"), hex_bytes(2), tag("'")), + preceded(tag("0x"), hex_bytes(2)), + ))(input) } -fn hex_bytes(input: LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Vec> { - fold_many0( - map_res(take(2_usize), |i: LocatedSpan<&[u8]>| hex::decode(*i)), - Vec::new, - |mut acc: Vec, bytes: Vec| { - acc.extend(bytes); - acc - }, - )(input) +fn hex_bytes(chunk: usize) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Vec> { + move |i| { + map_res( + verify(hex_digit0, |i: &LocatedSpan<&[u8]>| i.len() % chunk == 0), + |i: LocatedSpan<&[u8]>| hex::decode(*i), + )(i) + } } /// Specification for a SQL dialect to use when parsing @@ -259,8 +272,11 @@ impl Dialect { } /// Parse the raw (byte) content of a bytes literal using this Dialect. - // TODO(fran): Improve this. This is very naive, and for Postgres specifically, it only - // parses the hex-formatted byte array. We need to also add support for the escaped format. + // Naturally syntax and types vary between databases: + // - mysql: 0xFFFF | [Xx]'FFFF' -> varbinary; length must be even, 0X... is invalid! + // - psql: [Xx]'FFFF' -> bit-string + // + // FIXME(sac) Postgres escaped string (E'...') parsing is an incomplete hack. pub fn bytes_literal(self) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], Vec> { move |i| match self { Dialect::PostgreSQL => raw_hex_bytes_psql(i), @@ -280,35 +296,23 @@ impl Dialect { if *int >= 0 { literal } else { - return Err(nom::Err::Error(NomSqlError { - input: i, - kind: ErrorKind::Fail, - })); + failed!(i); } } Literal::Null => match self { Dialect::PostgreSQL => literal, Dialect::MySQL => { - return Err(nom::Err::Error(NomSqlError { - input: i, - kind: ErrorKind::Fail, - })); + failed!(i); } }, Literal::Numeric(..) | Literal::Float(_) | Literal::Double(_) => match self { Dialect::PostgreSQL => literal, Dialect::MySQL => { - return Err(nom::Err::Error(NomSqlError { - input: i, - kind: ErrorKind::Fail, - })); + failed!(i); } }, _ => { - return Err(nom::Err::Error(NomSqlError { - input: i, - kind: ErrorKind::Fail, - })); + failed!(i); } }; @@ -404,11 +408,17 @@ impl Dialect { #[cfg(test)] mod tests { + use nom::IResult; + use super::*; + use crate::to_nom_result; + + fn parse_dialect_bytes(dialect: Dialect, b: &[u8]) -> IResult<&[u8], Vec> { + to_nom_result(dialect.bytes_literal()(LocatedSpan::new(b))) + } mod mysql { use super::*; - use crate::to_nom_result; #[test] fn sql_identifiers() { @@ -462,20 +472,26 @@ mod tests { #[test] fn bytes_parsing() { - let res = to_nom_result(Dialect::MySQL.bytes_literal()(LocatedSpan::new( - b"X'0008275c6480'", - ))); - let expected = vec![0, 8, 39, 92, 100, 128]; - assert_eq!(res, Ok((&b""[..], expected))); + let res = parse_dialect_bytes(Dialect::MySQL, b"X'0008275c6480'"); + let expected = Ok((&b""[..], vec![0, 8, 39, 92, 100, 128])); + assert_eq!(res, expected); + let res = parse_dialect_bytes(Dialect::MySQL, b"x'0008275c6480'"); + assert_eq!(res, expected); + let res = parse_dialect_bytes(Dialect::MySQL, b"0x0008275c6480"); + assert_eq!(res, expected); + + let res = parse_dialect_bytes(Dialect::MySQL, b"0x6D617263656C6F"); + let expected = Ok((&b""[..], vec![109, 97, 114, 99, 101, 108, 111])); + assert_eq!(res, expected); // Empty - let res = to_nom_result(Dialect::MySQL.bytes_literal()(LocatedSpan::new(b"X''"))); + let res = parse_dialect_bytes(Dialect::MySQL, b"X''"); let expected = vec![]; assert_eq!(res, Ok((&b""[..], expected))); - // Malformed string - let res = Dialect::MySQL.bytes_literal()(LocatedSpan::new(b"''")); - res.unwrap_err(); + // Malformed strings + Dialect::MySQL.bytes_literal()(LocatedSpan::new(b"''")).unwrap_err(); + Dialect::MySQL.bytes_literal()(LocatedSpan::new(b"0x123")).unwrap_err(); } #[test] @@ -579,6 +595,12 @@ mod tests { let expected = vec![0, 8, 39, 92, 100, 128]; assert_eq!(res, Ok((&b""[..], expected))); + let res = parse_dialect_bytes(Dialect::PostgreSQL, b"X'0008275c6480'"); + let expected = Ok((&b""[..], vec![0, 8, 39, 92, 100, 128])); + assert_eq!(res, expected); + let res = parse_dialect_bytes(Dialect::PostgreSQL, b"x'0008275c6480'"); + assert_eq!(res, expected); + // Empty let res = to_nom_result(Dialect::PostgreSQL.bytes_literal()(LocatedSpan::new( b"E'\\\\x'::bytea", @@ -590,5 +612,14 @@ mod tests { let res = Dialect::PostgreSQL.bytes_literal()(LocatedSpan::new(b"E'\\\\'::btea")); res.unwrap_err(); } + + #[test] + #[ignore = "REA-4485"] + fn bytes_parsing_odd_length() { + // odd length is okay in postgres + let res = parse_dialect_bytes(Dialect::PostgreSQL, b"X'D617263656C6F'"); + let expected = Ok((&b""[..], vec![13, 97, 114, 99, 101, 108, 111])); + assert_eq!(res, expected); + } } } diff --git a/nom-sql/src/expression.rs b/nom-sql/src/expression.rs index b79345421f..bbf815b60c 100644 --- a/nom-sql/src/expression.rs +++ b/nom-sql/src/expression.rs @@ -19,7 +19,7 @@ use readyset_util::fmt::fmt_with; use serde::{Deserialize, Serialize}; use test_strategy::Arbitrary; -use crate::common::{column_identifier_no_alias, function_expr, ws_sep_comma}; +use crate::common::{column_identifier_no_alias, function_expr, ws_sep_comma, TimestampField}; use crate::literal::{literal, Double, Float}; use crate::select::nested_selection; use crate::set::{variable_scope_prefix, Variable}; @@ -41,6 +41,11 @@ pub enum FunctionExpr { /// `COUNT(*)` aggregation CountStar, + Extract { + field: TimestampField, + expr: Box, + }, + /// `SUM` aggregation Sum { expr: Box, distinct: bool }, @@ -89,7 +94,8 @@ impl FunctionExpr { | FunctionExpr::Sum { expr: arg, .. } | FunctionExpr::Max(arg) | FunctionExpr::Min(arg) - | FunctionExpr::GroupConcat { expr: arg, .. } => { + | FunctionExpr::GroupConcat { expr: arg, .. } + | FunctionExpr::Extract { expr: arg, .. } => { concrete_iter!(iter::once(arg.as_ref())) } FunctionExpr::CountStar => concrete_iter!(iter::empty()), @@ -156,6 +162,9 @@ impl DialectDisplay for FunctionExpr { write!(f, ")") } + FunctionExpr::Extract { field, expr } => { + write!(f, "EXTRACT({field} FROM {})", expr.display(dialect)) + } }) } } @@ -690,6 +699,8 @@ impl Arbitrary for Expr { Just(FunctionExpr::CountStar), (box_expr.clone(), any::()) .prop_map(|(expr, distinct)| FunctionExpr::Sum { expr, distinct }), + (box_expr.clone(), any::()) + .prop_map(|(expr, field)| FunctionExpr::Extract { expr, field }), box_expr.clone().prop_map(FunctionExpr::Max), box_expr.clone().prop_map(FunctionExpr::Min), (box_expr.clone(), any::>()).prop_map(|(expr, separator)| { diff --git a/nom-sql/src/lib.rs b/nom-sql/src/lib.rs index 48326f42af..f56fa8bb08 100644 --- a/nom-sql/src/lib.rs +++ b/nom-sql/src/lib.rs @@ -18,7 +18,7 @@ pub use self::alter::{ }; pub use self::column::{Column, ColumnConstraint, ColumnSpecification}; pub use self::comment::CommentStatement; -pub use self::common::{FieldDefinitionExpr, FieldReference, IndexType, TableKey}; +pub use self::common::{FieldDefinitionExpr, FieldReference, IndexType, TableKey, TimestampField}; pub use self::compound_select::{CompoundSelectOperator, CompoundSelectStatement}; pub use self::create::{ CacheInner, CreateCacheStatement, CreateTableBody, CreateTableStatement, CreateViewStatement, @@ -60,6 +60,7 @@ pub use self::table::{ TableExprInner, }; pub use self::transaction::StartTransactionStatement; +pub use self::truncate::TruncateStatement; pub use self::update::UpdateStatement; pub use self::use_statement::UseStatement; @@ -96,6 +97,7 @@ mod sql_identifier; mod sql_type; mod table; mod transaction; +mod truncate; mod update; mod use_statement; pub mod whitespace; diff --git a/nom-sql/src/literal.rs b/nom-sql/src/literal.rs index 321c2bb01d..52733227d6 100644 --- a/nom-sql/src/literal.rs +++ b/nom-sql/src/literal.rs @@ -119,12 +119,12 @@ pub enum ItemPlaceholder { ColonNumber(u32), } -impl ToString for ItemPlaceholder { - fn to_string(&self) -> String { +impl fmt::Display for ItemPlaceholder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - ItemPlaceholder::QuestionMark => "?".to_string(), - ItemPlaceholder::DollarNumber(ref i) => format!("${}", i), - ItemPlaceholder::ColonNumber(ref i) => format!(":{}", i), + ItemPlaceholder::QuestionMark => write!(f, "?"), + ItemPlaceholder::DollarNumber(ref i) => write!(f, "${}", i), + ItemPlaceholder::ColonNumber(ref i) => write!(f, ":{}", i), } } } @@ -163,7 +163,7 @@ pub enum Literal { // String or not. ByteArray(Vec), Placeholder(ItemPlaceholder), - BitVector(Vec), + BitVector(#[strategy(arbitrary_bitvec(0..=64))] BitVec), } impl From for Literal { @@ -259,15 +259,12 @@ impl DialectDisplay for Literal { write!(f, "X'{}'", b.iter().map(|v| format!("{:02X}", v)).join("")) } }, - Literal::Placeholder(item) => write!(f, "{}", item.to_string()), + Literal::Placeholder(item) => write!(f, "{}", item), Literal::BitVector(ref b) => { write!( f, "B'{}'", - BitVec::from_bytes(b.as_slice()) - .iter() - .map(|bit| if bit { "1" } else { "0" }) - .join("") + b.iter().map(|bit| if bit { "1" } else { "0" }).join("") ) } } @@ -315,6 +312,12 @@ impl Literal { SqlType::UnsignedSmallInt(_) => any::() .prop_map(|i| Self::UnsignedInteger(i as _)) .boxed(), + SqlType::MediumInt(_) => ((-1i32 << 23)..(1i32 << 23)) + .prop_map(|i| Self::Integer(i as _)) + .boxed(), + SqlType::UnsignedMediumInt(_) => (0..(1u32 << 24)) + .prop_map(|i| Self::UnsignedInteger(i as _)) + .boxed(), SqlType::Blob | SqlType::ByteArray | SqlType::LongBlob @@ -367,12 +370,12 @@ impl Literal { SqlType::Bit(n) => { let size = n.unwrap_or(1) as usize; arbitrary_bitvec(size..=size) - .prop_map(|bits| Self::BitVector(bits.to_bytes())) + .prop_map(Self::BitVector) .boxed() } SqlType::VarBit(n) => { arbitrary_bitvec(0..n.map(|max_size| max_size as usize).unwrap_or(20_usize)) - .prop_map(|bits| Self::BitVector(bits.to_bytes())) + .prop_map(Self::BitVector) .boxed() } SqlType::Serial => any::().prop_map(Self::from).boxed(), @@ -554,12 +557,13 @@ fn simple_literal(dialect: Dialect) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResu move |i| { alt(( float_literal, + map(dialect.bytes_literal(), Literal::ByteArray), integer_literal, boolean_literal, - map(dialect.bytes_literal(), Literal::ByteArray), - map(delimited(tag_no_case("b'"), bits, tag("'")), |bits| { - Literal::BitVector(bits.to_bytes()) - }), + map( + delimited(tag_no_case("b'"), bits, tag("'")), + Literal::BitVector, + ), map( terminated( tag_no_case("null"), @@ -697,7 +701,9 @@ mod tests { #[proptest] fn real_hash_matches_eq(real1: Double, real2: Double) { - assert_eq!(real1 == real2, hash(&real1) == hash(&real2)); + if real1 == real2 { + assert_eq!(hash(&real1), hash(&real2)); + } } #[proptest] @@ -775,6 +781,7 @@ mod tests { ); } } + mod postgres { use super::*; diff --git a/nom-sql/src/parser.rs b/nom-sql/src/parser.rs index 422299608c..417d7df6c0 100644 --- a/nom-sql/src/parser.rs +++ b/nom-sql/src/parser.rs @@ -13,8 +13,8 @@ use crate::comment::{comment, CommentStatement}; use crate::common::statement_terminator; use crate::compound_select::{simple_or_compound_selection, CompoundSelectStatement}; use crate::create::{ - create_cached_query, create_table, key_specification, view_creation, CreateCacheStatement, - CreateTableStatement, CreateViewStatement, + create_cached_query, create_database, create_table, key_specification, view_creation, + CreateCacheStatement, CreateDatabaseStatement, CreateTableStatement, CreateViewStatement, }; use crate::deallocate::{deallocate, DeallocateStatement}; use crate::delete::{deletion, DeleteStatement}; @@ -34,6 +34,7 @@ use crate::transaction::{ commit, rollback, start_transaction, CommitStatement, RollbackStatement, StartTransactionStatement, }; +use crate::truncate::{truncate, TruncateStatement}; use crate::update::{updating, UpdateStatement}; use crate::use_statement::{use_statement, UseStatement}; use crate::whitespace::whitespace0; @@ -45,6 +46,7 @@ use crate::{ #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Arbitrary)] #[allow(clippy::large_enum_variant)] pub enum SqlQuery { + CreateDatabase(CreateDatabaseStatement), CreateTable(CreateTableStatement), CreateView(CreateViewStatement), CreateCache(CreateCacheStatement), @@ -69,6 +71,7 @@ pub enum SqlQuery { Explain(ExplainStatement), Comment(CommentStatement), Deallocate(DeallocateStatement), + Truncate(TruncateStatement), } impl DialectDisplay for SqlQuery { @@ -98,6 +101,8 @@ impl DialectDisplay for SqlQuery { Self::Comment(c) => write!(f, "{}", c.display(dialect)), Self::DropAllProxiedQueries(drop) => write!(f, "{}", drop.display(dialect)), Self::Deallocate(dealloc) => write!(f, "{}", dealloc.display(dialect)), + Self::Truncate(truncate) => write!(f, "{}", truncate.display(dialect)), + Self::CreateDatabase(create) => write!(f, "{}", create.display(dialect)), }) } } @@ -125,6 +130,13 @@ impl SqlQuery { match self { Self::Select(_) => "SELECT", Self::Insert(_) => "INSERT", + Self::CreateDatabase(cd) => { + if cd.is_schema { + "CREATE SCHEMA" + } else { + "CREATE DATABASE" + } + } Self::CreateTable(_) => "CREATE TABLE", Self::CreateView(_) => "CREATE VIEW", Self::CreateCache(_) => "CREATE CACHE", @@ -147,6 +159,7 @@ impl SqlQuery { Self::Explain(_) => "EXPLAIN", Self::Comment(_) => "COMMENT", Self::Deallocate(_) => "DEALLOCATE", + Self::Truncate(_) => "TRUNCATE", } } @@ -174,7 +187,8 @@ impl SqlQuery { | ShowStatement::ReadySetTables | ShowStatement::Connections => true, }, - SqlQuery::CreateTable(_) + SqlQuery::CreateDatabase(_) + | SqlQuery::CreateTable(_) | SqlQuery::CreateView(_) | SqlQuery::AlterTable(_) | SqlQuery::Insert(_) @@ -191,6 +205,7 @@ impl SqlQuery { | SqlQuery::Rollback(_) | SqlQuery::RenameTable(_) | SqlQuery::Use(_) + | SqlQuery::Truncate(_) | SqlQuery::Comment(_) => false, } } @@ -235,7 +250,10 @@ fn sql_query_part1( map(rename_table(dialect), SqlQuery::RenameTable), map(use_statement(dialect), SqlQuery::Use), map(show(dialect), SqlQuery::Show), - map(explain_statement(dialect), SqlQuery::Explain), + alt(( + map(explain_statement(dialect), SqlQuery::Explain), + map(create_database(dialect), SqlQuery::CreateDatabase), + )), ))(i) } } @@ -244,6 +262,7 @@ fn sql_query_part2( ) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], SqlQuery> { move |i| { alt(( + map(truncate(dialect), SqlQuery::Truncate), // This does a more expensive clone of `i`, so process it last. map(create_cached_query(dialect), SqlQuery::CreateCache), map(comment(dialect), SqlQuery::Comment), diff --git a/nom-sql/src/sql_identifier.rs b/nom-sql/src/sql_identifier.rs index 36038b26ac..5b7bd4002b 100644 --- a/nom-sql/src/sql_identifier.rs +++ b/nom-sql/src/sql_identifier.rs @@ -307,12 +307,6 @@ impl std::borrow::Borrow for SqlIdentifier { } } -impl std::borrow::Borrow<[u8]> for SqlIdentifier { - fn borrow(&self) -> &[u8] { - self.as_ref() - } -} - impl PartialOrd for SqlIdentifier { #[inline] #[allow(clippy::non_canonical_partial_ord_impl)] diff --git a/nom-sql/src/sql_type.rs b/nom-sql/src/sql_type.rs index 0b4b584dd6..3dcaedf644 100644 --- a/nom-sql/src/sql_type.rs +++ b/nom-sql/src/sql_type.rs @@ -76,6 +76,8 @@ pub enum SqlType { UnsignedTinyInt(Option), SmallInt(Option), UnsignedSmallInt(Option), + MediumInt(Option), + UnsignedMediumInt(Option), Int2, Int4, Int8, @@ -224,10 +226,12 @@ impl Arbitrary for SqlType { (1..255u16).prop_map(|p| BigInt(Some(p))).boxed(), (1..255u16).prop_map(|p| SmallInt(Some(p))).boxed(), option::of(1..255u16).prop_map(TinyInt).boxed(), + option::of(1..255u16).prop_map(MediumInt).boxed(), option::of(1..255u16).prop_map(UnsignedInt).boxed(), option::of(1..255u16).prop_map(UnsignedSmallInt).boxed(), option::of(1..255u16).prop_map(UnsignedBigInt).boxed(), option::of(1..255u16).prop_map(UnsignedTinyInt).boxed(), + option::of(1..255u16).prop_map(UnsignedMediumInt).boxed(), Just(TinyText).boxed(), Just(MediumText).boxed(), Just(LongText).boxed(), @@ -335,6 +339,11 @@ impl DialectDisplay for SqlType { write_with_len(f, "SMALLINT", len)?; write!(f, " UNSIGNED") } + SqlType::MediumInt(len) => write_with_len(f, "MEDIUMINT", len), + SqlType::UnsignedMediumInt(len) => { + write_with_len(f, "MEDIUMINT", len)?; + write!(f, " UNSIGNED") + } SqlType::Int2 => write!(f, "INT2"), SqlType::Int4 => write!(f, "INT4"), SqlType::Int8 => write!(f, "INT8"), @@ -773,6 +782,14 @@ fn type_identifier_part1( value(SqlType::Int8, tag_no_case("int8")), |i| int_type("tinyint", SqlType::UnsignedTinyInt, SqlType::TinyInt, i), |i| int_type("smallint", SqlType::UnsignedSmallInt, SqlType::SmallInt, i), + cond_fail(dialect == Dialect::MySQL, |i| { + int_type( + "mediumint", + SqlType::UnsignedMediumInt, + SqlType::MediumInt, + i, + ) + }), |i| int_type("integer", SqlType::UnsignedInt, SqlType::Int, i), |i| int_type("int", SqlType::UnsignedInt, SqlType::Int, i), |i| int_type("bigint", SqlType::UnsignedBigInt, SqlType::BigInt, i), @@ -1022,6 +1039,27 @@ pub fn mysql_int_cast_targets() -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<& } } +/// Calls the parser if the condition is met; fails otherwise. +/// +/// This mirrors the intent of [`nom::combinator::cond`], but for use within [`nom::branch::alt`]: +/// instead of resolving to [`None`] when the condition is not met, it returns a parser error so +/// that this branch fails and another alternative can be selected. +fn cond_fail(pred: bool, f: F) -> impl FnMut(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], SqlType> +where + F: Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], SqlType>, +{ + move |i| { + if pred { + f(i) + } else { + Err(nom::Err::Error(ParseError::from_error_kind( + i, + ErrorKind::Fail, + ))) + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -1146,6 +1184,18 @@ mod tests { assert!(res.is_ok()); assert_eq!(res.unwrap().1, SqlType::Double); } + + #[test] + fn mediumint() { + assert_eq!( + test_parse!(type_identifier(Dialect::MySQL), b"mediumint(8)"), + SqlType::MediumInt(Some(8)) + ); + assert_eq!( + test_parse!(type_identifier(Dialect::MySQL), b"mediumint"), + SqlType::MediumInt(None) + ); + } } mod postgres { @@ -1432,5 +1482,16 @@ mod tests { } ); } + + #[test] + fn mediumint_not_recognized() { + assert_eq!( + test_parse!(type_identifier(Dialect::PostgreSQL), b"mediumint"), + SqlType::Other(Relation { + schema: None, + name: "mediumint".into() + }) + ); + } } } diff --git a/nom-sql/src/truncate.rs b/nom-sql/src/truncate.rs new file mode 100644 index 0000000000..02d0d17c65 --- /dev/null +++ b/nom-sql/src/truncate.rs @@ -0,0 +1,438 @@ +use itertools::Itertools; +use nom::branch::alt; +use nom::bytes::complete::{tag, tag_no_case}; +use nom::combinator::opt; +use nom::multi::separated_list1; +use nom::sequence::tuple; +use nom::Parser; +use nom_locate::LocatedSpan; +use readyset_util::fmt::fmt_with; +use serde::{Deserialize, Serialize}; +use test_strategy::Arbitrary; + +use crate::common::ws_sep_comma; +use crate::table::relation; +use crate::whitespace::{whitespace0, whitespace1}; +use crate::{Dialect, DialectDisplay, NomSqlResult, Relation}; + +#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Arbitrary)] + +pub struct TruncateTable { + pub relation: Relation, + pub only: bool, +} + +#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, Arbitrary)] +pub struct TruncateStatement { + pub tables: Vec, + pub restart_identity: bool, + pub cascade: bool, +} + +impl DialectDisplay for TruncateStatement { + fn display(&self, dialect: Dialect) -> impl std::fmt::Display + '_ { + fmt_with(move |f| { + write!(f, "TRUNCATE ")?; + + write!( + f, + "{}", + self.tables + .iter() + .map(|t| format!( + "{}{}", + if t.only { "ONLY " } else { "" }, + t.relation.display(dialect) + )) + .join(", ") + )?; + + if self.restart_identity { + write!(f, " RESTART IDENTITY")?; + } + + if self.cascade { + write!(f, " CASCADE")?; + } + + Ok(()) + }) + } +} + +/// Parse a TRUNCATE statement. +/// +/// The grammar for [MySQL][]: +/// +/// ```sql +/// TRUNCATE [TABLE] tbl_name +/// ``` +/// +/// The grammar for [Postgres][]: +/// +/// ```sql +/// TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ] +/// [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ] +/// ``` +/// +/// [MySQL]: https://dev.mysql.com/doc/refman/8.0/en/truncate-table.html +/// [Postgres]: https://www.postgresql.org/docs/current/sql-truncate.html +pub fn truncate( + dialect: Dialect, +) -> impl Fn(LocatedSpan<&[u8]>) -> NomSqlResult<&[u8], TruncateStatement> { + move |i| { + let (i, _) = tag_no_case("truncate")(i)?; + let (i, _) = whitespace1(i)?; + + let (i, _) = opt(tuple((tag_no_case("table"), whitespace1)))(i)?; + + let (i, tables) = match dialect { + Dialect::MySQL => { + let (i, rel) = relation(dialect)(i)?; + ( + i, + vec![TruncateTable { + relation: rel, + only: false, + }], + ) + } + Dialect::PostgreSQL => separated_list1(ws_sep_comma, |i| { + let (i, only) = opt(tuple((tag_no_case("only"), whitespace1)))(i)?; + let (i, rel) = relation(dialect)(i)?; + let i = if only.is_none() { + opt(tuple((whitespace0, tag("*"))))(i)?.0 + } else { + i + }; + + Ok(( + i, + TruncateTable { + relation: rel, + only: only.is_some(), + }, + )) + })(i)?, + }; + + let (i, restart_identity) = if matches!(dialect, Dialect::PostgreSQL) { + opt(tuple(( + whitespace1, + alt(( + tag_no_case("continue").map(|_| false), + tag_no_case("restart").map(|_| true), + )), + whitespace1, + tag_no_case("identity"), + ))) + .map(|r| r.map(|t| t.1).unwrap_or(false)) + .parse(i)? + } else { + (i, false) + }; + + let (i, cascade) = if matches!(dialect, Dialect::PostgreSQL) { + opt(tuple(( + whitespace1, + alt(( + tag_no_case("restrict").map(|_| false), + tag_no_case("cascade").map(|_| true), + )), + ))) + .map(|r| r.map(|t| t.1).unwrap_or(false)) + .parse(i)? + } else { + (i, false) + }; + + Ok(( + i, + TruncateStatement { + tables, + restart_identity, + cascade, + }, + )) + } +} + +#[cfg(test)] +mod tests { + use std::vec; + + use super::*; + + #[test] + fn truncate_table_mysql() { + assert_eq!( + truncate(Dialect::MySQL)(LocatedSpan::new(b"truncate mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::MySQL)(LocatedSpan::new(b"tRUNcate mydb.mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation { + name: "mytable".into(), + schema: Some("mydb".into()) + }, + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::MySQL)(LocatedSpan::new(b"truncate table mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + let leftover_i = truncate(Dialect::MySQL)(LocatedSpan::new(b"truncate t1, t2")) + .unwrap() + .0; + assert_eq!(*leftover_i, b", t2"); + let leftover_i = + truncate(Dialect::MySQL)(LocatedSpan::new(b"truncate t1 restart identity")) + .unwrap() + .0; + assert_eq!(*leftover_i, b" restart identity"); + let leftover_i = truncate(Dialect::MySQL)(LocatedSpan::new(b"truncate t1 cascade")) + .unwrap() + .0; + assert_eq!(*leftover_i, b" cascade"); + } + + #[test] + fn truncate_table_postgres() { + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"trunCATe mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate mydb.mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation { + name: "mytable".into(), + schema: Some("mydb".into()) + }, + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate table mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate table table1, table2")) + .unwrap() + .1, + TruncateStatement { + tables: vec![ + TruncateTable { + relation: Relation::from("table1"), + only: false, + }, + TruncateTable { + relation: Relation::from("table2"), + only: false, + } + ], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate ONLY mytable")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: true, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate t1, only t2")) + .unwrap() + .1, + TruncateStatement { + tables: vec![ + TruncateTable { + relation: Relation::from("t1"), + only: false, + }, + TruncateTable { + relation: Relation::from("t2"), + only: true, + } + ], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate mytable continue identity")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate mytable restart identity")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: true, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate mytable restrict")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: false, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate mytable cascade")) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: false, + cascade: true, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new( + b"truncate mytable restart identity cascade" + )) + .unwrap() + .1, + TruncateStatement { + tables: vec![TruncateTable { + relation: Relation::from("mytable"), + only: false, + }], + restart_identity: true, + cascade: true, + } + ); + assert_eq!( + truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate t1 *, t2*, t3")) + .unwrap() + .1, + TruncateStatement { + tables: vec![ + TruncateTable { + relation: Relation::from("t1"), + only: false, + }, + TruncateTable { + relation: Relation::from("t2"), + only: false, + }, + TruncateTable { + relation: Relation::from("t3"), + only: false, + } + ], + restart_identity: false, + cascade: false, + } + ); + // Can't combine explicit descendant truncation (*) with ONLY + let leftover_i = truncate(Dialect::PostgreSQL)(LocatedSpan::new(b"truncate only t1*, t2")) + .unwrap() + .0; + assert_eq!(*leftover_i, b"*, t2"); + } + + #[test] + fn display() { + let s = TruncateStatement { + tables: vec![ + TruncateTable { + relation: Relation::from("t1"), + only: false, + }, + TruncateTable { + relation: Relation::from("t2"), + only: true, + }, + ], + restart_identity: true, + cascade: true, + }; + assert_eq!( + s.display(Dialect::PostgreSQL).to_string().as_str(), + r#"TRUNCATE "t1", ONLY "t2" RESTART IDENTITY CASCADE"# + ); + } +} diff --git a/partial-map/src/lib.rs b/partial-map/src/lib.rs index e25e75f9df..768835aba7 100644 --- a/partial-map/src/lib.rs +++ b/partial-map/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(btree_extract_if, bound_map)] +#![feature(btree_extract_if)] use std::borrow::Borrow; pub use std::collections::btree_map::{Iter, Keys, Range, Values, ValuesMut}; diff --git a/proptest-stateful/Cargo.toml b/proptest-stateful/Cargo.toml index 9a82c332a1..8567de6005 100644 --- a/proptest-stateful/Cargo.toml +++ b/proptest-stateful/Cargo.toml @@ -13,8 +13,12 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] +# NOTE: DO NOT REPLACE THESE WITH WORKSPACE DEPENDENCIES. This crate is +# released publicly on crates.io, so we need to include the actual package +# versions here to ensure that the crate is usable outside of the context of +# our repo. async-trait = "0.1" -proptest = "1.0.0" +proptest = "1.4.0" rand = "0.8.5" -tokio = { version = "1.32", features = ["full"] } +tokio = { version = "1.37", features = ["full"] } diff --git a/psql-srv/Cargo.toml b/psql-srv/Cargo.toml index 5edbbec13e..ca46a9e213 100644 --- a/psql-srv/Cargo.toml +++ b/psql-srv/Cargo.toml @@ -9,33 +9,32 @@ description = "Bindings for emulating a PostgreSQL server" readme = "README.md" [dependencies] -async-trait = "0.1" base64 = "0.21" -bit-vec = { version = "0.6", features = ["serde"] } -bytes = "1.0.1" -chrono = "0.4.19" -cidr = "0.2.1" +bit-vec = { workspace = true, features = ["serde"] } +bytes = { workspace = true } +chrono = { workspace = true } +cidr = { workspace = true } eui48 = { workspace = true } -futures = "0.3" -hex = "0.4.3" -hmac = "0.12.1" -nom = "7.1" +futures = { workspace = true } +hex = { workspace = true } +hmac = { workspace = true } +nom = { workspace = true } postgres = { workspace = true } postgres-protocol = { workspace = true } postgres-types = { workspace = true, features = ["with-chrono-0_4", "with-cidr-0_2"] } -rand = "0.8.5" -rust_decimal = { version = "1.26" } -serde_json = { version = "1", features = ["arbitrary_precision"] } -sha2 = "0.10.6" -smallvec = "1.6" -stringprep = "0.1.2" -thiserror = "1.0.26" +rand = { workspace = true } +rust_decimal = { workspace = true } +serde_json = { workspace = true, features = ["arbitrary_precision"] } +sha2 = { workspace = true } +smallvec = { workspace = true } +stringprep = { workspace = true } +thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } -tokio-native-tls = "0.3.1" +tokio-native-tls = { workspace = true } tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] } -tokio-util = { version = "0.6.6", features = ["codec"] } -tracing = "0.1.29" -uuid = "0.8" +tokio-util = { workspace = true, features = ["codec"] } +tracing = { workspace = true } +uuid = { workspace = true } nom-sql = { path = "../nom-sql" } readyset-adapter-types = { path = "../readyset-adapter-types" } diff --git a/psql-srv/src/codec/decoder.rs b/psql-srv/src/codec/decoder.rs index fe921a6311..377d54bae7 100644 --- a/psql-srv/src/codec/decoder.rs +++ b/psql-srv/src/codec/decoder.rs @@ -1183,7 +1183,9 @@ mod tests { #[test] fn test_decode_binary_timestamp() { - let dt = NaiveDateTime::from_timestamp_opt(1_000_000_000, 42_000_000).unwrap(); + let dt = DateTime::from_timestamp(1_000_000_000, 42_000_000) + .unwrap() + .naive_utc(); let mut buf = BytesMut::new(); buf.put_i32(8); // size dt.to_sql(&Type::TIMESTAMP, &mut buf).unwrap(); // value diff --git a/psql-srv/src/codec/encoder.rs b/psql-srv/src/codec/encoder.rs index c8d070e181..96b3813d74 100644 --- a/psql-srv/src/codec/encoder.rs +++ b/psql-srv/src/codec/encoder.rs @@ -701,7 +701,7 @@ mod tests { use bit_vec::BitVec; use bytes::{BufMut, BytesMut}; - use chrono::{FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, TimeZone}; + use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, TimeZone}; use eui48::MacAddress; use postgres::SimpleQueryRow; use postgres_protocol::message::backend::DataRowBody; @@ -1403,7 +1403,9 @@ mod tests { #[test] fn test_encode_binary_timestamp() { - let dt = NaiveDateTime::from_timestamp_opt(1_000_000_000, 42_000_000).unwrap(); + let dt = DateTime::from_timestamp(1_000_000_000, 42_000_000) + .unwrap() + .naive_utc(); let mut buf = BytesMut::new(); put_binary_value(PsqlValue::Timestamp(dt), &mut buf).unwrap(); let mut exp = BytesMut::new(); diff --git a/psql-srv/src/lib.rs b/psql-srv/src/lib.rs index f982b190ac..387d2df5db 100644 --- a/psql-srv/src/lib.rs +++ b/psql-srv/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(associated_type_bounds, let_chains)] +#![feature(let_chains)] //! Bindings for emulating a PostgreSQL server. //! //! When developing new databases or caching layers, it can be immensely useful to test your system @@ -29,7 +29,6 @@ mod value; use std::collections::HashMap; use std::sync::Arc; -use async_trait::async_trait; use futures::Stream; use nom_sql::SqlIdentifier; use postgres::SimpleQueryMessage; @@ -62,7 +61,8 @@ pub enum Credentials<'a> { /// A trait for implementing a SQL backend that produces responses to SQL query statements. This /// trait is the primary interface for the `psql-srv` crate. -#[async_trait] +// Only used internally +#[allow(async_fn_in_trait)] pub trait PsqlBackend { /// An associated type representing a resultset returned by a SQL query, which can be iterated /// to produce `Self::Row`s. diff --git a/psql-srv/src/protocol.rs b/psql-srv/src/protocol.rs index 020589cd22..32b64344cd 100644 --- a/psql-srv/src/protocol.rs +++ b/psql-srv/src/protocol.rs @@ -1076,7 +1076,6 @@ mod tests { use std::task::Poll; use std::{io, vec}; - use async_trait::async_trait; use bytes::BytesMut; use futures::task::Context; use futures::{stream, TryStreamExt}; @@ -1134,7 +1133,6 @@ mod tests { } } - #[async_trait] impl PsqlBackend for Backend { type Resultset = stream::Iter>>; @@ -1971,7 +1969,7 @@ mod tests { parameter_data_types: vec![], }; block_on(protocol.on_request(parse_request, &mut backend, &mut channel)).unwrap(); - assert!(protocol.prepared_statements.get("prepared1").is_some()); + assert!(protocol.prepared_statements.contains_key("prepared1")); // A prepared statement close request calls close on the backend and removes Protocol state // for the prepared statement. @@ -1983,7 +1981,7 @@ mod tests { Response::Message(CloseComplete) )); assert_eq!(backend.last_close.unwrap(), DeallocateId::Numeric(0)); - assert!(protocol.prepared_statements.get("prepared1").is_none()); + assert!(!protocol.prepared_statements.contains_key("prepared1")); } #[test] @@ -2038,7 +2036,7 @@ mod tests { block_on(protocol.on_request(bind_request, &mut backend, &mut channel)).unwrap(), Response::Message(BindComplete) )); - assert!(protocol.portals.get("portal1").is_some()); + assert!(protocol.portals.contains_key("portal1")); // A portal close request removes Protocol state for the portal. let request = FrontendMessage::Close { @@ -2048,7 +2046,7 @@ mod tests { block_on(protocol.on_request(request, &mut backend, &mut channel)).unwrap(), Response::Message(CloseComplete) )); - assert!(protocol.portals.get("protal1").is_none()); + assert!(!protocol.portals.contains_key("protal1")); } #[test] @@ -2093,7 +2091,7 @@ mod tests { parameter_data_types: vec![], }; block_on(protocol.on_request(parse_request, &mut backend, &mut channel)).unwrap(); - assert!(protocol.prepared_statements.get("prepared1").is_some()); + assert!(protocol.prepared_statements.contains_key("prepared1")); // A prepared statement describe request generates a suitable description. let request = FrontendMessage::Describe { @@ -2173,7 +2171,7 @@ mod tests { parameter_data_types: vec![], }; block_on(protocol.on_request(parse_request, &mut backend, &mut channel)).unwrap(); - assert!(protocol.prepared_statements.get("prepared1").is_some()); + assert!(protocol.prepared_statements.contains_key("prepared1")); let bind_request = FrontendMessage::Bind { prepared_statement_name: bytes_str("prepared1"), @@ -2265,7 +2263,7 @@ mod tests { .on_request(parse_request, &mut backend, &mut channel) .await .unwrap(); - assert!(protocol.prepared_statements.get("prepared1").is_some()); + assert!(protocol.prepared_statements.contains_key("prepared1")); let bind_request = FrontendMessage::Bind { prepared_statement_name: bytes_str("prepared1"), @@ -2345,7 +2343,7 @@ mod tests { parameter_data_types: vec![], }; block_on(protocol.on_request(parse_request, &mut backend, &mut channel)).unwrap(); - assert!(protocol.prepared_statements.get("prepared1").is_some()); + assert!(protocol.prepared_statements.contains_key("prepared1")); let bind_request = FrontendMessage::Bind { prepared_statement_name: bytes_str("prepared1"), @@ -2386,7 +2384,7 @@ mod tests { parameter_data_types: vec![], }; block_on(protocol.on_request(parse_request, &mut backend, &mut channel)).unwrap(); - assert!(protocol.prepared_statements.get("prepared1").is_some()); + assert!(protocol.prepared_statements.contains_key("prepared1")); let bind_request = FrontendMessage::Bind { prepared_statement_name: bytes_str("prepared1"), diff --git a/psql-srv/tests/authentication.rs b/psql-srv/tests/authentication.rs index b74afcd8f2..4c9a8699cc 100644 --- a/psql-srv/tests/authentication.rs +++ b/psql-srv/tests/authentication.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::sync::Arc; use std::vec; -use async_trait::async_trait; use futures::stream; use postgres::config::{ChannelBinding, SslMode}; use postgres::error::SqlState; @@ -34,7 +33,6 @@ struct ScramSha256Backend { password: &'static str, } -#[async_trait] impl PsqlBackend for ScramSha256Backend { type Resultset = stream::Iter>>; @@ -90,7 +88,7 @@ impl PsqlBackend for ScramSha256Backend { async fn run_server(backend: ScramSha256Backend) -> u16 { let identity_file = include_bytes!("tls_certs/keyStore.p12"); - let identity = native_tls::Identity::from_pkcs12(identity_file, "").unwrap(); + let identity = native_tls::Identity::from_pkcs12(identity_file, "password").unwrap(); let tls_acceptor = Some(Arc::new(TlsAcceptor::from( native_tls::TlsAcceptor::new(identity).unwrap(), ))); diff --git a/psql-srv/tests/errors.rs b/psql-srv/tests/errors.rs index e028900eed..b1e983971f 100644 --- a/psql-srv/tests/errors.rs +++ b/psql-srv/tests/errors.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; use std::vec; -use async_trait::async_trait; use futures::{stream, Future}; use postgres::NoTls; use postgres_protocol::Oid; @@ -27,7 +26,6 @@ enum ErrorPosition { #[derive(Clone, Copy)] struct ErrorBackend(ErrorPosition); -#[async_trait] impl PsqlBackend for ErrorBackend { type Resultset = stream::Iter>>; diff --git a/psql-srv/tests/tls.rs b/psql-srv/tests/tls.rs index 9e332f489e..7541d5db7c 100644 --- a/psql-srv/tests/tls.rs +++ b/psql-srv/tests/tls.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::sync::Arc; use std::vec; -use async_trait::async_trait; use database_utils::{DatabaseURL, QueryableConnection}; use futures::stream; use postgres_protocol::Oid; @@ -28,7 +27,6 @@ impl TryFrom for psql_srv::PsqlValue { } } -#[async_trait] impl PsqlBackend for TestBackend { type Resultset = stream::Iter>>; @@ -90,7 +88,7 @@ async fn connect() { // Load the identity file as bytes (using relative path) let identity_file = include_bytes!("tls_certs/keyStore.p12"); // Test identify file does not require password - let identity = native_tls::Identity::from_pkcs12(identity_file, "").unwrap(); + let identity = native_tls::Identity::from_pkcs12(identity_file, "password").unwrap(); let tls_acceptor = Some(Arc::new(TlsAcceptor::from( native_tls::TlsAcceptor::new(identity).unwrap(), ))); diff --git a/psql-srv/tests/tls_certs/keyStore.p12 b/psql-srv/tests/tls_certs/keyStore.p12 index 7e806d5ba7..74b4ffabec 100644 Binary files a/psql-srv/tests/tls_certs/keyStore.p12 and b/psql-srv/tests/tls_certs/keyStore.p12 differ diff --git a/query-generator/Cargo.toml b/query-generator/Cargo.toml index 856f376d18..8ffc2d7953 100644 --- a/query-generator/Cargo.toml +++ b/query-generator/Cargo.toml @@ -6,30 +6,30 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0.38" -chrono = "0.4.19" +anyhow = { workspace = true } +chrono = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -derive_more = "0.99.11" -futures-util = "0.3.13" -itertools = "0.10" -lazy_static = "1.4.0" -rand = "0.8.3" -regex = "1.4.3" -serde = { version = "1.0.123", features = ["derive"] } -serde_json = "1.0.63" -strum = "0.23" -strum_macros = "0.23" -thiserror = "1.0.26" -proptest = "1.0.0" -test-strategy = "0.2.0" -rust_decimal = { version = "1.26" } +derive_more = { workspace = true } +futures-util = { workspace = true } +itertools = { workspace = true } +lazy_static = { workspace = true } +rand = { workspace = true } +regex = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } +thiserror = { workspace = true } +proptest = { workspace = true } +test-strategy = { workspace = true } +rust_decimal = { workspace = true } eui48 = { workspace = true } -uuid = "0.8" -bit-vec = { version = "0.6", features = ["serde"] } -rand_regex = "0.15.1" -zipf = "7.0.0" -parking_lot = "0.11.2" -growable-bloom-filter = "2.0.1" +uuid = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +rand_regex = { workspace = true } +zipf = { workspace = true } +parking_lot = { workspace = true } +growable-bloom-filter = { workspace = true } data-generator = { path = "../data-generator" } nom-sql = { path = "../nom-sql" } @@ -39,6 +39,6 @@ readyset-util = { path = "../readyset-util" } [dev-dependencies] mysql_async.workspace = true -serial_test = "0.5" +serial_test = { workspace = true } tokio = { workspace = true, features = ["full"] } tokio-postgres.workspace = true diff --git a/query-generator/src/lib.rs b/query-generator/src/lib.rs index f67f86bfd5..a4d0603eda 100644 --- a/query-generator/src/lib.rs +++ b/query-generator/src/lib.rs @@ -1070,6 +1070,14 @@ impl AggregateType { AggregateType::Min { column_type } => column_type.clone(), } } + + pub fn is_distinct(&self) -> bool { + match self { + AggregateType::Count { distinct, .. } => *distinct, + AggregateType::Sum { distinct, .. } => *distinct, + _ => false, + } + } } /// Parameters for generating an arbitrary FilterRhs @@ -2243,9 +2251,10 @@ impl Arbitrary for Operations { fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { any_with::>(args) .prop_map(|mut ops| { - // Don't generate an aggregate or distinct in the same query as a WHERE IN clause, + // Don't generate an aggregate with distinct keyword or a plain distinct + // in the same query as a WHERE IN clause, // since we don't support those queries (ENG-2942) - let mut agg_or_distinct_found = false; + let mut distinct_found = false; let mut in_parameter_found = false; // Don't generate an OR filter in the same query as a parameter of any kind, since @@ -2254,16 +2263,24 @@ impl Arbitrary for Operations { let mut or_filter_found = false; ops.retain(|op| match op { - QueryOperation::ColumnAggregate(_) | QueryOperation::Distinct => { + QueryOperation::ColumnAggregate(agg) if agg.is_distinct() => { + if in_parameter_found { + false + } else { + distinct_found = true; + true + } + } + QueryOperation::Distinct => { if in_parameter_found { false } else { - agg_or_distinct_found = true; + distinct_found = true; true } } QueryOperation::InParameter { .. } => { - if agg_or_distinct_found || or_filter_found { + if distinct_found | or_filter_found { false } else { in_parameter_found = true; diff --git a/quickstart/check_db_size.sh b/quickstart/check_db_size.sh new file mode 100755 index 0000000000..568a33853e --- /dev/null +++ b/quickstart/check_db_size.sh @@ -0,0 +1,202 @@ +#!/bin/bash + + +################################################################################################### +# Readyset DB Size Script +# +# Version: 1.0 +# +# This Script Will: +# +# 1. Attempt to connect to your database and validate credentials +# 2. Gather current database size +# 3. Gather number of tables in current database +# +################################################################################################### + + +default_port= + +# Parse connection string (assuming format: "postgresql://user:password@host[:port]/dbname") +# Or (assuming format: "mysql://user:password@host[:port]/[dbname]") +# This function will set the protocol, user, password, host, port, and dbname variables +parse_connection_string() { + local connection_string=$1 + local db_mode=$2 + protocol=$(echo $connection_string | grep -o '^[^:]*') + user=$(echo $connection_string | cut -d '/' -f 3 | cut -d ':' -f 1) + password=$(echo $connection_string | cut -d ':' -f 3 | cut -d '@' -f 1) + # Check if user has the "@" signal - empty password + if [[ $user == *"@"* ]]; then + user=$(echo $user | cut -d '@' -f 1) + password="" + fi + # Check if password is empty + if [[ -z $password ]]; then + echo "Password for user ${user}. Hit ENTER if the user has no password" + read -sp "Password: " password + echo "" + fi + + host_port=$(echo $connection_string | cut -d '@' -f 2 | cut -d '/' -f 1) + host=$(echo $host_port | cut -d ':' -f 1) + port=$default_port + if [[ $host_port == *":"* ]]; then + port=$(echo $host_port | cut -d ':' -f 2) + fi + dbname=$(echo $connection_string | cut -d '/' -f 4) + if [[ -z $dbname ]] && [[ "$db_mode" == "postgres" ]]; then + echo "Database name is required for Readyset." + exit 1 + fi + # Check credentials + if [[ $db_mode == "postgresql" ]]; then + execute_sql_pg "SELECT 1" &> /dev/null || { echo "Failed to connect. Is this script being run somewhere that it can connect to the db? Check your connection string"; exit 1; } + else + execute_sql_mysql "SELECT 1" &> /dev/null || { echo "Failed to connect. Is this script being run somewhere that it can connect to the db? Check your connection string"; exit 1; } + fi + +} + +# Provide prompts +interactive_mode_prompts() { + echo "Welcome to the Readyset Database Size Checker!" + echo "Please enter your database connection details." + echo "MySQL connection string format: mysql://user:password@host:port/dbname" + echo "PostgreSQL connection string format: postgresql://user:password@host:port/dbname" + + read -p "Enter the database connection: " connection_string + + if [[ $connection_string == mysql* ]]; then + default_port=3306 + parse_connection_string $connection_string "mysql" + run_mysql_commands + elif [[ $connection_string == postgres* ]]; then + default_port=5432 + parse_connection_string $connection_string "postgresql" + run_postgresql_commands + else + echo "Invalid database mode. Please enter either mysql or postgresql connection string." + exit 1 + fi + +} + +# Function that runs the required commands for PostgreSQL +run_postgresql_commands() { + # Check DB size + db_size=$(execute_sql_pg "SELECT pg_database_size(current_database());") + + # Check table count + table_count=$(execute_sql_pg "SELECT COUNT(*) + FROM pg_catalog.pg_class c + LEFT JOIN pg_catalog.pg_namespace n + ON n.oid = c.relnamespace + WHERE c.relkind IN ('r', 'v') AND n.nspname <> 'pg_catalog' + AND n.nspname <> 'information_schema' + AND n.nspname <> 'readyset' + AND n.nspname !~ '^pg_toast' + AND c.oid NOT IN( + SELECT c.oid + FROM pg_catalog.pg_class c + JOIN pg_catalog.pg_attribute a + ON a.attrelid = c.oid + WHERE attgenerated <> '' + );") + +} + +# Function that runs the required commands for MySQL +run_mysql_commands() { + # Check DB size + table_schema="WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')" + if [[ ! -z $dbname ]]; then + table_schema="${table_schema} AND table_schema = '${dbname}'" + fi + + db_size=$(execute_sql_mysql "SELECT SUM(data_length + index_length) FROM information_schema.tables ${table_schema};") + + # Check table count + table_count=$(execute_sql_mysql "SELECT COUNT(*) FROM information_schema.tables ${table_schema};") +} + +# Function to execute SQL command and print result - PostgreSQL +execute_sql_pg() { + local sql=$1 + PGPASSWORD=${password} psql --host=${host} --port=${port} --username=${user} --dbname=${dbname} -t --quiet -c "${sql}" +} + + +# Function responsible for checking psql is installed +check_psql_exists() { + if ! command -v psql &>/dev/null; then + echo -e "psql (PostgreSQL client) is not installed. Please install psql to continue." + exit 1 + fi +} + +# Function to execute SQL command and print result - MySQL +execute_sql_mysql() { + local sql=$1 + if [[ ! -z $db_name ]]; then + db="-D ${dbname}" + fi + mysql -h ${host} -P ${port} -u ${user} -p${password} ${db} -s -N -e "${sql}" +} + +# function to check if mysql client is installed +check_mysql_exists() { + if ! command -v mysql &>/dev/null; then + echo -e "mysql (MySQL client) is not installed. Please install mysql to continue." + exit 1 + fi +} + +##### End of functions ##### + +# Main run steps + +# Check psql is installed +check_psql_exists + +# Usage check +if [ "$#" -ne 1 ] ; then + interactive_mode_prompts +else + connection_string=$1 + if [[ $connection_string == mysql* ]]; then + default_port=3306 + parse_connection_string $connection_string "mysql" + run_mysql_commands + elif [[ $connection_string == postgres* ]]; then + default_port=5432 + parse_connection_string $connection_string "postgresql" + run_postgresql_commands + else + echo "Invalid connection string. Please provide a valid mysql or postgres connection string." + exit 1 + fi +fi + +# Create output +output=$(cat <"] edition = "2021" [dependencies] -triomphe = "0.1" -smallvec = { version = "1.8", default-features = false, features = ["union"] } -rand = { version = "0.7", default-features = false, features = ["std", "alloc"] } -left-right = "0.11" -itertools = "0.10" +triomphe = { workspace = true } +smallvec = { workspace = true, features = ["union"] } +rand = { workspace = true } +left-right = { workspace = true } +itertools = { workspace = true } readyset-client = { path = "../readyset-client" } readyset-util = { path = "../readyset-util" } partial-map = { path = "../partial-map" } -thiserror = "1.0.31" -iter-enum = "1.1.1" +thiserror = { workspace = true } +iter-enum = { workspace = true } [dev-dependencies] -proptest = "1.0.0" -test-strategy = "0.2.0" +proptest = { workspace = true } +test-strategy = { workspace = true } diff --git a/reader-map/benchmark/Cargo.toml b/reader-map/benchmark/Cargo.toml index 5f4c6f9ed2..2412278728 100644 --- a/reader-map/benchmark/Cargo.toml +++ b/reader-map/benchmark/Cargo.toml @@ -10,11 +10,11 @@ publish = false [dependencies] reader_map = { path = "../" } -chashmap = "2.1.0" +chashmap = { workspace = true } clap = { workspace = true, features = ["derive", "env"] } -zipf = "6" -rand = "0.7" -parking_lot = "0.10.1" +zipf = { workspace = true } +rand = { workspace = true } +parking_lot = { workspace = true } [profile.release] lto = true diff --git a/reader-map/src/read.rs b/reader-map/src/read.rs index 4418599013..458cb49a7a 100644 --- a/reader-map/src/read.rs +++ b/reader-map/src/read.rs @@ -113,10 +113,10 @@ where } /// Internal version of `get_and` - fn get_raw(&self, key: &Q) -> Result>>> + fn get_raw(&self, key: &Q) -> Result>>> where K: Borrow, - Q: Ord + Hash, + Q: Ord + Hash + ?Sized, { let MapReadRef { guard } = self.enter()?; Ok(ReadGuard::try_map(guard, |inner| { @@ -139,10 +139,10 @@ where /// published by the writer. If no publish has happened, or the map has been destroyed, this /// function returns an [`Error`]. #[inline] - pub fn get<'rh, Q: ?Sized>(&'rh self, key: &'_ Q) -> Result>>> + pub fn get<'rh, Q>(&'rh self, key: &'_ Q) -> Result>>> where K: Borrow, - Q: Ord + Hash, + Q: Ord + Hash + ?Sized, { // call `borrow` here to monomorphize `get_raw` fewer times self.get_raw(key.borrow()) @@ -163,10 +163,10 @@ where /// refreshed by the writer. If no refresh has happened, or the map has been destroyed, this /// function returns an [`Error`]. #[inline] - pub fn first<'rh, Q: ?Sized>(&'rh self, key: &'_ Q) -> Result>> + pub fn first<'rh, Q>(&'rh self, key: &'_ Q) -> Result>> where K: Borrow, - Q: Ord + Clone + Hash, + Q: Ord + Clone + Hash + ?Sized, { let vs = if let Some(vs) = self.get_raw(key.borrow())? { vs @@ -189,10 +189,10 @@ where /// function returns an [`Error`]. /// /// If no values exist for the given key, `Ok(None, _)` is returned. - pub fn meta_get(&self, key: &Q) -> Result<(Option>>, M)> + pub fn meta_get(&self, key: &Q) -> Result<(Option>>, M)> where K: Borrow, - Q: Ord + Clone + Hash, + Q: Ord + Clone + Hash + ?Sized, { let MapReadRef { guard } = self.enter()?; let meta = guard.meta.clone(); diff --git a/reader-map/src/read/read_ref.rs b/reader-map/src/read/read_ref.rs index e30dbd46be..1d417a5886 100644 --- a/reader-map/src/read/read_ref.rs +++ b/reader-map/src/read/read_ref.rs @@ -151,10 +151,10 @@ where /// Note that not all writes will be included with this read -- only those that have been /// published by the writer. If no publish has happened, or the map has been destroyed, this /// function returns `None`. - pub fn first<'a, Q: ?Sized>(&'a self, key: &'_ Q) -> Option<&'a V> + pub fn first<'a, Q>(&'a self, key: &'_ Q) -> Option<&'a V> where K: Borrow, - Q: Ord + Hash, + Q: Ord + Hash + ?Sized, { self.guard.data.get(key).and_then(|values| values.first()) } diff --git a/reader-map/tests/proptest.rs b/reader-map/tests/proptest.rs index c212658fad..c834129d74 100644 --- a/reader-map/tests/proptest.rs +++ b/reader-map/tests/proptest.rs @@ -17,10 +17,10 @@ use test_strategy::{proptest, Arbitrary}; const LARGE_VEC_RANGE: Range = 10..1000; -fn set<'a, T: 'a, I>(iter: I) -> HashSet +fn set<'a, T, I>(iter: I) -> HashSet where I: IntoIterator, - T: Copy + Hash + Eq, + T: Copy + Hash + Eq + 'a, { iter.into_iter().cloned().collect() } diff --git a/readyset-adapter/Cargo.toml b/readyset-adapter/Cargo.toml index a8c4c724b1..d0815d71cf 100644 --- a/readyset-adapter/Cargo.toml +++ b/readyset-adapter/Cargo.toml @@ -8,49 +8,50 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -ahash = "0.7" -anyhow = "1.0" +ahash = { workspace = true } +anyhow = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -fail = "0.5.0" -futures-executor = "0.3.14" -futures-util = "0.3.14" -lazy_static = "1.0.0" +fail = { workspace = true } +futures-executor = { workspace = true } +futures-util = { workspace = true } +lazy_static = { workspace = true } nom-sql = { path = "../nom-sql" } -nom = "7.1" -regex = "1.0.0" +nom = { workspace = true } +regex = { workspace = true } tokio = { workspace = true, features = ["full"] } -chrono = "0.4" -tracing = { version = "0.1", features = ["release_max_level_debug"] } -tracing-futures = "0.2.5" -vec1 = "1.6.0" -itertools = "0.10" -derive_more = "0.99.11" -async-trait = "0.1" -thiserror = "1.0.26" +chrono = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } +tracing-futures = { workspace = true } +vec1 = { workspace = true } +itertools = { workspace = true } +derive_more = { workspace = true } +async-trait = { workspace = true } +thiserror = { workspace = true } readyset-util = { path = "../readyset-util" } metrics = { workspace = true } metrics-exporter-prometheus = { workspace = true } metrics-util = { workspace = true } -futures = "0.3" -serde = "1.0.130" -serde_json = "1.0.67" -rust_decimal = { version = "1.26" } -bit-vec = { version = "0.6", features = ["serde"] } -hyper = { version = "0.14.10", features = [ "stream", "server" ] } -tokio-stream = { version = "0.1.5", features = [ "net" ] } -tokio-tower = "0.5.1" -tower = { version = "0.4.6", features = ["util"] } -time = { version = "0.3", features = ["local-offset"] } -dashmap = "4.0.2" -mysql_common = "0.32" -bincode = "1.3.3" -parking_lot = "0.11.2" -sqlformat = "0.2.1" -indexmap = { version = "1", default-features = false } -quanta = { version = "0.11", default-features = false } -lru = "0.12.0" -crossbeam-skiplist = "0.1.1" -slab = "0.4" +futures = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +rust_decimal = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +hyper = { workspace = true, features = ["stream", "server"] } +tokio-stream = { workspace = true, features = ["net"] } +tokio-tower = { workspace = true } +tower = { workspace = true, features = ["util"] } +time = { workspace = true, features = ["local-offset"] } +dashmap = { workspace = true } +mysql_common = { workspace = true } +bincode = { workspace = true } +parking_lot = { workspace = true } +sqlformat = { workspace = true } +indexmap = { workspace = true } +quanta = { workspace = true } +lru = { workspace = true } +crossbeam-skiplist = { workspace = true } +slab = { workspace = true } +xxhash-rust = { workspace = true } readyset-adapter-types = { path = "../readyset-adapter-types/" } readyset-alloc = { path = "../readyset-alloc/" } @@ -69,10 +70,10 @@ health-reporter = { path = "../health-reporter" } database-utils = { path = "../database-utils" } [dev-dependencies] -proptest = "1.0.0" -test-strategy = "0.2.0" +proptest = { workspace = true } +test-strategy = { workspace = true } criterion = { workspace = true } -rand = "0.8.5" +rand = { workspace = true } [lib] path = "src/lib.rs" @@ -81,6 +82,10 @@ path = "src/lib.rs" name = "parse" harness = false +[[bench]] +name = "hash" +harness = false + [features] ryw = [] failure_injection = ["fail/failpoints"] diff --git a/readyset-adapter/benches/hash.rs b/readyset-adapter/benches/hash.rs new file mode 100644 index 0000000000..c5880e382c --- /dev/null +++ b/readyset-adapter/benches/hash.rs @@ -0,0 +1,1059 @@ +use std::sync::Arc; + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use lru::LruCache; +use nom_sql::parse_select_statement; +use readyset_client::query::Query; +use readyset_client::ViewCreateRequest; +use xxhash_rust::xxh3; + +fn hash_benchmarks(c: &mut Criterion) { + let mut group = c.benchmark_group("xxHash Benchmarks"); + + let queries = QUERY_CORPUS + .iter() + .map(|q| { + Query::Parsed(Arc::new(ViewCreateRequest { + statement: parse_select_statement(nom_sql::Dialect::MySQL, q).unwrap(), + schema_search_path: vec!["public".into()], + })) + }) + .collect::>(); + + let mut i = 0; + let len = queries.len(); + + group.bench_function("xxHash 64-bit", |b| { + let mut lru_cache = black_box(LruCache::::new(100.try_into().expect("nonzero"))); + + b.iter(|| { + let hash = xxh3::xxh3_64(bincode::serialize(&queries[i % len]).unwrap().as_slice()); + if !lru_cache.contains(&hash) { + lru_cache.put(hash, true); + } + i += 1; + }); + }); + + group.bench_function("xxHash 128-bit", |b| { + let mut lru_cache = black_box(LruCache::::new( + 100.try_into().expect("nonzero"), + )); + + b.iter(|| { + let hash = xxh3::xxh3_128(bincode::serialize(&queries[i % len]).unwrap().as_slice()); + if !lru_cache.contains(&hash) { + lru_cache.put(hash, true); + } + i += 1; + }); + }); + + group.finish(); +} + +criterion_group!(benches, hash_benchmarks); +criterion_main!(benches); + +const QUERY_CORPUS: [&str; 1000] = [ + "SELECT sum(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT sum(table_1.column_2) AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT sum(table_1.column_3) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT sum(table_1.column_4) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT sum(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT sum(table_1.column_2) AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT sum(table_1.column_3) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT sum(table_1.column_4) AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?))", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?)", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?))", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?))", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?)", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?))", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE ((table_1.column_1 = ?) AND (table_1.column_1 = ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE table_1.column_1 IN (?, ?, ?) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (((table_1.column_1 = ?) AND (table_1.column_1 = ?)) AND table_1.column_1 IN (?, ?, ?)) ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT sum(table_1.column_1) AS alias_1 FROM table_1", + "SELECT group_concat(table_1.column_2 separator ', ') AS alias_1 FROM table_1", + "SELECT sum(table_1.column_3) AS alias_1, group_concat(table_1.column_4 separator ', ') AS alias_2 FROM table_1", + "SELECT sum(table_1.column_1) AS alias_1 FROM table_1", + "SELECT group_concat(table_1.column_2 separator ', ') AS alias_1 FROM table_1", + "SELECT sum(table_1.column_3) AS alias_1, group_concat(table_1.column_4 separator ', ') AS alias_2 FROM table_1", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`)", + "SELECT min(`table_1`.`column_3`) AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT `table_1`.`column_4` AS `alias_1`, `table_3`.`column_2` AS `alias_2`, min(`table_1`.`column_5`) AS `alias_3` FROM `table_1` INNER JOIN `table_3` ON (`table_1`.`column_1` = `table_3`.`column_1`) GROUP BY `table_1`.`column_4`, `table_3`.`column_2`", + "SELECT `table_3`.`column_3` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_4` ON (`table_3`.`column_1` = `table_4`.`column_1`) WHERE (`table_3`.`column_3` > ?)", + "SELECT min(`table_2`.`column_3`) AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_3` > ?)", + "SELECT `table_2`.`column_4` AS `alias_1`, `table_5`.`column_2` AS `alias_2`, min(`table_2`.`column_5`) AS `alias_3` FROM `table_2` INNER JOIN `table_5` ON (`table_2`.`column_3` = `table_5`.`column_1`) WHERE (`table_2`.`column_1` > ?) GROUP BY `table_2`.`column_4`, `table_5`.`column_2`", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`)", + "SELECT min(`table_1`.`column_3`) AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT `table_1`.`column_4` AS `alias_1`, `table_3`.`column_2` AS `alias_2`, min(`table_1`.`column_5`) AS `alias_3` FROM `table_1` INNER JOIN `table_3` ON (`table_1`.`column_1` = `table_3`.`column_1`) GROUP BY `table_1`.`column_4`, `table_3`.`column_2`", + "SELECT `table_3`.`column_3` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_4` ON (`table_3`.`column_1` = `table_4`.`column_1`) WHERE (`table_3`.`column_3` > ?)", + "SELECT min(`table_2`.`column_3`) AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_3` > ?)", + "SELECT `table_2`.`column_4` AS `alias_1`, `table_5`.`column_2` AS `alias_2`, min(`table_2`.`column_5`) AS `alias_3` FROM `table_2` INNER JOIN `table_5` ON (`table_2`.`column_3` = `table_5`.`column_1`) WHERE (`table_2`.`column_1` > ?) GROUP BY `table_2`.`column_4`, `table_5`.`column_2`", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`)", + "SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE `table_2`.`column_1` IN (?, ?, ?)", + "SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_1` > ?)", + "SELECT `table_2`.`column_3` AS `alias_1`, `table_3`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_3` ON (`table_2`.`column_1` = `table_3`.`column_1`) WHERE `table_2`.`column_1` IN (?, ?, ?)", + "SELECT `table_2`.`column_4` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_4` ON (`table_2`.`column_1` = `table_4`.`column_1`) WHERE (`table_2`.`column_1` > ?)", + "SELECT `table_3`.`column_2` AS `alias_1` FROM `table_3` WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?))", + "SELECT `table_3`.`column_3` AS `alias_1`, `table_5`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_5` ON (`table_3`.`column_2` = `table_5`.`column_1`) WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_2`.`column_2` AS `alias_2` FROM `table_1` INNER JOIN `table_2` ON (`table_1`.`column_1` = `table_2`.`column_1`)", + "SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE `table_2`.`column_1` IN (?, ?, ?)", + "SELECT `table_2`.`column_1` AS `alias_1` FROM `table_2` WHERE (`table_2`.`column_1` > ?)", + "SELECT `table_2`.`column_3` AS `alias_1`, `table_3`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_3` ON (`table_2`.`column_1` = `table_3`.`column_1`) WHERE `table_2`.`column_1` IN (?, ?, ?)", + "SELECT `table_2`.`column_4` AS `alias_1`, `table_4`.`column_2` AS `alias_2` FROM `table_2` INNER JOIN `table_4` ON (`table_2`.`column_1` = `table_4`.`column_1`) WHERE (`table_2`.`column_1` > ?)", + "SELECT `table_3`.`column_2` AS `alias_1` FROM `table_3` WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?))", + "SELECT `table_3`.`column_3` AS `alias_1`, `table_5`.`column_2` AS `alias_2` FROM `table_3` INNER JOIN `table_5` ON (`table_3`.`column_2` = `table_5`.`column_1`) WHERE (`table_3`.`column_2` IN (?, ?, ?) AND (`table_3`.`column_2` > ?))", + "SELECT count(table_1.column_1) AS alias_1 FROM table_1", + "SELECT sum(table_1.column_2) AS alias_1 FROM table_1", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT count(table_1.column_3) AS alias_1, sum(table_1.column_4) AS alias_2 FROM table_1", + "SELECT count(table_1.column_5) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10", + "SELECT count(table_1.column_6) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT sum(table_1.column_7) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10", + "SELECT sum(table_1.column_8) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT table_1.column_5 AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_9) AS alias_1, sum(table_1.column_10) AS alias_2 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10", + "SELECT count(table_1.column_11) AS alias_1, sum(table_1.column_12) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_13) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT sum(table_1.column_14) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_15) AS alias_1, sum(table_1.column_16) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_1) AS alias_1 FROM table_1", + "SELECT sum(table_1.column_2) AS alias_1 FROM table_1", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 ASC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 ORDER BY table_1.column_1 DESC LIMIT 10", + "SELECT count(table_1.column_3) AS alias_1, sum(table_1.column_4) AS alias_2 FROM table_1", + "SELECT count(table_1.column_5) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10", + "SELECT count(table_1.column_6) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT sum(table_1.column_7) AS alias_1 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10", + "SELECT sum(table_1.column_8) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT table_1.column_5 AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_9) AS alias_1, sum(table_1.column_10) AS alias_2 FROM table_1 ORDER BY table_1.column_5 ASC LIMIT 10", + "SELECT count(table_1.column_11) AS alias_1, sum(table_1.column_12) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_13) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT sum(table_1.column_14) AS alias_1 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT count(table_1.column_15) AS alias_1, sum(table_1.column_16) AS alias_2 FROM table_1 ORDER BY table_1.column_5 DESC LIMIT 10", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` < `table_1`.`column_2`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < `table_1`.`column_1`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?)", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` < `table_1`.`column_2`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < `table_1`.`column_1`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` < 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?)", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (((`table_1`.`column_2` > ?) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((((`table_1`.`column_2` < 1) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((((`table_1`.`column_2` < 1) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((((`table_1`.`column_2` < `table_1`.`column_1`) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((((`table_1`.`column_2` < `table_1`.`column_1`) OR (`table_1`.`column_2` < `table_1`.`column_1`)) AND (`table_1`.`column_2` < 1)) OR (`table_1`.`column_2` < 1)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = `table_1`.`column_2`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?)", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = `table_1`.`column_2`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = `table_1`.`column_1`)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` = 1)", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_2` > ?)", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_2` = 1) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_2` = 1) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_2` = `table_1`.`column_1`) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT DISTINCT `table_1`.`column_2` AS `alias_1`, `table_1`.`column_2` AS `alias_2`, `table_1`.`column_2` AS `alias_3`, `table_1`.`column_2` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_2` = `table_1`.`column_1`) OR (`table_1`.`column_2` = `table_1`.`column_1`)) AND (`table_1`.`column_2` = 1)) OR (`table_1`.`column_2` = 1)) AND (`table_1`.`column_2` > ?))", + "SELECT min(`table_1`.`column_1`) AS `alias_1` FROM `table_1`", + "SELECT max(`table_1`.`column_2`) AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT min(`table_1`.`column_3`) AS `alias_1`, max(`table_1`.`column_4`) AS `alias_2` FROM `table_1`", + "SELECT min(`table_1`.`column_5`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT max(`table_1`.`column_6`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT min(`table_1`.`column_7`) AS `alias_1`, max(`table_1`.`column_8`) AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_4` > ?)", + "SELECT min(`table_1`.`column_1`) AS `alias_1` FROM `table_1`", + "SELECT max(`table_1`.`column_2`) AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT min(`table_1`.`column_3`) AS `alias_1`, max(`table_1`.`column_4`) AS `alias_2` FROM `table_1`", + "SELECT min(`table_1`.`column_5`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT max(`table_1`.`column_6`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT min(`table_1`.`column_7`) AS `alias_1`, max(`table_1`.`column_8`) AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_4` > ?)", + "SELECT max(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4)", + "SELECT table_1.column_5 AS alias_1, table_2.column_2 AS alias_2 FROM table_1 INNER JOIN table_2 ON (table_1.column_1 = table_2.column_1)", + "SELECT max(table_2.column_3) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4", + "SELECT max(table_2.column_5) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4", + "SELECT max(table_2.column_6) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_7) GROUP BY table_2.column_4", + "SELECT max(table_2.column_8) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_9) GROUP BY table_2.column_4", + "SELECT max(table_2.column_10) AS alias_1, table_2.column_11 AS alias_2, table_3.column_2 AS alias_3 FROM table_2 INNER JOIN table_3 ON (table_2.column_5 = table_3.column_1) GROUP BY table_2.column_11, table_3.column_2", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_12))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_13))", + "SELECT table_2.column_4 AS alias_1, table_2.column_14 AS alias_2, table_4.column_2 AS alias_3 FROM table_2 INNER JOIN table_4 ON (table_2.column_12 = table_4.column_1) WHERE (table_2.column_4 <= 1)", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_15))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_16))", + "SELECT table_2.column_4 AS alias_1, table_2.column_17 AS alias_2, table_5.column_2 AS alias_3 FROM table_2 INNER JOIN table_5 ON (table_2.column_5 = table_5.column_1) WHERE (table_2.column_4 <= 1)", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= table_2.column_18) OR (table_2.column_4 <= table_2.column_19))", + "SELECT table_2.column_4 AS alias_1, table_2.column_21 AS alias_2, table_6.column_2 AS alias_3 FROM table_2 INNER JOIN table_6 ON (table_2.column_20 = table_6.column_1) WHERE (table_2.column_4 <= table_2.column_20)", + "SELECT table_2.column_4 AS alias_1, table_2.column_23 AS alias_2, table_7.column_2 AS alias_3 FROM table_2 INNER JOIN table_7 ON (table_2.column_20 = table_7.column_1) WHERE (table_2.column_4 <= table_2.column_22)", + "SELECT max(table_7.column_3) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= 1)) GROUP BY table_7.column_4, table_7.column_4", + "SELECT max(table_7.column_5) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) AND (table_7.column_4 <= table_7.column_6)) GROUP BY table_7.column_4, table_7.column_4", + "SELECT max(table_7.column_7) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= table_7.column_8)) GROUP BY table_7.column_4, table_7.column_4", + "SELECT max(table_7.column_9) AS alias_1, table_7.column_4 AS alias_2, table_7.column_10 AS alias_3, table_8.column_2 AS alias_4 FROM table_7 INNER JOIN table_8 ON (table_7.column_2 = table_8.column_1) WHERE (table_7.column_4 <= 1) GROUP BY table_7.column_4, table_7.column_10, table_8.column_2", + "SELECT max(table_3.column_3) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_5)) GROUP BY table_3.column_4, table_3.column_4", + "SELECT max(table_3.column_6) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_7)) GROUP BY table_3.column_4, table_3.column_4", + "SELECT max(table_3.column_8) AS alias_1, table_3.column_4 AS alias_2, table_3.column_9 AS alias_3, table_9.column_2 AS alias_4 FROM table_3 INNER JOIN table_9 ON (table_3.column_6 = table_9.column_1) WHERE (table_3.column_4 <= 1) GROUP BY table_3.column_4, table_3.column_9, table_9.column_2", + "SELECT max(table_3.column_10) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= table_3.column_11) OR (table_3.column_4 <= table_3.column_12)) GROUP BY table_3.column_4, table_3.column_4", + "SELECT max(table_3.column_13) AS alias_1, table_3.column_4 AS alias_2, table_3.column_15 AS alias_3, table_10.column_2 AS alias_4 FROM table_3 INNER JOIN table_10 ON (table_3.column_11 = table_10.column_1) WHERE (table_3.column_4 <= table_3.column_14) GROUP BY table_3.column_4, table_3.column_15, table_10.column_2", + "SELECT max(table_3.column_16) AS alias_1, table_3.column_4 AS alias_2, table_3.column_18 AS alias_3, table_11.column_2 AS alias_4 FROM table_3 INNER JOIN table_11 ON (table_3.column_10 = table_11.column_1) WHERE (table_3.column_4 <= table_3.column_17) GROUP BY table_3.column_4, table_3.column_18, table_11.column_2", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) AND (table_3.column_4 <= table_3.column_19))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) OR (table_3.column_4 <= table_3.column_20))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_21 AS alias_3, table_12.column_2 AS alias_4 FROM table_3 INNER JOIN table_12 ON (table_3.column_20 = table_12.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= 1))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_22)) OR (table_3.column_4 <= table_3.column_23))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_25 AS alias_3, table_13.column_2 AS alias_4 FROM table_3 INNER JOIN table_13 ON (table_3.column_20 = table_13.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_24))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_27 AS alias_3, table_14.column_2 AS alias_4 FROM table_3 INNER JOIN table_14 ON (table_3.column_20 = table_14.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_26))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_28)) OR (table_3.column_4 <= table_3.column_29))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_31 AS alias_3, table_15.column_2 AS alias_4 FROM table_3 INNER JOIN table_15 ON (table_3.column_20 = table_15.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_30))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_25 AS alias_3, table_16.column_2 AS alias_4 FROM table_2 INNER JOIN table_16 ON (table_2.column_20 = table_16.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_24))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_28 AS alias_3, table_17.column_2 AS alias_4 FROM table_2 INNER JOIN table_17 ON (table_2.column_20 = table_17.column_1) WHERE ((table_2.column_4 <= table_2.column_26) OR (table_2.column_4 <= table_2.column_27))", + "SELECT max(table_2.column_29) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_30)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_31) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_32)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_33) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_34 AS alias_4, table_18.column_2 AS alias_5 FROM table_2 INNER JOIN table_18 ON (table_2.column_31 = table_18.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_34, table_18.column_2", + "SELECT max(table_2.column_35) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_36)) OR (table_2.column_4 <= table_2.column_37)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_38) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_40 AS alias_4, table_19.column_2 AS alias_5 FROM table_2 INNER JOIN table_19 ON (table_2.column_31 = table_19.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_39)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_40, table_19.column_2", + "SELECT max(table_2.column_41) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_43 AS alias_4, table_20.column_2 AS alias_5 FROM table_2 INNER JOIN table_20 ON (table_2.column_31 = table_20.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_42)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_43, table_20.column_2", + "SELECT max(table_2.column_44) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_45)) OR (table_2.column_4 <= table_2.column_46)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_47) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_49 AS alias_4, table_21.column_2 AS alias_5 FROM table_2 INNER JOIN table_21 ON (table_2.column_31 = table_21.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_48)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_49, table_21.column_2", + "SELECT max(table_2.column_50) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_52 AS alias_4, table_22.column_2 AS alias_5 FROM table_2 INNER JOIN table_22 ON (table_2.column_31 = table_22.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_51)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_52, table_22.column_2", + "SELECT max(table_2.column_53) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_56 AS alias_4, table_23.column_2 AS alias_5 FROM table_2 INNER JOIN table_23 ON (table_2.column_31 = table_23.column_1) WHERE ((table_2.column_4 <= table_2.column_54) OR (table_2.column_4 <= table_2.column_55)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_56, table_23.column_2", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_57)) OR (table_2.column_4 <= table_2.column_58))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_60 AS alias_4, table_24.column_2 AS alias_5 FROM table_2 INNER JOIN table_24 ON (table_2.column_42 = table_24.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_59))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_62 AS alias_4, table_25.column_2 AS alias_5 FROM table_2 INNER JOIN table_25 ON (table_2.column_42 = table_25.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_61))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_65 AS alias_4, table_26.column_2 AS alias_5 FROM table_2 INNER JOIN table_26 ON (table_2.column_42 = table_26.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_63)) OR (table_2.column_4 <= table_2.column_64))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_68 AS alias_4, table_27.column_2 AS alias_5 FROM table_2 INNER JOIN table_27 ON (table_2.column_42 = table_27.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_66)) OR (table_2.column_4 <= table_2.column_67))", + "SELECT max(table_2.column_69) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_70)) OR (table_2.column_4 <= table_2.column_71)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_72) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_74 AS alias_5, table_28.column_2 AS alias_6 FROM table_2 INNER JOIN table_28 ON (table_2.column_42 = table_28.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_73)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_74, table_28.column_2", + "SELECT max(table_2.column_75) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_77 AS alias_5, table_29.column_2 AS alias_6 FROM table_2 INNER JOIN table_29 ON (table_2.column_42 = table_29.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_76)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_77, table_29.column_2", + "SELECT max(table_2.column_78) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_81 AS alias_5, table_30.column_2 AS alias_6 FROM table_2 INNER JOIN table_30 ON (table_2.column_42 = table_30.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_79)) OR (table_2.column_4 <= table_2.column_80)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_81, table_30.column_2", + "SELECT max(table_2.column_82) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_85 AS alias_5, table_31.column_2 AS alias_6 FROM table_2 INNER JOIN table_31 ON (table_2.column_83 = table_31.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_83)) OR (table_2.column_4 <= table_2.column_84)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_85, table_31.column_2", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_88 AS alias_5, table_32.column_2 AS alias_6 FROM table_2 INNER JOIN table_32 ON (table_2.column_83 = table_32.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_86)) OR (table_2.column_4 <= table_2.column_87))", + "SELECT max(table_2.column_89) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5, table_2.column_92 AS alias_6, table_33.column_2 AS alias_7 FROM table_2 INNER JOIN table_33 ON (table_2.column_83 = table_33.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_90)) OR (table_2.column_4 <= table_2.column_91)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_92, table_33.column_2", + "SELECT max(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4)", + "SELECT table_1.column_5 AS alias_1, table_2.column_2 AS alias_2 FROM table_1 INNER JOIN table_2 ON (table_1.column_1 = table_2.column_1)", + "SELECT max(table_2.column_3) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4", + "SELECT max(table_2.column_5) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= 1) GROUP BY table_2.column_4", + "SELECT max(table_2.column_6) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_7) GROUP BY table_2.column_4", + "SELECT max(table_2.column_8) AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE (table_2.column_4 <= table_2.column_9) GROUP BY table_2.column_4", + "SELECT max(table_2.column_10) AS alias_1, table_2.column_11 AS alias_2, table_3.column_2 AS alias_3 FROM table_2 INNER JOIN table_3 ON (table_2.column_5 = table_3.column_1) GROUP BY table_2.column_11, table_3.column_2", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_12))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_13))", + "SELECT table_2.column_4 AS alias_1, table_2.column_14 AS alias_2, table_4.column_2 AS alias_3 FROM table_2 INNER JOIN table_4 ON (table_2.column_12 = table_4.column_1) WHERE (table_2.column_4 <= 1)", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_15))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_16))", + "SELECT table_2.column_4 AS alias_1, table_2.column_17 AS alias_2, table_5.column_2 AS alias_3 FROM table_2 INNER JOIN table_5 ON (table_2.column_5 = table_5.column_1) WHERE (table_2.column_4 <= 1)", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2 FROM table_2 WHERE ((table_2.column_4 <= table_2.column_18) OR (table_2.column_4 <= table_2.column_19))", + "SELECT table_2.column_4 AS alias_1, table_2.column_21 AS alias_2, table_6.column_2 AS alias_3 FROM table_2 INNER JOIN table_6 ON (table_2.column_20 = table_6.column_1) WHERE (table_2.column_4 <= table_2.column_20)", + "SELECT table_2.column_4 AS alias_1, table_2.column_23 AS alias_2, table_7.column_2 AS alias_3 FROM table_2 INNER JOIN table_7 ON (table_2.column_20 = table_7.column_1) WHERE (table_2.column_4 <= table_2.column_22)", + "SELECT max(table_7.column_3) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= 1)) GROUP BY table_7.column_4, table_7.column_4", + "SELECT max(table_7.column_5) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) AND (table_7.column_4 <= table_7.column_6)) GROUP BY table_7.column_4, table_7.column_4", + "SELECT max(table_7.column_7) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE ((table_7.column_4 <= 1) OR (table_7.column_4 <= table_7.column_8)) GROUP BY table_7.column_4, table_7.column_4", + "SELECT max(table_7.column_9) AS alias_1, table_7.column_4 AS alias_2, table_7.column_10 AS alias_3, table_8.column_2 AS alias_4 FROM table_7 INNER JOIN table_8 ON (table_7.column_2 = table_8.column_1) WHERE (table_7.column_4 <= 1) GROUP BY table_7.column_4, table_7.column_10, table_8.column_2", + "SELECT max(table_3.column_3) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_5)) GROUP BY table_3.column_4, table_3.column_4", + "SELECT max(table_3.column_6) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_7)) GROUP BY table_3.column_4, table_3.column_4", + "SELECT max(table_3.column_8) AS alias_1, table_3.column_4 AS alias_2, table_3.column_9 AS alias_3, table_9.column_2 AS alias_4 FROM table_3 INNER JOIN table_9 ON (table_3.column_6 = table_9.column_1) WHERE (table_3.column_4 <= 1) GROUP BY table_3.column_4, table_3.column_9, table_9.column_2", + "SELECT max(table_3.column_10) AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE ((table_3.column_4 <= table_3.column_11) OR (table_3.column_4 <= table_3.column_12)) GROUP BY table_3.column_4, table_3.column_4", + "SELECT max(table_3.column_13) AS alias_1, table_3.column_4 AS alias_2, table_3.column_15 AS alias_3, table_10.column_2 AS alias_4 FROM table_3 INNER JOIN table_10 ON (table_3.column_11 = table_10.column_1) WHERE (table_3.column_4 <= table_3.column_14) GROUP BY table_3.column_4, table_3.column_15, table_10.column_2", + "SELECT max(table_3.column_16) AS alias_1, table_3.column_4 AS alias_2, table_3.column_18 AS alias_3, table_11.column_2 AS alias_4 FROM table_3 INNER JOIN table_11 ON (table_3.column_10 = table_11.column_1) WHERE (table_3.column_4 <= table_3.column_17) GROUP BY table_3.column_4, table_3.column_18, table_11.column_2", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) AND (table_3.column_4 <= table_3.column_19))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) OR (table_3.column_4 <= 1)) OR (table_3.column_4 <= table_3.column_20))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_21 AS alias_3, table_12.column_2 AS alias_4 FROM table_3 INNER JOIN table_12 ON (table_3.column_20 = table_12.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= 1))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_22)) OR (table_3.column_4 <= table_3.column_23))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_25 AS alias_3, table_13.column_2 AS alias_4 FROM table_3 INNER JOIN table_13 ON (table_3.column_20 = table_13.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_24))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_27 AS alias_3, table_14.column_2 AS alias_4 FROM table_3 INNER JOIN table_14 ON (table_3.column_20 = table_14.column_1) WHERE ((table_3.column_4 <= 1) OR (table_3.column_4 <= table_3.column_26))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_4 AS alias_3 FROM table_3 WHERE (((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_28)) OR (table_3.column_4 <= table_3.column_29))", + "SELECT table_3.column_4 AS alias_1, table_3.column_4 AS alias_2, table_3.column_31 AS alias_3, table_15.column_2 AS alias_4 FROM table_3 INNER JOIN table_15 ON (table_3.column_20 = table_15.column_1) WHERE ((table_3.column_4 <= 1) AND (table_3.column_4 <= table_3.column_30))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_25 AS alias_3, table_16.column_2 AS alias_4 FROM table_2 INNER JOIN table_16 ON (table_2.column_20 = table_16.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_24))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_28 AS alias_3, table_17.column_2 AS alias_4 FROM table_2 INNER JOIN table_17 ON (table_2.column_20 = table_17.column_1) WHERE ((table_2.column_4 <= table_2.column_26) OR (table_2.column_4 <= table_2.column_27))", + "SELECT max(table_2.column_29) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_30)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_31) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_32)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_33) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_34 AS alias_4, table_18.column_2 AS alias_5 FROM table_2 INNER JOIN table_18 ON (table_2.column_31 = table_18.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_34, table_18.column_2", + "SELECT max(table_2.column_35) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_36)) OR (table_2.column_4 <= table_2.column_37)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_38) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_40 AS alias_4, table_19.column_2 AS alias_5 FROM table_2 INNER JOIN table_19 ON (table_2.column_31 = table_19.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_39)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_40, table_19.column_2", + "SELECT max(table_2.column_41) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_43 AS alias_4, table_20.column_2 AS alias_5 FROM table_2 INNER JOIN table_20 ON (table_2.column_31 = table_20.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_42)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_43, table_20.column_2", + "SELECT max(table_2.column_44) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_45)) OR (table_2.column_4 <= table_2.column_46)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_47) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_49 AS alias_4, table_21.column_2 AS alias_5 FROM table_2 INNER JOIN table_21 ON (table_2.column_31 = table_21.column_1) WHERE ((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_48)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_49, table_21.column_2", + "SELECT max(table_2.column_50) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_52 AS alias_4, table_22.column_2 AS alias_5 FROM table_2 INNER JOIN table_22 ON (table_2.column_31 = table_22.column_1) WHERE ((table_2.column_4 <= 1) OR (table_2.column_4 <= table_2.column_51)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_52, table_22.column_2", + "SELECT max(table_2.column_53) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_56 AS alias_4, table_23.column_2 AS alias_5 FROM table_2 INNER JOIN table_23 ON (table_2.column_31 = table_23.column_1) WHERE ((table_2.column_4 <= table_2.column_54) OR (table_2.column_4 <= table_2.column_55)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_56, table_23.column_2", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_57)) OR (table_2.column_4 <= table_2.column_58))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_60 AS alias_4, table_24.column_2 AS alias_5 FROM table_2 INNER JOIN table_24 ON (table_2.column_42 = table_24.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_59))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_62 AS alias_4, table_25.column_2 AS alias_5 FROM table_2 INNER JOIN table_25 ON (table_2.column_42 = table_25.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_61))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_65 AS alias_4, table_26.column_2 AS alias_5 FROM table_2 INNER JOIN table_26 ON (table_2.column_42 = table_26.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_63)) OR (table_2.column_4 <= table_2.column_64))", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_68 AS alias_4, table_27.column_2 AS alias_5 FROM table_2 INNER JOIN table_27 ON (table_2.column_42 = table_27.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_66)) OR (table_2.column_4 <= table_2.column_67))", + "SELECT max(table_2.column_69) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5 FROM table_2 WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_70)) OR (table_2.column_4 <= table_2.column_71)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4", + "SELECT max(table_2.column_72) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_74 AS alias_5, table_28.column_2 AS alias_6 FROM table_2 INNER JOIN table_28 ON (table_2.column_42 = table_28.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_73)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_74, table_28.column_2", + "SELECT max(table_2.column_75) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_77 AS alias_5, table_29.column_2 AS alias_6 FROM table_2 INNER JOIN table_29 ON (table_2.column_42 = table_29.column_1) WHERE (((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) OR (table_2.column_4 <= table_2.column_76)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_77, table_29.column_2", + "SELECT max(table_2.column_78) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_81 AS alias_5, table_30.column_2 AS alias_6 FROM table_2 INNER JOIN table_30 ON (table_2.column_42 = table_30.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_79)) OR (table_2.column_4 <= table_2.column_80)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_81, table_30.column_2", + "SELECT max(table_2.column_82) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_85 AS alias_5, table_31.column_2 AS alias_6 FROM table_2 INNER JOIN table_31 ON (table_2.column_83 = table_31.column_1) WHERE (((table_2.column_4 <= 1) AND (table_2.column_4 <= table_2.column_83)) OR (table_2.column_4 <= table_2.column_84)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_85, table_31.column_2", + "SELECT table_2.column_4 AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_88 AS alias_5, table_32.column_2 AS alias_6 FROM table_2 INNER JOIN table_32 ON (table_2.column_83 = table_32.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_86)) OR (table_2.column_4 <= table_2.column_87))", + "SELECT max(table_2.column_89) AS alias_1, table_2.column_4 AS alias_2, table_2.column_4 AS alias_3, table_2.column_4 AS alias_4, table_2.column_4 AS alias_5, table_2.column_92 AS alias_6, table_33.column_2 AS alias_7 FROM table_2 INNER JOIN table_33 ON (table_2.column_83 = table_33.column_1) WHERE ((((table_2.column_4 <= 1) OR (table_2.column_4 <= 1)) AND (table_2.column_4 <= table_2.column_90)) OR (table_2.column_4 <= table_2.column_91)) GROUP BY table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_4, table_2.column_92, table_33.column_2", + "SELECT count(distinct `table_1`.`column_1`) AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT count(distinct `table_1`.`column_3`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_4`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_4`) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_5`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_6`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_7`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= `table_1`.`column_4`))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) OR (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?))", + "SELECT count(distinct `table_1`.`column_8`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_9`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_10`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_11`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_12`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_13`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_14`) AS `alias_1`, `table_1`.`column_14` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_14` <= `table_1`.`column_8`) AND (`table_1`.`column_14` > ?)) GROUP BY `table_1`.`column_14`", + "SELECT count(distinct `table_1`.`column_15`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_16`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_17`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT count(distinct `table_1`.`column_18`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_19`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_20`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_21`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_22`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_23`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_24`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_25`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_26`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_27`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_27` <= 1) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27`", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT count(distinct `table_1`.`column_28`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4`, `table_1`.`column_27` AS `alias_5` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27`", + "SELECT count(distinct `table_1`.`column_29`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_30`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_31`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_32`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT count(distinct `table_1`.`column_33`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4`, `table_1`.`column_8` AS `alias_5` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_1`) AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` <= 1)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT count(distinct `table_1`.`column_3`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_2`) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_4`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= `table_1`.`column_4`) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_5`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_6`) AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE (`table_1`.`column_1` <= 1) GROUP BY `table_1`.`column_1`", + "SELECT count(distinct `table_1`.`column_7`) AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= `table_1`.`column_4`))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) OR (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= `table_1`.`column_4`) AND (`table_1`.`column_1` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1`, `table_1`.`column_1` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) OR (`table_1`.`column_1` <= 1))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?))", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` <= 1) AND (`table_1`.`column_1` > ?))", + "SELECT count(distinct `table_1`.`column_8`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_9`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_10`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_11`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_12`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_13`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_14`) AS `alias_1`, `table_1`.`column_14` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_14` <= `table_1`.`column_8`) AND (`table_1`.`column_14` > ?)) GROUP BY `table_1`.`column_14`", + "SELECT count(distinct `table_1`.`column_15`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_16`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_17`) AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE ((`table_1`.`column_8` <= 1) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2` FROM `table_1` WHERE (((`table_1`.`column_8` <= 1) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT count(distinct `table_1`.`column_18`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_19`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_20`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= `table_1`.`column_19`)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_21`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_22`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_23`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_24`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_25`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_26`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_8` <= `table_1`.`column_19`) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_27`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE (((`table_1`.`column_27` <= 1) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27`", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT `table_1`.`column_27` AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) AND (`table_1`.`column_27` > ?))", + "SELECT count(distinct `table_1`.`column_28`) AS `alias_1`, `table_1`.`column_27` AS `alias_2`, `table_1`.`column_27` AS `alias_3`, `table_1`.`column_27` AS `alias_4`, `table_1`.`column_27` AS `alias_5` FROM `table_1` WHERE ((((`table_1`.`column_27` <= `table_1`.`column_8`) OR (`table_1`.`column_27` <= `table_1`.`column_8`)) AND (`table_1`.`column_27` <= 1)) OR (`table_1`.`column_27` <= 1)) GROUP BY `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27`, `table_1`.`column_27`", + "SELECT count(distinct `table_1`.`column_29`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_30`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_31`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT count(distinct `table_1`.`column_32`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE ((((`table_1`.`column_8` <= `table_1`.`column_3`) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT `table_1`.`column_8` AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?))", + "SELECT count(distinct `table_1`.`column_33`) AS `alias_1`, `table_1`.`column_8` AS `alias_2`, `table_1`.`column_8` AS `alias_3`, `table_1`.`column_8` AS `alias_4`, `table_1`.`column_8` AS `alias_5` FROM `table_1` WHERE (((((`table_1`.`column_8` <= `table_1`.`column_3`) OR (`table_1`.`column_8` <= `table_1`.`column_3`)) AND (`table_1`.`column_8` <= 1)) OR (`table_1`.`column_8` <= 1)) AND (`table_1`.`column_8` > ?)) GROUP BY `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`, `table_1`.`column_8`", + "SELECT avg(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4)", + "SELECT avg(table_1.column_5) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2", + "SELECT avg(table_1.column_6) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2", + "SELECT avg(table_1.column_7) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_8) GROUP BY table_1.column_2", + "SELECT avg(table_1.column_9) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_10) GROUP BY table_1.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_11))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_12))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_13))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_14))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_15) OR (table_1.column_2 <= table_1.column_16))", + "SELECT avg(table_1.column_17) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_18) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_19)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_20) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_21)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_22) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_23)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_24) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_25)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_26) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_27) OR (table_1.column_2 <= table_1.column_28)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_29))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_30))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_31)) OR (table_1.column_2 <= table_1.column_32))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_33)) OR (table_1.column_2 <= table_1.column_34))", + "SELECT avg(table_1.column_35) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_36)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_37) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_38)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_39) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_40)) OR (table_1.column_2 <= table_1.column_41)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_42) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_43)) OR (table_1.column_2 <= table_1.column_44)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_45)) OR (table_1.column_2 <= table_1.column_46))", + "SELECT avg(table_1.column_47) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4, table_1.column_2 AS alias_5 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_48)) OR (table_1.column_2 <= table_1.column_49)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_3)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_4)", + "SELECT avg(table_1.column_5) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2", + "SELECT avg(table_1.column_6) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= 1) GROUP BY table_1.column_2", + "SELECT avg(table_1.column_7) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_8) GROUP BY table_1.column_2", + "SELECT avg(table_1.column_9) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 <= table_1.column_10) GROUP BY table_1.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_11))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_12))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_13))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_14))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_15) OR (table_1.column_2 <= table_1.column_16))", + "SELECT avg(table_1.column_17) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_18) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_19)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_20) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_21)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_22) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_23)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_24) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= table_1.column_25)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_26) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_27) OR (table_1.column_2 <= table_1.column_28)) GROUP BY table_1.column_2, table_1.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_29))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_30))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_31)) OR (table_1.column_2 <= table_1.column_32))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_33)) OR (table_1.column_2 <= table_1.column_34))", + "SELECT avg(table_1.column_35) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_36)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_37) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) OR (table_1.column_2 <= table_1.column_38)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_39) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_40)) OR (table_1.column_2 <= table_1.column_41)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT avg(table_1.column_42) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((table_1.column_2 <= 1) AND (table_1.column_2 <= table_1.column_43)) OR (table_1.column_2 <= table_1.column_44)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_45)) OR (table_1.column_2 <= table_1.column_46))", + "SELECT avg(table_1.column_47) AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4, table_1.column_2 AS alias_5 FROM table_1 WHERE ((((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND (table_1.column_2 <= table_1.column_48)) OR (table_1.column_2 <= table_1.column_49)) GROUP BY table_1.column_2, table_1.column_2, table_1.column_2, table_1.column_2", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (table_1.column_1 <= table_1.column_2)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?)", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_1 AS alias_1 FROM table_1 WHERE (table_1.column_1 <= table_1.column_2)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1)", + "SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?)", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= table_1.column_1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE (table_1.column_2 <= 1) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 IN (?, ?, ?) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= table_1.column_1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE ((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE ((table_1.column_2 <= 1) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?))", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (((table_1.column_2 <= 1) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 ASC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3 FROM table_1 WHERE ((((table_1.column_2 <= table_1.column_1) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2, table_1.column_2 AS alias_3, table_1.column_2 AS alias_4 FROM table_1 WHERE (((((table_1.column_2 <= table_1.column_1) OR (table_1.column_2 <= table_1.column_1)) AND (table_1.column_2 <= 1)) OR (table_1.column_2 <= 1)) AND table_1.column_2 IN (?, ?, ?)) ORDER BY table_1.column_2 DESC LIMIT 10", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?)", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?))", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?))", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1`", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` = ?)", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE (`table_1`.`column_1` > ?)", + "SELECT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?))", + "SELECT DISTINCT `table_1`.`column_1` AS `alias_1` FROM `table_1` WHERE ((`table_1`.`column_1` = ?) AND (`table_1`.`column_1` > ?))", + "SELECT sum(table_1.column_1) AS alias_1 FROM table_1", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5", + "SELECT table_1.column_2 AS alias_1 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5", + "SELECT table_1.column_3 AS alias_1, table_2.column_2 AS alias_2 FROM table_1 LEFT JOIN table_2 ON (table_1.column_1 = table_2.column_1)", + "SELECT sum(table_1.column_4) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5 GROUP BY table_1.column_2", + "SELECT sum(table_1.column_5) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5 GROUP BY table_1.column_2", + "SELECT sum(table_1.column_6) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 NOT BETWEEN 1 AND 5 GROUP BY table_1.column_2", + "SELECT sum(table_1.column_7) AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE table_1.column_2 BETWEEN 1 AND 5 GROUP BY table_1.column_2", + "SELECT sum(table_1.column_8) AS alias_1, table_1.column_9 AS alias_2, table_3.column_2 AS alias_3 FROM table_1 LEFT JOIN table_3 ON (table_1.column_3 = table_3.column_1) GROUP BY table_1.column_9, table_3.column_2", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 NOT BETWEEN 1 AND 5 AND table_1.column_2 BETWEEN 1 AND 5)", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 NOT BETWEEN 1 AND 5 OR table_1.column_2 NOT BETWEEN 1 AND 5)", + "SELECT table_1.column_2 AS alias_1, table_1.column_2 AS alias_2 FROM table_1 WHERE (table_1.column_2 NOT BETWEEN 1 AND 5 OR table_1.column_2 BETWEEN 1 AND 5)", + "SELECT table_1.column_2 AS alias_1, table_1.column_10 AS alias_2, table_4.column_2 AS alias_3 FROM table_1 LEFT JOIN table_4 ON (table_1.column_3 = table_4.column_1) WHERE table_1.column_2 NOT BETWEEN 1 AND 5", + "SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2 FROM table_2 WHERE (table_2.column_3 BETWEEN 1 AND 5 OR table_2.column_3 NOT BETWEEN 1 AND 5)", + "SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2 FROM table_2 WHERE (table_2.column_3 BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5)", + "SELECT table_2.column_3 AS alias_1, table_2.column_4 AS alias_2, table_5.column_2 AS alias_3 FROM table_2 LEFT JOIN table_5 ON (table_2.column_1 = table_5.column_1) WHERE table_2.column_3 BETWEEN 1 AND 5", + "SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2 FROM table_2 WHERE (table_2.column_3 NOT BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5)", + "SELECT table_2.column_3 AS alias_1, table_2.column_5 AS alias_2, table_6.column_2 AS alias_3 FROM table_2 LEFT JOIN table_6 ON (table_2.column_1 = table_6.column_1) WHERE table_2.column_3 NOT BETWEEN 1 AND 5", + "SELECT table_2.column_3 AS alias_1, table_2.column_6 AS alias_2, table_7.column_2 AS alias_3 FROM table_2 LEFT JOIN table_7 ON (table_2.column_1 = table_7.column_1) WHERE table_2.column_3 BETWEEN 1 AND 5", + "SELECT sum(table_7.column_3) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE (table_7.column_4 NOT BETWEEN 1 AND 5 AND table_7.column_4 BETWEEN 1 AND 5) GROUP BY table_7.column_4, table_7.column_4", + "SELECT sum(table_7.column_5) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE (table_7.column_4 NOT BETWEEN 1 AND 5 OR table_7.column_4 NOT BETWEEN 1 AND 5) GROUP BY table_7.column_4, table_7.column_4", + "SELECT sum(table_7.column_6) AS alias_1, table_7.column_4 AS alias_2, table_7.column_4 AS alias_3 FROM table_7 WHERE (table_7.column_4 NOT BETWEEN 1 AND 5 OR table_7.column_4 BETWEEN 1 AND 5) GROUP BY table_7.column_4, table_7.column_4", + "SELECT sum(table_7.column_7) AS alias_1, table_7.column_4 AS alias_2, table_7.column_8 AS alias_3, table_8.column_2 AS alias_4 FROM table_7 LEFT JOIN table_8 ON (table_7.column_2 = table_8.column_1) WHERE table_7.column_4 NOT BETWEEN 1 AND 5 GROUP BY table_7.column_4, table_7.column_8, table_8.column_2", + "SELECT sum(table_8.column_3) AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE (table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) GROUP BY table_8.column_4, table_8.column_4", + "SELECT sum(table_8.column_5) AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE (table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 BETWEEN 1 AND 5) GROUP BY table_8.column_4, table_8.column_4", + "SELECT sum(table_8.column_6) AS alias_1, table_8.column_4 AS alias_2, table_8.column_7 AS alias_3, table_9.column_2 AS alias_4 FROM table_8 LEFT JOIN table_9 ON (table_8.column_5 = table_9.column_1) WHERE table_8.column_4 BETWEEN 1 AND 5 GROUP BY table_8.column_4, table_8.column_7, table_9.column_2", + "SELECT sum(table_8.column_8) AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 BETWEEN 1 AND 5) GROUP BY table_8.column_4, table_8.column_4", + "SELECT sum(table_8.column_9) AS alias_1, table_8.column_4 AS alias_2, table_8.column_10 AS alias_3, table_10.column_2 AS alias_4 FROM table_8 LEFT JOIN table_10 ON (table_8.column_5 = table_10.column_1) WHERE table_8.column_4 NOT BETWEEN 1 AND 5 GROUP BY table_8.column_4, table_8.column_10, table_10.column_2", + "SELECT sum(table_8.column_11) AS alias_1, table_8.column_4 AS alias_2, table_8.column_12 AS alias_3, table_11.column_2 AS alias_4 FROM table_8 LEFT JOIN table_11 ON (table_8.column_5 = table_11.column_1) WHERE table_8.column_4 BETWEEN 1 AND 5 GROUP BY table_8.column_4, table_8.column_12, table_11.column_2", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 NOT BETWEEN 1 AND 5 AND table_8.column_4 BETWEEN 1 AND 5) OR table_8.column_4 NOT BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 NOT BETWEEN 1 AND 5 AND table_8.column_4 BETWEEN 1 AND 5) OR table_8.column_4 BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_13 AS alias_3, table_12.column_2 AS alias_4 FROM table_8 LEFT JOIN table_12 ON (table_8.column_5 = table_12.column_1) WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 AND table_8.column_4 BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) OR table_8.column_4 BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_14 AS alias_3, table_13.column_2 AS alias_4 FROM table_8 LEFT JOIN table_13 ON (table_8.column_5 = table_13.column_1) WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_15 AS alias_3, table_14.column_2 AS alias_4 FROM table_8 LEFT JOIN table_14 ON (table_8.column_5 = table_14.column_1) WHERE (table_8.column_4 NOT BETWEEN 1 AND 5 OR table_8.column_4 BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_4 AS alias_3 FROM table_8 WHERE ((table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5) OR table_8.column_4 BETWEEN 1 AND 5)", + "SELECT table_8.column_4 AS alias_1, table_8.column_4 AS alias_2, table_8.column_16 AS alias_3, table_15.column_2 AS alias_4 FROM table_8 LEFT JOIN table_15 ON (table_8.column_6 = table_15.column_1) WHERE (table_8.column_4 BETWEEN 1 AND 5 OR table_8.column_4 NOT BETWEEN 1 AND 5)", + "SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2, table_2.column_7 AS alias_3, table_16.column_2 AS alias_4 FROM table_2 LEFT JOIN table_16 ON (table_2.column_1 = table_16.column_1) WHERE (table_2.column_3 BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5)", + "SELECT table_2.column_3 AS alias_1, table_2.column_3 AS alias_2, table_2.column_8 AS alias_3, table_17.column_2 AS alias_4 FROM table_2 LEFT JOIN table_17 ON (table_2.column_1 = table_17.column_1) WHERE (table_2.column_3 NOT BETWEEN 1 AND 5 OR table_2.column_3 BETWEEN 1 AND 5)", + "SELECT sum(table_2.column_9) AS alias_1, table_2.column_3 AS alias_2, table_2.column_3 AS alias_3, table_2.column_3 AS alias_4 FROM table_2 WHERE ((table_2.column_3 NOT BETWEEN 1 AND 5 AND table_2.column_3 BETWEEN 1 AND 5) OR table_2.column_3 NOT BETWEEN 1 AND 5) GROUP BY table_2.column_3, table_2.column_3, table_2.column_3", + "SELECT sum(table_2.column_10) AS alias_1, table_2.column_3 AS alias_2, table_2.column_3 AS alias_3, table_2.column_3 AS alias_4 FROM table_2 WHERE ((table_2.column_3 NOT BETWEEN 1 AND 5 AND table_2.column_3 BETWEEN 1 AND 5) OR table_2.column_3 BETWEEN 1 AND 5) GROUP BY table_2.column_3, table_2.column_3, table_2.column_3", + "SELECT sum(table_2.column_11) AS alias_1, table_2.column_3 AS alias_2, table_2.column_3 AS alias_3, table_2.column_12 AS alias_4, table_18.column_2 AS alias_5 FROM table_2 LEFT JOIN table_18 ON (table_2.column_1 = table_18.column_1) WHERE (table_2.column_3 NOT BETWEEN 1 AND 5 AND table_2.column_3 BETWEEN 1 AND 5) GROUP BY table_2.column_3, table_2.column_3, table_2.column_12, table_18.column_2", +]; diff --git a/readyset-adapter/src/backend.rs b/readyset-adapter/src/backend.rs index 56709099fa..961f381c2b 100644 --- a/readyset-adapter/src/backend.rs +++ b/readyset-adapter/src/backend.rs @@ -1573,7 +1573,7 @@ where .ok_or(PreparedStatementMissing { statement_id: id })?; let mut event = QueryExecutionEvent::new(EventType::Execute); - event.query = cached_statement.parsed_query.clone(); + event.query.clone_from(&cached_statement.parsed_query); event.query_id = cached_statement.query_id; let upstream = &mut self.upstream; @@ -2373,7 +2373,7 @@ where if let Err(e) = &res { if let Some(ddl_req) = ddl_req { let remove_res = retry_with_exponential_backoff( - async || { + || async { let ddl_req = ddl_req.clone(); self.authority.remove_cache_ddl_request(ddl_req).await }, @@ -2416,7 +2416,7 @@ where ) { let remove_res = retry_with_exponential_backoff( - async || { + || async { let ddl_req = ddl_req.clone(); self.authority.remove_cache_ddl_request(ddl_req).await }, @@ -2805,11 +2805,13 @@ where // Table Create / Drop (RYW not supported) // TODO(andrew, justin): how are these types of writes handled w.r.t RYW? - SqlQuery::CreateView(_) + SqlQuery::CreateDatabase(_) + | SqlQuery::CreateView(_) | SqlQuery::CreateTable(_) | SqlQuery::DropTable(_) | SqlQuery::DropView(_) | SqlQuery::AlterTable(_) + | SqlQuery::Truncate(_) | SqlQuery::Use(_) => { event.sql_type = SqlQueryType::Other; upstream.query(raw_query).await.map(QueryResult::Upstream) @@ -2862,6 +2864,7 @@ where SqlQuery::Insert(q) => noria.handle_insert(q).await, SqlQuery::Update(q) => noria.handle_update(q).await, SqlQuery::Delete(q) => noria.handle_delete(q).await, + SqlQuery::Truncate(q) => noria.handle_truncate(q).await, SqlQuery::Deallocate(_) => unreachable!("deallocate path returns prior"), // Return an empty result as we are allowing unsupported set statements. Commit diff --git a/readyset-adapter/src/backend/noria_connector.rs b/readyset-adapter/src/backend/noria_connector.rs index d9d5b45def..ee98d2a984 100644 --- a/readyset-adapter/src/backend/noria_connector.rs +++ b/readyset-adapter/src/backend/noria_connector.rs @@ -8,7 +8,7 @@ use std::time::Instant; use itertools::Itertools; use nom_sql::{ self, ColumnConstraint, DeleteStatement, DialectDisplay, Expr, InsertStatement, Relation, - SqlIdentifier, SqlQuery, UnaryOperator, UpdateStatement, + SqlIdentifier, SqlQuery, TruncateStatement, UnaryOperator, UpdateStatement, }; use readyset_client::consistency::Timestamp; use readyset_client::internal::LocalNodeIndex; @@ -138,9 +138,7 @@ pub enum PreparedSelectTypes { } #[derive(Debug, Clone)] -// Due to differences in data type sizes, the large_enum_variant Clippy warning was being emitted -// for this type, but only when compiling for aarch64 targets. -#[cfg_attr(target_arch = "aarch64", allow(clippy::large_enum_variant))] +#[allow(clippy::large_enum_variant)] pub enum PrepareResult { Select { types: PreparedSelectTypes, @@ -497,7 +495,7 @@ impl NoriaConnector { ("keys", DfType::DEFAULT_TEXT), ("size_bytes", DfType::BigInt), ("partial", DfType::Bool), - ("indexes", DfType::Array(Box::new(DfType::DEFAULT_TEXT))), + ("indexes", DfType::DEFAULT_TEXT), ]; let schema = SelectSchema { columns: cols.iter().map(|(n, _)| n.into()).collect(), @@ -528,9 +526,8 @@ impl NoriaConnector { .into_iter() .map(|idx| { format!("{:?}[{}]", idx.index_type, idx.columns.iter().join(", ")) - .into() }) - .collect::>() + .join(", ") .into(), ] }) @@ -858,6 +855,24 @@ impl NoriaConnector { Ok(QueryResult::Empty) } + pub(crate) async fn handle_truncate( + &mut self, + q: &TruncateStatement, + ) -> ReadySetResult> { + for table in &q.tables { + trace!(table = %table.relation.name, "truncate::access mutator"); + let mutator = self + .inner + .get_mut()? + .get_noria_table(&table.relation) + .await?; + trace!("truncate::perform truncate"); + mutator.truncate().await?; + trace!("truncate::done"); + } + Ok(QueryResult::Empty) + } + /// Query the status of a pending migration identified by the given `migration_id`. Once the /// function returns a result (completed or an error), calling again with the same id will lead /// to undefined behavior. diff --git a/readyset-adapter/src/migration_handler.rs b/readyset-adapter/src/migration_handler.rs index fffb041bc9..6e02b7c9fe 100644 --- a/readyset-adapter/src/migration_handler.rs +++ b/readyset-adapter/src/migration_handler.rs @@ -344,8 +344,18 @@ impl MigrationHandler { match controller.dry_run(changelist).await { Ok(_) => { self.start_time.remove(view_request); + + // It's possible that the ViewsSynchronizer found an existing view for this query + // on the server while we were performing a dry run, in which case it would have + // updated the query's status to "successful". In this situation, we don't want to + // overwrite the "successful" status, so we only write the new "dry run succeeded" + // status if the query's status is still "pending" self.query_status_cache - .update_query_migration_state(view_request, MigrationState::DryRunSucceeded); + .with_mut_migration_state(view_request, |status| { + if status.is_pending() { + *status = MigrationState::DryRunSucceeded; + } + }); } Err(e) if e.caused_by_unsupported() => { self.start_time.remove(view_request); diff --git a/readyset-adapter/src/query_status_cache.rs b/readyset-adapter/src/query_status_cache.rs index cfe01b26c2..dacc69d084 100644 --- a/readyset-adapter/src/query_status_cache.rs +++ b/readyset-adapter/src/query_status_cache.rs @@ -560,6 +560,24 @@ impl QueryStatusCache { } } + /// Yields to the given function `f` a mutable reference to the migration state of the query + /// `q`. The primary purpose of this method is allow for atomic reads and writes of the + /// migration state of a query. + pub fn with_mut_migration_state(&self, q: &Q, f: F) -> bool + where + Q: QueryStatusKey, + F: Fn(&mut MigrationState), + { + q.with_mut_status(self, |maybe_query_status| { + if let Some(query_status) = maybe_query_status { + f(&mut query_status.migration_state); + true + } else { + false + } + }) + } + /// Marks a query as dropped by the user. /// /// NOTE: this should only be called after we successfully remove a View for this query. This is @@ -635,12 +653,12 @@ impl QueryStatusCache { { let should_insert = q.with_mut_status(self, |s| match s { Some(s) if s.migration_state != MigrationState::Unsupported => { - s.migration_state = status.migration_state.clone(); - s.execution_info = status.execution_info.clone(); + s.migration_state.clone_from(&status.migration_state); + s.execution_info.clone_from(&status.execution_info); false } Some(s) => { - s.execution_info = status.execution_info.clone(); + s.execution_info.clone_from(&status.execution_info); false } None => true, @@ -785,6 +803,22 @@ impl QueryStatusCache { .into() } + /// Returns a list of queries whose migration states match `states`. + pub fn queries_with_statuses(&self, states: &[MigrationState]) -> QueryList { + let statuses = self.persistent_handle.statuses.read(); + statuses + .iter() + .filter_map(|(_query_id, (query, status))| { + if states.contains(&status.migration_state) { + Some((query.clone(), status.clone())) + } else { + None + } + }) + .collect::>() + .into() + } + /// Returns a list of queries that have a state of [`QueryState::Successful`]. pub fn allow_list(&self) -> Vec<(QueryId, Arc, QueryStatus)> { self.persistent_handle.allow_list() diff --git a/readyset-adapter/src/upstream_database.rs b/readyset-adapter/src/upstream_database.rs index 9fe6e57eaf..d93d50a0bd 100644 --- a/readyset-adapter/src/upstream_database.rs +++ b/readyset-adapter/src/upstream_database.rs @@ -357,11 +357,11 @@ where self.upstream().await?.start_tx(stmt).await } - async fn commit<'a>(&'a mut self) -> Result, Self::Error> { + async fn commit(&mut self) -> Result, Self::Error> { self.upstream().await?.commit().await } - async fn rollback<'a>(&'a mut self) -> Result, Self::Error> { + async fn rollback(&mut self) -> Result, Self::Error> { self.upstream().await?.rollback().await } diff --git a/readyset-adapter/src/views_synchronizer.rs b/readyset-adapter/src/views_synchronizer.rs index 72ae3e0ad1..0c4d4c7678 100644 --- a/readyset-adapter/src/views_synchronizer.rs +++ b/readyset-adapter/src/views_synchronizer.rs @@ -1,3 +1,4 @@ +use std::collections::HashSet; use std::sync::Arc; use dataflow_expression::Dialect; @@ -8,6 +9,7 @@ use readyset_util::shared_cache::LocalCache; use readyset_util::shutdown::ShutdownReceiver; use tokio::select; use tracing::{debug, info, instrument, trace, warn}; +use xxhash_rust::xxh3; use crate::query_status_cache::QueryStatusCache; @@ -22,6 +24,13 @@ pub struct ViewsSynchronizer { dialect: Dialect, /// Global and thread-local cache of view endpoints and prepared statements. view_name_cache: LocalCache, + /// A cache to keep track of the queries for which we've already checked the server for + /// existing views. Note that this cache is *not* updated (i.e. a query is not removed) when a + /// "dry run succeeded" query is migrated. + /// + /// This HashSet stores 128-bit hashes computed via xxHash in an attempt to minimize the amount + /// of data we need to store to keep track of the queries we've already seen. + views_checked: HashSet, } impl ViewsSynchronizer { @@ -38,6 +47,7 @@ impl ViewsSynchronizer { poll_interval, dialect, view_name_cache, + views_checked: HashSet::new(), } } @@ -69,16 +79,26 @@ impl ViewsSynchronizer { async fn poll(&mut self) { debug!("Views synchronizer polling"); - let queries = self + let (queries, hashes): (Vec<_>, Vec<_>) = self .query_status_cache - .pending_migration() + .queries_with_statuses(&[MigrationState::DryRunSucceeded, MigrationState::Pending]) .into_iter() .filter_map(|(q, _)| { - q.into_parsed() - // once arc_unwrap_or_clone is stabilized, we can use that cleaner syntax - .map(|p| Arc::try_unwrap(p).unwrap_or_else(|arc| (*arc).clone())) + q.into_parsed().and_then(|p| { + let hash = xxh3::xxh3_128(&bincode::serialize(&*p).unwrap()); + + if self.views_checked.contains(&hash) { + None + } else { + // once arc_unwrap_or_clone is stabilized, we can use that cleaner syntax + Some(( + Arc::try_unwrap(p).unwrap_or_else(|arc| (*arc).clone()), + hash, + )) + } + }) }) - .collect::>(); + .unzip(); match self .controller @@ -86,7 +106,7 @@ impl ViewsSynchronizer { .await { Ok(statuses) => { - for (query, name) in queries.into_iter().zip(statuses) { + for ((query, name), hash) in queries.into_iter().zip(statuses).zip(hashes) { trace!( // FIXME(REA-2168): Use correct dialect. query = %query.statement.display(nom_sql::Dialect::MySQL), @@ -96,7 +116,8 @@ impl ViewsSynchronizer { if let Some(name) = name { self.view_name_cache.insert(query.clone(), name).await; self.query_status_cache - .update_query_migration_state(&query, MigrationState::Successful) + .update_query_migration_state(&query, MigrationState::Successful); + self.views_checked.insert(hash); } } } diff --git a/readyset-alloc-metrics/Cargo.toml b/readyset-alloc-metrics/Cargo.toml index 463502457e..47a44289c8 100644 --- a/readyset-alloc-metrics/Cargo.toml +++ b/readyset-alloc-metrics/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" [dependencies] metrics = { workspace = true } tokio = { workspace = true, features = ["full"] } -tracing = { version = "0.1", features = ["release_max_level_debug"] } +tracing = { workspace = true, features = ["release_max_level_debug"] } # Local dependencies readyset-alloc = { path = "../readyset-alloc" } diff --git a/readyset-alloc/Cargo.toml b/readyset-alloc/Cargo.toml index 37e5fb35e2..f3568b79db 100644 --- a/readyset-alloc/Cargo.toml +++ b/readyset-alloc/Cargo.toml @@ -13,15 +13,15 @@ mem-profiling = ["tikv-jemallocator/profiling"] sys-malloc = [] [dependencies] -futures = { version = "0.3", features = ["executor", "thread-pool"]} -fxhash = "0.2.1" -lazy_static = "1.3" -libc = "0.2" -tikv-jemalloc-ctl = "0.5.0" -tikv-jemalloc-sys = { version = "0.5.0", features = ["stats"] } -tikv-jemallocator = { version = "0.5.0", features = ["unprefixed_malloc_on_supported_platforms", "stats"] } +futures = { workspace = true, features = ["executor", "thread-pool"] } +fxhash = { workspace = true } +lazy_static = { workspace = true } +libc = { workspace = true } +tikv-jemalloc-ctl = { workspace = true } +tikv-jemalloc-sys = { workspace = true, features = ["stats"] } +tikv-jemallocator = { workspace = true, features = ["unprefixed_malloc_on_supported_platforms", "stats"] } tokio = { workspace = true, features = ["full"] } [dev-dependencies] -tempfile = "3.0" +tempfile = { workspace = true } diff --git a/readyset-alloc/src/lib.rs b/readyset-alloc/src/lib.rs index 66baa0f72e..747429a50d 100644 --- a/readyset-alloc/src/lib.rs +++ b/readyset-alloc/src/lib.rs @@ -59,6 +59,7 @@ #![cfg_attr(test, feature(test))] #![cfg_attr(test, feature(custom_test_frameworks))] #![cfg_attr(test, test_runner(runner::run_env_conditional_tests))] +#![allow(internal_features)] #![feature(core_intrinsics)] #[macro_use] diff --git a/readyset-client-metrics/Cargo.toml b/readyset-client-metrics/Cargo.toml index 4e52f567e3..ad9b4b7e5a 100644 --- a/readyset-client-metrics/Cargo.toml +++ b/readyset-client-metrics/Cargo.toml @@ -8,8 +8,8 @@ edition = "2021" [dependencies] clap = { workspace = true, features = ["derive","env"] } metrics = { workspace = true } -serde = "1.0.130" -serde_json = "1.0.67" +serde = { workspace = true } +serde_json = { workspace = true } #local dependencies readyset-client = { path = "../readyset-client" } diff --git a/readyset-client-test-helpers/Cargo.toml b/readyset-client-test-helpers/Cargo.toml index 2578c685da..95a2c11844 100644 --- a/readyset-client-test-helpers/Cargo.toml +++ b/readyset-client-test-helpers/Cargo.toml @@ -6,12 +6,12 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -async-trait = "0.1" +async-trait = { workspace = true } tokio = { workspace = true, features = ["full"] } -chrono = "0.4" +chrono = { workspace = true } mysql_async = { workspace = true, optional = true } tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"], optional = true } -tracing = "0.1.35" +tracing = { workspace = true } nom-sql = { path = "../nom-sql" } readyset-client = { path = "../readyset-client/" } diff --git a/readyset-client-test-helpers/src/mysql_helpers.rs b/readyset-client-test-helpers/src/mysql_helpers.rs index 9cf843c431..8243dd90f6 100644 --- a/readyset-client-test-helpers/src/mysql_helpers.rs +++ b/readyset-client-test-helpers/src/mysql_helpers.rs @@ -11,6 +11,22 @@ use tokio::net::TcpStream; use crate::Adapter; +pub fn upstream_config() -> mysql_async::OptsBuilder { + mysql_async::OptsBuilder::default() + .user(Some( + &env::var("MYSQL_USER").unwrap_or_else(|_| "root".into()), + )) + .pass(Some( + &env::var("MYSQL_PASSWORD").unwrap_or_else(|_| "noria".into()), + )) + .ip_or_hostname(env::var("MYSQL_HOST").unwrap_or_else(|_| "127.0.0.1".into())) + .tcp_port( + env::var("MYSQL_TCP_PORT") + .unwrap_or_else(|_| "3306".into()) + .parse() + .unwrap(), + ) +} /// Retrieves where the query executed by parsing the row returned by /// EXPLAIN LAST STATEMENT. pub async fn last_query_info(conn: &mut impl Queryable) -> QueryInfo { diff --git a/readyset-client/Cargo.toml b/readyset-client/Cargo.toml index b3cb5a8d51..f25fdc9021 100644 --- a/readyset-client/Cargo.toml +++ b/readyset-client/Cargo.toml @@ -12,69 +12,69 @@ keywords = ["database", "dataflow", "backend", "storage", "sql"] categories = ["api-bindings", "database"] [dependencies] -anyhow = "1.0" -async-bincode = "0.6.1" +anyhow = { workspace = true } +async-bincode = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -fail = "0.5.0" -thiserror = "1.0.26" -hyper = { version = "0.14.10", features = [ "stream", "client", "http2" ] } -nom = "7.1" -nom_locate = "4.0.0" -serde = { version = "1.0.8", features = ["rc", "derive"] } -serde_json = { version = "1.0.2", features = ["arbitrary_precision"] } -serde_with = "1.9.4" -serde_bytes = "0.11" -rmp-serde = "1.1.2" +fail = { workspace = true } +thiserror = { workspace = true } +hyper = { workspace = true, features = ["stream", "client", "http2"] } +nom = { workspace = true } +nom_locate = { workspace = true } +serde = { workspace = true, features = ["rc", "derive"] } +serde_json = { workspace = true, features = ["arbitrary_precision"] } +serde_with = { workspace = true } +serde_bytes = { workspace = true } +rmp-serde = { workspace = true } tokio = { workspace = true, features = ["full"] } -bincode = "1.3.3" -vec_map = { version = "0.8.0", features = ["eders"] } -petgraph = { version = "0.5", features = ["serde-1"] } -ahash = "0.7" -chrono = { version = "0.4.0", features = ["serde"] } -time = { version = "0.3", features = ["local-offset"] } -tower-service = "0.3.1" -tower-layer = "0.3.1" -tokio-tower = "0.5.1" -tower = { version = "0.4.6", features = ["limit", "balance", "buffer", "discover", "util", "timeout"] } -tracing = { version = "0.1", features = ["release_max_level_debug"] } -tracing-futures = "0.2.2" -slab = "0.4" -futures-util = "0.3.0" -futures = "0.3" -mysql_common = { version = "0.32", features = ["chrono"] } -vec1 = { version = "1.6.0", features = ["serde"] } -proptest = "1.0.0" -derive_more = "0.99.11" -backoff = { version = "0.4.0", features = ["tokio"] } -url = { version = "2.2", features = ["serde"] } +bincode = { workspace = true } +vec_map = { workspace = true, features = ["eders"] } +petgraph = { workspace = true, features = ["serde-1"] } +ahash = { workspace = true } +chrono = { workspace = true, features = ["serde"] } +time = { workspace = true, features = ["local-offset"] } +tower-service = { workspace = true } +tower-layer = { workspace = true } +tokio-tower = { workspace = true } +tower = { workspace = true, features = ["limit", "balance", "buffer", "discover", "util", "timeout"] } +tracing = { workspace = true, features = ["release_max_level_debug"] } +tracing-futures = { workspace = true } +slab = { workspace = true } +futures-util = { workspace = true } +futures = { workspace = true } +mysql_common = { workspace = true, features = ["chrono"] } +vec1 = { workspace = true, features = ["serde"] } +proptest = { workspace = true } +derive_more = { workspace = true } +backoff = { workspace = true, features = ["tokio"] } +url = { workspace = true, features = ["serde"] } mysql_async = { workspace = true } -rand = "0.8.4" -parking_lot = "0.11.2" -cloudflare-zlib = { version = "0.2.9", features = ["arm-always"] } -smallvec = "1.8" +rand = { workspace = true } +parking_lot = { workspace = true } +cloudflare-zlib = { workspace = true, features = ["arm-always"] } +smallvec = { workspace = true } rocksdb.workspace = true tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] } metrics = { workspace = true } metrics-util = { workspace = true } -itertools = "0.10" -bytes = "1.0.1" -rust_decimal = { version = "1.26", features = ["db-tokio-postgres", "serde-str"] } +itertools = { workspace = true } +bytes = { workspace = true } +rust_decimal = { workspace = true, features = ["db-tokio-postgres", "serde-str"] } eui48 = { workspace = true } -uuid = { version = "0.8", features = ["v4"] } -bit-vec = { version = "0.6", features = ["serde"] } -triomphe = "0.1" -streaming-iterator = "0.1" -test-strategy = "0.2.0" +uuid = { workspace = true, features = ["v4"] } +bit-vec = { workspace = true, features = ["serde"] } +triomphe = { workspace = true } +streaming-iterator = { workspace = true } +test-strategy = { workspace = true } # consensus/ -enum_dispatch = "0.3.7" -async-trait = "0.1" +enum_dispatch = { workspace = true } +async-trait = { workspace = true } consulrs = { workspace = true } base64 = "0.13" # metrics/ -reqwest = { version = "0.11.3", features = ["json"] } +reqwest = { workspace = true, features = ["json"] } # Local dependencies failpoint-macros = { path = "../failpoint-macros" } @@ -91,8 +91,8 @@ readyset-sql-passes = { path = "../readyset-sql-passes" } replication-offset = { path = "../replication-offset" } [dev-dependencies] -serial_test = "0.5.1" -tempfile = "3.4" +serial_test = { workspace = true } +tempfile = { workspace = true } [features] failure_injection = ["fail/failpoints"] diff --git a/readyset-client/src/controller/rpc.rs b/readyset-client/src/controller/rpc.rs index 592e38f59f..c979732a67 100644 --- a/readyset-client/src/controller/rpc.rs +++ b/readyset-client/src/controller/rpc.rs @@ -16,7 +16,7 @@ use crate::ReadySetHandle; // this alias is needed to work around -> impl Trait capturing _all_ lifetimes by default // the A parameter is needed so it gets captured into the impl Trait -pub type RpcFuture<'a, R: 'a> = impl Future> + 'a; +pub type RpcFuture<'a, R: DeserializeOwned + 'a> = impl Future> + 'a; impl ReadySetHandle { /// Perform a raw RPC request to the HTTP `path` provided, providing a request body `r`. diff --git a/readyset-client/src/lib.rs b/readyset-client/src/lib.rs index 5903a88ae1..350be21672 100644 --- a/readyset-client/src/lib.rs +++ b/readyset-client/src/lib.rs @@ -142,7 +142,6 @@ result_flattening, type_alias_impl_trait, stmt_expr_attributes, - bound_map, bound_as_ref, box_into_inner, is_sorted, @@ -258,21 +257,21 @@ pub mod consistency; mod controller; pub mod metrics; pub mod query; +pub mod recipe; pub mod status; mod table; pub mod utils; mod view; -use std::convert::TryFrom; -use std::default::Default; -pub mod recipe; #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 pub mod consensus; #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 pub mod internal; -// for the row! macro +use std::convert::TryFrom; +use std::default::Default; use std::future::Future; +use std::hash::Hash; use std::pin::Pin; pub use nom_sql::{ColumnConstraint, SqlIdentifier}; @@ -435,8 +434,10 @@ pub fn shard_by(dt: &DfValue, shards: usize) -> usize { DfValue::Int(n) => n as usize % shards, DfValue::UnsignedInt(n) => n as usize % shards, DfValue::Text(..) | DfValue::TinyText(..) | DfValue::TimestampTz(_) => { - use std::hash::Hasher; - let mut hasher = ahash::AHasher::new_with_keys(0x3306, 0x6033); + use std::hash::{BuildHasher, Hasher}; + + let mut hasher = + ahash::RandomState::with_seeds(0x3306, 0x6033, 0x5432, 0x6034).build_hasher(); // this unwrap should be safe because there are no error paths with a Text, TinyText, // nor Timestamp converting to Text #[allow(clippy::unwrap_used)] @@ -459,10 +460,8 @@ pub fn shard_by(dt: &DfValue, shards: usize) -> usize { | DfValue::BitVector(_) | DfValue::Array(_) | DfValue::PassThrough(_) => { - use std::hash::{Hash, Hasher}; - let mut hasher = ahash::AHasher::new_with_keys(0x3306, 0x6033); - dt.hash(&mut hasher); - hasher.finish() as usize % shards + let hash = ahash::RandomState::with_seeds(0x3306, 0x6033, 0x5432, 0x6034).hash_one(dt); + hash as usize % shards } } } diff --git a/readyset-client/src/view/results.rs b/readyset-client/src/view/results.rs index c54c52fb65..a58530ac33 100644 --- a/readyset-client/src/view/results.rs +++ b/readyset-client/src/view/results.rs @@ -172,8 +172,15 @@ impl ResultIterator { let limit = adapter_limit.or(*limit); // Limit specifies total number of results to return let inner = match (order_by, aggregates) { + // No data in the result set, so return as simply as possible. + (_, _) if data.is_empty() => ResultIteratorInner::MultiKey(MultiKeyIterator::new(data)), // No specific order is required, simply iterate over each result set one by one (None, None) => ResultIteratorInner::MultiKey(MultiKeyIterator::new(data)), + // if there's an order by clause, yet the result set has only one row for a single key, + // return a simple iterator as there's nothing to order (it's a single row) + (Some(_), None) if data.len() == 1 && data.first().is_some_and(|v| v.len() == 1) => { + ResultIteratorInner::MultiKey(MultiKeyIterator::new(data)) + } (Some(order_by), None) => { // Order by is specified, merge results using a k-way merge iterator let comparator = RowComparator { @@ -182,10 +189,15 @@ impl ResultIterator { debug_assert!(data .iter() - .all(|s| { s.is_sorted_by(|a, b| Some(comparator.cmp(a, b))) })); + .all(|s| { s.is_sorted_by(|a, b| comparator.cmp(a, b).is_le()) })); ResultIteratorInner::MultiKeyMerge(MergeIterator::new(data, comparator)) } + // if there's an aggregation, but only one key in the result set, we can return a + // simple iterator as results are already aggregated in the dataflow graph. + (None, Some(_)) if data.len() == 1 => { + ResultIteratorInner::MultiKey(MultiKeyIterator::new(data)) + } (None, Some(aggregates)) => { if aggregates.group_by.is_empty() { // No group by means just iterate over the results and aggregate @@ -208,7 +220,7 @@ impl ResultIterator { debug_assert!(data .iter() - .all(|s| { s.is_sorted_by(|a, b| Some(comparator.cmp(a, b))) })); + .all(|s| { s.is_sorted_by(|a, b| comparator.cmp(a, b).is_le()) })); ResultIteratorInner::MultiKeyAggregateMerge(AggregateIterator { inner: Box::new(ResultIteratorInner::MultiKeyMerge(MergeIterator::new( @@ -220,6 +232,12 @@ impl ResultIterator { }) } } + // if there's an order by clause with an aggregate, yet the result set has only one row + // for a single key, return a simple iterator as there's nothing to order + // (it's a single row) + (Some(_), Some(_)) if data.len() == 1 && data.first().is_some_and(|v| v.len() == 1) => { + ResultIteratorInner::MultiKey(MultiKeyIterator::new(data)) + } (Some(order_by), Some(aggregates)) => { // When both aggregates and order by are specified it is tricky to lazily evaluate // rows, so sadly we end up having to collect all of the rows, aggregate, then sort @@ -234,7 +252,7 @@ impl ResultIterator { debug_assert!(data .iter() - .all(|s| { s.is_sorted_by(|a, b| Some(comparator.cmp(a, b))) })); + .all(|s| { s.is_sorted_by(|a, b| comparator.cmp(a, b).is_le()) })); let temp_iter = ResultIterator { inner: ResultIteratorInner::MultiKeyAggregateMerge(AggregateIterator { diff --git a/readyset-clustertest/Cargo.toml b/readyset-clustertest/Cargo.toml index 86ef2d81ae..10c5c407c7 100644 --- a/readyset-clustertest/Cargo.toml +++ b/readyset-clustertest/Cargo.toml @@ -7,18 +7,18 @@ edition = "2021" [dependencies] tokio = { workspace = true, features = ["full"] } -futures = "0.3" -futures-util = "0.3" -anyhow = "1.0" -rand = "0.8.3" -url = "2.2.2" +futures = { workspace = true } +futures-util = { workspace = true } +anyhow = { workspace = true } +rand = { workspace = true } +url = { workspace = true } mysql_async = { workspace = true } tokio-postgres = { workspace = true } -envy = "0.4" -serde = { version = "1.0.8", features = ["derive"] } -hyper = "0.14.10" -bincode = "1.3.3" -tracing = { version = "0.1", features = ["release_max_level_debug"] } +envy = { workspace = true } +serde = { workspace = true, features = ["derive"] } +hyper = { workspace = true } +bincode = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } # local deps database-utils = { path = "../database-utils" } @@ -31,14 +31,14 @@ readyset-tracing = { path = "../readyset-tracing" } readyset-errors = { path = "../readyset-errors" } [dev-dependencies] -serial_test = "0.5.1" +serial_test = { workspace = true } criterion = { workspace = true, features=['real_blackbox', 'async_tokio']} -itertools = "0.10.4" +itertools = { workspace = true } readyset-client-metrics = { path = "../readyset-client-metrics" } test-utils = { path = "../test-utils" } readyset-clustertest-macros = { path = "./macros" } readyset-tracing = { path = "../readyset-tracing" } -rust_decimal = "1.26" +rust_decimal = { workspace = true } [[bench]] name = "clustering" diff --git a/readyset-clustertest/macros/Cargo.toml b/readyset-clustertest/macros/Cargo.toml index 46f4f18a0c..8ce40458e3 100644 --- a/readyset-clustertest/macros/Cargo.toml +++ b/readyset-clustertest/macros/Cargo.toml @@ -6,8 +6,8 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -syn = {version="1.0.57",features=["full","fold"]} -quote = "1.0.8" +syn = { workspace = true, features = ["full", "fold"] } +quote = { workspace = true } [lib] proc-macro = true diff --git a/readyset-clustertest/src/lib.rs b/readyset-clustertest/src/lib.rs index 993563b8e2..ff3e3e61a1 100644 --- a/readyset-clustertest/src/lib.rs +++ b/readyset-clustertest/src/lib.rs @@ -379,6 +379,8 @@ pub struct ServerStartParams { wait_for_failpoint: bool, /// Whether to allow full materialization nodes or not allow_full_materialization: bool, + /// Whether to allow post-lookup operations + enable_post_lookups: bool, } /// Set of parameters defining an entire cluster's topology. @@ -451,6 +453,8 @@ pub struct DeploymentBuilder { enable_experimental_placeholder_inlining: bool, /// Whether to allow fully materialized nodes or not allow_full_materialization: bool, + /// Whether to enable post-lookup operations + enable_post_lookups: bool, /// Whether to allow prometheus metrics prometheus_metrics: bool, /// How to execute the adapter and server processes. @@ -528,6 +532,7 @@ impl DeploymentBuilder { cleanup: false, enable_experimental_placeholder_inlining: false, allow_full_materialization: false, + enable_post_lookups: false, prometheus_metrics: true, } } @@ -685,6 +690,12 @@ impl DeploymentBuilder { self } + /// Enable post-lookup operations + pub fn enable_post_lookups(mut self) -> Self { + self.enable_post_lookups = true; + self + } + /// Sets whether or not to automatically create inlined caches for queries with unsupported /// placeholders pub fn enable_experimental_placeholder_inlining(mut self) -> Self { @@ -729,6 +740,7 @@ impl DeploymentBuilder { enable_experimental_placeholder_inlining: self.enable_experimental_placeholder_inlining, deployment_mode: self.deployment_mode, allow_full_materialization: self.allow_full_materialization, + enable_post_lookups: self.enable_post_lookups, prometheus_metrics: self.prometheus_metrics, } } @@ -750,6 +762,7 @@ impl DeploymentBuilder { auto_restart: self.auto_restart, wait_for_failpoint, allow_full_materialization: self.allow_full_materialization, + enable_post_lookups: self.enable_post_lookups, } } @@ -1546,6 +1559,8 @@ pub struct AdapterStartParams { deployment_mode: DeploymentMode, /// Whether or not to allow full materializations allow_full_materialization: bool, + /// Whether or not to enable post-lookup operations + enable_post_lookups: bool, /// Whether to enable prometheus metrics prometheus_metrics: bool, } @@ -1592,6 +1607,9 @@ async fn start_server( if server_start_params.allow_full_materialization { builder = builder.allow_full_materialization(); } + if server_start_params.enable_post_lookups { + builder = builder.enable_post_lookups(); + } let addr = Url::parse(&format!("http://127.0.0.1:{}", port)).unwrap(); Ok(ServerHandle { addr, @@ -1688,6 +1706,10 @@ async fn start_adapter( builder = builder.allow_full_materialization(); } + if params.enable_post_lookups { + builder = builder.enable_post_lookups(); + } + if params.prometheus_metrics { builder = builder.prometheus_metrics() } diff --git a/readyset-clustertest/src/readyset.rs b/readyset-clustertest/src/readyset.rs index 7a311d3344..c2f86c941a 100644 --- a/readyset-clustertest/src/readyset.rs +++ b/readyset-clustertest/src/readyset.rs @@ -196,6 +196,7 @@ async fn replicated_readers() { let mut deployment = DeploymentBuilder::new(DatabaseType::MySQL, "ct_replicated_readers") .with_servers(2, ServerParams::default()) .reader_replicas(2) + .enable_post_lookups() .start() .await .unwrap(); @@ -292,6 +293,7 @@ async fn replicated_readers_with_unions() { DeploymentBuilder::new(DatabaseType::MySQL, "ct_replicated_readers_with_unions") .with_servers(2, ServerParams::default()) .reader_replicas(2) + .enable_post_lookups() .start() .await .unwrap(); @@ -757,7 +759,7 @@ async fn startup_permutations() { // FIXME[ENG-1668]: Either the system cannot startup healthily for the following situations, or // there are bugs in the failure injection we are doing in tests. - let known_failures = vec![ + let known_failures = [ vec![Authority, Adapter, Server, Upstream], vec![Upstream, Adapter, Server, Authority], vec![Adapter, Authority, Server, Upstream], diff --git a/readyset-clustertest/src/readyset_mysql.rs b/readyset-clustertest/src/readyset_mysql.rs index 9406afda8e..810899c2e8 100644 --- a/readyset-clustertest/src/readyset_mysql.rs +++ b/readyset-clustertest/src/readyset_mysql.rs @@ -1599,7 +1599,7 @@ async fn views_synchronize_between_deployments() { // Eventually it should show up in adapter 1 too eventually! { - adapter_1.as_mysql_conn().unwrap().query_drop("SELECT * FROM t1;"); + adapter_1.as_mysql_conn().unwrap().query_drop("SELECT * FROM t1;").await.unwrap(); last_statement_destination(adapter_1.as_mysql_conn().unwrap()).await == QueryDestination::Readyset } @@ -1649,6 +1649,7 @@ async fn enable_experimental_placeholder_inlining() { .with_servers(1, ServerParams::default()) .explicit_migrations(500) .enable_experimental_placeholder_inlining() + .enable_post_lookups() .start() .await .unwrap(); diff --git a/readyset-clustertest/src/readyset_postgres.rs b/readyset-clustertest/src/readyset_postgres.rs index b416598bbf..943d8ad58c 100644 --- a/readyset-clustertest/src/readyset_postgres.rs +++ b/readyset-clustertest/src/readyset_postgres.rs @@ -139,6 +139,7 @@ async fn embedded_readers_adapters_lt_replicas() { .with_servers(1, ServerParams::default().no_readers()) .embedded_readers(true) .allow_full_materialization() + .enable_post_lookups() .start() .await .unwrap(); @@ -308,6 +309,7 @@ async fn reader_domain_panic_handling() { .with_servers(1, ServerParams::default().no_readers()) .embedded_readers(true) .allow_full_materialization() + .enable_post_lookups() .start() .await .unwrap(); @@ -425,6 +427,7 @@ async fn base_domain_panic_handling() { .with_servers(1, ServerParams::default().no_readers()) .embedded_readers(true) .allow_full_materialization() + .enable_post_lookups() .start() .await .unwrap(); diff --git a/readyset-clustertest/src/server.rs b/readyset-clustertest/src/server.rs index 2e5ce0a3c9..05535fcae6 100644 --- a/readyset-clustertest/src/server.rs +++ b/readyset-clustertest/src/server.rs @@ -194,6 +194,10 @@ impl ReadysetServerBuilder { pub fn allow_full_materialization(self) -> Self { self.push_arg("--allow-full-materialization") } + + pub fn enable_post_lookups(self) -> Self { + self.push_arg("--enable-experimental-post-lookup") + } } /// Manages running a readyset binary with the correct arguments. @@ -349,6 +353,10 @@ impl AdapterBuilder { self.push_arg("--allow-full-materialization") } + pub fn enable_post_lookups(self) -> Self { + self.push_arg("--enable-experimental-post-lookup") + } + pub fn prometheus_metrics(self) -> Self { self.push_arg("--prometheus-metrics") } diff --git a/readyset-common/Cargo.toml b/readyset-common/Cargo.toml index 98a9b30ba4..208167fa62 100644 --- a/readyset-common/Cargo.toml +++ b/readyset-common/Cargo.toml @@ -8,16 +8,16 @@ edition = "2021" description = "Artifacts commonly shared among other ReadySet crates" [dependencies] -chrono = { version = "0.4.0", features = ["serde"] } -serde = { version = "1.0.8", features = ["rc", "derive"] } -petgraph = { version = "0.5", features = ["serde-1"] } -vec1 = "1.6.0" -triomphe = "0.1" -proptest = "1.0" -test-strategy = "0.2.0" -rlimit = "0.10.1" -anyhow = "1.0" -tracing = "0.1" +chrono = { workspace = true, features = ["serde"] } +serde = { workspace = true, features = ["rc", "derive"] } +petgraph = { workspace = true, features = ["serde-1"] } +vec1 = { workspace = true } +triomphe = { workspace = true } +proptest = { workspace = true } +test-strategy = { workspace = true } +rlimit = { workspace = true } +anyhow = { workspace = true } +tracing = { workspace = true } # Local deps readyset-client = { path = "../readyset-client" } diff --git a/readyset-common/src/lib.rs b/readyset-common/src/lib.rs index a7afa70c06..253bb0a3d7 100644 --- a/readyset-common/src/lib.rs +++ b/readyset-common/src/lib.rs @@ -1,5 +1,4 @@ #![deny(macro_use_extern_crate)] -#![feature(bound_map)] mod local; mod records; @@ -117,14 +116,15 @@ mod tests { fn data_type_mem_size() { use std::mem::{size_of, size_of_val}; - use chrono::NaiveDateTime; + use chrono::DateTime; let s = "this needs to be longer than 14 chars to make it be a Text"; let txt: DfValue = DfValue::from(s); let shrt = DfValue::Int(5); let time = DfValue::TimestampTz( - NaiveDateTime::from_timestamp_opt(0, 42_000_000) + DateTime::from_timestamp(0, 42_000_000) .unwrap() + .naive_utc() .into(), ); diff --git a/readyset-common/src/records.rs b/readyset-common/src/records.rs index 91beec4ee3..943ef26830 100644 --- a/readyset-common/src/records.rs +++ b/readyset-common/src/records.rs @@ -121,10 +121,10 @@ impl<'a> IntoIterator for &'a Records { pub struct Records(Vec); impl Records { - pub fn has(&self, q: &Q, positive: bool) -> bool + pub fn has(&self, q: &Q, positive: bool) -> bool where Vec: Borrow, - Q: Eq, + Q: Eq + ?Sized, { self.iter().any(|r| match r { Record::Positive(ref r) if positive => r.borrow() == q, @@ -133,18 +133,18 @@ impl Records { }) } - pub fn has_positive(&self, q: &Q) -> bool + pub fn has_positive(&self, q: &Q) -> bool where Vec: Borrow, - Q: Eq, + Q: Eq + ?Sized, { self.has(q, true) } - pub fn has_negative(&self, q: &Q) -> bool + pub fn has_negative(&self, q: &Q) -> bool where Vec: Borrow, - Q: Eq, + Q: Eq + ?Sized, { self.has(q, false) } diff --git a/readyset-data/Cargo.toml b/readyset-data/Cargo.toml index c2115bdd18..3acd0f6c05 100644 --- a/readyset-data/Cargo.toml +++ b/readyset-data/Cargo.toml @@ -6,54 +6,54 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0" -bit-vec = { version = "0.6", features = ["serde"] } -bytes = "1.0.1" -chrono = { version = "0.4.19", features = ["serde"] } +anyhow = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +bytes = { workspace = true } +chrono = { workspace = true, features = ["serde"] } eui48 = { workspace = true } -itertools = "0.10" -lazy_static = "1.4" -mysql_common = { version = "0.32", features = ["chrono"] } -proptest = "1.0.0" -regex = "1.8" -rust_decimal = { version = "1.26", features = ["db-tokio-postgres", "serde-str"] } -serde = { version = "1.0.8", features = ["rc", "derive"] } -serde_bytes = "0.11" -serde_json = { version = "1.0.2", features = ["arbitrary_precision", "unbounded_depth"] } -serde_stacker = "0.1.7" -strum = "0.23" -strum_macros = "0.23" -test-strategy = "0.2.0" -time = { version = "0.3", features = ["local-offset"] } -triomphe = "0.1" -uuid = { version = "0.8", features = ["v4"] } -enum-kinds = "0.5.1" -ndarray = { version = "0.15.4", features = ["serde"] } -fallible-iterator = "0.2.0" # Only for internals of ToSql impls -nom = "7.1" -nom_locate = "4.0.0" +itertools = { workspace = true } +lazy_static = { workspace = true } +mysql_common = { workspace = true, features = ["chrono"] } +proptest = { workspace = true } +regex = { workspace = true } +rust_decimal = { workspace = true, features = ["db-tokio-postgres", "serde-str"] } +serde = { workspace = true, features = ["rc", "derive"] } +serde_bytes = { workspace = true } +serde_json = { workspace = true, features = ["arbitrary_precision", "unbounded_depth"] } +serde_stacker = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } +test-strategy = { workspace = true } +time = { workspace = true, features = ["local-offset"] } +triomphe = { workspace = true } +uuid = { workspace = true, features = ["v4"] } +enum-kinds = { workspace = true } +ndarray = { workspace = true, features = ["serde"] } +fallible-iterator = { workspace = true } # Only for internals of ToSql impls +nom = { workspace = true } +nom_locate = { workspace = true } postgres-protocol = { workspace = true } -cidr = "0.2.1" +cidr = { workspace = true } postgres-types = { workspace = true, features = ["with-cidr-0_2"] } -vec1 = "1.6.0" +vec1 = { workspace = true } # Local dependencies nom-sql = { path = "../nom-sql" } readyset-util = { path = "../readyset-util" } readyset-errors = { path = "../readyset-errors" } mysql-time = { path = "../mysql-time" } -smallvec = { version = "1.9.0", features = ["union", "const_generics", "serde"] } +smallvec = { workspace = true, features = ["union", "const_generics", "serde"] } [dependencies.tokio-postgres] workspace = true features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] [dev-dependencies] -derive_more = "0.99.11" -bincode = "1.3.3" +derive_more = { workspace = true } +bincode = { workspace = true } criterion = { workspace = true, features=['real_blackbox', 'async_tokio']} tokio = { workspace = true, features = ["full"] } -serial_test = "0.5.1" +serial_test = { workspace = true } [[bench]] name = "serde" diff --git a/readyset-data/benches/serde.rs b/readyset-data/benches/serde.rs index 5321001399..f62f1fcc34 100644 --- a/readyset-data/benches/serde.rs +++ b/readyset-data/benches/serde.rs @@ -24,10 +24,15 @@ fn serde(c: &mut Criterion) { let timestamp_tz = DfValue::from(chrono::TimeZone::from_utc_datetime( &chrono::FixedOffset::west_opt(18_000).unwrap(), - &chrono::NaiveDateTime::from_timestamp_opt(0, 42_000_000).unwrap(), + &chrono::DateTime::from_timestamp(0, 42_000_000) + .unwrap() + .naive_utc(), )); - let timestamp = - DfValue::from(chrono::NaiveDateTime::from_timestamp_opt(0, 42_000_000).unwrap()); + let timestamp = DfValue::from( + chrono::DateTime::from_timestamp(0, 42_000_000) + .unwrap() + .naive_utc(), + ); let time: DfValue = MySqlTime::from_hmsus(false, 10, 30, 24, 100).into(); diff --git a/readyset-data/src/dialect.rs b/readyset-data/src/dialect.rs index d835440310..d10204c725 100644 --- a/readyset-data/src/dialect.rs +++ b/readyset-data/src/dialect.rs @@ -97,7 +97,7 @@ impl Dialect { // TODO: Handle `real_as_float` mode. match self.engine { SqlEngine::PostgreSQL => DfType::Float, - SqlEngine::MySQL => DfType::Float, + SqlEngine::MySQL => DfType::Double, } } @@ -108,6 +108,18 @@ impl Dialect { SqlEngine::PostgreSQL => DfType::Int, } } + + /// Return whether the specified storage engine type is supported by Readyset. Only applicable + /// to MySQL. Currently, only InnoDB and MyRocks are supported. + pub fn storage_engine_is_supported>(&self, storage_engine: S) -> bool { + match self.engine { + SqlEngine::MySQL => { + storage_engine.as_ref().eq_ignore_ascii_case("InnoDB") + || storage_engine.as_ref().eq_ignore_ascii_case("RocksDB") + } + SqlEngine::PostgreSQL => true, + } + } } impl From for nom_sql::Dialect { diff --git a/readyset-data/src/float.rs b/readyset-data/src/float.rs index 5cfbb870cb..6216a56a3e 100644 --- a/readyset-data/src/float.rs +++ b/readyset-data/src/float.rs @@ -82,6 +82,14 @@ pub(crate) fn coerce_f64(val: f64, to_ty: &DfType, from_ty: &DfType) -> ReadySet DfType::UnsignedSmallInt => coerce_f64_to_uint::(val) .ok_or_else(bounds_err) .map(DfValue::from), + DfType::MediumInt => coerce_f64_to_int::(val) + .filter(|i| ((-1 << 23)..(1 << 23)).contains(i)) + .ok_or_else(bounds_err) + .map(DfValue::from), + DfType::UnsignedMediumInt => coerce_f64_to_uint::(val) + .filter(|&i| i < (1 << 24)) + .ok_or_else(bounds_err) + .map(DfValue::from), DfType::Int => coerce_f64_to_int::(val) .ok_or_else(bounds_err) .map(DfValue::from), @@ -184,6 +192,16 @@ pub(crate) fn coerce_decimal( DfType::UnsignedTinyInt => val.to_u8().ok_or_else(err).map(DfValue::from), DfType::SmallInt => val.to_i16().ok_or_else(err).map(DfValue::from), DfType::UnsignedSmallInt => val.to_u16().ok_or_else(err).map(DfValue::from), + DfType::MediumInt => val + .to_i32() + .filter(|i| ((-1 << 23)..(1 << 23)).contains(i)) + .ok_or_else(err) + .map(DfValue::from), + DfType::UnsignedMediumInt => val + .to_u32() + .filter(|&i| i < (1 << 24)) + .ok_or_else(err) + .map(DfValue::from), DfType::Int => val.to_i32().ok_or_else(err).map(DfValue::from), DfType::UnsignedInt => val.to_u32().ok_or_else(err).map(DfValue::from), DfType::BigInt => val.to_i64().ok_or_else(err).map(DfValue::from), @@ -314,6 +332,30 @@ mod tests { } } + #[proptest] + fn float_to_mediumint(val: f32) { + if val < (-1i32 << 23) as f32 - 0.5 || val >= ((1i32 << 23) - 1) as f32 + 0.5 { + DfValue::Double(val as _) + .coerce_to(&DfType::MediumInt, &DfType::Unknown) + .expect_err("OOB"); + } else { + assert_eq!( + DfValue::Double(val as f64).coerce_to(&DfType::MediumInt, &DfType::Unknown), + Ok(DfValue::Int(val.round() as i64)) + ); + } + if val < -0.5f32 || val >= ((1u32 << 24) - 1) as f32 + 0.5 { + DfValue::Double(val as _) + .coerce_to(&DfType::UnsignedMediumInt, &DfType::Unknown) + .expect_err("OOB"); + } else { + assert_eq!( + DfValue::Double(val as f64).coerce_to(&DfType::UnsignedMediumInt, &DfType::Unknown), + Ok(DfValue::UnsignedInt(val.round() as u64)) + ); + } + } + #[proptest] fn float_to_int(val: f64) { if val < i32::MIN as f64 - 0.5 || val >= i32::MAX as f64 + 0.5 { @@ -494,5 +536,32 @@ mod tests { .coerce_to(&DfType::UnsignedBigInt, &DfType::Unknown), Ok(DfValue::UnsignedInt(17946744073709551616)) ); + + assert_eq!( + DfValue::Double(-8388608.49).coerce_to(&DfType::MediumInt, &DfType::Unknown), + Ok(DfValue::Int(-8388608)) + ); + + DfValue::Double(-8388608.51) + .coerce_to(&DfType::MediumInt, &DfType::Unknown) + .unwrap_err(); + + assert_eq!( + DfValue::Double(8388607.49).coerce_to(&DfType::MediumInt, &DfType::Unknown), + Ok(DfValue::Int(8388607)) + ); + + DfValue::Double(8388607.51) + .coerce_to(&DfType::MediumInt, &DfType::Unknown) + .unwrap_err(); + + assert_eq!( + DfValue::Double(16777215.49).coerce_to(&DfType::UnsignedMediumInt, &DfType::Unknown), + Ok(DfValue::UnsignedInt(16777215)) + ); + + DfValue::Double(16777215.51) + .coerce_to(&DfType::UnsignedMediumInt, &DfType::Unknown) + .unwrap_err(); } } diff --git a/readyset-data/src/integer.rs b/readyset-data/src/integer.rs index cc55fdfc53..1396fb6e21 100644 --- a/readyset-data/src/integer.rs +++ b/readyset-data/src/integer.rs @@ -2,6 +2,7 @@ use std::convert::TryFrom; use std::fmt; use std::sync::Arc; +use bit_vec::BitVec; use readyset_errors::{ReadySetError, ReadySetResult}; use rust_decimal::Decimal; @@ -57,7 +58,7 @@ where u64: TryFrom, Decimal: From, usize: TryFrom, - I: std::ops::BitXor + std::cmp::Eq + Copy + fmt::Display + IntAsFloat, + I: std::ops::BitXor + IntAsFloat + std::cmp::Eq + Copy + fmt::Display, { let err = || ReadySetError::DfValueConversionError { src_type: from_ty.to_string(), @@ -73,6 +74,16 @@ where DfType::UnsignedTinyInt => u8::try_from(val).map_err(|_| err()).map(DfValue::from), DfType::SmallInt => i16::try_from(val).map_err(|_| err()).map(DfValue::from), DfType::UnsignedSmallInt => u16::try_from(val).map_err(|_| err()).map(DfValue::from), + DfType::MediumInt => i32::try_from(val) + .ok() + .filter(|i| ((-1 << 23)..(1 << 23)).contains(i)) + .ok_or_else(err) + .map(DfValue::from), + DfType::UnsignedMediumInt => u32::try_from(val) + .ok() + .filter(|&i| i < (1 << 24)) + .ok_or_else(err) + .map(DfValue::from), DfType::Int => i32::try_from(val).map_err(|_| err()).map(DfValue::from), DfType::UnsignedInt => u32::try_from(val).map_err(|_| err()).map(DfValue::from), DfType::BigInt => i64::try_from(val).map_err(|_| err()).map(DfValue::from), @@ -101,7 +112,7 @@ where DfType::VarBinary(l) => { let mut val = val.to_string(); val.truncate(l as usize); - Ok(val.to_string().into_bytes().into()) + Ok(val.into_bytes().into()) } DfType::Binary(l) => { @@ -178,11 +189,14 @@ where Ok(DfValue::from(r#enum::apply_enum_limits(idx, variants))) } + DfType::Bit(/* TODO */ _len) => u64::try_from(val) + .map_err(|_| err()) + .map(|v| DfValue::BitVector(Arc::new(BitVec::from_bytes(&v.to_be_bytes())))), + DfType::Unknown | DfType::MacAddr | DfType::Inet | DfType::Uuid - | DfType::Bit(_) | DfType::VarBit(_) | DfType::Array(_) => Err(ReadySetError::DfValueConversionError { src_type: from_ty.to_string(), diff --git a/readyset-data/src/lib.rs b/readyset-data/src/lib.rs index e9b04ee290..b44bf61ead 100644 --- a/readyset-data/src/lib.rs +++ b/readyset-data/src/lib.rs @@ -235,9 +235,9 @@ impl DfValue { ), DfValue::Float(..) => DfValue::Float(f32::MIN), DfValue::Double(..) => DfValue::Double(f64::MIN), - DfValue::Int(_) => DfValue::Int(i64::min_value()), + DfValue::Int(_) => DfValue::Int(i64::MIN), DfValue::UnsignedInt(_) => DfValue::UnsignedInt(0), - DfValue::Time(_) => DfValue::Time(MySqlTime::min_value()), + DfValue::Time(_) => DfValue::Time(MySqlTime::MIN), DfValue::ByteArray(_) => DfValue::ByteArray(Arc::new(Vec::new())), DfValue::Numeric(_) => DfValue::from(Decimal::MIN), DfValue::BitVector(_) => DfValue::from(BitVec::new()), @@ -265,9 +265,9 @@ impl DfValue { ), DfValue::Float(..) => DfValue::Float(f32::MAX), DfValue::Double(..) => DfValue::Double(f64::MIN), - DfValue::Int(_) => DfValue::Int(i64::max_value()), - DfValue::UnsignedInt(_) => DfValue::UnsignedInt(u64::max_value()), - DfValue::Time(_) => DfValue::Time(MySqlTime::max_value()), + DfValue::Int(_) => DfValue::Int(i64::MAX), + DfValue::UnsignedInt(_) => DfValue::UnsignedInt(u64::MAX), + DfValue::Time(_) => DfValue::Time(MySqlTime::MAX), DfValue::Numeric(_) => DfValue::from(Decimal::MAX), DfValue::TinyText(_) | DfValue::Text(_) @@ -584,6 +584,7 @@ impl DfValue { Some(max_size) if vec.len() > *max_size as usize => Err(mk_err()), _ => Ok(self.clone()), }, + DfType::Bit(/* TODO */ _len) => Ok(self.clone()), _ => Err(mk_err()), }, DfValue::ByteArray(_) | DfValue::Max => Err(mk_err()), @@ -1252,7 +1253,7 @@ impl<'a> TryFrom<&'a Literal> for DfValue { .map(|d| DfValue::Numeric(Arc::new(d))), Literal::Blob(b) => Ok(DfValue::from(b.as_slice())), Literal::ByteArray(b) => Ok(DfValue::ByteArray(Arc::new(b.clone()))), - Literal::BitVector(b) => Ok(DfValue::from(BitVec::from_bytes(b.as_slice()))), + Literal::BitVector(b) => Ok(DfValue::from(b)), Literal::Placeholder(_) => { internal!("Tried to convert a Placeholder literal to a DfValue") } @@ -1294,7 +1295,7 @@ impl TryFrom for Literal { )?)), DfValue::ByteArray(ref array) => Ok(Literal::ByteArray(array.as_ref().clone())), DfValue::Numeric(ref d) => Ok(Literal::Numeric(d.mantissa(), d.scale())), - DfValue::BitVector(ref bits) => Ok(Literal::BitVector(bits.as_ref().to_bytes())), + DfValue::BitVector(ref bits) => Ok(Literal::BitVector(bits.as_ref().clone())), DfValue::Array(_) => unsupported!("Arrays not implemented yet"), DfValue::PassThrough(_) => internal!("PassThrough has no representation as a literal"), DfValue::Max => internal!("MAX has no representation as a literal"), @@ -1338,6 +1339,12 @@ impl From> for DfValue { } } +impl From<&BitVec> for DfValue { + fn from(value: &BitVec) -> Self { + DfValue::BitVector(Arc::new(value.clone())) + } +} + impl<'a> TryFrom<&'a DfValue> for NaiveDateTime { type Error = ReadySetError; @@ -2243,6 +2250,9 @@ mod arbitrary { .boxed(), Some(DfType::TinyInt) => any::().prop_map(|i| DfValue::Int(i as i64)).boxed(), Some(DfType::SmallInt) => any::().prop_map(|i| DfValue::Int(i as i64)).boxed(), + Some(DfType::MediumInt) => ((-1i32 << 23)..(1i32 << 23)) + .prop_map(|i| DfValue::Int(i as i64)) + .boxed(), Some(DfType::Int) => any::().prop_map(|i| DfValue::Int(i as i64)).boxed(), Some(DfType::BigInt) => any::().prop_map(DfValue::Int).boxed(), Some(DfType::UnsignedTinyInt) => any::() @@ -2251,6 +2261,9 @@ mod arbitrary { Some(DfType::UnsignedSmallInt) => any::() .prop_map(|u| DfValue::UnsignedInt(u as u64)) .boxed(), + Some(DfType::UnsignedMediumInt) => (0..(1u32 << 24)) + .prop_map(|u| DfValue::UnsignedInt(u as u64)) + .boxed(), Some(DfType::UnsignedInt) => any::() .prop_map(|u| DfValue::UnsignedInt(u as u64)) .boxed(), @@ -2339,7 +2352,7 @@ mod tests { let timestamp_tz = DfValue::from( FixedOffset::west_opt(18_000) .unwrap() - .from_utc_datetime(&NaiveDateTime::from_timestamp_opt(0, 42_000_000).unwrap()), + .from_utc_datetime(&DateTime::from_timestamp(0, 42_000_000).unwrap().naive_utc()), ); match ×tamp_tz { @@ -2750,14 +2763,15 @@ mod tests { let double = DfValue::Double(-8.99); let numeric = DfValue::from(Decimal::new(-899, 2)); // -8.99 let timestamp = DfValue::TimestampTz( - NaiveDateTime::from_timestamp_opt(0, 42_000_000) + DateTime::from_timestamp(0, 42_000_000) .unwrap() + .naive_utc() .into(), ); let timestamp_tz = DfValue::from( FixedOffset::west_opt(19_800) .unwrap() - .from_utc_datetime(&NaiveDateTime::from_timestamp_opt(0, 42_000_000).unwrap()), + .from_utc_datetime(&DateTime::from_timestamp(0, 42_000_000).unwrap().naive_utc()), ); let int = DfValue::Int(5); let bytes = DfValue::ByteArray(Arc::new(vec![0, 8, 39, 92, 100, 128])); @@ -2800,24 +2814,26 @@ mod tests { let numeric = DfValue::from(Decimal::new(-899, 2)); // -8.99 let numeric2 = DfValue::from(Decimal::new(-898, 2)); // -8.99 let time = DfValue::TimestampTz( - NaiveDateTime::from_timestamp_opt(0, 42_000_000) + DateTime::from_timestamp(0, 42_000_000) .unwrap() + .naive_utc() .into(), ); let time2 = DfValue::TimestampTz( - NaiveDateTime::from_timestamp_opt(1, 42_000_000) + DateTime::from_timestamp(1, 42_000_000) .unwrap() + .naive_utc() .into(), ); let timestamp_tz = DfValue::from( FixedOffset::west_opt(18_000) .unwrap() - .from_utc_datetime(&NaiveDateTime::from_timestamp_opt(0, 42_000_000).unwrap()), + .from_utc_datetime(&DateTime::from_timestamp(0, 42_000_000).unwrap().naive_utc()), ); let timestamp_tz2 = DfValue::from( FixedOffset::west_opt(18_000) .unwrap() - .from_utc_datetime(&NaiveDateTime::from_timestamp_opt(1, 42_000_000).unwrap()), + .from_utc_datetime(&DateTime::from_timestamp(1, 42_000_000).unwrap().naive_utc()), ); let shrt = DfValue::Int(5); let shrt6 = DfValue::Int(6); @@ -2995,17 +3011,17 @@ mod tests { #[test] fn data_type_conversion() { - let bigint_i64_min = DfValue::Int(std::i64::MIN); - let bigint_i32_min = DfValue::Int(std::i32::MIN as i64); - let bigint_u32_min = DfValue::Int(std::u32::MIN as i64); - let bigint_i32_max = DfValue::Int(std::i32::MAX as i64); - let bigint_u32_max = DfValue::Int(std::u32::MAX as i64); - let bigint_i64_max = DfValue::Int(std::i64::MAX); - let ubigint_u32_min = DfValue::UnsignedInt(std::u32::MIN as u64); - let ubigint_i32_max = DfValue::UnsignedInt(std::i32::MAX as u64); - let ubigint_u32_max = DfValue::UnsignedInt(std::u32::MAX as u64); - let ubigint_i64_max = DfValue::UnsignedInt(std::i64::MAX as u64); - let ubigint_u64_max = DfValue::UnsignedInt(std::u64::MAX); + let bigint_i64_min = DfValue::Int(i64::MIN); + let bigint_i32_min = DfValue::Int(i32::MIN as i64); + let bigint_u32_min = DfValue::Int(u32::MIN as i64); + let bigint_i32_max = DfValue::Int(i32::MAX as i64); + let bigint_u32_max = DfValue::Int(u32::MAX as i64); + let bigint_i64_max = DfValue::Int(i64::MAX); + let ubigint_u32_min = DfValue::UnsignedInt(u32::MIN as u64); + let ubigint_i32_max = DfValue::UnsignedInt(i32::MAX as u64); + let ubigint_u32_max = DfValue::UnsignedInt(u32::MAX as u64); + let ubigint_i64_max = DfValue::UnsignedInt(i64::MAX as u64); + let ubigint_u64_max = DfValue::UnsignedInt(u64::MAX); fn _data_type_conversion_test_eq_i32(d: &DfValue) { assert_eq!( @@ -3224,24 +3240,26 @@ mod tests { let numeric = DfValue::from(Decimal::new(-899, 2)); // -8.99 let numeric2 = DfValue::from(Decimal::new(-898, 2)); // -8.99 let time = DfValue::TimestampTz( - NaiveDateTime::from_timestamp_opt(0, 42_000_000) + DateTime::from_timestamp(0, 42_000_000) .unwrap() + .naive_utc() .into(), ); let time2 = DfValue::TimestampTz( - NaiveDateTime::from_timestamp_opt(1, 42_000_000) + DateTime::from_timestamp(1, 42_000_000) .unwrap() + .naive_utc() .into(), ); let timestamp_tz = DfValue::from( FixedOffset::west_opt(18_000) .unwrap() - .from_utc_datetime(&NaiveDateTime::from_timestamp_opt(0, 42_000_000).unwrap()), + .from_utc_datetime(&DateTime::from_timestamp(0, 42_000_000).unwrap().naive_utc()), ); let timestamp_tz2 = DfValue::from( FixedOffset::west_opt(18_000) .unwrap() - .from_utc_datetime(&NaiveDateTime::from_timestamp_opt(1, 42_000_000).unwrap()), + .from_utc_datetime(&DateTime::from_timestamp(1, 42_000_000).unwrap().naive_utc()), ); let shrt = DfValue::Int(5); let shrt6 = DfValue::Int(6); diff --git a/readyset-data/src/serde.rs b/readyset-data/src/serde.rs index 73deb476e4..5e398c0ac5 100644 --- a/readyset-data/src/serde.rs +++ b/readyset-data/src/serde.rs @@ -3,7 +3,7 @@ use std::fmt; use std::sync::Arc; use bit_vec::BitVec; -use chrono::NaiveDateTime; +use chrono::DateTime; use mysql_time::MySqlTime; use rust_decimal::Decimal; use serde::de::{DeserializeSeed, EnumAccess, VariantAccess, Visitor}; @@ -143,8 +143,8 @@ impl serde::ser::Serialize for DfValue { DfValue::TimestampTz(ts) => { let extra = ts.extra; let nt = ts.to_chrono(); - let ts = nt.naive_utc().timestamp() as u64 as u128 - + ((nt.naive_utc().timestamp_subsec_nanos() as u128) << 64); + let ts = nt.naive_utc().and_utc().timestamp() as u64 as u128 + + ((nt.naive_utc().and_utc().timestamp_subsec_nanos() as u128) << 64); serialize_variant(serializer, Variant::TimestampTz, &(ts, extra)) } DfValue::Array(vs) => serialize_variant(serializer, Variant::Array, &vs), @@ -161,64 +161,65 @@ impl serde::ser::Serialize for DfValue { } } -impl<'de> Deserialize<'de> for DfValue { - fn deserialize(deserializer: D) -> Result +struct FieldVisitor; + +impl<'de> serde::de::Visitor<'de> for FieldVisitor { + type Value = Variant; + fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("variant identifier") + } + + fn visit_u64(self, val: u64) -> Result where - D: serde::Deserializer<'de>, + E: serde::de::Error, { - struct FieldVisitor; - impl<'de> serde::de::Visitor<'de> for FieldVisitor { - type Value = Variant; - fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("variant identifier") - } - - fn visit_u64(self, val: u64) -> Result - where - E: serde::de::Error, - { - if let Some(f) = Variant::from_repr(val as _) { - Ok(f) - } else { - Err(serde::de::Error::invalid_value( - serde::de::Unexpected::Unsigned(val), - &"variant index 0 <= i < 11", - )) - } - } + if let Some(f) = Variant::from_repr(val as _) { + Ok(f) + } else { + Err(serde::de::Error::invalid_value( + serde::de::Unexpected::Unsigned(val), + &"variant index 0 <= i < 11", + )) + } + } - fn visit_str(self, val: &str) -> Result - where - E: serde::de::Error, - { - val.parse() - .map_err(|_| serde::de::Error::unknown_variant(val, Variant::VARIANTS)) - } + fn visit_str(self, val: &str) -> Result + where + E: serde::de::Error, + { + val.parse() + .map_err(|_| serde::de::Error::unknown_variant(val, Variant::VARIANTS)) + } - fn visit_bytes(self, val: &[u8]) -> Result - where - E: serde::de::Error, - { - match std::str::from_utf8(val).map(|s| s.parse()) { - Ok(Ok(field)) => Ok(field), - _ => Err(serde::de::Error::unknown_variant( - &String::from_utf8_lossy(val), - Variant::VARIANTS, - )), - } - } + fn visit_bytes(self, val: &[u8]) -> Result + where + E: serde::de::Error, + { + match std::str::from_utf8(val).map(|s| s.parse()) { + Ok(Ok(field)) => Ok(field), + _ => Err(serde::de::Error::unknown_variant( + &String::from_utf8_lossy(val), + Variant::VARIANTS, + )), } + } +} - impl<'de> serde::Deserialize<'de> for Variant { - #[inline] - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - serde::Deserializer::deserialize_identifier(deserializer, FieldVisitor) - } - } +impl<'de> serde::Deserialize<'de> for Variant { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + serde::Deserializer::deserialize_identifier(deserializer, FieldVisitor) + } +} +impl<'de> Deserialize<'de> for DfValue { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = DfValue; @@ -276,8 +277,9 @@ impl<'de> Deserialize<'de> for DfValue { .map(|(ts, extra)| { // We deserialize the NaiveDateTime by extracting nsecs from the top 64 bits // of the encoded i128, and secs from the low 64 bits - let datetime = - NaiveDateTime::from_timestamp_opt(ts as _, (ts >> 64) as _).unwrap(); + let datetime = DateTime::from_timestamp(ts as _, (ts >> 64) as _) + .unwrap() + .naive_utc(); DfValue::TimestampTz(TimestampTz { datetime, extra }) }), (Variant::Array, variant) => { diff --git a/readyset-data/src/text.rs b/readyset-data/src/text.rs index e3482029c8..817023de33 100644 --- a/readyset-data/src/text.rs +++ b/readyset-data/src/text.rs @@ -336,7 +336,7 @@ pub(crate) trait TextCoerce: Sized + Clone + Into { /// Print the DfValue name for error reporting fn type_name() -> String; - /// A convenience constructor for a coerction error from this type + /// A convenience constructor for a coercion error from this type fn coerce_err(ty: &DfType, deets: D) -> ReadySetError { ReadySetError::DfValueConversionError { src_type: Self::type_name(), @@ -345,8 +345,8 @@ pub(crate) trait TextCoerce: Sized + Clone + Into { } } - /// A convenience integer parser that diffirentiates between out of bounds errors and other - /// parse errors + /// A convenience integer parser that ignores non-numeric suffixes and differentiates between + /// out of bounds errors and other parse errors fn parse_int(str: &str, ty: &DfType) -> ReadySetResult where I: FromStr + Into, @@ -372,6 +372,26 @@ pub(crate) trait TextCoerce: Sized + Clone + Into { } } + fn check_mediumint_bounds(v: DfValue, ty: &DfType) -> ReadySetResult { + match v { + DfValue::Int(i) => { + if ((-1 << 23)..(1 << 23)).contains(&i) { + Ok(v) + } else { + Err(Self::coerce_err(ty, "out of bounds")) + } + } + DfValue::UnsignedInt(i) => { + if i < (1 << 24) { + Ok(v) + } else { + Err(Self::coerce_err(ty, "out of bounds")) + } + } + _ => Err(Self::coerce_err(ty, "unsupported")), + } + } + /// Coerce this type to a different DfValue. fn coerce_to(&self, to_ty: &DfType, from_ty: &DfType) -> ReadySetResult { let str = self.try_str()?; @@ -384,21 +404,21 @@ pub(crate) trait TextCoerce: Sized + Clone + Into { Ok(DfValue::from_str_and_collation(self.try_str()?, collation)) } - DfType::VarChar(l, ..) if l as usize >= str.len() => { + DfType::VarChar(l, ..) if l as usize >= str.chars().count() => { // VarChar, but length is sufficient to store current string Ok(self.clone().into()) } - DfType::Char(l, ..) if l as usize == str.len() => { + DfType::Char(l, ..) if l as usize == str.chars().count() => { // Char, but length is same as current string Ok(self.clone().into()) } - DfType::Char(l, ..) if l as usize > str.len() => { + DfType::Char(l, ..) if l as usize > str.chars().count() => { // Char, but length is greater than the current string, have to pad with whitespace let mut new_string = String::with_capacity(l as usize); new_string += str; - new_string.extend(std::iter::repeat(' ').take(l as usize - str.len())); + new_string.extend(std::iter::repeat(' ').take(l as usize - str.chars().count())); Ok(DfValue::from(new_string)) } @@ -451,6 +471,10 @@ pub(crate) trait TextCoerce: Sized + Clone + Into { DfType::UnsignedTinyInt => Self::parse_int::(str, to_ty), DfType::SmallInt => Self::parse_int::(str, to_ty), DfType::UnsignedSmallInt => Self::parse_int::(str, to_ty), + DfType::MediumInt => Self::parse_int::(str, to_ty) + .and_then(|v| Self::check_mediumint_bounds(v, to_ty)), + DfType::UnsignedMediumInt => Self::parse_int::(str, to_ty) + .and_then(|v| Self::check_mediumint_bounds(v, to_ty)), DfType::Int => Self::parse_int::(str, to_ty), DfType::UnsignedInt => Self::parse_int::(str, to_ty), DfType::BigInt => Self::parse_int::(str, to_ty), @@ -878,4 +902,40 @@ mod tests { assert_eq!(result.unwrap().collation(), Some(Collation::Citext)); } + + #[test] + fn mediumint_bounds_checks() { + assert_eq!( + DfValue::from("-8388608") + .coerce_to(&DfType::MediumInt, &DfType::DEFAULT_TEXT) + .unwrap(), + DfValue::Int(-8388608), + ); + + DfValue::from("-8388609") + .coerce_to(&DfType::MediumInt, &DfType::DEFAULT_TEXT) + .unwrap_err(); + + assert_eq!( + DfValue::from("8388607") + .coerce_to(&DfType::MediumInt, &DfType::DEFAULT_TEXT) + .unwrap(), + DfValue::UnsignedInt(8388607), + ); + + DfValue::from("8388608") + .coerce_to(&DfType::MediumInt, &DfType::DEFAULT_TEXT) + .unwrap_err(); + + assert_eq!( + DfValue::from("16777215") + .coerce_to(&DfType::UnsignedMediumInt, &DfType::DEFAULT_TEXT) + .unwrap(), + DfValue::UnsignedInt(16777215), + ); + + DfValue::from("16777216") + .coerce_to(&DfType::UnsignedMediumInt, &DfType::DEFAULT_TEXT) + .unwrap_err(); + } } diff --git a/readyset-data/src/timestamp.rs b/readyset-data/src/timestamp.rs index 1b1dbea64d..24bdad6f41 100644 --- a/readyset-data/src/timestamp.rs +++ b/readyset-data/src/timestamp.rs @@ -65,6 +65,13 @@ impl TimestampTz { const NEGATIVE_FLAG: u8 = 0b_0000_0010; const TOP_OFFSET_BIT: u8 = 0b_0000_0001; + #[inline(always)] + /// Convert self to local timezone while keeping the same extra + pub fn to_local(&self) -> Self { + let mut ts = *self; + ts.datetime = self.to_chrono().with_timezone(&chrono::Local).naive_local(); + ts + } #[inline(always)] /// Constructs a [`TimestampTz`] when provided with the number of ms since the unix epoch. pub fn from_unix_ms(time_ms: u64) -> Self { @@ -72,7 +79,7 @@ impl TimestampTz { (time_ms / 1000) as i64, ((time_ms % 1000) * 1_000 * 1_000) as u32, ); - Self::from(NaiveDateTime::from_timestamp_opt(secs, ns).unwrap()) + Self::from(DateTime::from_timestamp(secs, ns).unwrap().naive_utc()) } /// Returns true if the contained offset should be negated @@ -143,7 +150,7 @@ impl TimestampTz { /// Set the desired precision when displaying subseconds. #[inline(always)] - fn set_subsecond_digits(&mut self, count: u8) { + pub fn set_subsecond_digits(&mut self, count: u8) { self.extra[2] = ((count << TimestampTz::SUBSECOND_DIGITS_BITS.trailing_zeros()) & TimestampTz::SUBSECOND_DIGITS_BITS) | (self.extra[2] & !TimestampTz::SUBSECOND_DIGITS_BITS); @@ -390,6 +397,8 @@ impl TimestampTz { DfType::Int | DfType::UnsignedInt + | DfType::MediumInt + | DfType::UnsignedMediumInt | DfType::SmallInt | DfType::UnsignedSmallInt | DfType::TinyInt diff --git a/readyset-data/src/type.rs b/readyset-data/src/type.rs index 310041b62b..c0a232acef 100644 --- a/readyset-data/src/type.rs +++ b/readyset-data/src/type.rs @@ -73,6 +73,12 @@ pub enum DfType { /// [`u16`]. UnsignedSmallInt, + /// Notionally an `i24`, but really an [`i32`] that we bounds check. + MediumInt, + + /// Notionally an `u24`, but really an [`u32`] that we bounds check. + UnsignedMediumInt, + /// [`f32`]: a IEEE 754 floating-point 32-bit real value. /// /// This is either: @@ -248,10 +254,12 @@ impl DfType { Int(_) | Int4 => Self::Int, TinyInt(_) => Self::TinyInt, SmallInt(_) | Int2 => Self::SmallInt, + MediumInt(_) => Self::MediumInt, BigInt(_) | Int8 => Self::BigInt, UnsignedInt(_) => Self::UnsignedInt, UnsignedTinyInt(_) => Self::UnsignedTinyInt, UnsignedSmallInt(_) => Self::UnsignedSmallInt, + UnsignedMediumInt(_) => Self::UnsignedMediumInt, UnsignedBigInt(_) => Self::UnsignedBigInt, Double => Self::Double, @@ -284,7 +292,7 @@ impl DfType { Bit(len) => Self::Bit(len.unwrap_or(1)), VarBit(len) => Self::VarBit(len), - Json => unsupported!("Unsupported type: Json"), + Json => Self::Json, Jsonb => unsupported!("Unsupported type: Jsonb"), Date => Self::Date, @@ -343,6 +351,9 @@ impl DfType { | DfType::UnsignedTinyInt | DfType::SmallInt | DfType::UnsignedSmallInt + // XXX(mvzink): MEDIUMINT isn't implemented by PostgreSQL, but this seems better than making this fn fail + | DfType::MediumInt + | DfType::UnsignedMediumInt | DfType::Float | DfType::Double | DfType::Numeric { .. } => PgTypeCategory::Numeric, @@ -456,6 +467,18 @@ impl DfType { /// Returns `true` if this is any `*int` type. #[inline] pub fn is_any_int(&self) -> bool { + self.is_any_normal_int() || self.is_any_bigint() + } + + /// Returns `true` if this is any large integer type (bigint/int8). + #[inline] + pub fn is_any_bigint(&self) -> bool { + matches!(*self, Self::BigInt | Self::UnsignedBigInt) + } + + /// Returns `true` if this is any non-large integer type. + #[inline] + pub fn is_any_normal_int(&self) -> bool { matches!( *self, Self::TinyInt @@ -464,15 +487,22 @@ impl DfType { | Self::UnsignedSmallInt | Self::Int | Self::UnsignedInt - | Self::BigInt - | Self::UnsignedBigInt + | Self::MediumInt + | Self::UnsignedMediumInt ) } - /// Returns `true` if this is any `text` type + /// Returns `true` if this is any unsigned integer type. #[inline] - pub fn is_any_text(&self) -> bool { - matches!(self, Self::Text(..) | Self::VarChar(..) | Self::Char(..)) + pub fn is_any_unsigned_int(&self) -> bool { + matches!( + *self, + Self::UnsignedTinyInt + | Self::UnsignedSmallInt + | Self::UnsignedInt + | Self::UnsignedMediumInt + | Self::UnsignedBigInt + ) } /// Returns `true` if this is any IEEE 754 floating-point type. @@ -481,12 +511,64 @@ impl DfType { matches!(*self, Self::Float | Self::Double) } + /// Returns `true` if this is a 4-byte IEEE 754 floating-point type. + #[inline] + pub fn is_float(&self) -> bool { + matches!(*self, Self::Float) + } + + /// Returns `true` if this is an 8-byte IEEE 754 floating-point type. + #[inline] + pub fn is_double(&self) -> bool { + matches!(*self, Self::Double) + } + + /// Returns `true` if this is a decimal or numeric type. + #[inline] + pub fn is_numeric(&self) -> bool { + matches!(*self, Self::Numeric { .. }) + } + + /// Returns `true` if this is DATE/TIMESTAMP/TIMESTAMPTZ/DATETIME type. + #[inline] + pub fn is_any_temporal(&self) -> bool { + matches!( + *self, + Self::DateTime { .. } + | Self::Date + | Self::Timestamp { .. } + | Self::TimestampTz { .. } + | Self::Time { .. } + ) + } + + /// Returns `true` if this is any exact number type (INTEGER(s), DECIMAL). + #[inline] + pub fn is_any_exact_number(&self) -> bool { + self.is_any_int() || self.is_numeric() + } + + /// Returns `true` if this is DATETIME/TIMESTAMP/TIMESTAMPTZ. + #[inline] + pub fn is_date_and_time(&self) -> bool { + matches!( + *self, + Self::DateTime { .. } | Self::Timestamp { .. } | Self::TimestampTz { .. } + ) + } + /// Returns `true` if this is any PostgreSQL array type. #[inline] pub fn is_array(&self) -> bool { matches!(self, Self::Array { .. }) } + /// Returns `true` if this is any `text` type + #[inline] + pub fn is_any_text(&self) -> bool { + matches!(self, Self::Text(..) | Self::VarChar(..) | Self::Char(..)) + } + /// Returns `true` if this is any MySQL binary type. #[inline] pub fn is_binary(&self) -> bool { @@ -670,6 +752,8 @@ impl fmt::Display for DfType { | Self::UnsignedTinyInt | Self::SmallInt | Self::UnsignedSmallInt + | Self::MediumInt + | Self::UnsignedMediumInt | Self::Int | Self::UnsignedInt | Self::BigInt diff --git a/readyset-dataflow/Cargo.toml b/readyset-dataflow/Cargo.toml index cf09c6ec66..aeb81babe7 100644 --- a/readyset-dataflow/Cargo.toml +++ b/readyset-dataflow/Cargo.toml @@ -8,48 +8,48 @@ edition = "2021" description = "ReadySet dataflow crate" [dependencies] -anyhow = "1.0" -async-bincode = "0.6.1" -backoff = { version = "0.4.0", features = ["tokio"] } -bincode = "1.0.0" -bufstream = "0.1.3" -byteorder = "1.0.0" -hashbag = "0.1.2" -ahash = "0.7" -futures-util = "0.3.13" -lazy_static = "1.0.0" -itertools = "0.10" +anyhow = { workspace = true } +async-bincode = { workspace = true } +backoff = { workspace = true, features = ["tokio"] } +bincode = { workspace = true } +bufstream = { workspace = true } +byteorder = { workspace = true } +hashbag = { workspace = true } +ahash = { workspace = true } +futures-util = { workspace = true } +lazy_static = { workspace = true } +itertools = { workspace = true } metrics = { workspace = true } nom-sql = { path = "../nom-sql" } -pin-project = "1.0" -indexmap = "1.9.2" -rand = "0.7" -regex = "1" -serde_derive = "1.0.8" -serde_with = "1.9.4" -serde_json = "1.0.2" -socket2 = "0.4" -tracing = { version = "0.1", features = ["release_max_level_debug"] } +pin-project = { workspace = true } +indexmap = { workspace = true } +rand = { workspace = true } +regex = { workspace = true } +serde_derive = { workspace = true } +serde_with = { workspace = true } +serde_json = { workspace = true } +socket2 = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } tokio = { workspace = true, features = ["full"] } -tokio-stream = { version = "0.1.5", features = ["net"] } -vec_map = { version = "0.8.0", features = ["eders"] } -tempfile = "3.4" -derive_more = "0.99.11" -tuple = "0.5.1" -vec1 = "1.6.0" +tokio-stream = { workspace = true, features = ["net"] } +vec_map = { workspace = true, features = ["eders"] } +tempfile = { workspace = true } +derive_more = { workspace = true } +tuple = { workspace = true } +vec1 = { workspace = true } criterion = { workspace = true, features=['real_blackbox', 'async_tokio'], optional = true } -test-strategy = "0.2.0" -thiserror = "1.0.26" -proptest = "1.0.0" -fail = "0.5.0" -strum = "0.23" -strum_macros = "0.23" +test-strategy = { workspace = true } +thiserror = { workspace = true } +proptest = { workspace = true } +fail = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } clap = { workspace = true, features = ["derive"] } # need features -petgraph = { version = "0.5", features = ["serde-1"] } -serde = { version = "1.0.8", features = ["rc"] } -timekeeper = { version = "0.3.2", default-features = false } +petgraph = { workspace = true, features = ["serde-1"] } +serde = { workspace = true, features = ["rc"] } +timekeeper = { workspace = true } # local deps common = { path = "../readyset-common", package = "readyset-common" } diff --git a/readyset-dataflow/src/domain/channel/tcp.rs b/readyset-dataflow/src/domain/channel/tcp.rs index 0207a110a5..ef83c8b8e4 100644 --- a/readyset-dataflow/src/domain/channel/tcp.rs +++ b/readyset-dataflow/src/domain/channel/tcp.rs @@ -120,7 +120,7 @@ impl TcpSender { // end, or else we'll silently get the wrong data (but no deserialization errors!) // https://app.clubhouse.io/readysettech/story/437 to fix that let c = bincode::options() - .with_limit(u32::max_value() as u64) + .with_limit(u32::MAX as u64) .allow_trailing_bytes(); let size = c .serialized_size(packet) diff --git a/readyset-dataflow/src/domain/mod.rs b/readyset-dataflow/src/domain/mod.rs index 2dbaaa3697..3faddd4b94 100644 --- a/readyset-dataflow/src/domain/mod.rs +++ b/readyset-dataflow/src/domain/mod.rs @@ -2411,6 +2411,15 @@ impl Domain { let key = self.handle_eviction(req, executor)?; Ok(Some(bincode::serialize(&key)?)) } + DomainRequest::Shutdown => { + self.state.values_mut().for_each(|s| { + let err = s.shut_down(); + if let Err(e) = err { + warn!(error = %e, "error on shutting down domains"); + } + }); + Ok(None) + } }; // What we just did might have done things like insert into `self.delayed_for_self`, so @@ -4003,10 +4012,10 @@ impl Domain { #[allow(clippy::indexing_slicing)] // nodes in replay paths must exist if let Some(result) = state[dest.node].evict_keys(tag, &keys) { bytes_freed += result.bytes_freed; - #[allow(clippy::unwrap_used)] // we can only evict from partial replay paths, so we must have a // partial key bytes_freed += trigger_downstream_evictions( + #[allow(clippy::unwrap_used)] dest.partial_index.as_ref().unwrap(), &keys, dest.node, diff --git a/readyset-dataflow/src/lib.rs b/readyset-dataflow/src/lib.rs index a3a08cec20..28be878e91 100644 --- a/readyset-dataflow/src/lib.rs +++ b/readyset-dataflow/src/lib.rs @@ -9,7 +9,6 @@ trait_alias, btree_extract_if, bound_as_ref, - bound_map, stmt_expr_attributes, extract_if, hash_extract_if, diff --git a/readyset-dataflow/src/node/ntype.rs b/readyset-dataflow/src/node/ntype.rs index 96acf8bcf5..b18c258d23 100644 --- a/readyset-dataflow/src/node/ntype.rs +++ b/readyset-dataflow/src/node/ntype.rs @@ -1,3 +1,5 @@ +use std::fmt; + use serde::{Deserialize, Serialize}; use crate::node::special; @@ -67,17 +69,17 @@ impl NodeType { } } -impl ToString for NodeType { - fn to_string(&self) -> String { +impl fmt::Display for NodeType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - NodeType::Ingress => "Ingress".to_string(), - NodeType::Base(_) => "Base".to_string(), - NodeType::Internal(o) => format!("Internal ({})", o.to_string()), - NodeType::Egress(_) => "Egress".to_string(), - NodeType::Sharder(_) => "Sharder".to_string(), - NodeType::Reader(_) => "Reader".to_string(), - NodeType::Source => "Source".to_string(), - NodeType::Dropped => "Dropped".to_string(), + NodeType::Ingress => write!(f, "Ingress"), + NodeType::Base(_) => write!(f, "Base"), + NodeType::Internal(o) => write!(f, "Internal ({})", o), + NodeType::Egress(_) => write!(f, "Egress"), + NodeType::Sharder(_) => write!(f, "Sharder"), + NodeType::Reader(_) => write!(f, "Reader"), + NodeType::Source => write!(f, "Source"), + NodeType::Dropped => write!(f, "Dropped"), } } } diff --git a/readyset-dataflow/src/ops/filter.rs b/readyset-dataflow/src/ops/filter.rs index 1b55e003c9..aa9fdb3a7b 100644 --- a/readyset-dataflow/src/ops/filter.rs +++ b/readyset-dataflow/src/ops/filter.rs @@ -137,10 +137,6 @@ impl Ingredient for Filter { IngredientLookupResult::Miss => Ok(IngredientLookupResult::Miss), } } - - fn is_selective(&self) -> bool { - true - } } #[cfg(test)] diff --git a/readyset-dataflow/src/ops/grouped/aggregate.rs b/readyset-dataflow/src/ops/grouped/aggregate.rs index 238008727c..3362b670e9 100644 --- a/readyset-dataflow/src/ops/grouped/aggregate.rs +++ b/readyset-dataflow/src/ops/grouped/aggregate.rs @@ -3,7 +3,8 @@ use std::collections::HashMap; use std::hash::{Hash, Hasher}; pub use nom_sql::{BinaryOperator, Literal, SqlType}; -use readyset_data::{Collation, DfType}; +use readyset_data::dialect::SqlEngine; +use readyset_data::{Collation, DfType, Dialect}; use readyset_errors::{invariant, ReadySetResult}; use serde::{Deserialize, Serialize}; @@ -25,7 +26,7 @@ pub enum Aggregation { } impl Aggregation { - /// Construct a new `Aggregator` that performs this operation. + /// Construct a new [`Aggregator`] that performs this operation. /// /// The aggregation will aggregate the value in column number `over` from its inputs (i.e., /// from the `src` node in the graph), and use the columns in the `group_by` array as a group @@ -36,13 +37,33 @@ impl Aggregation { over: usize, group_by: &[usize], over_col_ty: &DfType, + dialect: &Dialect, ) -> ReadySetResult> { let out_ty = match &self { Aggregation::Count { .. } => DfType::BigInt, - // The SUM() and AVG() functions return a DECIMAL value for exact-value arguments - // (integer or DECIMAL), and a DOUBLE value for approximate-value arguments (FLOAT or - // DOUBLE). - Aggregation::Sum | Aggregation::Avg => { + Aggregation::Sum => match dialect.engine() { + SqlEngine::MySQL => { + if over_col_ty.is_any_float() { + DfType::Double + } else { + DfType::DEFAULT_NUMERIC + } + } + SqlEngine::PostgreSQL => { + if over_col_ty.is_any_int() { + DfType::BigInt + } else if over_col_ty.is_any_bigint() || over_col_ty.is_numeric() { + DfType::DEFAULT_NUMERIC + } else if over_col_ty.is_float() { + DfType::Float + } else if over_col_ty.is_double() { + DfType::Double + } else { + invalid_query!("Cannot sum over type {}", over_col_ty) + } + } + }, + Aggregation::Avg => { if over_col_ty.is_any_float() { DfType::Double } else { @@ -318,7 +339,13 @@ mod tests { "identity", &["x", "ys"], aggregation - .over(s.as_global(), 1, &[0], &DfType::Double) + .over( + s.as_global(), + 1, + &[0], + &DfType::Double, + &Dialect::DEFAULT_MYSQL, + ) .unwrap(), mat, ); @@ -332,7 +359,13 @@ mod tests { "identity", &["x", "z", "ys"], aggregation - .over(s.as_global(), 1, &[0, 2], &DfType::Double) + .over( + s.as_global(), + 1, + &[0, 2], + &DfType::Double, + &Dialect::DEFAULT_MYSQL, + ) .unwrap(), mat, ); @@ -344,17 +377,17 @@ mod tests { let src = 0.into(); let c = Aggregation::Count - .over(src, 1, &[0, 2], &DfType::Unknown) + .over(src, 1, &[0, 2], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(); assert_eq!(c.description(true), "|*| γ[0, 2]"); let s = Aggregation::Sum - .over(src, 1, &[2, 0], &DfType::Unknown) + .over(src, 1, &[2, 0], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(); assert_eq!(s.description(true), "𝛴(1) γ[2, 0]"); let a = Aggregation::Avg - .over(src, 1, &[2, 0], &DfType::Unknown) + .over(src, 1, &[2, 0], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(); assert_eq!(a.description(true), "Avg(1) γ[2, 0]"); } @@ -1129,4 +1162,29 @@ mod tests { .into() ); } + + #[test] + fn it_determines_postgres_sum_output_type() { + let grouped = Aggregation::Sum + .over( + Default::default(), + 0, + &[1], + &DfType::Int, + &Dialect::DEFAULT_POSTGRESQL, + ) + .unwrap(); + assert_eq!(grouped.output_col_type(), DfType::BigInt); + + let grouped = Aggregation::Sum + .over( + Default::default(), + 0, + &[1], + &DfType::Int, + &Dialect::DEFAULT_MYSQL, + ) + .unwrap(); + assert!(matches!(grouped.output_col_type(), DfType::Numeric { .. })); + } } diff --git a/readyset-dataflow/src/ops/grouped/concat.rs b/readyset-dataflow/src/ops/grouped/concat.rs index eb021f1930..f20bb2ebb6 100644 --- a/readyset-dataflow/src/ops/grouped/concat.rs +++ b/readyset-dataflow/src/ops/grouped/concat.rs @@ -184,7 +184,7 @@ impl GroupedOperation for GroupConcat { write!(&mut out_str, "{}", self.separator).unwrap(); } } - prev_state.string_repr = out_str.clone(); + prev_state.string_repr.clone_from(&out_str); last_state.insert(group, prev_state); Ok(Some(out_str.into())) } diff --git a/readyset-dataflow/src/ops/grouped/mod.rs b/readyset-dataflow/src/ops/grouped/mod.rs index e647d85c2b..d569bcf7eb 100644 --- a/readyset-dataflow/src/ops/grouped/mod.rs +++ b/readyset-dataflow/src/ops/grouped/mod.rs @@ -451,8 +451,4 @@ where fn description(&self, detailed: bool) -> String { self.inner.description(detailed) } - - fn is_selective(&self) -> bool { - true - } } diff --git a/readyset-dataflow/src/ops/join.rs b/readyset-dataflow/src/ops/join.rs index bb4f7f617a..6ef8fe24b5 100644 --- a/readyset-dataflow/src/ops/join.rs +++ b/readyset-dataflow/src/ops/join.rs @@ -6,7 +6,6 @@ use itertools::Itertools; use readyset_client::KeyComparison; use readyset_errors::{internal_err, ReadySetResult}; use readyset_util::intervals::into_bound_endpoint; -use readyset_util::Indices; use serde::{Deserialize, Serialize}; use vec1::{vec1, Vec1}; @@ -133,28 +132,72 @@ impl Join { .collect() } - fn handle_replay_for_generated( - &self, - left: Records, - right: Records, - ) -> ReadySetResult { - let mut from_key = vec![]; - let mut other_key = vec![]; + /// Build a hash map from one of the sides of the join. + fn build_join_hash_map<'a>( + &'a self, + records: &'a Records, + key: &[usize], + ) -> HashMap, Vec<&Record>> { + let mut hm = HashMap::new(); + for rec in records { + let key: Vec<&DfValue> = key.iter().map(|idx| &rec[*idx]).collect(); + hm.entry(key) + .and_modify(|entry: &mut Vec<&Record>| entry.push(rec)) + .or_insert(vec![rec]); + } + hm + } + + /// Perform a hash join between two sets of records. + fn hash_join(&self, left: Records, right: Records) -> ReadySetResult { + let mut probe_keys = vec![]; + let mut build_keys = vec![]; let mut ret: Vec = vec![]; + let probe_is_left = left.len() > right.len(); for (left_key, right_key) in &self.on { - from_key.push(*left_key); - other_key.push(*right_key); + match probe_is_left { + true => { + probe_keys.push(*left_key); + build_keys.push(*right_key); + } + false => { + probe_keys.push(*right_key); + build_keys.push(*left_key); + } + } } - for rec in left { - let (rec, positive) = rec.extract(); - invariant!(positive, "replays should only include positive records"); - - for other_rec in right - .iter() - .filter(|r| rec.indices(from_key.clone()) == r.indices(other_key.clone())) - { - ret.push(Record::Positive(self.generate_row(&rec, other_rec.row()))) + let (probe_side, build_side) = match probe_is_left { + true => (&left, &right), + false => (&right, &left), + }; + let hm = self.build_join_hash_map(build_side, &build_keys); + + let mut key: Vec<&DfValue> = vec![&DfValue::None; probe_keys.len()]; + for prob_rec in probe_side { + for i in 0..probe_keys.len() { + key[i] = &prob_rec[probe_keys[i]]; } + if let Some(build_recs) = hm.get(&key) { + invariant!( + prob_rec.is_positive(), + "replays should only include positive records" + ); + for build_rec in build_recs { + invariant!( + build_rec.is_positive(), + "replays should only include positive records" + ); + + match probe_is_left { + true => ret.push(Record::Positive( + self.generate_row(prob_rec.row(), build_rec.row()), + )), + false => ret.push(Record::Positive( + self.generate_row(build_rec.row(), prob_rec.row()), + )), + } + } + }; } Ok(ret.into()) } @@ -302,7 +345,7 @@ impl Ingredient for Join { )) { // we have both sides now let (left, right) = if is_left { (rs, other) } else { (other, rs) }; - let ret = self.handle_replay_for_generated(left, right)?; + let ret = self.hash_join(left, right)?; Ok(ProcessingResult { results: ret, ..Default::default() diff --git a/readyset-dataflow/src/ops/mod.rs b/readyset-dataflow/src/ops/mod.rs index c08215a3f5..048c3a372a 100644 --- a/readyset-dataflow/src/ops/mod.rs +++ b/readyset-dataflow/src/ops/mod.rs @@ -1,4 +1,5 @@ use std::collections::{HashMap, HashSet}; +use std::fmt; use std::time::Instant; use dataflow_state::PointKey; @@ -59,21 +60,20 @@ pub enum NodeOperator { TopK(topk::TopK), } -impl ToString for NodeOperator { - fn to_string(&self) -> String { +impl fmt::Display for NodeOperator { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - NodeOperator::Aggregation(_) => "Aggregation", - NodeOperator::Extremum(_) => "Extremum", - NodeOperator::Concat(_) => "Concat", - NodeOperator::Join(_) => "Join", - NodeOperator::Paginate(_) => "Paginate", - NodeOperator::Project(_) => "Project", - NodeOperator::Union(_) => "Union", - NodeOperator::Identity(_) => "Identity", - NodeOperator::Filter(_) => "Filter", - NodeOperator::TopK(_) => "TopK", + NodeOperator::Aggregation(_) => write!(f, "Aggregation"), + NodeOperator::Extremum(_) => write!(f, "Extremum"), + NodeOperator::Concat(_) => write!(f, "Concat"), + NodeOperator::Join(_) => write!(f, "Join"), + NodeOperator::Paginate(_) => write!(f, "Paginate"), + NodeOperator::Project(_) => write!(f, "Project"), + NodeOperator::Union(_) => write!(f, "Union"), + NodeOperator::Identity(_) => write!(f, "Identity"), + NodeOperator::Filter(_) => write!(f, "Filter"), + NodeOperator::TopK(_) => write!(f, "TopK"), } - .to_string() } } @@ -221,9 +221,6 @@ impl Ingredient for NodeOperator { ) -> ReadySetResult> { impl_ingredient_fn_ref!(self, lookup, parent, columns, key, domain, states, mode) } - fn is_selective(&self) -> bool { - impl_ingredient_fn_ref!(self, is_selective,) - } fn requires_full_materialization(&self) -> bool { impl_ingredient_fn_ref!(self, requires_full_materialization,) } diff --git a/readyset-dataflow/src/ops/paginate.rs b/readyset-dataflow/src/ops/paginate.rs index 654f80c91e..90053aefa0 100644 --- a/readyset-dataflow/src/ops/paginate.rs +++ b/readyset-dataflow/src/ops/paginate.rs @@ -360,10 +360,6 @@ impl Ingredient for Paginate { self.order ) } - - fn is_selective(&self) -> bool { - true - } } #[cfg(test)] diff --git a/readyset-dataflow/src/ops/topk.rs b/readyset-dataflow/src/ops/topk.rs index a9c289ee03..a208d4295b 100644 --- a/readyset-dataflow/src/ops/topk.rs +++ b/readyset-dataflow/src/ops/topk.rs @@ -459,10 +459,6 @@ impl Ingredient for TopK { self.order ) } - - fn is_selective(&self) -> bool { - true - } } #[cfg(test)] diff --git a/readyset-dataflow/src/ops/union.rs b/readyset-dataflow/src/ops/union.rs index f9e209d845..f74325cbf3 100644 --- a/readyset-dataflow/src/ops/union.rs +++ b/readyset-dataflow/src/ops/union.rs @@ -1010,8 +1010,8 @@ impl Ingredient for Union { }..=BufferedReplayKey { tag, key: key.clone(), - requesting_shard: usize::max_value(), - requesting_replica: usize::max_value(), + requesting_shard: usize::MAX, + requesting_replica: usize::MAX, }, ) { if e.buffered.contains_key(&from) { diff --git a/readyset-dataflow/src/payload.rs b/readyset-dataflow/src/payload.rs index 86ce88e6be..2ee93f46e2 100644 --- a/readyset-dataflow/src/payload.rs +++ b/readyset-dataflow/src/payload.rs @@ -431,6 +431,9 @@ pub enum DomainRequest { /// Requests an eviction from state within this Domain. Evict(EvictRequest), + + /// Requests a domain to cleanly shut down. + Shutdown, } /// The primary unit of communication between nodes in the dataflow graph. @@ -664,20 +667,19 @@ impl Packet { } } -impl ToString for Packet { - fn to_string(&self) -> String { +impl fmt::Display for Packet { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Packet::Input { .. } => "Input", - Packet::Message { .. } => "Message", - Packet::RequestReaderReplay { .. } => "RequestReaderReplay", - Packet::RequestPartialReplay { .. } => "RequestPartialReplay", - Packet::ReplayPiece { .. } => "ReplayPiece", - Packet::Timestamp { .. } => "Timestamp", - Packet::Finish { .. } => "Finish", - Packet::Spin { .. } => "Spin", - Packet::Evict { .. } => "Evict", + Packet::Input { .. } => write!(f, "Input"), + Packet::Message { .. } => write!(f, "Message"), + Packet::RequestReaderReplay { .. } => write!(f, "RequestReaderReplay"), + Packet::RequestPartialReplay { .. } => write!(f, "RequestPartialReplay"), + Packet::ReplayPiece { .. } => write!(f, "ReplayPiece"), + Packet::Timestamp { .. } => write!(f, "Timestamp"), + Packet::Finish { .. } => write!(f, "Finish"), + Packet::Spin { .. } => write!(f, "Spin"), + Packet::Evict { .. } => write!(f, "Evict"), } - .to_string() } } diff --git a/readyset-dataflow/src/processing.rs b/readyset-dataflow/src/processing.rs index 007824b068..6fce5b9d9f 100644 --- a/readyset-dataflow/src/processing.rs +++ b/readyset-dataflow/src/processing.rs @@ -817,11 +817,6 @@ where } } - /// Performance hint: should return true if this operator reduces the size of its input - fn is_selective(&self) -> bool { - false - } - /// Returns true if this operator requires a full materialization fn requires_full_materialization(&self) -> bool { false diff --git a/readyset-errors/Cargo.toml b/readyset-errors/Cargo.toml index 39a34b030c..a6b10e371d 100644 --- a/readyset-errors/Cargo.toml +++ b/readyset-errors/Cargo.toml @@ -6,25 +6,25 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0" +anyhow = { workspace = true } consulrs = { workspace = true } -futures = "0.3" -hyper = "0.14.10" -thiserror = "1.0.26" +futures = { workspace = true } +hyper = { workspace = true } +thiserror = { workspace = true } mysql_async = { workspace = true } tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] } -petgraph = { version = "0.5", features = ["serde-1"] } -rmp-serde = "1.1.2" -tokio-tower = "0.5.1" -url = { version = "2.2", features = ["serde"] } -serde_json = { version = "1.0.2", features = ["arbitrary_precision"] } -derive_more = "0.99.11" -bincode = "1.3.3" -serde = { version = "1.0.8", features = ["rc", "derive"] } +petgraph = { workspace = true, features = ["serde-1"] } +rmp-serde = { workspace = true } +tokio-tower = { workspace = true } +url = { workspace = true, features = ["serde"] } +serde_json = { workspace = true, features = ["arbitrary_precision"] } +derive_more = { workspace = true } +bincode = { workspace = true } +serde = { workspace = true, features = ["rc", "derive"] } nom-sql = { path = "../nom-sql" } -vec1 = { version = "1.6.0", features = ["serde"] } -tikv-jemalloc-ctl = "0.5.0" +vec1 = { workspace = true, features = ["serde"] } +tikv-jemalloc-ctl = { workspace = true } readyset-util = { path = "../readyset-util" } -deadpool-postgres = "0.10.3" +deadpool-postgres = { workspace = true } failpoint-macros = { path = "../failpoint-macros" } -tokio-native-tls = "0.3.1" +tokio-native-tls = { workspace = true } diff --git a/readyset-logictest/Cargo.toml b/readyset-logictest/Cargo.toml index c463859870..d94f69f092 100644 --- a/readyset-logictest/Cargo.toml +++ b/readyset-logictest/Cargo.toml @@ -6,35 +6,35 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0.38" +anyhow = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -console = "0.15.5" -derive_more = "0.99.11" -hex = "0.4.3" -md5 = "0.7.0" +console = { workspace = true } +derive_more = { workspace = true } +hex = { workspace = true } +md5 = { workspace = true } mysql_async = { workspace = true } -mysql_common = { version = "0.32", features = ["chrono"] } -tikv-jemallocator = "0.5" +mysql_common = { workspace = true, features = ["chrono"] } +tikv-jemallocator = { workspace = true } tokio-postgres = { workspace = true, features = ["with-chrono-0_4"] } postgres-native-tls = { workspace = true } -native-tls = "0.2.7" -nom = "7.1" -nom_locate = "4.0.0" +native-tls = { workspace = true } +nom = { workspace = true } +nom_locate = { workspace = true } tokio = { workspace = true, features = ["full"] } -itertools = "0.10.0" -chrono = "0.4.19" -pretty_assertions = "1.4.0" -walkdir = "2.3.2" -proptest = "1.0.0" -futures = "0.3" -bytes = "1.0.1" -enum-display-derive = "0.1.1" -lazy_static = "1.4.0" -humantime = "2.1" -rust_decimal = { version = "1.26", features = ["db-tokio-postgres"] } -indicatif = "0.17" -bit-vec = { version = "0.6", features = ["serde"] } -thiserror = "1.0.30" +itertools = { workspace = true } +chrono = { workspace = true } +pretty_assertions = { workspace = true } +walkdir = { workspace = true } +proptest = { workspace = true } +futures = { workspace = true } +bytes = { workspace = true } +enum-display-derive = { workspace = true } +lazy_static = { workspace = true } +humantime = { workspace = true } +rust_decimal = { workspace = true, features = ["db-tokio-postgres"] } +indicatif = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +thiserror = { workspace = true } readyset-server = { path = "../readyset-server/" } readyset-adapter = { path = "../readyset-adapter/" } diff --git a/readyset-logictest/src/ast.rs b/readyset-logictest/src/ast.rs index 9e09694272..9b6bb6bb89 100644 --- a/readyset-logictest/src/ast.rs +++ b/readyset-logictest/src/ast.rs @@ -287,7 +287,7 @@ impl TryFrom for Value { Value::Text(String::from_utf8(v).map_err(|e| ValueConversionError(e.to_string()))?) } Literal::ByteArray(b) => Value::ByteArray(b), - Literal::BitVector(b) => Value::BitVector(BitVec::from_bytes(b.as_slice())), + Literal::BitVector(b) => Value::BitVector(b), Literal::Placeholder(_) => { return Err(ValueConversionError( "Placeholders are not valid values".to_string(), @@ -320,9 +320,11 @@ impl From for mysql_async::Value { t.seconds(), t.microseconds(), ), + // Though `BitVec` is really PostgreSQL-specific, it's useful to compare bitstrings for + // non-utf8 bytes. + Value::BitVector(bv) => mysql_async::Value::Bytes(bv.to_bytes()), // These types are PostgreSQL-specific Value::ByteArray(_) => unimplemented!(), - Value::BitVector(_) => unimplemented!(), Value::TimestampTz(_) => unimplemented!(), } } @@ -362,7 +364,8 @@ impl pgsql::types::ToSql for Value { | Type::NUMERIC | Type::TEXT | Type::DATE - | Type::TIME => true, + | Type::TIME + | Type::BIT => true, ref ty if ty.name() == "citext" => true, _ => false, } @@ -426,7 +429,9 @@ impl<'a> pgsql::types::FromSql<'a> for Value { | Type::DATE | Type::TIMESTAMP | Type::TIMESTAMPTZ - | Type::TIME => true, + | Type::TIME + | Type::BIT + | Type::VARBIT => true, ref ty if ty.name() == "citext" => true, _ => false, } @@ -582,9 +587,14 @@ impl Value { } _ => bail!("Could not convert {:?} to Time", val), })), + // Though `BitVec` is really PostgreSQL-specific, it's useful to compare bitstrings for + // non-utf8 bytes. + Type::BitVec => Ok(Self::BitVector(match val { + mysql_async::Value::Bytes(b) => BitVec::from_bytes(&b), + _ => unimplemented!(), + })), // These types are PostgreSQL specific. Type::ByteArray => unimplemented!(), - Type::BitVec => unimplemented!(), Type::TimestampTz => unimplemented!(), } } @@ -597,6 +607,7 @@ impl Value { | (Self::Date(_), Type::Date) | (Self::Time(_), Type::Time) | (Self::TimestampTz(_), Type::TimestampTz) + | (Self::BitVector(_), Type::BitVec) | (Self::Null, _) => Ok(Cow::Borrowed(self)), (Self::TimestampTz(ts), Type::Date) => Ok(Cow::Owned(Self::Date(ts.naive_local()))), (Self::Text(txt), Type::Integer) => Ok(Cow::Owned(Self::Integer(txt.parse()?))), @@ -608,8 +619,11 @@ impl Value { })?, ))), (Self::Text(txt), Type::Time) => Ok(Cow::Owned(Self::Time(txt.parse()?))), - _ => { - todo!() + (Self::Text(txt), Type::BitVec) => Ok(Cow::Owned(Self::BitVector(BitVec::from_bytes( + txt.as_bytes(), + )))), + (v, t) => { + todo!("{v:?} {t:?}") } } } diff --git a/readyset-logictest/src/from_query_log.rs b/readyset-logictest/src/from_query_log.rs index fd2b57e59b..153988f6ba 100644 --- a/readyset-logictest/src/from_query_log.rs +++ b/readyset-logictest/src/from_query_log.rs @@ -103,8 +103,10 @@ fn is_ddl(query: &SqlQuery) -> bool { | SqlQuery::Show(_) | SqlQuery::Explain(_) | SqlQuery::Deallocate(_) + | SqlQuery::Truncate(_) | SqlQuery::Comment(_) => false, - SqlQuery::CreateTable(_) + SqlQuery::CreateDatabase(_) + | SqlQuery::CreateTable(_) | SqlQuery::CreateView(_) | SqlQuery::DropTable(_) | SqlQuery::DropView(_) diff --git a/readyset-logictest/src/main.rs b/readyset-logictest/src/main.rs index 5fbfd9452d..1ba14b788d 100644 --- a/readyset-logictest/src/main.rs +++ b/readyset-logictest/src/main.rs @@ -229,7 +229,7 @@ impl Parse { } /// Run a test script, or all test scripts in a directory, against either ReadySet or a reference -/// MySQL database +/// upstream database #[derive(Parser)] struct Verify { #[command(flatten)] diff --git a/readyset-logictest/src/parser.rs b/readyset-logictest/src/parser.rs index c9e63acd8d..db2d3b2f9e 100644 --- a/readyset-logictest/src/parser.rs +++ b/readyset-logictest/src/parser.rs @@ -11,15 +11,16 @@ use std::io; use std::str::FromStr; use anyhow::{anyhow, bail, Context}; +use bit_vec::BitVec; use mysql_time::MySqlTime; use nom::branch::alt; -use nom::bytes::complete::tag; +use nom::bytes::complete::{tag, tag_no_case}; use nom::character::complete::{ alphanumeric1, anychar, char, digit1, line_ending, not_line_ending, one_of, space0, space1, }; use nom::combinator::{complete, eof, map, map_opt, map_parser, opt, peek, recognize}; -use nom::multi::{count, many0, many1, many_till}; -use nom::sequence::{pair, preceded, terminated, tuple}; +use nom::multi::{count, fold_many1, many0, many1, many_till}; +use nom::sequence::{delimited, pair, preceded, terminated, tuple}; use nom::IResult; use nom_locate::LocatedSpan; use nom_sql::to_nom_result; @@ -212,6 +213,20 @@ fn value(i: &[u8]) -> IResult<&[u8], Value> { }), line_ending, ), + map( + terminated( + delimited( + tag_no_case("b'"), + fold_many1(alt((char('0'), char('1'))), BitVec::new, |mut bv, c| { + bv.push(c == '1'); + bv + }), + tag("'"), + ), + line_ending, + ), + Value::BitVector, + ), map( terminated( map_opt(not_line_ending, |s: &[u8]| { @@ -409,6 +424,7 @@ where mod tests { use std::collections::HashMap; + use bit_vec::BitVec; use chrono::{FixedOffset, NaiveDateTime, TimeZone}; use nom::combinator::complete; use pretty_assertions::assert_eq; @@ -878,4 +894,30 @@ SELECT * FROM t2 let expected = Value::from(0.75_f64); assert_eq!(complete(float)(input).unwrap().1, expected); } + + #[test] + fn parse_query_with_bitvec() { + let input = b"query BV +SELECT * FROM t1 +---- +b'111' +b'00000000000000000' +"; + let result = complete(records)(input); + assert_eq!( + result.unwrap().1, + vec![Record::Query(Query { + label: None, + column_types: Some(vec![Type::BitVec]), + sort_mode: None, + conditionals: vec![], + query: "SELECT * FROM t1".to_string(), + results: QueryResults::Results(vec![ + Value::BitVector(BitVec::from_elem(3, true)), + Value::BitVector(BitVec::from_elem(17, false)), + ]), + params: Default::default(), + })] + ) + } } diff --git a/readyset-logictest/src/runner.rs b/readyset-logictest/src/runner.rs index 82f7fc9c8b..d17bb7af77 100644 --- a/readyset-logictest/src/runner.rs +++ b/readyset-logictest/src/runner.rs @@ -571,7 +571,13 @@ impl TestScript { DatabaseType::MySQL => nom_sql::Dialect::MySQL, DatabaseType::PostgreSQL => nom_sql::Dialect::PostgreSQL, }, - Default::default(), + match database_type { + DatabaseType::MySQL if replication_url.is_some() => vec!["noria".into()], + DatabaseType::PostgreSQL if replication_url.is_some() => { + vec!["noria".into(), "public".into()] + } + _ => Default::default(), + }, adapter_rewrite_params, ) .await; diff --git a/readyset-mir/Cargo.toml b/readyset-mir/Cargo.toml index 280dc832e8..d832185d04 100644 --- a/readyset-mir/Cargo.toml +++ b/readyset-mir/Cargo.toml @@ -7,16 +7,16 @@ edition = "2021" description = "ReadySet MIR crate" [dependencies] -regex = "1.5" -lazy_static = "1.4" -petgraph = { version = "0.5", features = ["serde-1"] } -itertools = "0.10" -tracing = { version = "0.1", features = ["release_max_level_debug"] } -serde = { version = "1.0.8", features = ["rc", "derive"] } -proptest = "1.0.0" -vec1 = "1.6" -fixedbitset = { version = "0.2.0", default-features = false } -derive_more = "0.99.17" +regex = { workspace = true } +lazy_static = { workspace = true } +petgraph = { workspace = true, features = ["serde-1"] } +itertools = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } +serde = { workspace = true, features = ["rc", "derive"] } +proptest = { workspace = true } +vec1 = { workspace = true } +fixedbitset = { workspace = true } +derive_more = { workspace = true } # local deps common = { path = "../readyset-common", package = "readyset-common" } diff --git a/readyset-mir/src/graph.rs b/readyset-mir/src/graph.rs index 4c001cc191..d55fd59371 100644 --- a/readyset-mir/src/graph.rs +++ b/readyset-mir/src/graph.rs @@ -378,12 +378,10 @@ impl MirGraph { }, // otherwise, just look up in the column set // Compare by name if there is no table - _ => match { - if c.table.is_none() { - self.columns(node).iter().position(|cc| cc.name == c.name) - } else { - self.columns(node).iter().position(|cc| cc == c) - } + _ => match if c.table.is_none() { + self.columns(node).iter().position(|cc| cc.name == c.name) + } else { + self.columns(node).iter().position(|cc| cc == c) } { Some(id) => Ok(id), None => err, diff --git a/readyset-mir/src/rewrite/predicate_pushup.rs b/readyset-mir/src/rewrite/predicate_pushup.rs index 2464c4f696..7c5dc14a9b 100644 --- a/readyset-mir/src/rewrite/predicate_pushup.rs +++ b/readyset-mir/src/rewrite/predicate_pushup.rs @@ -186,7 +186,7 @@ fn map_columns_above_alias_table( .get(&column.name) .ok_or_else(|| unsupported_err!("Parent of AliasTable node missing required column"))?; - column.table = new_column.table.clone(); + column.table.clone_from(&new_column.table); } Ok(()) diff --git a/readyset-mysql/Cargo.toml b/readyset-mysql/Cargo.toml index 2542610bac..3a837dc3c9 100644 --- a/readyset-mysql/Cargo.toml +++ b/readyset-mysql/Cargo.toml @@ -7,16 +7,16 @@ edition = "2021" [dependencies] clap = { workspace = true, features = ["derive","env"] } -async-trait = "0.1" -fail = "0.5.0" +async-trait = { workspace = true } +fail = { workspace = true } metrics = { workspace = true } mysql-srv = { path = "../mysql-srv" } mysql_async = { workspace = true } -lazy_static = "1.0" -streaming-iterator = "0.1" -futures-util = "0.3" -pin-project = "1.0" -bincode = "1.3.3" +lazy_static = { workspace = true } +streaming-iterator = { workspace = true } +futures-util = { workspace = true } +pin-project = { workspace = true } +bincode = { workspace = true } readyset-client = { path = "../readyset-client" } readyset-errors = { path = "../readyset-errors" } @@ -27,14 +27,14 @@ readyset-client-metrics = { path = "../readyset-client-metrics" } readyset-version = { path = "../readyset-version" } failpoint-macros = { path = "../failpoint-macros" } nom-sql = { path = "../nom-sql" } -tikv-jemallocator = "0.5" +tikv-jemallocator = { workspace = true } tokio = { workspace = true, features = ["full"] } -tracing = { version = "0.1", features = ["release_max_level_debug"] } -anyhow = "1.0.42" -derive_more = "0.99.16" -thiserror = "1.0.26" -mysql_common = "0.32" -itertools = "0.10" +tracing = { workspace = true, features = ["release_max_level_debug"] } +anyhow = { workspace = true } +derive_more = { workspace = true } +thiserror = { workspace = true } +mysql_common = { workspace = true } +itertools = { workspace = true } readyset-util = { path = "../readyset-util" } [dev-dependencies] @@ -43,17 +43,17 @@ readyset-client-metrics = { path = "../readyset-client-metrics" } readyset-telemetry-reporter = { path = "../readyset-telemetry-reporter", features = ["test-util"] } readyset-server = { path = "../readyset-server" } test-utils = { path = "../test-utils" } -chrono = "0.4.19" -futures = "0.3" -mysql = "25" -paste = "1.0.5" -proptest = "1.0.0" -serial_test = "0.5.1" +chrono = { workspace = true } +futures = { workspace = true } +mysql = { workspace = true } +paste = { workspace = true } +proptest = { workspace = true } +serial_test = { workspace = true } proptest-stateful = { path = "../proptest-stateful" } -test-strategy = "0.2.0" +test-strategy = { workspace = true } readyset-tracing = { path = "../readyset-tracing" } -reqwest = "0.11.3" -regex = "1.8.4" +reqwest = { workspace = true } +regex = { workspace = true } [features] vertical_tests = [] diff --git a/readyset-mysql/src/backend.rs b/readyset-mysql/src/backend.rs index 9660bcbc8c..0f4cdaa822 100644 --- a/readyset-mysql/src/backend.rs +++ b/readyset-mysql/src/backend.rs @@ -5,7 +5,6 @@ use std::convert::TryFrom; use std::fmt::Formatter; use std::ops::{Deref, DerefMut}; -use async_trait::async_trait; use futures_util::StreamExt; use itertools::{izip, Itertools}; use mysql_async::consts::StatusFlags; @@ -138,11 +137,10 @@ async fn write_column( DfValue::TimestampTz(ts) => match cs.coltype { mysql_srv::ColumnType::MYSQL_TYPE_DATETIME - | mysql_srv::ColumnType::MYSQL_TYPE_DATETIME2 - | mysql_srv::ColumnType::MYSQL_TYPE_TIMESTAMP - | mysql_srv::ColumnType::MYSQL_TYPE_TIMESTAMP2 => { - rw.write_col(ts.to_chrono().naive_local()) - } + | mysql_srv::ColumnType::MYSQL_TYPE_DATETIME2 => rw.write_col(ts), + + mysql_srv::ColumnType::MYSQL_TYPE_TIMESTAMP + | mysql_srv::ColumnType::MYSQL_TYPE_TIMESTAMP2 => rw.write_col(ts.to_local()), ColumnType::MYSQL_TYPE_DATE => rw.write_col(ts.to_chrono().naive_local().date()), _ => return Err(conv_error())?, }, @@ -498,7 +496,6 @@ where } } -#[async_trait] impl MySqlShim for Backend where W: AsyncWrite + Unpin + Send + 'static, @@ -554,6 +551,7 @@ where SinglePrepareResult::Noria(Update { params, .. } | Delete { params, .. }), )) => { let params = convert_columns!(params, info); + schema_cache.remove(&statement_id); info.reply(statement_id, ¶ms, &[]).await } Ok(( @@ -565,7 +563,7 @@ where )) => { let params = params.iter().map(|c| c.into()).collect::>(); let schema = schema.iter().map(|c| c.into()).collect::>(); - + schema_cache.remove(&statement_id); info.reply(statement_id, ¶ms, &schema).await } @@ -600,7 +598,7 @@ where Err(e) => info.error(e.error_kind(), e.to_string().as_bytes()).await, }; - Ok(res?) + res } async fn on_execute( @@ -741,7 +739,7 @@ where } let query_result = self.query(query).await; - return handle_query_result(query_result, results).await; + handle_query_result(query_result, results).await } fn password_for_username(&self, username: &str) -> Option> { diff --git a/readyset-mysql/src/schema.rs b/readyset-mysql/src/schema.rs index a0e8eeff90..25b13fb63c 100644 --- a/readyset-mysql/src/schema.rs +++ b/readyset-mysql/src/schema.rs @@ -35,6 +35,11 @@ pub(crate) fn convert_column(col: &ColumnSchema) -> ReadySetResult MYSQL_TYPE_INT24, + DfType::UnsignedMediumInt => { + colflags |= mysql_srv::ColumnFlags::UNSIGNED_FLAG; + MYSQL_TYPE_INT24 + } DfType::Bool => MYSQL_TYPE_BIT, DfType::DateTime { .. } => MYSQL_TYPE_DATETIME, DfType::Blob => MYSQL_TYPE_BLOB, diff --git a/readyset-mysql/tests/integration.rs b/readyset-mysql/tests/integration.rs index e89485e31a..de8b2fd532 100644 --- a/readyset-mysql/tests/integration.rs +++ b/readyset-mysql/tests/integration.rs @@ -1,7 +1,10 @@ +use std::env; +use std::panic::AssertUnwindSafe; use std::sync::Arc; use std::time::Duration; use chrono::{NaiveDate, NaiveDateTime, NaiveTime}; +use mysql::Row; use mysql_async::prelude::Queryable; use mysql_async::OptsBuilder; use readyset_adapter::backend::noria_connector::ReadBehavior; @@ -15,11 +18,13 @@ use readyset_client_test_helpers::{sleep, TestBuilder}; use readyset_errors::ReadySetError; use readyset_server::Handle; use readyset_telemetry_reporter::{TelemetryEvent, TelemetryInitializer, TelemetryReporter}; +use readyset_util::eventually; use readyset_util::shutdown::ShutdownSender; use regex::Regex; +use serial_test::serial; use test_utils::skip_flaky_finder; -async fn setup_with_mysql() -> (mysql_async::Opts, Handle, ShutdownSender) { +async fn setup_with_mysql(recreate_db: bool) -> (mysql_async::Opts, Handle, ShutdownSender) { readyset_tracing::init_test_logging(); let mut users = std::collections::HashMap::new(); users.insert("root".to_string(), "noria".to_string()); @@ -30,6 +35,7 @@ async fn setup_with_mysql() -> (mysql_async::Opts, Handle, ShutdownSender) { .users(users), ) .fallback(true) + .recreate_database(recreate_db) .build::() .await } @@ -51,6 +57,14 @@ async fn setup_telemetry() -> (TelemetryReporter, mysql_async::Opts, Handle, Shu (reporter, opts, handle, shutdown_tx) } +fn mysql_url() -> String { + format!( + "mysql://root:noria@{}:{}/noria", + env::var("MYSQL_HOST").unwrap_or_else(|_| "127.0.0.1".into()), + env::var("MYSQL_TCP_PORT").unwrap_or_else(|_| "3306".into()), + ) +} + #[tokio::test(flavor = "multi_thread")] async fn duplicate_join_key() { // This used to trigger a bug involving weak indexes. See issue #179 for more info. @@ -1842,8 +1856,9 @@ async fn show_caches_with_always() { } #[tokio::test(flavor = "multi_thread")] +#[serial] async fn show_readyset_status() { - let (opts, _handle, shutdown_tx) = setup_with_mysql().await; + let (opts, _handle, shutdown_tx) = setup_with_mysql(true).await; let mut conn = mysql_async::Conn::new(opts).await.unwrap(); let mut ret: Vec = conn.query("SHOW READYSET STATUS;").await.unwrap(); @@ -2107,3 +2122,248 @@ async fn test_proxied_queries_telemetry() { shutdown_tx.shutdown().await; } + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn datetime_nanosecond_precision_text_protocol() { + let mut direct_mysql = mysql_async::Conn::from_url(mysql_url()).await.unwrap(); + direct_mysql.query_drop("DROP TABLE IF EXISTS dt_nano_text_protocol CASCADE; + CREATE TABLE dt_nano_text_protocol (col1 DATETIME, col2 DATETIME(2), col3 DATETIME(4), col4 DATETIME(6)); + INSERT INTO dt_nano_text_protocol VALUES ('2021-01-01 00:00:00', '2021-01-01 00:00:00.00', '2021-01-01 00:00:00.0000', '2021-01-01 00:00:00.000000'); + INSERT INTO dt_nano_text_protocol VALUES ('2021-01-01 00:00:00', '2021-01-01 00:00:00.01', '2021-01-01 00:00:00.0001', '2021-01-01 00:00:00.000001');") + .await + .unwrap(); + let (opts, _handle, shutdown_tx) = setup_with_mysql(false).await; + let mut conn = mysql_async::Conn::new(opts).await.unwrap(); + sleep().await; + + conn.query_drop("CREATE CACHE FROM SELECT * FROM dt_nano_text_protocol") + .await + .unwrap(); + sleep().await; + + let my_rows: Vec<(String, String, String, String)> = direct_mysql + .query("SELECT * FROM dt_nano_text_protocol") + .await + .unwrap(); + let rs_rows: Vec<(String, String, String, String)> = conn + .query("SELECT * FROM dt_nano_text_protocol") + .await + .unwrap(); + assert_eq!(rs_rows, my_rows); + conn.query_drop("INSERT INTO dt_nano_text_protocol VALUES ('2021-01-02 00:00:00', '2021-01-02 00:00:00.00', '2021-01-02 00:00:00.0000', '2021-01-02 00:00:00.000000');").await.unwrap(); + conn.query_drop("INSERT INTO dt_nano_text_protocol VALUES ('2021-01-02 00:00:00', '2021-01-02 00:00:00.01', '2021-01-02 00:00:00.0001', '2021-01-02 00:00:00.000001');").await.unwrap(); + + sleep().await; + + eventually!(run_test: { + let my_rows: Vec<(String, String, String, String)> = direct_mysql + .query("SELECT * FROM dt_nano_text_protocol") + .await + .unwrap(); + + let rs_rows: Vec<(String, String, String, String)> = conn + .query("SELECT * FROM dt_nano_text_protocol") + .await + .unwrap(); + AssertUnwindSafe(move || (rs_rows, my_rows)) + },then_assert: |results| { + let (rs_rows, my_rows) = results(); + assert_eq!(rs_rows, my_rows) + }); + + shutdown_tx.shutdown().await; +} + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn datetime_nanosecond_precision_binary_protocol() { + let mut direct_mysql = mysql_async::Conn::from_url(mysql_url()).await.unwrap(); + direct_mysql.query_drop("DROP TABLE IF EXISTS dt_nano_bin_protocol CASCADE; + CREATE TABLE dt_nano_bin_protocol (ID INT PRIMARY KEY, col1 DATETIME, col2 DATETIME(2), col3 DATETIME(4), col4 DATETIME(6)); + INSERT INTO dt_nano_bin_protocol VALUES (1, '2021-01-01 00:00:00', '2021-01-01 00:00:00.00', '2021-01-01 00:00:00.0000', '2021-01-01 00:00:00.000000'); + INSERT INTO dt_nano_bin_protocol VALUES (2, '2021-01-01 00:00:00', '2021-01-01 00:00:00.01', '2021-01-01 00:00:00.0001', '2021-01-01 00:00:00.000001');") + .await + .unwrap(); + let (opts, _handle, shutdown_tx) = setup_with_mysql(false).await; + let mut conn = mysql_async::Conn::new(opts).await.unwrap(); + sleep().await; + + conn.query_drop("CREATE CACHE FROM SELECT * FROM dt_nano_bin_protocol WHERE ID = ?") + .await + .unwrap(); + sleep().await; + + for id in 1..=2 { + let my_rows: Row = direct_mysql + .exec_first("SELECT * FROM dt_nano_bin_protocol WHERE ID = ?", (id,)) + .await + .unwrap() + .unwrap(); + let rs_rows: Row = conn + .exec_first("SELECT * FROM dt_nano_bin_protocol WHERE ID = ?", (id,)) + .await + .unwrap() + .unwrap(); + assert_eq!(rs_rows.unwrap_raw(), my_rows.unwrap_raw()) + } + + conn.query_drop("INSERT INTO dt_nano_bin_protocol VALUES (3, '2021-01-02 00:00:00', '2021-01-02 00:00:00.00', '2021-01-02 00:00:00.0000', '2021-01-02 00:00:00.000000');").await.unwrap(); + conn.query_drop("INSERT INTO dt_nano_bin_protocol VALUES (4, '2021-01-02 00:00:00', '2021-01-02 00:00:00.01', '2021-01-02 00:00:00.0001', '2021-01-02 00:00:00.000001');").await.unwrap(); + + sleep().await; + + for id in 3..=4 { + eventually!(run_test: { + + let my_rows: Row = direct_mysql + .exec_first("SELECT * FROM dt_nano_bin_protocol WHERE ID = ?", (id,)) + .await + .unwrap() + .unwrap(); + let rs_rows: Row = conn + .exec_first("SELECT * FROM dt_nano_bin_protocol WHERE ID = ?", (id,)) + .await + .unwrap() + .unwrap(); + AssertUnwindSafe(move || (rs_rows, my_rows)) + },then_assert: |results| { + let (rs_rows, my_rows) = results(); + assert_eq!(rs_rows.unwrap_raw(), my_rows.unwrap_raw()) + }); + } + shutdown_tx.shutdown().await; +} + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn datetime_binary_protocol() { + let (opts, _handle, shutdown_tx) = setup_with_mysql(false).await; + let mut conn = mysql_async::Conn::new(opts).await.unwrap(); + let mut direct_mysql = mysql_async::Conn::from_url(mysql_url()).await.unwrap(); + direct_mysql.query_drop("SET sql_mode='';").await.unwrap(); + direct_mysql + .query_drop("DROP TABLE IF EXISTS dt_bin_protocol CASCADE;") + .await + .unwrap(); + direct_mysql.query_drop("CREATE TABLE dt_bin_protocol (ID INT PRIMARY KEY, col1 DATETIME(6), col2 DATETIME(6), col3 DATETIME(6), col4 DATETIME(6));").await.unwrap(); + direct_mysql.query_drop("INSERT INTO dt_bin_protocol VALUES (1, '0000-00-00 00:00:00.000000', '2021-01-01 00:00:00.000000', '2021-01-01 00:00:01.0000000', '2021-01-01 00:00:01.000001');") + .await + .unwrap(); + sleep().await; + + conn.query_drop("CREATE CACHE FROM SELECT * FROM dt_bin_protocol WHERE ID = ?") + .await + .unwrap(); + sleep().await; + let rs_rows: Row = conn + .exec_first("SELECT * FROM dt_bin_protocol WHERE ID = 1", ()) + .await + .unwrap() + .unwrap(); + assert_eq!( + rs_rows.unwrap_raw(), + vec![ + Some(mysql::Value::Int(1)), + Some(mysql::Value::NULL), + Some(mysql::Value::Date(2021, 1, 1, 0, 0, 0, 0)), + Some(mysql::Value::Date(2021, 1, 1, 0, 0, 1, 0)), + Some(mysql::Value::Date(2021, 1, 1, 0, 0, 1, 1)) + ] + ); + shutdown_tx.shutdown().await; +} + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn timestamp_binary_protocol() { + let mut direct_mysql = mysql_async::Conn::from_url(mysql_url()).await.unwrap(); + direct_mysql.query_drop(" + SET SESSION time_zone = '+05:00'; + DROP TABLE IF EXISTS ts_bin_protocol CASCADE; + CREATE TABLE ts_bin_protocol (ID INT PRIMARY KEY, col1 TIMESTAMP, col2 TIMESTAMP(2), col3 TIMESTAMP(4), col4 TIMESTAMP(6)); + INSERT INTO ts_bin_protocol VALUES (1, '2021-01-01 00:00:00', '2021-01-01 00:00:00.00', '2021-01-01 00:00:00.0000', '2021-01-01 00:00:00.000000'); + INSERT INTO ts_bin_protocol VALUES (2, '2021-01-01 00:00:00', '2021-01-01 00:00:00.01', '2021-01-01 00:00:00.0001', '2021-01-01 00:00:00.000001');") + .await + .unwrap(); + let (opts, _handle, shutdown_tx) = setup_with_mysql(false).await; + let mut conn = mysql_async::Conn::new(opts).await.unwrap(); + sleep().await; + + direct_mysql.query_drop("INSERT INTO ts_bin_protocol VALUES (3, '2021-01-02 00:00:00', '2021-01-02 00:00:00.00', '2021-01-02 00:00:00.0000', '2021-01-02 00:00:00.000000');").await.unwrap(); + direct_mysql.query_drop("INSERT INTO ts_bin_protocol VALUES (4, '2021-01-02 00:00:00', '2021-01-02 00:00:00.01', '2021-01-02 00:00:00.0001', '2021-01-02 00:00:00.000001');").await.unwrap(); + direct_mysql + .query_drop("SET SESSION time_zone = SYSTEM;") + .await + .unwrap(); + conn.query_drop("CREATE CACHE FROM SELECT * FROM ts_bin_protocol WHERE ID = ?") + .await + .unwrap(); + sleep().await; + + for id in 1..=4 { + eventually!(run_test: { + + let my_rows: Row = direct_mysql + .exec_first("SELECT * FROM ts_bin_protocol WHERE ID = ?", (id,)) + .await + .unwrap() + .unwrap(); + let rs_rows: Row = conn + .exec_first("SELECT * FROM ts_bin_protocol WHERE ID = ?", (id,)) + .await + .unwrap() + .unwrap(); + AssertUnwindSafe(move || (rs_rows, my_rows)) + },then_assert: |results| { + let (rs_rows, my_rows) = results(); + assert_eq!(rs_rows.unwrap_raw(), my_rows.unwrap_raw()) + }); + } + shutdown_tx.shutdown().await; +} + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn timestamp_text_protocol() { + let mut direct_mysql = mysql_async::Conn::from_url(mysql_url()).await.unwrap(); + direct_mysql.query_drop(" + SET SESSION time_zone = '+05:00'; + DROP TABLE IF EXISTS ts_text_protocol CASCADE; + CREATE TABLE ts_text_protocol (col1 TIMESTAMP, col2 TIMESTAMP(2), col3 TIMESTAMP(4), col4 TIMESTAMP(6)); + INSERT INTO ts_text_protocol VALUES ('2021-01-01 00:00:00', '2021-01-01 00:00:00.00', '2021-01-01 00:00:00.0000', '2021-01-01 00:00:00.000000'); + INSERT INTO ts_text_protocol VALUES ('2021-01-01 00:00:00', '2021-01-01 00:00:00.01', '2021-01-01 00:00:00.0001', '2021-01-01 00:00:00.000001');") + .await + .unwrap(); + let (opts, _handle, shutdown_tx) = setup_with_mysql(false).await; + let mut conn = mysql_async::Conn::new(opts).await.unwrap(); + sleep().await; + + direct_mysql.query_drop("INSERT INTO ts_text_protocol VALUES ('2021-01-02 00:00:00', '2021-01-02 00:00:00.00', '2021-01-02 00:00:00.0000', '2021-01-02 00:00:00.000000');").await.unwrap(); + direct_mysql.query_drop("INSERT INTO ts_text_protocol VALUES ('2021-01-02 00:00:00', '2021-01-02 00:00:00.01', '2021-01-02 00:00:00.0001', '2021-01-02 00:00:00.000001');").await.unwrap(); + direct_mysql + .query_drop("SET SESSION time_zone = SYSTEM;") + .await + .unwrap(); + conn.query_drop("CREATE CACHE FROM SELECT * FROM ts_text_protocol WHERE ID = ?") + .await + .unwrap(); + sleep().await; + + eventually!(run_test: { + + let my_rows: Vec<(String, String, String, String)> = direct_mysql + .query("SELECT * FROM ts_text_protocol") + .await + .unwrap(); + let rs_rows: Vec<(String, String, String, String)> = conn + .query("SELECT * FROM ts_text_protocol") + .await + .unwrap(); + AssertUnwindSafe(move || (rs_rows, my_rows)) + },then_assert: |results| { + let (rs_rows, my_rows) = results(); + assert_eq!(rs_rows, my_rows) + }); + shutdown_tx.shutdown().await; +} diff --git a/readyset-mysql/tests/query_cache.rs b/readyset-mysql/tests/query_cache.rs index 9ccd6b3e2a..d36785e415 100644 --- a/readyset-mysql/tests/query_cache.rs +++ b/readyset-mysql/tests/query_cache.rs @@ -758,3 +758,140 @@ async fn test_binlog_transaction_compression() { shutdown_tx.shutdown().await; } + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn test_char_padding_lookup() { + let query_status_cache: &'static _ = Box::leak(Box::new(QueryStatusCache::new())); + let (opts, _handle, shutdown_tx) = setup( + query_status_cache, + true, // fallback enabled + MigrationMode::OutOfBand, + UnsupportedSetMode::Error, + ) + .await; + let mut conn = Conn::new(opts).await.unwrap(); + conn.query_drop( + "CREATE TABLE `col_pad_lookup` ( + id int NOT NULL PRIMARY KEY, + c CHAR(3) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;", + ) + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_lookup` VALUES (1, 'ࠈࠈ');") + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_lookup` VALUES (2, 'A');") + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_lookup` VALUES (3, 'AAA');") + .await + .unwrap(); + sleep().await; + conn.query_drop("CREATE CACHE test FROM SELECT id, c FROM col_pad_lookup WHERE c = ?") + .await + .unwrap(); + let row: Vec<(u32, String)> = conn + .query("SELECT id, c FROM col_pad_lookup WHERE c = 'ࠈࠈ'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "ࠈࠈ "); + + let row: Vec<(u32, String)> = conn + .query("SELECT id, c FROM col_pad_lookup WHERE c = 'A'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "A "); + + let row: Vec<(u32, String)> = conn + .query("SELECT id, c FROM col_pad_lookup WHERE c = 'AAA'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "AAA"); + shutdown_tx.shutdown().await; +} + +#[tokio::test(flavor = "multi_thread")] +#[serial] +async fn test_binary_padding_lookup() { + let query_status_cache: &'static _ = Box::leak(Box::new(QueryStatusCache::new())); + let (opts, _handle, shutdown_tx) = setup( + query_status_cache, + true, // fallback enabled + MigrationMode::OutOfBand, + UnsupportedSetMode::Error, + ) + .await; + let mut conn = Conn::new(opts).await.unwrap(); + conn.query_drop( + "CREATE TABLE `col_pad_bin_lookup` ( + id int NOT NULL PRIMARY KEY, + b BINARY(3) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;", + ) + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_bin_lookup` VALUES (1, 'ࠈ');") + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_bin_lookup` VALUES (2, '¥');") + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_bin_lookup` VALUES (3, 'A');") + .await + .unwrap(); + conn.query_drop("INSERT INTO `col_pad_bin_lookup` VALUES (4, 'A¥');") + .await + .unwrap(); + + sleep().await; + conn.query_drop("CREATE CACHE test FROM SELECT id, b FROM col_pad_bin_lookup WHERE b = ?") + .await + .unwrap(); + let row: Vec<(u32, String)> = conn + .query("SELECT id, b FROM col_pad_bin_lookup WHERE b = 'ࠈ'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "0xe0a088"); + + let row: Vec<(u32, String)> = conn + .query("SELECT id, b FROM col_pad_bin_lookup WHERE b = '¥'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "0xc2a500"); + + let row: Vec<(u32, String)> = conn + .query("SELECT id, b FROM col_pad_bin_lookup WHERE b = 'A'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "0x410000"); + + let row: Vec<(u32, String)> = conn + .query("SELECT id, b FROM col_pad_bin_lookup WHERE b = 'A¥'") + .await + .unwrap(); + assert_eq!(row.len(), 1); + let last_status = last_query_info(&mut conn).await; + assert_eq!(last_status.destination, QueryDestination::Readyset); + assert_eq!(row[0].1, "0x41c2a5"); + shutdown_tx.shutdown().await; +} diff --git a/readyset-mysql/tests/vertical.rs b/readyset-mysql/tests/vertical.rs index 7d60b27bf2..6fc70bf849 100644 --- a/readyset-mysql/tests/vertical.rs +++ b/readyset-mysql/tests/vertical.rs @@ -389,7 +389,7 @@ where } => { let table_rows = self.rows.entry(table).or_default(); let old_state_row = table_rows.iter_mut().find(|r| *r == old_row).unwrap(); - *old_state_row = new_row.clone(); + old_state_row.clone_from(new_row); } Operation::Delete { table, row } => { let table_rows = self.rows.entry(table).or_default(); diff --git a/readyset-psql/Cargo.toml b/readyset-psql/Cargo.toml index d87ecaf43e..f678fe207f 100644 --- a/readyset-psql/Cargo.toml +++ b/readyset-psql/Cargo.toml @@ -8,8 +8,8 @@ edition = "2021" [dependencies] clap = { workspace = true, features = ["derive","env"] } -async-trait = "0.1" -lazy_static = "1.0" +async-trait = { workspace = true } +lazy_static = { workspace = true } readyset-client = { path = "../readyset-client/" } readyset-errors = { path = "../readyset-errors/" } readyset-data = { path = "../readyset-data/" } @@ -20,36 +20,36 @@ readyset-version = { path = "../readyset-version" } failpoint-macros = { path = "../failpoint-macros" } nom-sql = { path = "../nom-sql" } psql-srv = { path = "../psql-srv" } -anyhow = "1.0.42" -fail = "0.5.0" +anyhow = { workspace = true } +fail = { workspace = true } tokio = { workspace = true, features = ["full"] } tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] } postgres-types = { workspace = true, features = ["derive"] } postgres-native-tls = { workspace = true } -native-tls = "0.2.7" -futures = "0.3" -itertools = "0.10" -thiserror = "1.0.26" -tikv-jemallocator = "0.5" -tracing = { version = "0.1", features = ["release_max_level_debug"] } -tracing-futures = "0.2.5" -rust_decimal = { version = "1.26" } +native-tls = { workspace = true } +futures = { workspace = true } +itertools = { workspace = true } +thiserror = { workspace = true } +tikv-jemallocator = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } +tracing-futures = { workspace = true } +rust_decimal = { workspace = true } eui48 = { workspace = true } -uuid = "0.8" -serde_json = { version = "1", features = ["arbitrary_precision"] } -bit-vec = { version = "0.6", features = ["serde"] } -streaming-iterator = "0.1" -rand = "0.8" -cidr = "0.2.1" +uuid = { workspace = true } +serde_json = { workspace = true, features = ["arbitrary_precision"] } +bit-vec = { workspace = true, features = ["serde"] } +streaming-iterator = { workspace = true } +rand = { workspace = true } +cidr = { workspace = true } metrics = { workspace = true } -tempfile = "3.8.1" +tempfile = { workspace = true } [dev-dependencies] -chrono = "0.4" +chrono = { workspace = true } readyset-server = { path = "../readyset-server/" } -proptest = "1.0.0" -serial_test = "0.5.1" -test-strategy = "0.2.0" +proptest = { workspace = true } +serial_test = { workspace = true } +test-strategy = { workspace = true } readyset-util = { path = "../readyset-util" } readyset-client-test-helpers = { path = "../readyset-client-test-helpers", features = ["postgres"] } criterion = { workspace = true, features = ["async_tokio"] } diff --git a/readyset-psql/benches/proxy.rs b/readyset-psql/benches/proxy.rs index 4afd5012e5..6f163b9b15 100644 --- a/readyset-psql/benches/proxy.rs +++ b/readyset-psql/benches/proxy.rs @@ -18,7 +18,6 @@ use std::pin::Pin; use std::task::{Context, Poll}; use std::{io, vec}; -use async_trait::async_trait; use criterion::{criterion_group, criterion_main, Criterion}; use futures::future::{try_select, Either}; use futures::stream::Peekable; @@ -128,7 +127,6 @@ impl Backend { } } -#[async_trait] impl PsqlBackend for Backend { type Resultset = ResultStream; diff --git a/readyset-psql/src/backend.rs b/readyset-psql/src/backend.rs index 35861f8b26..b81be12562 100644 --- a/readyset-psql/src/backend.rs +++ b/readyset-psql/src/backend.rs @@ -4,7 +4,6 @@ use std::ops::Deref; use std::str::FromStr; use std::sync::Arc; -use async_trait::async_trait; use clap::ValueEnum; use eui48::MacAddressFormat; use postgres_types::{Oid, Type}; @@ -121,7 +120,6 @@ impl Backend { } } -#[async_trait] impl ps::PsqlBackend for Backend { type Resultset = Resultset; diff --git a/readyset-psql/src/schema.rs b/readyset-psql/src/schema.rs index b23ff8bb9b..120e62eb82 100644 --- a/readyset-psql/src/schema.rs +++ b/readyset-psql/src/schema.rs @@ -90,6 +90,8 @@ pub fn type_to_pgsql(col_type: &DfType) -> Result { DfType::DateTime { .. } => unsupported_type!(), DfType::Binary(_) => unsupported_type!(), DfType::VarBinary(_) => unsupported_type!(), + DfType::MediumInt => unsupported_type!(), + DfType::UnsignedMediumInt => unsupported_type!(), DfType::Enum { metadata: Some(PgEnumMetadata { name, schema, oid, .. @@ -141,6 +143,8 @@ pub fn type_to_pgsql(col_type: &DfType) -> Result { DfType::Array(box DfType::TinyInt) => Ok(Type::CHAR_ARRAY), DfType::Array(box DfType::UnsignedTinyInt) => unsupported_type!(), DfType::Array(box DfType::UnsignedSmallInt) => unsupported_type!(), + DfType::Array(box DfType::MediumInt) => unsupported_type!(), + DfType::Array(box DfType::UnsignedMediumInt) => unsupported_type!(), DfType::Array(box DfType::Blob) => unsupported_type!(), DfType::Array(box DfType::DateTime { .. }) => unsupported_type!(), DfType::Array(box DfType::Binary(_)) => unsupported_type!(), diff --git a/readyset-repl/Cargo.toml b/readyset-repl/Cargo.toml index 4c74b80a27..c6c88639b9 100644 --- a/readyset-repl/Cargo.toml +++ b/readyset-repl/Cargo.toml @@ -6,16 +6,16 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0" +anyhow = { workspace = true } clap = { workspace = true, features = ["derive", "wrap_help"] } -console = "0.15.5" -rustyline = "11.0" -rustyline-derive = "0.6.0" +console = { workspace = true } +rustyline = { workspace = true } +rustyline-derive = { workspace = true } tokio = { workspace = true, features = ["full"] } -prettytable = "0.10.0" +prettytable = { workspace = true } postgres-types = { workspace = true } -textwrap = "0.14" -nom = "7.1.1" +textwrap = { workspace = true } +nom = { workspace = true } database-utils = { path = "../database-utils" } readyset-data = { path = "../readyset-data" } diff --git a/readyset-server/Cargo.toml b/readyset-server/Cargo.toml index c12f62e4b7..49f1387196 100644 --- a/readyset-server/Cargo.toml +++ b/readyset-server/Cargo.toml @@ -23,59 +23,58 @@ redact_sensitive = ["readyset-util/redact_sensitive"] [dependencies] clap = { workspace = true, features = ["derive","env"] } -anyhow = "1.0" -bimap = { version = "0.6.3", features = ["serde"] } -thiserror = "1.0.26" -ahash = "0.7" -futures = "0.3" -futures-core = "0.3.14" -futures-util = "0.3.14" -futures-sink = "0.3.14" -futures-executor = "0.3.14" -pin-project = "1.0" -hyper = { version = "0.14.10", features = [ "stream", "server" ] } -querystring = "1.1.0" -itertools = "0.10" +anyhow = { workspace = true } +bimap = { workspace = true, features = ["serde"] } +thiserror = { workspace = true } +ahash = { workspace = true } +futures = { workspace = true } +futures-core = { workspace = true } +futures-util = { workspace = true } +futures-sink = { workspace = true } +futures-executor = { workspace = true } +pin-project = { workspace = true } +hyper = { workspace = true, features = ["stream", "server"] } +querystring = { workspace = true } +itertools = { workspace = true } metrics = { workspace = true } metrics-util = { workspace = true } metrics-exporter-prometheus = { workspace = true } -nom = "7.1" -petgraph = { version = "0.5", features = ["serde-1"] } -rand = "0.7.0" -serde_json = "1.0.2" -serde_with = "1.9.4" -slab = "0.4" -bincode = "1.3.3" +nom = { workspace = true } +petgraph = { workspace = true, features = ["serde-1"] } +rand = { workspace = true } +serde_json = { workspace = true } +serde_with = { workspace = true } +slab = { workspace = true } +bincode = { workspace = true } tokio = { workspace = true, features = ["full"] } -async-bincode = "0.6.1" -tracing = { version = "0.1", features = ["release_max_level_debug"] } -vec1 = "1.6.0" -reqwest = "0.11.3" -url = { version = "2.2", features = ["serde"] } -tokio-stream = "0.1.5" -tokio-retry = "0.3" -lazy_static = "1.4.0" -regex = "1.5.4" -tracing-futures = "0.2.5" -parking_lot = "0.11.2" -scopeguard = "1.1.0" -fail = "0.5.0" -sha1 = "0.10" -derive_more = "0.99" -streaming-iterator = "0.1" -proptest = "1.0.0" -once_cell = "1.14" -enum-kinds = "0.5.1" -slotmap = "1.0.6" -tikv-jemalloc-ctl = "0.5.0" -rlimit = "0.10.1" +async-bincode = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } +vec1 = { workspace = true } +reqwest = { workspace = true } +url = { workspace = true, features = ["serde"] } +tokio-stream = { workspace = true } +tokio-retry = { workspace = true } +lazy_static = { workspace = true } +regex = { workspace = true } +tracing-futures = { workspace = true } +parking_lot = { workspace = true } +scopeguard = { workspace = true } +fail = { workspace = true } +sha1 = { workspace = true } +derive_more = { workspace = true } +streaming-iterator = { workspace = true } +proptest = { workspace = true } +enum-kinds = { workspace = true } +slotmap = { workspace = true } +tikv-jemalloc-ctl = { workspace = true } +rlimit = { workspace = true } -timekeeper = { version = "0.3.2", default-features = false } -vec_map = { version = "0.8.0", features = ["eders"] } -serde = { version = "1.0.8", features = ["rc", "derive"] } -tokio-tower = "0.5.1" -tower = { version = "0.4.6", features = ["util"] } -strawpoll = "0.2.2" +timekeeper = { workspace = true } +vec_map = { workspace = true, features = ["eders"] } +serde = { workspace = true, features = ["rc", "derive"] } +tokio-tower = { workspace = true } +tower = { workspace = true, features = ["util"] } +strawpoll = { workspace = true } # local deps dataflow = { path = "../readyset-dataflow", package = "readyset-dataflow" } @@ -100,27 +99,27 @@ health-reporter = { path = "../health-reporter" } database-utils = { path = "../database-utils" } catalog-tables = { path = "../catalog-tables" } replication-offset = { path = "../replication-offset" } -num_cpus = "1.16.0" +num_cpus = { workspace = true } [dev-dependencies] dataflow = { path = "../readyset-dataflow", package = "readyset-dataflow", features = ["bench"] } test-utils = { path = "../test-utils" } # Exact version dep here is only to avoid duplicate versions of downstream # dependencies -backtrace = { version = "=0.3.65", features = ["serialize-serde"] } -toml = "0.5" -diff = "0.1.10" -tempfile = "3.4" -mysql = "25" -chrono = "0.4.19" -assert_approx_eq = "1.1.0" -assert_unordered = "0.3" +backtrace = { workspace = true, features = ["serialize-serde"] } +toml = { workspace = true } +diff = { workspace = true } +tempfile = { workspace = true } +mysql = { workspace = true } +chrono = { workspace = true } +assert_approx_eq = { workspace = true } +assert_unordered = { workspace = true } criterion = { workspace = true } -include_dir = "0.6.2" -rusty-fork = "0.3.0" -test-strategy = "0.2.0" -rust_decimal = "1.25" -triomphe = "0.1" +include_dir = { workspace = true } +rusty-fork = { workspace = true } +test-strategy = { workspace = true } +rust_decimal = { workspace = true } +triomphe = { workspace = true } [[bench]] name = "dataflow" diff --git a/readyset-server/src/controller/migrate/materialization/mod.rs b/readyset-server/src/controller/migrate/materialization/mod.rs index a3e26fb055..0b3bd71608 100644 --- a/readyset-server/src/controller/migrate/materialization/mod.rs +++ b/readyset-server/src/controller/migrate/materialization/mod.rs @@ -429,7 +429,6 @@ impl Materializations { ); mi = parent; indices = map_lookup_indices(m, mi, &indices)?; - #[allow(clippy::indexing_slicing)] // graph must contain mi m = &graph[mi]; } @@ -743,7 +742,7 @@ impl Materializations { self.partial.contains(&pi), "attempting to place full materialization beyond materialization frontier" ); - #[allow(clippy::unwrap_used)] // graph must contain pi + // #[allow(clippy::unwrap_used)] // graph must contain pi graph.node_weight_mut(pi).unwrap().purge = true; } } diff --git a/readyset-server/src/controller/migrate/mod.rs b/readyset-server/src/controller/migrate/mod.rs index 641da76af1..179eb06c1e 100644 --- a/readyset-server/src/controller/migrate/mod.rs +++ b/readyset-server/src/controller/migrate/mod.rs @@ -774,7 +774,6 @@ impl<'df> Migration<'df> { node = ni.index(), "marking node as beyond materialization frontier" ); - #[allow(clippy::unwrap_used)] // ni must belong to the graph self.dataflow_state .ingredients .node_weight_mut(ni) diff --git a/readyset-server/src/controller/mir_to_flow.rs b/readyset-server/src/controller/mir_to_flow.rs index 4e73a2215a..0482172199 100644 --- a/readyset-server/src/controller/mir_to_flow.rs +++ b/readyset-server/src/controller/mir_to_flow.rs @@ -579,6 +579,7 @@ fn make_grouped_node( over_col_indx, group_col_indx.as_slice(), over_col_ty, + &mig.dialect, )?; let agg_col = make_agg_col(grouped.output_col_type().or_ref(over_col_ty).clone()); cols.push(agg_col); @@ -881,7 +882,7 @@ fn lower_expression( DfExpr::lower( expr, dialect, - LowerContext { + &LowerContext { graph, parent_node_idx: parent, parent_cols, @@ -1021,7 +1022,13 @@ fn make_distinct_node( // remaining occurrences of the set. // // We use 0 as a placeholder value - Aggregation::Count.over(parent_na.address(), 0, &group_by_indx, &DfType::Unknown)?, + Aggregation::Count.over( + parent_na.address(), + 0, + &group_by_indx, + &DfType::Unknown, + &mig.dialect, + )?, ); Ok(DfNodeIndex::new(na)) } diff --git a/readyset-server/src/controller/mod.rs b/readyset-server/src/controller/mod.rs index 340b3f3877..68789827ec 100644 --- a/readyset-server/src/controller/mod.rs +++ b/readyset-server/src/controller/mod.rs @@ -707,7 +707,6 @@ impl Controller { } req = self.replicator_channel.receiver.recv() => { fn now() -> u64 { - #[allow(clippy::unwrap_used)] // won't error comparing to UNIX EPOCH SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as u64 } diff --git a/readyset-server/src/controller/sql/mir/grouped.rs b/readyset-server/src/controller/sql/mir/grouped.rs index d35f71e624..ddacf5b894 100644 --- a/readyset-server/src/controller/sql/mir/grouped.rs +++ b/readyset-server/src/controller/sql/mir/grouped.rs @@ -326,7 +326,7 @@ pub(super) fn post_lookup_aggregates( GroupConcat { separator, .. } => PostLookupAggregateFunction::GroupConcat { separator: separator.clone().unwrap_or_else(|| ",".to_owned()), }, - Call { .. } | Substring { .. } => continue, + Extract { .. } | Call { .. } | Substring { .. } => continue, }, }); } diff --git a/readyset-server/src/controller/sql/mir/mod.rs b/readyset-server/src/controller/sql/mir/mod.rs index dd94909d90..927173cba1 100644 --- a/readyset-server/src/controller/sql/mir/mod.rs +++ b/readyset-server/src/controller/sql/mir/mod.rs @@ -2238,10 +2238,41 @@ impl SqlToMirConverter { project_order, ); - let aggregates = if view_key.index_type != IndexType::HashMap { - post_lookup_aggregates(query_graph, query_name)? + let post_lookup_aggregates = if view_key.index_type == IndexType::HashMap { + // If we have aggregates under the IndexType::HashMap, they aren't necessarily + // post-lookup operations. For example, `select sum(col2) from t where col1 = + // ?`, the aggregate will be handled in the dataflow graph. + // But if the query originally contained a `where col1 in + // (?, ?)`, the aggregate does need to be executed as a + // post-lookup. Adding a post-lookup is necessary for `where in` for correctly + // aggregating results, but a mild perf impediment for aggregates with a simple + // equality (we'll run an aggregation on a single row). However, we've lost the + // "did this come from a `where in` information" way above, as it's rewritten in + // the adapter. Hence, to avoid that penalty on all users, + // only add the post-lookup to users who have opted in to + // using post-lookups. + if self.config.allow_post_lookup { + match post_lookup_aggregates(query_graph, query_name) { + Ok(aggs) => aggs, + // This part is a hack. When we get an ReadySetError::Unsupported, + // that is because the aggregate was a AVG, COUNT(DISTINCT..), or + // SUM(DISTINCT..). We can only support those (currently!) when the + // query contained an equality clause, and + // not a `where in` clause (that was + // rewritten as an equality). As mentioned above, we don't know which + // one the original query had, thus this + // code opts to preserve the functionality + // of the simple equality. Once again, this only applies if the user + // opted in to using "experimental" + // post-lookups. + Err(ReadySetError::Unsupported(..)) => None, + Err(e) => return Err(e), + } + } else { + None + } } else { - None + post_lookup_aggregates(query_graph, query_name)? }; let order_by = query_graph @@ -2252,7 +2283,7 @@ impl SqlToMirConverter { let limit = query_graph.pagination.as_ref().map(|p| p.limit); if !self.config.allow_post_lookup - && (aggregates.is_some() || order_by.is_some() || limit.is_some()) + && (post_lookup_aggregates.is_some() || order_by.is_some() || limit.is_some()) { unsupported!("Queries which perform operations post-lookup are not supported"); } @@ -2269,7 +2300,7 @@ impl SqlToMirConverter { limit, returned_cols: Some(returned_cols), default_row: query_graph.default_row.clone(), - aggregates, + aggregates: post_lookup_aggregates, }, ), &[leaf_project_reorder_node], diff --git a/readyset-server/src/controller/sql/mod.rs b/readyset-server/src/controller/sql/mod.rs index 9d6edda276..ffa2f4c2df 100644 --- a/readyset-server/src/controller/sql/mod.rs +++ b/readyset-server/src/controller/sql/mod.rs @@ -6,14 +6,15 @@ use ::mir::visualize::GraphViz; use ::mir::DfNodeIndex; use ::serde::{Deserialize, Serialize}; use nom_sql::{ - CompoundSelectOperator, CompoundSelectStatement, CreateTableBody, DialectDisplay, - FieldDefinitionExpr, NonReplicatedRelation, NotReplicatedReason, Relation, SelectSpecification, - SelectStatement, SqlIdentifier, SqlType, TableExpr, + CompoundSelectOperator, CompoundSelectStatement, CreateTableBody, CreateTableOption, + DialectDisplay, FieldDefinitionExpr, NonReplicatedRelation, NotReplicatedReason, Relation, + SelectSpecification, SelectStatement, SqlIdentifier, SqlType, TableExpr, }; use petgraph::graph::NodeIndex; use readyset_client::query::QueryId; use readyset_client::recipe::changelist::{AlterTypeChange, Change, PostgresTableMetadata}; use readyset_client::recipe::ChangeList; +use readyset_data::dialect::SqlEngine; use readyset_data::{DfType, Dialect, PgEnumMetadata}; use readyset_errors::{ internal, internal_err, invalid_query_err, invariant, unsupported, ReadySetError, @@ -238,6 +239,28 @@ impl SqlIncorporator { Sensitive(&unparsed) ), }; + if dialect.engine() == SqlEngine::MySQL { + let options = match cts.options { + Ok(options) => options, + Err(unparsed) => unsupported!( + "CREATE TABLE {} options failed to parse: {}", + cts.table.display_unquoted(), + Sensitive(&unparsed) + ), + }; + if let Some(CreateTableOption::Engine(Some(storage_engine))) = options + .iter() + .find(|option| matches!(option, CreateTableOption::Engine(Some(_)))) + { + if !dialect.storage_engine_is_supported(storage_engine) { + unsupported!( + "CREATE TABLE {} specifies unsupported storage engine: {}", + cts.table.display_unquoted(), + storage_engine + ) + } + } + } if body.fields.is_empty() { return Err(ReadySetError::TableError { table: cts.table.clone(), diff --git a/readyset-server/src/controller/sql/query_graph.rs b/readyset-server/src/controller/sql/query_graph.rs index 8990759461..d9aad9175d 100644 --- a/readyset-server/src/controller/sql/query_graph.rs +++ b/readyset-server/src/controller/sql/query_graph.rs @@ -869,7 +869,9 @@ fn default_row_for_select(st: &SelectStatement) -> Option> { FunctionExpr::Max(..) => DfValue::None, FunctionExpr::Min(..) => DfValue::None, FunctionExpr::GroupConcat { .. } => DfValue::None, - FunctionExpr::Call { .. } | FunctionExpr::Substring { .. } => DfValue::None, + FunctionExpr::Extract { .. } + | FunctionExpr::Call { .. } + | FunctionExpr::Substring { .. } => DfValue::None, }, _ => DfValue::None, }) diff --git a/readyset-server/src/controller/sql/query_signature.rs b/readyset-server/src/controller/sql/query_signature.rs index d528caf6c5..c91d2d66d7 100644 --- a/readyset-server/src/controller/sql/query_signature.rs +++ b/readyset-server/src/controller/sql/query_signature.rs @@ -12,21 +12,19 @@ pub trait Signature { // TODO: Change relations to Hashset<&'a Relation> #[derive(Clone, Debug)] -pub struct QuerySignature<'a> { - pub relations: HashSet<&'a str>, - pub attributes: HashSet<&'a Column>, +pub struct QuerySignature { pub hash: u64, } -impl<'a> PartialEq for QuerySignature<'a> { +impl PartialEq for QuerySignature { fn eq(&self, other: &QuerySignature) -> bool { self.hash == other.hash } } -impl<'a> Eq for QuerySignature<'a> {} +impl Eq for QuerySignature {} -impl<'a> Hash for QuerySignature<'a> { +impl Hash for QuerySignature { fn hash(&self, state: &mut H) where H: Hasher, @@ -51,7 +49,6 @@ impl Signature for QueryGraph { use std::collections::hash_map::DefaultHasher; let mut hasher = DefaultHasher::new(); - let rels = self.relations.keys().map(|r| r.name.as_str()).collect(); // Compute relations part of hash let mut r_vec: Vec<_> = self.relations.keys().collect(); @@ -129,8 +126,6 @@ impl Signature for QueryGraph { } QuerySignature { - relations: rels, - attributes: attrs, hash: hasher.finish(), } } diff --git a/readyset-server/src/controller/sql/recipe/mod.rs b/readyset-server/src/controller/sql/recipe/mod.rs index a3c01b575d..5c11771f59 100644 --- a/readyset-server/src/controller/sql/recipe/mod.rs +++ b/readyset-server/src/controller/sql/recipe/mod.rs @@ -1,6 +1,6 @@ use std::{fmt, str}; -use nom_sql::{Relation, SelectStatement, SqlIdentifier}; +use nom_sql::{Relation, SelectStatement}; use petgraph::graph::NodeIndex; use readyset_client::recipe::changelist::ChangeList; use readyset_client::ViewCreateRequest; @@ -85,7 +85,7 @@ impl PartialEq for Recipe { #[derive(Debug)] pub(crate) enum Schema<'a> { Table(&'a BaseSchema), - View(&'a [SqlIdentifier]), + View, } impl Recipe { @@ -174,7 +174,7 @@ impl Recipe { None => self.inc.get_view_schema(name), Some(internal_qn) => self.inc.get_view_schema(internal_qn), }; - s.map(Schema::View) + s.map(|_| Schema::View) } Some(s) => Some(Schema::Table(s)), } diff --git a/readyset-server/src/controller/state.rs b/readyset-server/src/controller/state.rs index c336de50fd..90a3127e1b 100644 --- a/readyset-server/src/controller/state.rs +++ b/readyset-server/src/controller/state.rs @@ -1494,7 +1494,7 @@ impl DfState { let idx = { let mut rng = rand::thread_rng(); - rng.gen_range(0, tags.len()) + rng.gen_range(0..tags.len()) }; let (ni, tag) = tags.get(idx).ok_or_else(|| internal_err!())?; @@ -1818,8 +1818,12 @@ impl DfState { self.workers = Default::default(); let mut new_materializations = Materializations::new(); - new_materializations.paths = self.materializations.paths.clone(); - new_materializations.redundant_partial = self.materializations.redundant_partial.clone(); + new_materializations + .paths + .clone_from(&self.materializations.paths); + new_materializations + .redundant_partial + .clone_from(&self.materializations.redundant_partial); new_materializations.tag_generator = self.materializations.tag_generator; new_materializations.config = self.materializations.config.clone(); diff --git a/readyset-server/src/http_router.rs b/readyset-server/src/http_router.rs index 57eeff236d..de99420826 100644 --- a/readyset-server/src/http_router.rs +++ b/readyset-server/src/http_router.rs @@ -12,7 +12,6 @@ use hyper::header::CONTENT_TYPE; use hyper::service::make_service_fn; use hyper::{self, Body, Method, Request, Response, StatusCode}; use readyset_alloc::{dump_stats, memory_and_per_thread_stats}; -use readyset_client::consensus::Authority; use readyset_client::metrics::recorded; use readyset_errors::ReadySetError; use readyset_util::shutdown::ShutdownReceiver; @@ -41,13 +40,12 @@ pub struct NoriaServerHttpRouter { pub worker_tx: Sender, /// Channel to the running `Controller`. pub controller_tx: Sender, - /// The `Authority` used inside the server. - pub authority: Arc, /// Used to record and report the servers current health. pub health_reporter: HealthReporter, /// Used to communicate externally that a failpoint request has been received and successfully /// handled. /// Most commonly used to block on further startup action if --wait-for-failpoint is supplied. + #[allow(dead_code)] pub failpoint_channel: Option>>, } diff --git a/readyset-server/src/integration.rs b/readyset-server/src/integration.rs index 72a9e5b6c5..081015ab41 100644 --- a/readyset-server/src/integration.rs +++ b/readyset-server/src/integration.rs @@ -1532,7 +1532,7 @@ async fn mutator_churn() { "votecount", make_columns(&["id", "votes"]), Aggregation::Count - .over(vote, 0, &[1], &DfType::Unknown) + .over(vote, 0, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); @@ -2040,7 +2040,7 @@ async fn votes() { "vc", make_columns(&["id", "votes"]), Aggregation::Count - .over(vote, 0, &[1], &DfType::Unknown) + .over(vote, 0, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); mig.maintain_anonymous(vc, &Index::hash_map(vec![0])); @@ -2697,7 +2697,7 @@ async fn cascading_replays_with_sharding() { // aggregate over the join. this will force a shard merger to be inserted because the // group-by column ("f2") isn't the same as the join's output sharding column ("f1"/"u") let a = Aggregation::Count - .over(j, 0, &[2], &DfType::Unknown) + .over(j, 0, &[2], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(); let end = mig.add_ingredient("end", make_columns(&["u", "c"]), a); mig.maintain_anonymous_with_reader_processing( @@ -2826,7 +2826,7 @@ async fn full_aggregation_with_bogokey() { "agg", make_columns(&["bogo", "count"]), Aggregation::Count - .over(bogo, 0, &[1], &DfType::Unknown) + .over(bogo, 0, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); mig.maintain_anonymous_with_reader_processing( @@ -2962,7 +2962,7 @@ async fn materialization_frontier() { "votecount", make_columns(&["id", "votes"]), Aggregation::Count - .over(vote, 0, &[1], &DfType::Unknown) + .over(vote, 0, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); mig.mark_shallow(vc); @@ -3258,7 +3258,7 @@ async fn do_full_vote_migration(sharded: bool, old_puts_after: bool) { "votecount", make_columns(&["id", "votes"]), Aggregation::Count - .over(vote, 0, &[1], &DfType::Unknown) + .over(vote, 0, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); @@ -3321,7 +3321,7 @@ async fn do_full_vote_migration(sharded: bool, old_puts_after: bool) { "rsum", make_columns(&["id", "total"]), Aggregation::Sum - .over(rating, 2, &[1], &DfType::Unknown) + .over(rating, 2, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); @@ -3427,7 +3427,7 @@ async fn live_writes() { "votecount", make_columns(&["id", "votes"]), Aggregation::Count - .over(vote, 0, &[1], &DfType::Unknown) + .over(vote, 0, &[1], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); @@ -3471,7 +3471,7 @@ async fn live_writes() { "votecount2", make_columns(&["id", "votes"]), Aggregation::Sum - .over(vc, 1, &[0], &DfType::Unknown) + .over(vc, 1, &[0], &DfType::Unknown, &Dialect::DEFAULT_MYSQL) .unwrap(), ); mig.maintain_anonymous_with_reader_processing( @@ -4337,6 +4337,7 @@ async fn correct_nested_view_schema() { ("swvc.id".into(), DfType::Int), ("swvc.content".into(), DfType::DEFAULT_TEXT), ("swvc.vc".into(), DfType::BigInt), + ("swvc.story".into(), DfType::Int), ]; assert_eq!( q.schema() @@ -8306,9 +8307,9 @@ async fn reroutes_count() { assert_eq!( r2.into_vec(), vec![ + vec![DfValue::Int(2)], vec![DfValue::Int(1)], - vec![DfValue::Int(1)], - vec![DfValue::Int(2)] + vec![DfValue::Int(1)] ] ); @@ -9397,3 +9398,30 @@ async fn evict_single_intermediate_state() { shutdown_tx.shutdown().await; } + +#[tokio::test(flavor = "multi_thread")] +async fn check_supported_mysql_storage_engines() { + let (mut g, shutdown_tx) = start_simple_unsharded("unsupported_engine").await; + + g.extend_recipe( + ChangeList::from_str( + "CREATE TABLE test (value double) ENGINE=MEMORY;", + Dialect::DEFAULT_MYSQL, + ) + .unwrap(), + ) + .await + .expect_err("Should not replicate table with unsupported storage engine"); + + g.extend_recipe( + ChangeList::from_str( + "CREATE TABLE test (value double) ENGINE=innodb;", + Dialect::DEFAULT_MYSQL, + ) + .unwrap(), + ) + .await + .expect("Should replicate table with supported storage engine"); + + shutdown_tx.shutdown().await; +} diff --git a/readyset-server/src/metrics/mod.rs b/readyset-server/src/metrics/mod.rs index 36e1f6211f..8c1ad80dc5 100644 --- a/readyset-server/src/metrics/mod.rs +++ b/readyset-server/src/metrics/mod.rs @@ -1,6 +1,7 @@ //! Support for recording and exporting in-memory metrics using the [`metrics`] crate -use once_cell::sync::OnceCell; +use std::sync::OnceLock; + use thiserror::Error; pub use crate::metrics::composite_recorder::{CompositeMetricsRecorder, RecorderType}; @@ -14,7 +15,7 @@ mod recorders; /// The type of the static, globally accessible metrics recorder. type GlobalRecorder = CompositeMetricsRecorder; -static METRICS_RECORDER: OnceCell<&'static GlobalRecorder> = OnceCell::new(); +static METRICS_RECORDER: OnceLock<&'static GlobalRecorder> = OnceLock::new(); /// Error value returned from [`install_global_recorder`] if a metrics recorder is already set. /// diff --git a/readyset-server/src/startup.rs b/readyset-server/src/startup.rs index 6a95f77d26..006b867abc 100644 --- a/readyset-server/src/startup.rs +++ b/readyset-server/src/startup.rs @@ -187,7 +187,6 @@ async fn start_controller( } async fn start_request_router( - authority: Arc, listen_addr: IpAddr, external_addr: SocketAddr, worker_tx: Sender, @@ -202,7 +201,6 @@ async fn start_request_router( port: external_addr.port(), worker_tx: worker_tx.clone(), controller_tx, - authority: authority.clone(), health_reporter: health_reporter.clone(), failpoint_channel, }; @@ -279,7 +277,6 @@ pub(crate) async fn start_instance_inner( let (tx, rx) = maybe_create_failpoint_chann(wait_for_failpoint); let mut health_reporter = HealthReporter::new(); let http_uri = start_request_router( - authority.clone(), listen_addr, external_addr, worker_tx.clone(), diff --git a/readyset-server/src/worker/mod.rs b/readyset-server/src/worker/mod.rs index e8513d6d7e..383fa4935d 100644 --- a/readyset-server/src/worker/mod.rs +++ b/readyset-server/src/worker/mod.rs @@ -399,9 +399,30 @@ impl Worker { } WorkerRequestKind::KillDomains(domains) => { for addr in domains { + let nsde = || ReadySetError::NoSuchReplica { + domain_index: addr.domain_index.index(), + shard: addr.shard, + replica: addr.replica, + }; match self.domains.remove(&addr) { Some(domain) => { - info!(domain = %addr, "Aborting domain at request of controller"); + info!(domain = %addr, "Shutting down domain"); + + // tell the domain to cleanly shut down. note: this serially shuts down + // the the domains; it could be done in + // parallel. + let (tx, rx) = oneshot::channel(); + domain + .req_tx + .send(WrappedDomainRequest { + req: DomainRequest::Shutdown, + done_tx: tx, + }) + .await + .map_err(|_| nsde())?; + let _ = rx.await.map_err(|_| nsde())?; + + // now, shut down the actaul thread for the domain let _ = domain.abort.send(()); } None => warn!(domain = %addr, "Asked to kill domain that is not running"), @@ -484,6 +505,23 @@ impl Worker { }; select! { + // We use `biased` here to ensure that our shutdown signal will be received and + // acted upon even if the other branches in this `select!` are constantly in a + // ready state (e.g. a stream that has many messages where very little time passes + // between receipt of these messages). More information about this situation can + // be found in the docs for `tokio::select`. + biased; + _ = self.shutdown_rx.recv() => { + debug!("worker shutting down after shutdown signal received"); + let keys: Vec<_> = self.domains.keys().cloned().collect(); + if let Ok(keys) = Vec1::try_from_vec(keys) { + let ret = self.handle_worker_request(WorkerRequestKind::KillDomains(keys)).await; + if let Err(ref e) = ret { + warn!(error = %e, "error on shutting down domains"); + } + } + return; + } req = self.rx.recv() => { if let Some(req) = req { self.process_worker_request(req).await; @@ -493,10 +531,6 @@ impl Worker { return; } } - _ = self.shutdown_rx.recv() => { - debug!("worker shutting down after shutdown signal received"); - return; - } _ = eviction => { self.process_eviction(); } @@ -550,13 +584,13 @@ async fn do_eviction( let span = info_span!("evicting"); let start = std::time::Instant::now(); - let mut used: usize = memory_tracker.allocated_bytes()?; + let used: usize = memory_tracker.allocated_bytes()?; gauge!(recorded::EVICTION_WORKER_HEAP_ALLOCATED_BYTES, used as f64); // Are we over the limit? match memory_limit { None => Ok(()), Some(limit) => { - while used >= limit { + if used >= limit { // we are! time to evict. // add current state sizes (could be out of date, as packet sent below is not // necessarily received immediately) @@ -583,6 +617,7 @@ async fn do_eviction( let actual_over = used - limit; let mut proportional_over = ((total_reported as f64 / used as f64) * actual_over as f64).round() as usize; + // here's how we're going to proceed. // we don't want to _empty_ any views if we can avoid it. // and we also need to be aware that evicting something from one place may cause a @@ -660,8 +695,6 @@ async fn do_eviction( domain_senders.remove(&target); } } - // Check again the allocated memory size - used = memory_tracker.allocated_bytes()?; } histogram!( recorded::EVICTION_WORKER_EVICTION_TIME, diff --git a/readyset-sql-passes/Cargo.toml b/readyset-sql-passes/Cargo.toml index 151d72c648..1af197fb4a 100644 --- a/readyset-sql-passes/Cargo.toml +++ b/readyset-sql-passes/Cargo.toml @@ -6,10 +6,10 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -itertools = "0.10" -tracing = { version = "0.1" } -serde = "1.0.8" -vec1 = "1.6.0" +itertools = { workspace = true } +tracing = { workspace = true } +serde = { workspace = true } +vec1 = { workspace = true } # Local dependencies nom-sql = { path = "../nom-sql" } diff --git a/readyset-sql-passes/src/adapter_rewrites/autoparameterize.rs b/readyset-sql-passes/src/adapter_rewrites/autoparameterize.rs index b37c685ab9..a361254b92 100644 --- a/readyset-sql-passes/src/adapter_rewrites/autoparameterize.rs +++ b/readyset-sql-passes/src/adapter_rewrites/autoparameterize.rs @@ -8,7 +8,6 @@ struct AutoParameterizeVisitor { autoparameterize_equals: bool, autoparameterize_ranges: bool, out: Vec<(usize, Literal)>, - has_aggregates: bool, in_supported_position: bool, param_index: usize, query_depth: u8, @@ -116,7 +115,7 @@ impl<'ast> VisitorMut<'ast> for AutoParameterizeVisitor { e, Expr::Literal(lit) if !matches!(lit, Literal::Placeholder(_)) ) - }) && !self.has_aggregates => + }) => { if self.autoparameterize_equals { let exprs = mem::replace( @@ -365,7 +364,6 @@ pub fn auto_parameterize_query( let mut visitor = AutoParameterizeVisitor { autoparameterize_equals, autoparameterize_ranges, - has_aggregates: query.contains_aggregate_select(), ..Default::default() }; #[allow(clippy::unwrap_used)] // error is !, which can never be returned @@ -555,8 +553,8 @@ mod tests { fn in_with_aggregates() { test_auto_parameterize_mysql( "SELECT count(*) FROM users WHERE id = 1 AND x IN (1, 2)", - "SELECT count(*) FROM users WHERE id = ? AND x IN (1, 2)", - vec![(0, 1.into())], + "SELECT count(*) FROM users WHERE id = ? AND x IN (?, ?)", + vec![(0, 1.into()), (1, 1.into()), (2, 2.into())], ); } diff --git a/readyset-sql-passes/src/adapter_rewrites/mod.rs b/readyset-sql-passes/src/adapter_rewrites/mod.rs index 4518132f94..86a4ce2229 100644 --- a/readyset-sql-passes/src/adapter_rewrites/mod.rs +++ b/readyset-sql-passes/src/adapter_rewrites/mod.rs @@ -351,25 +351,14 @@ impl<'ast> VisitorMut<'ast> for CollapseWhereInVisitor { /// by regular filter nodes in dataflow fn collapse_where_in(query: &mut SelectStatement) -> ReadySetResult> { let mut res = vec![]; - let distinct = query.distinct; - let has_aggregates = query.contains_aggregate_select(); if let Some(ref mut w) = query.where_clause { let mut visitor = CollapseWhereInVisitor::default(); visitor.visit_expr(w)?; res = visitor.out; - // When a `SELECT` statement contains aggregates, such as `SUM` or `COUNT` (or `DISTINCT`, - // which is implemented via COUNT), we can't use placeholders, as those will aggregate key - // lookups into a multi row response, as opposed to a single row response required by - // aggregates. We could support this pretty easily, but for now it's not in-scope - if !res.is_empty() { - if has_aggregates { - unsupported!("Aggregates with parameterized IN are not supported"); - } - if distinct { - unsupported!("DISTINCT with parameterized IN is not supported"); - } + if !res.is_empty() && query.distinct { + unsupported!("DISTINCT with parameterized IN is not supported"); } } Ok(res) diff --git a/readyset-sql-passes/src/expr/constant_fold.rs b/readyset-sql-passes/src/expr/constant_fold.rs index dd8af9d3c9..0d00cd21c9 100644 --- a/readyset-sql-passes/src/expr/constant_fold.rs +++ b/readyset-sql-passes/src/expr/constant_fold.rs @@ -21,7 +21,7 @@ fn const_eval(expr: &Expr, dialect: Dialect) -> ReadySetResult { } } - let dataflow_expr = DataflowExpr::lower(expr.clone(), dialect, ConstEvalLowerContext)?; + let dataflow_expr = DataflowExpr::lower(expr.clone(), dialect, &ConstEvalLowerContext)?; let res = dataflow_expr.eval::(&[])?; res.try_into() } diff --git a/readyset-sql-passes/src/implied_tables.rs b/readyset-sql-passes/src/implied_tables.rs index 41723d19dd..b97dc45338 100644 --- a/readyset-sql-passes/src/implied_tables.rs +++ b/readyset-sql-passes/src/implied_tables.rs @@ -181,7 +181,7 @@ impl<'ast, 'schema> VisitorMut<'ast> for ExpandImpliedTablesVisitor<'schema> { } if let Some(t) = matches.first() { - table.schema = t.schema.clone(); + table.schema.clone_from(&t.schema); } } else { column.table = self.find_table(&column.name); diff --git a/readyset-sql-passes/src/resolve_schemas.rs b/readyset-sql-passes/src/resolve_schemas.rs index 287e5d68d0..d3e0a3c526 100644 --- a/readyset-sql-passes/src/resolve_schemas.rs +++ b/readyset-sql-passes/src/resolve_schemas.rs @@ -108,6 +108,17 @@ impl<'ast, 'schema> VisitorMut<'ast> for ResolveSchemaVisitor<'schema> { visit_mut::walk_table_expr(self, table_expr) } + fn visit_target_table_fk(&mut self, table: &'ast mut Relation) -> Result<(), Self::Error> { + match self.visit_table(table) { + Ok(()) => Ok(()), + Err(ReadySetError::TableNotReplicated { name: _, schema: _ }) => { + table.schema = Some(SqlIdentifier::from("public")); + Ok(()) + } + Err(e) => Err(e), + } + } + fn visit_table(&mut self, table: &'ast mut Relation) -> Result<(), Self::Error> { if table.schema.is_some() { return Ok(()); diff --git a/readyset-telemetry-reporter/Cargo.toml b/readyset-telemetry-reporter/Cargo.toml index fad3216d4f..05efe1ce5c 100644 --- a/readyset-telemetry-reporter/Cargo.toml +++ b/readyset-telemetry-reporter/Cargo.toml @@ -5,29 +5,29 @@ edition = "2021" publish = false [dependencies] -async-trait = "0.1" -backoff = { version = "0.4.0", features = ["tokio"] } +async-trait = { workspace = true } +backoff = { workspace = true, features = ["tokio"] } base64 = "0.13" -derive_builder = "0.11.2" -hex = "0.4" -lazy_static = "1.4" -reqwest = { version = "0.11.7", features = ["json"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -serde_with_macros = "2.0.0" -thiserror = "1.0" +derive_builder = { workspace = true } +hex = { workspace = true } +lazy_static = { workspace = true } +reqwest = { workspace = true, features = ["json"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +serde_with_macros = { workspace = true } +thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } -tracing = { version = "0.1", features = ["release_max_level_debug"] } -readyset-tracing = { path = "../readyset-tracing" } +tracing = { workspace = true, features = ["release_max_level_debug"] } +readyset-tracing = { path = "../readyset-tracing", optional = true } readyset-util = { path = "../readyset-util" } -uuid = { version = "0.8", features = [ "v4" ] } -machine-uid = "0.2" +uuid = { workspace = true, features = ["v4"] } +machine-uid = { workspace = true } blake2= "0.10" readyset-version = { path = "../readyset-version" } -[dev_dependencies] +[dev-dependencies] tokio = { workspace = true, features = ["full", "test-util"] } [features] -test-util = [] +test-util = ["readyset-tracing"] diff --git a/readyset-tools/Cargo.toml b/readyset-tools/Cargo.toml index a8ea0aa2fb..463c7f0200 100644 --- a/readyset-tools/Cargo.toml +++ b/readyset-tools/Cargo.toml @@ -6,14 +6,14 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0.38" +anyhow = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -serde_json = "1.0.69" +serde_json = { workspace = true } readyset-client = { path = "../readyset-client" } tokio = { workspace = true, features = ["full"] } readyset-server = { path = "../readyset-server" } -hyper = { version = "0.14.10" } -bincode = "1.3.3" +hyper = { workspace = true } +bincode = { workspace = true } [[bin]] name = "view_checker" diff --git a/readyset-tracing/Cargo.toml b/readyset-tracing/Cargo.toml index 521eafd514..d108eeeaf4 100644 --- a/readyset-tracing/Cargo.toml +++ b/readyset-tracing/Cargo.toml @@ -7,22 +7,21 @@ edition = "2021" [dependencies] clap = { workspace = true, features = ["derive","env"] } -once_cell = "1.9.0" -parking_lot = "0.12.0" -rand = "0.8.5" -serde = { version = "1.0.136", features = ["derive"] } -thiserror = "1.0.30" +parking_lot = { workspace = true } +rand = { workspace = true } +serde = { workspace = true, features = ["derive"] } +thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } -lazy_static = "1.0" +lazy_static = { workspace = true } -tracing = "0.1.40" -opentelemetry = { version = "0.21.0" } -opentelemetry-otlp = { version = "0.14.0" } -opentelemetry-semantic-conventions = "0.13" -tracing-opentelemetry = "0.22.0" -tracing-subscriber = { version = "0.3.9", features = ["env-filter", "json"] } -tracing-appender = "0.2.3" -opentelemetry_sdk = { version = "0.21.2", features = ["rt-tokio"] } +tracing = { workspace = true } +opentelemetry = { workspace = true } +opentelemetry-otlp = { workspace = true } +opentelemetry-semantic-conventions = { workspace = true } +tracing-opentelemetry = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter", "json"] } +tracing-appender = { workspace = true } +opentelemetry_sdk = { workspace = true, features = ["rt-tokio"] } [dev-dependencies] -tracing-attributes = "0.1.27" +tracing-attributes = { workspace = true } diff --git a/readyset-tracing/src/lib.rs b/readyset-tracing/src/lib.rs index 7e5f1a25ae..5170c72b59 100644 --- a/readyset-tracing/src/lib.rs +++ b/readyset-tracing/src/lib.rs @@ -15,7 +15,6 @@ //! [presampling](presampled) - sampling spans at creation time rather than when a subscriber would //! send them to a collector. -#![feature(core_intrinsics)] use std::fs::File; use std::path::{Path, PathBuf}; use std::sync::Arc; diff --git a/readyset-util/Cargo.toml b/readyset-util/Cargo.toml index 71f82988f8..b5e6148009 100644 --- a/readyset-util/Cargo.toml +++ b/readyset-util/Cargo.toml @@ -7,29 +7,29 @@ edition = "2021" description = "Extensions to the Rust standard library" [dependencies] -backoff = { version = "0.4.0", features = ["tokio"] } -bytes = "1.0" -proptest = "1.0.0" -chrono = { version = "0.4.0", features = ["serde"] } -chrono-tz = "0.8.6" +backoff = { workspace = true, features = ["tokio"] } +bytes = { workspace = true } +proptest = { workspace = true } +chrono = { workspace = true, features = ["serde"] } +chrono-tz = { workspace = true } tokio = { workspace = true, features = ["full"] } -futures = "0.3" -tracing = { version = "0.1", features = ["release_max_level_debug"] } -rust_decimal = { version = "1.26" } +futures = { workspace = true } +tracing = { workspace = true, features = ["release_max_level_debug"] } +rust_decimal = { workspace = true } eui48 = { workspace = true } -uuid = { version = "0.8", features = ["v4"] } -serde_json = "1" -bit-vec = { version = "0.6", features = ["serde"] } -serde = { version = "1.0", features = ["derive"] } -async-stream = "0.3.2" -cidr = "0.2.1" -thiserror = "1.0.26" +uuid = { workspace = true, features = ["v4"] } +serde_json = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +serde = { workspace = true, features = ["derive"] } +async-stream = { workspace = true } +cidr = { workspace = true } +thiserror = { workspace = true } [dev-dependencies] criterion = { workspace = true } -test-strategy = "0.2.0" -rand = "0.8.5" -pprof = { version = "0.13", features = ["flamegraph", "criterion"] } +test-strategy = { workspace = true } +rand = { workspace = true } +pprof = { workspace = true, features = ["flamegraph", "criterion"] } postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] } [features] diff --git a/readyset-util/src/lib.rs b/readyset-util/src/lib.rs index befbba1068..47501d87a1 100644 --- a/readyset-util/src/lib.rs +++ b/readyset-util/src/lib.rs @@ -1,7 +1,7 @@ //! This crate provides miscellaneous utilities and extensions to the Rust standard library, for use //! in all crates in this workspace. #![deny(missing_docs, rustdoc::missing_crate_level_docs)] -#![feature(step_trait, bound_as_ref, bound_map, rustc_attrs)] +#![feature(step_trait, bound_as_ref, rustc_attrs)] #![allow(internal_features)] use std::borrow::Borrow; use std::collections::{BTreeMap, HashMap}; diff --git a/readyset-util/src/nonmaxusize.rs b/readyset-util/src/nonmaxusize.rs index 42d0483419..3c824b43b9 100644 --- a/readyset-util/src/nonmaxusize.rs +++ b/readyset-util/src/nonmaxusize.rs @@ -50,7 +50,9 @@ mod test { std::mem::size_of::() ); - assert!(unsafe { Some(NonMaxUsize(usize::MAX)) }.is_none()); + let expected_none = unsafe { Some(NonMaxUsize(usize::MAX)) }; + assert!(expected_none.is_none()); + assert!(unsafe { Some(NonMaxUsize(usize::MAX - 1)) }.is_some()); assert!(unsafe { Some(NonMaxUsize(0)) }.is_some()); } diff --git a/readyset-version/Cargo.toml b/readyset-version/Cargo.toml index aef1e122f3..ad4cbd09e9 100644 --- a/readyset-version/Cargo.toml +++ b/readyset-version/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -const-str = "0.5" -serde = "1.0.130" +const-str = { workspace = true } +serde = { workspace = true } diff --git a/readyset-version/build.rs b/readyset-version/build.rs index 3b33d70f6f..505abdc23b 100644 --- a/readyset-version/build.rs +++ b/readyset-version/build.rs @@ -21,7 +21,9 @@ fn set_version_info() { /// - $RELEASE_VERSION /// - "unknown-release-version" fn set_release_version() { - env_or_unknown("RELEASE_VERSION", "release-version"); + env_or_unknown_with_fallback("RELEASE_VERSION", "release-version", || { + Some(String::from("unknown-release-version")) + }); } /// Set COMMIT_ID to one of the following, in order: diff --git a/readyset/Cargo.toml b/readyset/Cargo.toml index 2dc5371c07..3b9d4eafb4 100644 --- a/readyset/Cargo.toml +++ b/readyset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "readyset" -version = "1.3.0" +version = "1.6.0" publish = false authors = ["Readyset Technology, Inc. "] edition = "2021" @@ -10,23 +10,22 @@ A real-time SQL caching engine for Postgres and MySQL.""" [dependencies] -anyhow = "1.0" -async-trait = "0.1" +anyhow = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -futures-util = "0.3.0" -fail = "0.5.0" +futures-util = { workspace = true } +fail = { workspace = true } failpoint-macros = { path = "../failpoint-macros" } metrics = { workspace = true } metrics-exporter-prometheus = { workspace = true } tokio = { workspace = true, features = ["full"] } -tokio-native-tls = "0.3.1" -tokio-stream = { version = "0.1.5", features = ["net"] } -tracing = { version = "0.1", features = ["release_max_level_debug"] } -tracing-subscriber = "0.3.9" -tracing-futures = "0.2.5" -reqwest = { version = "0.11", features = ["json"] } -chrono = "0.4" -crossbeam-skiplist = "0.1.1" +tokio-native-tls = { workspace = true } +tokio-stream = { workspace = true, features = ["net"] } +tracing = { workspace = true, features = ["release_max_level_debug"] } +tracing-subscriber = { workspace = true } +tracing-futures = { workspace = true } +reqwest = { workspace = true, features = ["json"] } +chrono = { workspace = true } +crossbeam-skiplist = { workspace = true } # Local dependencies health-reporter = { path = "../health-reporter" } @@ -52,12 +51,12 @@ readyset-telemetry-reporter = { path = "../readyset-telemetry-reporter" } readyset-tracing = { path = "../readyset-tracing" } readyset-version = { path = "../readyset-version" } replicators = { path = "../replicators" } -serde_json = "1.0.89" +serde_json = { workspace = true } [dev-dependencies] -serial_test = "0.5" -temp-dir = "0.1" +serial_test = { workspace = true } +temp-dir = { workspace = true } [features] failure_injection = ["fail/failpoints", "readyset-client/failure_injection", "readyset-server/failure_injection"] diff --git a/readyset/src/lib.rs b/readyset/src/lib.rs index 8265092b8c..876b24808d 100644 --- a/readyset/src/lib.rs +++ b/readyset/src/lib.rs @@ -6,6 +6,7 @@ pub mod psql; mod query_logger; use std::collections::HashMap; use std::fs::remove_dir_all; +use std::future::Future; use std::io; use std::marker::Send; use std::net::{IpAddr, Ipv4Addr, SocketAddr, ToSocketAddrs}; @@ -16,7 +17,6 @@ use std::sync::{Arc, Mutex}; use std::time::{Duration, SystemTime}; use anyhow::{anyhow, bail}; -use async_trait::async_trait; use clap::builder::NonEmptyStringValueParser; use clap::{ArgGroup, Parser, ValueEnum}; use crossbeam_skiplist::SkipSet; @@ -74,19 +74,22 @@ const UPSTREAM_CONNECTION_TIMEOUT: Duration = Duration::from_secs(5); /// Retry interval to use when attempting to connect to the upstream database const UPSTREAM_CONNECTION_RETRY_INTERVAL: Duration = Duration::from_secs(1); -#[async_trait] pub trait ConnectionHandler { type UpstreamDatabase: UpstreamDatabase; type Handler: QueryHandler; - async fn process_connection( + fn process_connection( &mut self, stream: net::TcpStream, backend: Backend, - ); + ) -> impl Future + Send; /// Return an immediate error to a newly-established connection, then immediately disconnect - async fn immediate_error(self, stream: net::TcpStream, error_message: String); + fn immediate_error( + self, + stream: net::TcpStream, + error_message: String, + ) -> impl Future + Send; } /// How to behave when receiving unsupported `SET` statements. diff --git a/readyset/src/mysql.rs b/readyset/src/mysql.rs index 60017f1af3..6438ecfbd6 100644 --- a/readyset/src/mysql.rs +++ b/readyset/src/mysql.rs @@ -1,4 +1,3 @@ -use async_trait::async_trait; use mysql_srv::MySqlIntermediary; use readyset_adapter::upstream_database::LazyUpstream; use readyset_mysql::{MySqlQueryHandler, MySqlUpstream}; @@ -13,7 +12,6 @@ pub struct MySqlHandler { pub enable_statement_logging: bool, } -#[async_trait] impl ConnectionHandler for MySqlHandler { type UpstreamDatabase = LazyUpstream; type Handler = MySqlQueryHandler; diff --git a/readyset/src/psql.rs b/readyset/src/psql.rs index fa4aff04d3..986a265052 100644 --- a/readyset/src/psql.rs +++ b/readyset/src/psql.rs @@ -1,7 +1,6 @@ use std::io::Read; use std::sync::Arc; -use async_trait::async_trait; use clap::Parser; use readyset_adapter::upstream_database::LazyUpstream; use readyset_errors::ReadySetResult; @@ -92,7 +91,6 @@ impl PsqlHandler { } } -#[async_trait] impl ConnectionHandler for PsqlHandler { type UpstreamDatabase = LazyUpstream; type Handler = PostgreSqlQueryHandler; diff --git a/replication-offset/Cargo.toml b/replication-offset/Cargo.toml index 443a9791b9..fbe09a2a07 100644 --- a/replication-offset/Cargo.toml +++ b/replication-offset/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] nom-sql = { path = "../nom-sql" } readyset-errors = { path = "../readyset-errors" } -serde = { version = "1.0", features = ["derive"] } +serde = { workspace = true, features = ["derive"] } readyset-util = { path = "../readyset-util" } -bytes = "1.0" -serde_json = "1.0.89" +bytes = { workspace = true } +serde_json = { workspace = true } diff --git a/replicators/Cargo.toml b/replicators/Cargo.toml index f11c12bb84..631b1afba9 100644 --- a/replicators/Cargo.toml +++ b/replicators/Cargo.toml @@ -6,27 +6,27 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0" -async-trait = "0.1" +anyhow = { workspace = true } +async-trait = { workspace = true } clap = { workspace = true, features = ["derive","env"] } -native-tls = "0.2.7" +native-tls = { workspace = true } tokio = { workspace = true, features = ["full"] } -futures = { version = "0.3" } -fail = "0.5.0" -bytes = "1.0" -chrono = "0.4" -itertools = "0.10" +futures = { workspace = true } +fail = { workspace = true } +bytes = { workspace = true } +chrono = { workspace = true } +itertools = { workspace = true } metrics = { workspace = true } -tracing = { version = "0.1", features = ["release_max_level_debug"] } -tracing-futures = "0.2.5" -serde_json = { version = "1", features = ["arbitrary_precision"] } -hex = "0.4.3" -rust_decimal = { version = "1.26" } -bit-vec = { version = "0.6", features = ["serde"] } -serde = { version = "1.0", features = ["derive"] } -nom_locate = "4.0.0" -deadpool-postgres = "0.10.3" -mysql_common = "0.32" +tracing = { workspace = true, features = ["release_max_level_debug"] } +tracing-futures = { workspace = true } +serde_json = { workspace = true, features = ["arbitrary_precision"] } +hex = { workspace = true } +rust_decimal = { workspace = true } +bit-vec = { workspace = true, features = ["serde"] } +serde = { workspace = true, features = ["derive"] } +nom_locate = { workspace = true } +deadpool-postgres = { workspace = true } +mysql_common = { workspace = true } tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-serde_json-1"] } postgres-types = { workspace = true, features = ["with-chrono-0_4", "with-serde_json-1"] } @@ -43,23 +43,23 @@ mysql-time = { path = "../mysql-time" } mysql-srv = { path = "../mysql-srv" } readyset-data = { path = "../readyset-data" } database-utils = { path = "../database-utils" } -test-utils = { path = "../test-utils" } failpoint-macros = { path = "../failpoint-macros" } readyset-sql-passes = { path = "../readyset-sql-passes" } readyset-telemetry-reporter = { path = "../readyset-telemetry-reporter" } replication-offset = { path = "../replication-offset" } [dev-dependencies] +test-utils = { path = "../test-utils" } readyset-server = { path = "../readyset-server" } readyset-telemetry-reporter = { path = "../readyset-telemetry-reporter", features = ["test-util"] } -readyset-client-test-helpers = { path = "../readyset-client-test-helpers", features = ["postgres"] } +readyset-client-test-helpers = { path = "../readyset-client-test-helpers", features = ["mysql", "postgres"] } proptest-stateful = { path = "../proptest-stateful" } -serial_test = "0.5" -rand = "0.8.5" -proptest = "1.0.0" -test-strategy = "0.2.0" -bincode = "1.3.3" -reqwest = "0.11.3" +serial_test = { workspace = true } +rand = { workspace = true } +proptest = { workspace = true } +test-strategy = { workspace = true } +bincode = { workspace = true } +reqwest = { workspace = true } [features] ddl_vertical_tests = [] diff --git a/replicators/src/db_util.rs b/replicators/src/db_util.rs index f8883533a4..212d8d7aea 100644 --- a/replicators/src/db_util.rs +++ b/replicators/src/db_util.rs @@ -1,6 +1,7 @@ //! Database Utilities //! Contains helpers for determining the schemas and tables of a database for use in replication use std::collections::HashMap; +use std::fmt; use nom_sql::{Dialect, DialectDisplay}; use readyset_errors::ReadySetError; @@ -54,9 +55,9 @@ impl DatabaseSchemas { } } -impl ToString for DatabaseSchemas { - fn to_string(&self) -> String { - format!("{:?}", self) +impl fmt::Display for DatabaseSchemas { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) } } @@ -163,9 +164,9 @@ impl CreateSchema { } } -impl ToString for CreateSchema { - fn to_string(&self) -> String { - format!("{self:?}") +impl fmt::Display for CreateSchema { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{self:?}") } } diff --git a/replicators/src/mysql_connector/connector.rs b/replicators/src/mysql_connector/connector.rs index 222e3b4e45..cdccc292f3 100644 --- a/replicators/src/mysql_connector/connector.rs +++ b/replicators/src/mysql_connector/connector.rs @@ -5,26 +5,29 @@ use std::io; use async_trait::async_trait; use binlog::consts::{BinlogChecksumAlg, EventType}; use metrics::counter; -use mysql::binlog::events::StatusVarVal; +use mysql::binlog::events::{OptionalMetaExtractor, StatusVarVal}; use mysql::binlog::jsonb::{self, JsonbToJsonError}; use mysql::prelude::Queryable; use mysql_async as mysql; use mysql_common::binlog; use mysql_common::binlog::row::BinlogRow; use mysql_common::binlog::value::BinlogValue; -use nom_sql::Relation; +use nom_sql::{Relation, SqlIdentifier}; use readyset_client::metrics::recorded; use readyset_client::recipe::ChangeList; -use readyset_data::{DfValue, Dialect}; +use readyset_client::TableOperation; +use readyset_data::{DfValue, Dialect, TimestampTz}; use readyset_errors::{internal, internal_err, ReadySetError, ReadySetResult}; use replication_offset::mysql::MySqlPosition; use replication_offset::ReplicationOffset; use tracing::{error, info, warn}; +use crate::mysql_connector::utils::mysql_pad_collation_column; use crate::noria_adapter::{Connector, ReplicationAction}; -const CHECKSUM_QUERY: &str = "SET @master_binlog_checksum='CRC32'"; +const CHECKSUM_QUERY: &str = "SET @source_binlog_checksum='CRC32'"; const DEFAULT_SERVER_ID: u32 = u32::MAX - 55; +const MAX_POSITION_TIME: u64 = 10; /// A connector that connects to a MySQL server and starts reading binlogs from a given position. /// @@ -55,6 +58,9 @@ pub(crate) struct MySqlBinlogConnector { current_gtid: Option, /// Whether to log statements received by the connector enable_statement_logging: bool, + /// Timestamp of the last reported position. This is use to ensure we keep the distance + /// between min/max position as short as possible. + last_reported_pos_ts: std::time::Instant, } impl MySqlBinlogConnector { @@ -131,6 +137,8 @@ impl MySqlBinlogConnector { next_position, current_gtid: None, enable_statement_logging, + last_reported_pos_ts: std::time::Instant::now() + - std::time::Duration::from_secs(MAX_POSITION_TIME), }; connector.register_as_replica().await?; @@ -376,7 +384,8 @@ impl MySqlBinlogConnector { /// /// # Arguments /// - /// * `q_event` - the query event to process + /// * `q_event` - the query event to process. + /// * `is_last` - a boolean indicating if this is the last event during catchup. /// /// # Returns /// This function might return an error of type `ReadySetError::SkipEvent` if the query does not @@ -384,6 +393,7 @@ impl MySqlBinlogConnector { async fn process_event_query( &mut self, q_event: mysql_common::binlog::events::QueryEvent<'_>, + is_last: bool, ) -> mysql::Result { // Written when an updating statement is done. if self.enable_statement_logging { @@ -403,14 +413,8 @@ impl MySqlBinlogConnector { // `CREATE TABLE` and `ALTER TABLE` and those always change only one DB. names.first().unwrap().as_str().to_string() } - // If the query does not affect the schema, just keep going - // TODO: Transactions begin with the `BEGIN` queries, but we do not - // currently support those - _ => { - return Err(mysql_async::Error::Other(Box::new( - ReadySetError::SkipEvent, - ))) - } + // Even if the query does not affect the schema, it may still require a table action. + _ => return self.try_non_ddl_action_from_query(q_event, is_last), }; let changes = match ChangeList::from_str(q_event.query(), Dialect::DEFAULT_MYSQL) { @@ -427,12 +431,50 @@ impl MySqlBinlogConnector { Ok(ReplicationAction::DdlChange { schema, changes }) } + /// Attempt to produce a non-DDL [`ReplicationAction`] from the give query. + /// + /// `COMMIT` queries are issued for writes on non-transactional storage engines such as MyISAM. + /// We report the position after the `COMMIT` query if necessary. + /// + /// TRUNCATE statements are also parsed and handled here. + /// + /// TODO: Transactions begin with `BEGIN` queries, but we do not currently support those. + fn try_non_ddl_action_from_query( + &mut self, + q_event: mysql_common::binlog::events::QueryEvent<'_>, + is_last: bool, + ) -> mysql::Result { + use nom_sql::{parse_query, Dialect, SqlQuery}; + match parse_query(Dialect::MySQL, q_event.query()) { + Ok(SqlQuery::Commit(_)) if self.report_position_elapsed() || is_last => { + Ok(ReplicationAction::LogPosition) + } + Ok(SqlQuery::Truncate(truncate)) if truncate.tables.len() == 1 => { + // MySQL only allows one table in the statement, or we would be in trouble. + let mut relation = truncate.tables[0].relation.clone(); + if relation.schema.is_none() { + relation.schema = Some(SqlIdentifier::from(q_event.schema())) + } + Ok(ReplicationAction::TableAction { + table: relation, + actions: vec![TableOperation::Truncate], + txid: self.current_gtid, + }) + } + _ => Err(mysql_async::Error::Other(Box::new( + ReadySetError::SkipEvent, + ))), + } + } + /// Merge table actions into a hashmap of actions. /// If the table already exists in the hashmap, the actions are merged. /// If the table does not exist in the hashmap, a new entry is created. + /// /// # Arguments /// * `map` - the hashmap to merge the actions into /// * `action` - the action to merge + /// /// # Returns /// This function does not return anything, it modifies the hashmap in place. async fn merge_table_actions( @@ -471,11 +513,14 @@ impl MySqlBinlogConnector { /// # Arguments /// /// * `payload_event` - the payload event to process + /// * `is_last` - a boolean indicating if this is the last event during catchup. + /// /// # Returns /// This function returns a vector of all actionable inner events async fn process_event_transaction_payload( &mut self, payload_event: mysql_common::binlog::events::TransactionPayloadEvent<'_>, + is_last: bool, ) -> mysql::Result> { let mut hash_actions: HashMap = HashMap::new(); if self.enable_statement_logging { @@ -497,9 +542,15 @@ impl MySqlBinlogConnector { })? { EventType::QUERY_EVENT => { // We only accept query events in the transaction payload that do not affect the - // schema. Those are BEGIN and COMMIT and they emit a - // `ReadySetError::SkipEvent`. - let _ = match self.process_event_query(binlog_ev.read_event()?).await { + // schema. Those are `BEGIN` and `COMMIT`. `BEGIN` will return a + // `ReadySetError::SkipEvent` and `COMMIT` will return a + // `ReplicationAction::LogPosition` if necessary. We skip + // `ReplicationAction::LogPosition` here because we will report the position + // only once at the end. + match self + .process_event_query(binlog_ev.read_event()?, is_last) + .await + { Err(mysql_async::Error::Other(ref err)) if err.downcast_ref::() == Some(&ReadySetError::SkipEvent) => @@ -507,10 +558,17 @@ impl MySqlBinlogConnector { continue; } Err(err) => return Err(err), - Ok(action) => mysql_async::Error::Other(Box::new(internal_err!( - "Unexpected query event in transaction payload {:?}", - action - ))), + Ok(action) => match action { + ReplicationAction::LogPosition { .. } => { + continue; + } + _ => { + return Err(mysql_async::Error::Other(Box::new(internal_err!( + "Unexpected query event in transaction payload {:?}", + action + )))); + } + }, }; } EventType::WRITE_ROWS_EVENT => { @@ -543,9 +601,34 @@ impl MySqlBinlogConnector { } } } + // We will always have received at least one COMMIT from either COM_QUERY or XID_EVENT. + // To avoid reporting multiple times the same position we only report it once here if + // necessary. + if !hash_actions.is_empty() && (self.report_position_elapsed() || is_last) { + hash_actions.insert( + Relation { + schema: None, + name: SqlIdentifier::from(""), + }, + ReplicationAction::LogPosition, + ); + } Ok(hash_actions.into_values().collect()) } + /// Check whatever we need to report the current position + /// If last_reported_pos_ts has elapsed, update it with the current timestamp. + /// + /// # Returns + /// This function returns a boolean indicating if we need to report the current position + fn report_position_elapsed(&mut self) -> bool { + if self.last_reported_pos_ts.elapsed().as_secs() > MAX_POSITION_TIME { + self.last_reported_pos_ts = std::time::Instant::now(); + return true; + } + false + } + /// Process binlog events until an actionable event occurs. /// /// # Arguments @@ -571,6 +654,13 @@ impl MySqlBinlogConnector { self.next_position.position = u64::from(binlog_event.header().log_pos()); } + let is_last = match until { + Some(limit) => { + let limit = MySqlPosition::try_from(limit).expect("Valid binlog limit"); + self.next_position >= limit + } + None => false, + }; match binlog_event.header().event_type().map_err(|ev| { mysql_async::Error::Other(Box::new(internal_err!( "Unknown binlog event type {}", @@ -588,7 +678,10 @@ impl MySqlBinlogConnector { } EventType::QUERY_EVENT => { - let action = match self.process_event_query(binlog_event.read_event()?).await { + let action = match self + .process_event_query(binlog_event.read_event()?, is_last) + .await + { Ok(action) => action, Err(mysql_async::Error::Other(ref err)) if err.downcast_ref::() @@ -649,12 +742,21 @@ impl MySqlBinlogConnector { EventType::TRANSACTION_PAYLOAD_EVENT => { return Ok(( - self.process_event_transaction_payload(binlog_event.read_event()?) + self.process_event_transaction_payload(binlog_event.read_event()?, is_last) .await?, &self.next_position, )); } + EventType::XID_EVENT => { + // Generated for a commit of a transaction that modifies one or more tables of + // an XA-capable storage engine (InnoDB). + if self.report_position_elapsed() || is_last { + return Ok((vec![ReplicationAction::LogPosition], &self.next_position)); + } + continue; + } + EventType::WRITE_ROWS_EVENT_V1 => unimplemented!(), /* The V1 event numbers are */ // used from 5.1.16 until // mysql-5.6. @@ -735,11 +837,8 @@ impl MySqlBinlogConnector { // We didn't get an actionable event, but we still need to check that we haven't reached // the until limit - if let Some(limit) = until { - let limit = MySqlPosition::try_from(limit).expect("Valid binlog limit"); - if self.next_position >= limit { - return Ok((vec![ReplicationAction::LogPosition], &self.next_position)); - } + if is_last { + return Ok((vec![ReplicationAction::LogPosition], &self.next_position)); } } } @@ -749,22 +848,24 @@ fn binlog_val_to_noria_val( val: &mysql_common::value::Value, col_kind: mysql_common::constants::ColumnType, meta: &[u8], + collation: u16, ) -> mysql::Result { // Not all values are coerced to the value expected by ReadySet directly use mysql_common::constants::ColumnType; - - let buf = match val { - mysql_common::value::Value::Bytes(b) => b, - _ => { - return val.try_into().map_err(|e| { - mysql_async::Error::Other(Box::new(internal_err!("Unable to coerce value {}", e))) - }) - } - }; - + if let mysql_common::value::Value::NULL = val { + return Ok(DfValue::None); + } match (col_kind, meta) { (ColumnType::MYSQL_TYPE_TIMESTAMP2, &[0]) => { + let buf = match val { + mysql_common::value::Value::Bytes(b) => b, + _ => { + return Err(mysql_async::Error::Other(Box::new(internal_err!( + "Expected a byte array for timestamp" + )))); + } + }; //https://github.com/blackbeam/rust_mysql_common/blob/408effed435c059d80a9e708bcfa5d974527f476/src/binlog/value.rs#L144 // When meta is 0, `mysql_common` encodes this value as number of seconds (since UNIX // EPOCH) @@ -774,20 +875,75 @@ fn binlog_val_to_noria_val( // currently set to None return Ok(DfValue::None); } - let time = chrono::naive::NaiveDateTime::from_timestamp_opt(epoch, 0).unwrap(); + let time = chrono::DateTime::from_timestamp(epoch, 0) + .unwrap() + .naive_utc(); // Can unwrap because we know it maps directly to [`DfValue`] Ok(time.into()) } - (ColumnType::MYSQL_TYPE_TIMESTAMP2, _) => { + (ColumnType::MYSQL_TYPE_TIMESTAMP2, meta) => { + let buf = match val { + mysql_common::value::Value::Bytes(b) => b, + _ => { + return Err(mysql_async::Error::Other(Box::new(internal_err!( + "Expected a byte array for timestamp" + )))); + } + }; // When meta is anything else, `mysql_common` encodes this value as number of // seconds.microseconds (since UNIX EPOCH) let s = String::from_utf8_lossy(buf); - let (secs, usecs) = s.split_once('.').unwrap(); // safe to unwrap because format is fixed + let (secs, usecs) = s.split_once('.').unwrap_or((&s, "0")); let secs = secs.parse::().unwrap(); let usecs = usecs.parse::().unwrap(); - let time = chrono::naive::NaiveDateTime::from_timestamp_opt(secs, usecs * 32).unwrap(); - // Can wrap because we know this maps directly to [`DfValue`] - Ok(time.into()) + let time = chrono::DateTime::from_timestamp(secs, usecs * 1000) + .unwrap() + .naive_utc(); + let mut ts: TimestampTz = time.into(); + // The meta[0] is the fractional seconds precision + ts.set_subsecond_digits(meta[0]); + Ok(DfValue::TimestampTz(ts)) + } + (ColumnType::MYSQL_TYPE_STRING, meta) => { + let buf = match val { + mysql_common::value::Value::Bytes(b) => b, + _ => { + return Err(mysql_async::Error::Other(Box::new(internal_err!( + "Expected a byte array for string" + )))); + } + }; + match mysql_pad_collation_column( + buf, + col_kind, + collation, + meta[1] as usize, // 2nd byte of meta is the length of the string + ) { + Ok(s) => Ok(s), + Err(e) => Err(mysql_async::Error::Other(Box::new(internal_err!("{e}")))), + } + } + (ColumnType::MYSQL_TYPE_DATETIME2, meta) => { + //meta[0] is the fractional seconds precision + let df_val: DfValue = val + .try_into() + .map_err(|e| { + mysql_async::Error::Other(Box::new(internal_err!( + "Unable to coerce value {}", + e + ))) + }) + .and_then(|val| match val { + DfValue::TimestampTz(mut ts) => { + ts.set_subsecond_digits(meta[0]); + Ok(DfValue::TimestampTz(ts)) + } + DfValue::None => Ok(DfValue::None), //NULL + _ => Err(mysql_async::Error::Other(Box::new(internal_err!( + "Expected a timestamp" + )))), + })?; + Ok(df_val) } _ => Ok(val.try_into().map_err(|e| { mysql_async::Error::Other(Box::new(internal_err!("Unable to coerce value {}", e))) @@ -799,6 +955,9 @@ fn binlog_row_to_noria_row( binlog_row: &BinlogRow, tme: &binlog::events::TableMapEvent<'static>, ) -> mysql::Result> { + let opt_meta_extractor = OptionalMetaExtractor::new(tme.iter_optional_meta()).unwrap(); + let mut charset_iter = opt_meta_extractor.iter_charset(); + let mut enum_and_set_charset_iter = opt_meta_extractor.iter_enum_and_set_charset(); (0..binlog_row.len()) .map(|idx| { match binlog_row.as_ref(idx).unwrap() { @@ -814,7 +973,17 @@ fn binlog_row_to_noria_row( .unwrap(), tme.get_column_metadata(idx).unwrap(), ); - binlog_val_to_noria_val(val, kind, meta) + let charset = if kind.is_character_type() { + charset_iter.next().transpose()?.unwrap_or_default() + } else if kind.is_enum_or_set_type() { + enum_and_set_charset_iter + .next() + .transpose()? + .unwrap_or_default() + } else { + Default::default() + }; + binlog_val_to_noria_val(val, kind, meta, charset) } BinlogValue::Jsonb(val) => { let json: Result = val.clone().try_into(); // urgh no TryFrom impl diff --git a/replicators/src/mysql_connector/mod.rs b/replicators/src/mysql_connector/mod.rs index 8cb1b9043d..bdf78bc83d 100644 --- a/replicators/src/mysql_connector/mod.rs +++ b/replicators/src/mysql_connector/mod.rs @@ -1,5 +1,7 @@ mod connector; mod snapshot; +mod snapshot_type; +mod utils; pub(crate) use connector::MySqlBinlogConnector; pub(crate) use snapshot::MySqlReplicator; diff --git a/replicators/src/mysql_connector/snapshot.rs b/replicators/src/mysql_connector/snapshot.rs index 89f0ac2199..b0088e4075 100644 --- a/replicators/src/mysql_connector/snapshot.rs +++ b/replicators/src/mysql_connector/snapshot.rs @@ -11,9 +11,11 @@ use itertools::Itertools; use mysql::prelude::Queryable; use mysql::{Transaction, TxOpts}; use mysql_async as mysql; +use mysql_common::constants::ColumnType; +use mysql_srv::ColumnFlags; use nom_sql::{DialectDisplay, NonReplicatedRelation, NotReplicatedReason, Relation}; use readyset_client::recipe::changelist::{Change, ChangeList}; -use readyset_data::Dialect; +use readyset_data::{DfValue, Dialect}; use readyset_errors::{internal_err, ReadySetResult}; use replication_offset::mysql::MySqlPosition; use replication_offset::{ReplicationOffset, ReplicationOffsets}; @@ -21,11 +23,14 @@ use tokio::task::JoinHandle; use tracing::{debug, error, info, info_span, warn}; use tracing_futures::Instrument; +use super::utils::mysql_pad_collation_column; use crate::db_util::DatabaseSchemas; +use crate::mysql_connector::snapshot_type::SnapshotType; +use crate::mysql_connector::utils::MYSQL_BATCH_SIZE; use crate::table_filter::TableFilter; use crate::TablesSnapshottingGaugeGuard; -const BATCH_SIZE: usize = 1000; // How many queries to buffer before pushing to ReadySet +const RS_BATCH_SIZE: usize = 1000; // How many queries to buffer before pushing to ReadySet const MAX_SNAPSHOT_BATCH: usize = 8; // How many tables to snapshot at the same time @@ -204,7 +209,7 @@ impl MySqlReplicator { let mut bad_tables = Vec::new(); // Process `CREATE TABLE` statements for (db, table) in replicated_tables.iter() { - match create_for_table(&mut tx, db, table, TableKind::BaseTable) + let res = create_for_table(&mut tx, db, table, TableKind::BaseTable) .map_err(|e| e.into()) .and_then(|create_table| { debug!(%create_table, "Extending recipe"); @@ -222,11 +227,12 @@ impl MySqlReplicator { changelist.with_schema_search_path(vec![db.clone().into()]), ) }) - .await - { + .await; + + match res { Ok(_) => {} Err(error) => { - warn!(%error, "Error extending CREATE TABLE, table will not be used"); + warn!(%error, "Error extending CREATE TABLE {:?}.{:?}, table will not be used", db, table); // Prevent the table from being snapshotted as well bad_tables.push((db.clone(), table.clone())); @@ -256,7 +262,7 @@ impl MySqlReplicator { // Process `CREATE VIEW` statements for (db, view) in all_views.iter() { - match create_for_table(&mut tx, db, view, TableKind::View) + let res = create_for_table(&mut tx, db, view, TableKind::View) .map_err(|e| e.into()) .and_then(|create_view| { db_schemas.extend_create_schema_for_view( @@ -272,8 +278,9 @@ impl MySqlReplicator { changelist.with_schema_search_path(vec![db.clone().into()]), ) }) - .await - { + .await; + + match res { Ok(_) => {} Err(error) => { warn!(%view, %error, "Error extending CREATE VIEW, view will not be used"); @@ -318,10 +325,8 @@ impl MySqlReplicator { Ok((tx, table_list)) } - /// Call `SELECT * FROM table` and convert all rows into a ReadySet row - /// it may seem inefficient but apparently that is the correct way to - /// replicate a table, and `mysqldump` and `debezium` do just that - pub(crate) async fn dump_table(&self, table: &Relation) -> mysql::Result { + /// Get one transaction that will be used to snapshot table data + pub(crate) async fn get_one_transaction(&self) -> mysql::Result> { let mut tx = self .pool .start_transaction(tx_opts()) @@ -333,23 +338,45 @@ impl MySqlReplicator { .await .map_err(log_err); - let query_count = format!( - "select count(*) from {}", - table.display(nom_sql::Dialect::MySQL) - ); - let query = format!("select * from {}", table.display(nom_sql::Dialect::MySQL)); - Ok(TableDumper { - query_count, - query, - tx, - }) + // Set the timezone to UTC + let _ = tx + .query_drop("SET SESSION time_zone = '+00:00';") + .await + .map_err(log_err); + Ok(tx) } - /// Use the SHOW MASTER STATUS statement to determine the current binary log - /// file name and position. + /// Get MySQL Server Version + async fn get_mysql_version(&self) -> mysql::Result { + let mut conn = self.pool.get_conn().await?; + let version: mysql::Row = conn.query_first("SELECT VERSION()").await?.unwrap(); + let version: String = version.get(0).expect("MySQL version"); + let version_parts: Vec<&str> = version.split('.').collect(); + let major = version_parts[0].parse::().unwrap(); + let minor = version_parts[1].parse::().unwrap(); + let patch = version_parts[2].parse::().unwrap(); + Ok(major * 10000 + minor * 100 + patch) + } + + /// Use the SHOW MASTER STATUS or SHOW BINARY LOG STATUS statement to determine + /// the current binary log file name and position. async fn get_binlog_position(&self) -> mysql::Result { let mut conn = self.pool.get_conn().await?; - let query = "SHOW MASTER STATUS"; + let query = match self.get_mysql_version().await { + Ok(version) => { + if version >= 80400 { + // MySQL 8.4.0 and above + "SHOW BINARY LOG STATUS" + } else { + // MySQL 8.3.0 and below + "SHOW MASTER STATUS" + } + } + Err(err) => { + return Err(err); + } + }; + let pos: mysql::Row = conn.query_first(query).await?.ok_or_else(|| { mysql_async::Error::Other(Box::new(internal_err!( "Empty response for SHOW MASTER STATUS. \ @@ -376,25 +403,39 @@ impl MySqlReplicator { Ok(conn) } - /// Replicate a single table from the provided TableDumper and into ReadySet by - /// converting every MySQL row into ReadySet row and calling `insert_many` in batches - async fn replicate_table( - mut dumper: TableDumper, + /// Copy all the rows from the provided table into ReadySet by + /// converting every MySQL row into ReadySet row and calling `insert_many` in batches. + /// Depending on the table schema, we may use a key-based snapshotting strategy. + /// Which consists of batching rows based on the primary key or unique key of the table. + /// If the table does not have a primary key or unique key, we will use a full table scan. + /// + /// # Arguments + /// * `trx` - The transaction to use for snapshotting. This transaction was opened while the + /// table were locked, meaning it will see the same data as the binlog position recorded for + /// this table. + /// * `table_mutator` - The table mutator to insert the rows into + async fn snapshot_table( + mut trx: Transaction<'static>, mut table_mutator: readyset_client::Table, snapshot_report_interval_secs: u16, ) -> ReadySetResult<()> { let mut cnt = 0; + let mut snapshot_type = SnapshotType::new(&table_mutator)?; + let (count_query, initial_query, bound_base_query) = + snapshot_type.get_queries(&table_mutator); // Query for number of rows first - let nrows: usize = dumper - .tx - .query_first(&dumper.query_count) + let nrows: usize = trx + .query_first(count_query) .await .map_err(log_err)? .unwrap_or(0); - let mut row_stream = dumper.stream().await.map_err(log_err)?; - let mut rows = Vec::with_capacity(BATCH_SIZE); + let mut row_stream = trx + .exec_iter(&initial_query, mysql::Params::Empty) + .await + .map_err(log_err)?; + let mut rows = Vec::with_capacity(RS_BATCH_SIZE); info!(rows = %nrows, "Snapshotting started"); @@ -405,36 +446,63 @@ impl MySqlReplicator { let mut last_report_time = start_time; let snapshot_report_interval_secs = snapshot_report_interval_secs as u64; - loop { - let row = match row_stream.next().await { - Ok(Some(row)) => row, - Ok(None) => break, - Err(err) if cnt == nrows => { - info!(error = %err, "Error encountered during snapshot, but all rows replicated successfully"); - break; - } - Err(err) => { - return Err(log_err(err)); + // Loop until we have no more batches to process + while cnt != nrows { + // Still have rows in this batch + loop { + let row = row_stream.next().await.map_err(log_err)?; + let df_row = match row.as_ref().map(mysql_row_to_noria_row).transpose() { + Ok(Some(df_row)) => df_row, + Ok(None) => break, + Err(err) if cnt == nrows => { + info!(error = %err, "Error encountered during snapshot, but all rows replicated successfully"); + break; + } + Err(err) => { + return Err(log_err(err)); + } + }; + rows.push(df_row); + cnt += 1; + + if rows.len() == RS_BATCH_SIZE { + // We aggregate rows into batches and then send them all to noria + let send_rows = std::mem::replace(&mut rows, Vec::with_capacity(RS_BATCH_SIZE)); + table_mutator + .insert_many(send_rows) + .await + .map_err(log_err)?; } - }; - rows.push(row); - cnt += 1; + if cnt % MYSQL_BATCH_SIZE == 0 && cnt != nrows && snapshot_type.is_key_based() { + // Last row from batch. Update lower bound with last row. + // It's safe to unwrap here because we will break out of the loop at + // mysql_row_to_noria_row if row was None. + snapshot_type.set_lower_bound(row.as_ref().unwrap()); + } - if rows.len() == BATCH_SIZE { - // We aggregate rows into batches and then send them all to noria - let send_rows = std::mem::replace(&mut rows, Vec::with_capacity(BATCH_SIZE)); - table_mutator - .insert_many(send_rows) + if snapshot_report_interval_secs != 0 + && last_report_time.elapsed().as_secs() > snapshot_report_interval_secs + { + last_report_time = Instant::now(); + crate::log_snapshot_progress(start_time.elapsed(), cnt as i64, nrows as i64); + } + } + if cnt != nrows { + // Next batch + row_stream = trx + .exec_iter( + &bound_base_query, + mysql::Params::Positional(snapshot_type.get_lower_bound()?), + ) .await .map_err(log_err)?; - } - - if snapshot_report_interval_secs != 0 - && last_report_time.elapsed().as_secs() > snapshot_report_interval_secs - { - last_report_time = Instant::now(); - crate::log_snapshot_progress(start_time.elapsed(), cnt as i64, nrows as i64); + if row_stream.is_empty() { + return Err(internal_err!( + "Snapshotting for table {:?} stopped before all rows were replicated. Next batch query returned no rows.", + table_mutator.table_name() + )); + } } } @@ -558,7 +626,7 @@ impl MySqlReplicator { let repl_offset = ReplicationOffset::from(self.get_binlog_position().await?); span.in_scope(|| info!("Snapshotting table")); - let dumper = self.dump_table(&table).instrument(span.clone()).await?; + let trx = self.get_one_transaction().instrument(span.clone()).await?; // At this point we have a transaction that will see *that* table at *this* binlog // position, so we can drop the read lock @@ -571,7 +639,7 @@ impl MySqlReplicator { ( table, repl_offset, - Self::replicate_table(dumper, table_mutator, snapshot_report_interval_secs) + Self::snapshot_table(trx, table_mutator, snapshot_report_interval_secs) .instrument(span) .await, ) @@ -702,44 +770,64 @@ impl MySqlReplicator { } } -/// An intermediary struct that can be used to get a stream of ReadySet rows -// This is required because mysql::QueryResult borrows from conn and then -// we have some hard to solve borrowing issues -pub(crate) struct TableDumper { - query_count: String, - query: String, - tx: mysql::Transaction<'static>, -} - -impl TableDumper { - pub(crate) async fn stream(&mut self) -> mysql::Result> { - Ok(TableStream { - query: self.tx.exec_iter(&self.query, ()).await?, - }) - } -} - -// Just another helper struct to make it streamable -pub(crate) struct TableStream<'a> { - query: mysql::QueryResult<'a, 'static, mysql::BinaryProtocol>, -} - -impl<'a> TableStream<'a> { - /// Get the next row from the query response - pub(crate) async fn next<'b>( - &'b mut self, - ) -> ReadySetResult>> { - let next_row = self.query.next().await?; - next_row.map(mysql_row_to_noria_row).transpose() - } -} - /// Convert each entry in a row to a ReadySet type that can be inserted into the base tables -fn mysql_row_to_noria_row(row: mysql::Row) -> ReadySetResult> { +fn mysql_row_to_noria_row(row: &mysql::Row) -> ReadySetResult> { let mut noria_row = Vec::with_capacity(row.len()); for idx in 0..row.len() { let val = value_to_value(row.as_ref(idx).unwrap()); - noria_row.push(readyset_data::DfValue::try_from(val)?); + let col = row.columns_ref().get(idx).unwrap(); + let flags = col.flags(); + match col.column_type() { + ColumnType::MYSQL_TYPE_STRING => { + // ENUM and SET columns are stored as integers and retrieved as strings. We don't + // need padding. + let require_padding = val != mysql_common::value::Value::NULL + && !flags.contains(ColumnFlags::ENUM_FLAG) + && !flags.contains(ColumnFlags::SET_FLAG); + match require_padding { + true => { + let bytes = match val.clone() { + mysql_common::value::Value::Bytes(b) => b, + _ => { + return Err(internal_err!( + "Expected MYSQL_TYPE_STRING column to be of value Bytes, got {:?}", + val + )); + } + }; + match mysql_pad_collation_column( + &bytes, + col.column_type(), + col.character_set(), + col.column_length() as usize, + ) { + Ok(padded) => noria_row.push(padded), + Err(err) => return Err(internal_err!("Error padding column: {}", err)), + } + } + false => noria_row.push(readyset_data::DfValue::try_from(val)?), + } + } + ColumnType::MYSQL_TYPE_DATETIME | ColumnType::MYSQL_TYPE_TIMESTAMP => { + let df_val: DfValue = readyset_data::DfValue::try_from(val) + .map_err(|err| { + internal_err!("Error converting MYSQL_TYPE_DATETIME column: {}", err) + }) + .and_then(|val| match val { + DfValue::TimestampTz(mut ts) => { + ts.set_subsecond_digits(col.decimals()); + Ok(DfValue::TimestampTz(ts)) + } + DfValue::None => Ok(DfValue::None), //NULL + _ => Err(internal_err!( + "Expected MYSQL_TYPE_DATETIME column to be of type TimestampTz, got {:?}", + val + )), + })?; + noria_row.push(df_val); + } + _ => noria_row.push(readyset_data::DfValue::try_from(val)?), + } } Ok(noria_row) } diff --git a/replicators/src/mysql_connector/snapshot_type.rs b/replicators/src/mysql_connector/snapshot_type.rs new file mode 100644 index 0000000000..6d86ba1c20 --- /dev/null +++ b/replicators/src/mysql_connector/snapshot_type.rs @@ -0,0 +1,157 @@ +use itertools::Itertools; +use mysql_async as mysql; +use nom_sql::{Column, DialectDisplay}; +use readyset_errors::{internal_err, ReadySetResult}; + +use super::utils::MYSQL_BATCH_SIZE; + +/// The type of snapshot to be taken +/// KeyBased: Snapshot based on the primary key or unique key +/// FullTableScan: Snapshot the entire table +pub enum SnapshotType { + KeyBased { + keys: Vec, + lower_bound: Option>, + }, + FullTableScan, +} + +impl SnapshotType { + pub fn new(table: &readyset_client::Table) -> ReadySetResult { + let cts = match table.schema() { + Some(cts) => cts, + None => { + return Ok(SnapshotType::FullTableScan); + } + }; + + let keys = if let Some(pk) = cts.get_primary_key() { + pk.get_columns() + } else if let Some(uk) = cts.get_first_unique_key() { + uk.get_columns() + } else { + return Ok(SnapshotType::FullTableScan); + }; + + Ok(SnapshotType::KeyBased { + keys: keys.to_vec(), + lower_bound: None, + }) + } + + /// Get the lower bound for the next query + /// Returns: + /// * The lower bound + /// Errors if the snapshot type is FullTableScan or the lower bound is not set + pub fn get_lower_bound(&mut self) -> ReadySetResult> { + match self { + SnapshotType::KeyBased { + ref mut lower_bound, + .. + } => { + if let Some(lb) = lower_bound.take() { + Ok(lb) + } else { + Err(internal_err!("Lower bound not set")) + } + } + SnapshotType::FullTableScan => Err(internal_err!( + "Full table scan does not require a lower bound" + )), + } + } + + /// Generate the queries to be used for snapshotting the table, given the snapshot type + /// + /// Arguments: + /// * `table` - The table to snapshot + /// + /// Returns: + /// * A tuple containing the count query, the initial query, and the bound based query + pub fn get_queries(&self, table: &readyset_client::Table) -> (String, String, String) { + //TODO(marce): COUNT(1) Or COUNT(PK) might have better performance + let count_query = format!( + "SELECT COUNT(*) FROM {}", + table.table_name().display(nom_sql::Dialect::MySQL) + ); + let (initial_query, bound_based_query) = match self { + SnapshotType::KeyBased { ref keys, .. } => { + let keys = keys + .iter() + .map(|key| key.display(nom_sql::Dialect::MySQL).to_string()) + .collect::>(); + // ORDER BY col1 ASC, col2 ASC, col3 ASC + let order_by = keys.join(" ASC, ") + " ASC"; + + // col1 >= ? AND col2 >= ? AND col3 >= ? + let next_bound = keys.join(" >= ? AND ").to_string() + " >= ?"; + + // (col1, col2, col3) != (?, ?, ?) + let exclude_lower_bound = keys.join(", ").to_string() + + ") != (" + + &keys + .iter() + .map(|_| '?') + .collect::>() + .iter() + .join(", "); + let initial_query = format!( + "SELECT * FROM {} ORDER BY {} LIMIT {}", + table.table_name().display(nom_sql::Dialect::MySQL), + order_by, + MYSQL_BATCH_SIZE + ); + let bound_based_query = format!( + "SELECT * FROM {} WHERE {} AND ({}) ORDER BY {} LIMIT {}", + table.table_name().display(nom_sql::Dialect::MySQL), + next_bound, + exclude_lower_bound, + order_by, + MYSQL_BATCH_SIZE + ); + (initial_query, bound_based_query) + } + SnapshotType::FullTableScan => { + let initial_query = format!( + "SELECT * FROM {}", + table.table_name().display(nom_sql::Dialect::MySQL) + ); + (initial_query.clone(), initial_query) + } + }; + (count_query, initial_query, bound_based_query) + } + + /// Given a row, compute the lower bound for the next query based on the keys and update the + /// lower bound. Note that the lower bound is used twice. One get all the values greater or + /// equal to the lower bound and the other to exclude the lower bound itself. + /// + /// Arguments: + /// * `row` - The row to compute the lower bound from + pub fn set_lower_bound(&mut self, row: &mysql::Row) { + match self { + SnapshotType::KeyBased { + ref keys, + ref mut lower_bound, + } => { + let mut new_lower_bound = keys + .iter() + .map(|key| row.get(key.name.as_str()).unwrap()) + .collect::>(); + new_lower_bound.append(&mut new_lower_bound.clone()); + *lower_bound = Some(new_lower_bound); + } + SnapshotType::FullTableScan => { + unreachable!("Full table scan does not require a lower bound") + } + } + } + + /// Check if the snapshot type is key based + /// + /// Returns: + /// * True if the snapshot type is key based, false otherwise + pub fn is_key_based(&self) -> bool { + matches!(self, SnapshotType::KeyBased { .. }) + } +} diff --git a/replicators/src/mysql_connector/utils.rs b/replicators/src/mysql_connector/utils.rs new file mode 100644 index 0000000000..943f0e6f78 --- /dev/null +++ b/replicators/src/mysql_connector/utils.rs @@ -0,0 +1,50 @@ +use std::string::FromUtf8Error; +use std::sync::Arc; + +use mysql_common::collations::{self, Collation, CollationId}; +use mysql_srv::ColumnType; +use readyset_data::DfValue; + +//TODO(marce): Make this a configuration parameter or dynamically adjust based on the table size +pub const MYSQL_BATCH_SIZE: usize = 100_000; // How many rows to fetch at a time from MySQL + +/// Pad a MYSQL_TYPE_STRING (CHAR / BINARY) column value to the correct length for the given column +/// type and charset. +/// +/// Parameters: +/// - `val`: The current column value as a vector of bytes. +/// - `col`: The column type. +/// - `collation`: The collation ID of the column. +/// - `col_len`: The length of the column in bytes. +/// +/// Returns: +/// - A `DfValue` representing the padded column value - `CHAR` will return a `TinyText` or `Text` +/// and `BINARY` will return a `ByteArray`. +pub fn mysql_pad_collation_column( + val: &[u8], + col: ColumnType, + collation: u16, + col_len: usize, +) -> Result { + assert_eq!(col, ColumnType::MYSQL_TYPE_STRING); + let collation: Collation = collations::CollationId::from(collation).into(); + match collation.id() { + CollationId::BINARY => { + if val.len() < col_len { + let mut padded = val.to_owned(); + padded.extend(std::iter::repeat(0).take(col_len - val.len())); + return Ok(DfValue::ByteArray(Arc::new(padded))); + } + Ok(DfValue::ByteArray(Arc::new(val.to_vec()))) + } + _ => { + let column_length_characters = col_len / collation.max_len() as usize; + let mut str = String::from_utf8(val.to_vec())?; + let str_len = str.chars().count(); + if str_len < column_length_characters { + str.extend(std::iter::repeat(' ').take(column_length_characters - str_len)); + } + Ok(DfValue::from(str)) + } + } +} diff --git a/replicators/src/noria_adapter.rs b/replicators/src/noria_adapter.rs index c65fb0ef94..8f6125ac8f 100644 --- a/replicators/src/noria_adapter.rs +++ b/replicators/src/noria_adapter.rs @@ -824,7 +824,7 @@ impl NoriaAdapter { return Err(ReadySetError::ResnapshotNeeded); } - changelist = changelist.with_schema_search_path(vec![schema.into()]); + changelist = changelist.with_schema_search_path(vec![schema.clone().into()]); // Collect a list of all tables we're creating for later let tables = changelist @@ -862,6 +862,15 @@ impl NoriaAdapter { reason: NotReplicatedReason::from_string(&error.to_string()), })) })); + for change in changelist.changes_mut() { + match change { + Change::AddNonReplicatedRelation(NonReplicatedRelation { + ref mut name, + .. + }) if name.schema.is_none() => name.schema = Some((&schema).into()), + _ => (), + } + } self.noria.extend_recipe(changelist).await?; } Ok(_) => {} diff --git a/replicators/src/postgres_connector/ddl_replication.rs b/replicators/src/postgres_connector/ddl_replication.rs index 9f3f552f9a..e65109d857 100644 --- a/replicators/src/postgres_connector/ddl_replication.rs +++ b/replicators/src/postgres_connector/ddl_replication.rs @@ -184,6 +184,7 @@ pub(crate) struct DdlEvent { /// This is just an ugly wrapper because `deserialize_with` doesn't play well with Options #[derive(Debug, Deserialize, Clone)] +#[allow(dead_code)] pub(crate) struct ParsedStatement(#[serde(deserialize_with = "parse_pgsql")] SqlQuery); fn parse_pgsql<'de, D>(deserializer: D) -> Result diff --git a/replicators/src/postgres_connector/snapshot.rs b/replicators/src/postgres_connector/snapshot.rs index d2c822a405..6877b0bad2 100644 --- a/replicators/src/postgres_connector/snapshot.rs +++ b/replicators/src/postgres_connector/snapshot.rs @@ -64,6 +64,7 @@ enum ConstraintKind { PrimaryKey, UniqueKey, ForeignKey, + #[allow(dead_code)] Other(u8), } @@ -711,6 +712,10 @@ impl<'a> PostgresReplicator<'a> { trace!(?view_list, "Loaded view list"); trace!(?custom_types, "Loaded custom types"); + self.drop_leftover_tables(&table_list, &view_list) + .await + .map_err(|e| e.context("Error while cleaning up leftover cache tables"))?; + self.set_replica_identity_for_tables(&table_list).await?; self.noria @@ -766,15 +771,11 @@ impl<'a> PostgresReplicator<'a> { } } - self.drop_leftover_tables(&table_list, &view_list) - .await - .map_err(|e| e.context("Error while cleaning up leftover cache tables"))?; - // For each table, retrieve its structure let mut tables = Vec::with_capacity(table_list.len()); for table in table_list { let table_name = &table.name.clone().to_string(); - match table + let res = table .get_table(get_transaction!(self)) .and_then(|create_table| { future::ready( @@ -809,8 +810,9 @@ impl<'a> PostgresReplicator<'a> { )) .map_ok(|_| create_table) }) - .await - { + .await; + + match res { Ok(create_table) => { tables.push(create_table); } @@ -836,7 +838,7 @@ impl<'a> PostgresReplicator<'a> { let view_name = view.name.clone(); let view_schema = view.schema.clone(); - match view + let res = view .get_create_view(get_transaction!(self)) .map_err(|e| e.into()) .and_then(|create_view| { @@ -856,8 +858,9 @@ impl<'a> PostgresReplicator<'a> { .with_schema_search_path(vec![view_schema.clone().into()]), ) }) - .await - { + .await; + + match res { Ok(_) => {} Err(error) => { warn!( @@ -1042,12 +1045,13 @@ impl<'a> PostgresReplicator<'a> { } /// Get a list of ReadySet cache tables and compare against the list of upstream tables and - /// views, dropping any cache tables that are missing upstream. + /// views, dropping any cache tables that are missing upstream or newly filtered out. /// /// This function is called during snapshotting to detect and handle cases where we somehow /// have a leftover cache that doesn't correspond to any upstream table or view. Without /// removing such tables, we can run potentially run into problems later on where we panic due - /// to failure to get a replication offset. + /// to failure to get a replication offset. This also allows us to forget about previously + /// replicated base tables that have since been filtered, e.g. by `--replication-tables-ignore`. async fn drop_leftover_tables( &mut self, table_list: &[TableEntry], diff --git a/replicators/tests/ddl_vertical_mysql.rs b/replicators/tests/ddl_vertical_mysql.rs new file mode 100644 index 0000000000..cbbc04460e --- /dev/null +++ b/replicators/tests/ddl_vertical_mysql.rs @@ -0,0 +1,970 @@ +//! This test suite implements the [Replicator Vertical Testing Doc][doc]. +//! +//! [doc]: https://docs.google.com/document/d/1GRYV7okEzz2T-KuF06M5Y4EkyRv7euMSb1viroT9JTk +//! +//! Note that this test suite is ignored by default, and conditionally de-ignored with the +//! `ddl_vertical_tests` feature to prevent it running in normal builds (since it's slow and may +//! find new bugs); to run it locally run: +//! +//! ```notrust +//! cargo test -p replicators --features ddl_vertical_tests --test ddl_vertical_mysql +//! ``` +//! +//! This test suite will connect to a local MySQL database, which can be set up with all the +//! correct configuration using the `docker-compose.yml` and `docker-compose.override.example.yml` +//! in the build directory of the repository. To run that MySQL database, run: +//! +//! ```notrust +//! $ cp docker-compose.override.example.yml docker-compose.yml +//! $ docker-compose up -d MySQL +//! ``` +//! +//! Note that this test suite requires the *exact* configuration specified in that docker-compose +//! configuration, including the port, username, and password. + +use std::cell::RefCell; +use std::collections::{BTreeMap, HashSet}; +use std::fmt::{Debug, Formatter, Result}; +use std::iter::once; +use std::panic::AssertUnwindSafe; +use std::time::Duration; + +use async_trait::async_trait; +use itertools::Itertools; +use mysql_async::prelude::Queryable; +use mysql_async::{Conn, OptsBuilder, Params, Row}; +use nom_sql::{DialectDisplay, SqlType}; +use proptest::prelude::*; +use proptest::strategy::{BoxedStrategy, Just, Strategy}; +use proptest::{collection, sample}; +use proptest_stateful::{ + proptest_config_with_local_failure_persistence, ModelState, ProptestStatefulConfig, +}; +use readyset_client::SingleKeyEviction; +use readyset_client_test_helpers::mysql_helpers::MySQLAdapter; +use readyset_client_test_helpers::{mysql_helpers, TestBuilder}; +use readyset_data::DfValue; +use readyset_server::Handle; +use readyset_util::arbitrary::arbitrary_timestamp_naive_date_time; +use readyset_util::eventually; +use readyset_util::shutdown::ShutdownSender; + +// Disabling update case while REA-4432 is being worked on +//const SQL_NAME_REGEX: &str = "[a-zA-Z_][a-zA-Z0-9_]*"; +const SQL_NAME_REGEX: &str = "[a-z_][a-z0-9_]+"; + +/// This struct is used to generate arbitrary column specifications, both for creating tables, and +/// potentially for altering them by adding columns and such. +#[derive(Clone)] +struct ColumnSpec { + name: String, + sql_type: SqlType, + gen: BoxedStrategy, +} + +// The debug output for the generators can be really verbose and is usually not helpful, so we +// custom derive Debug to skip that part: +impl Debug for ColumnSpec { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + f.debug_struct("ColumnSpec") + .field("name", &self.name) + .field("sql_type", &self.sql_type) + .finish() + } +} + +impl Arbitrary for ColumnSpec { + type Parameters = BTreeMap>; + type Strategy = BoxedStrategy; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + let name_gen = SQL_NAME_REGEX + .prop_filter("Can't generate additional columns named id", |s| { + s.to_lowercase() != "id" + }); + let col_types = vec![ + ( + SqlType::Int(None), + any::().prop_map(DfValue::from).boxed(), + ), + ( + SqlType::Real, + any::() + // unwrap is fine because the f32 Arbitrary impl only yields finite values + .prop_map(|f| DfValue::try_from(f).unwrap()) + .boxed(), + ), + ( + SqlType::Text, + any::().prop_map(DfValue::from).boxed(), + ), + ( + SqlType::Blob, + any::>().prop_map(DfValue::from).boxed(), + ), + ( + SqlType::DateTime(None), + arbitrary_timestamp_naive_date_time() + .prop_map(DfValue::from) + .boxed(), + ), + ( + SqlType::Timestamp, + arbitrary_timestamp_naive_date_time() + .prop_map(DfValue::from) + .boxed(), + ), + ]; + (name_gen, sample::select(col_types)) + .prop_map(|(name, (sql_type, gen))| ColumnSpec { + name, + sql_type, + gen, + }) + .boxed() + } +} + +/// Each Operation represents one step to take in a given test run. +#[derive(Clone, Debug)] +enum Operation { + /// Create a new table with the given name and columns + CreateTable(String, Vec), + /// Drop the table with the given name + DropTable(String), + /// Write a random row to a random table with the given primary key + /// (The [`SqlTypes`] values are just to check preconditions so that we don't try to write a + /// row to a table whose column types don't match the row we originally generated.) + WriteRow { + table: String, + pkey: i32, + col_vals: Vec, + col_types: Vec, + }, + /// Delete rows to a given table that match a given key + DeleteRow(String, i32), + /// Adds a new column to an existing table + AddColumn(String, ColumnSpec), + /// Removes a column from an existing table + DropColumn(String, String), + /// Alters a column to a different name + AlterColumnName { + table: String, + col_name: String, + new_name: String, + }, + /// Creates a simple view that does a SELECT * on a given table + CreateSimpleView { name: String, table_source: String }, + /// Creates a view that does a SELECT * on a JOIN of two tables + CreateJoinView { + name: String, + table_a: String, + table_b: String, + }, + /// Drops the view with the given name + DropView(String), + /// This operation triggers an eviction of a single key in ReadySet, using `inner` as the + /// payload for the /evict_single RPC. + /// + /// The payload is initialized to `None`, which triggers a random eviction the first time this + /// operation is run. `inner` is then updated with the `SingleKeyResult` returned by the + /// /evict_single RPC, so that if this operation is run again, we can trigger the same eviction + /// again. This behavior is necessary to ensure consistent results when attempting to reproduce + /// a failing test case. + Evict { + inner: RefCell>, + }, +} + +// Generators for Operation: + +fn gen_column_specs() -> impl Strategy> { + collection::vec(any_with::(Default::default()), 1..4) + .prop_filter("duplicate column names not allowed", |specs| { + specs.iter().map(|cs| &cs.name).all_unique() + }) +} + +prop_compose! { + fn gen_create_table() + (name in SQL_NAME_REGEX, cols in gen_column_specs()) + -> Operation { + Operation::CreateTable(name, cols) + } +} + +prop_compose! { + fn gen_drop_table(tables: Vec)(t in sample::select(tables)) -> Operation { + Operation::DropTable(t) + } +} + +prop_compose! { + fn gen_write_row(tables: BTreeMap>, pkeys: BTreeMap>) + (t in sample::select(tables.keys().cloned().collect::>())) + (col_vals in tables[&t].iter().map(|cs| cs.gen.clone()).collect::>(), + col_types in Just(tables[&t].iter().map(|cs| cs.sql_type.clone()).collect()), + table in Just(t)) + -> Operation { + let table_keys = &pkeys[&table]; + // Find the first unused key: + let pkey = (0..).find(|k| !table_keys.contains(k)).unwrap(); + Operation::WriteRow { table, pkey, col_vals, col_types } + } +} + +prop_compose! { + fn gen_add_col_unfiltered(tables: Vec) + (t in sample::select(tables), col in any::()) + -> Operation { + Operation::AddColumn(t, col) + } +} + +fn gen_add_col(tables: BTreeMap>) -> impl Strategy { + gen_add_col_unfiltered(tables.keys().cloned().collect()).prop_filter( + "Can't add a new column with a duplicate name", + move |op| match op { + Operation::AddColumn(table, new_cs) => { + new_cs.name != "id" + && !tables[table] + .iter() + .any(|table_cs| new_cs.name.eq_ignore_ascii_case(&table_cs.name)) + } + _ => unreachable!(), + }, + ) +} + +fn gen_non_id_col_name() -> impl Strategy { + SQL_NAME_REGEX.prop_filter("Can't generate additional columns named id", |s| { + s.to_lowercase() != "id" + }) +} + +prop_compose! { + fn gen_rename_col(tables: BTreeMap>, tables_with_cols: Vec) + (table in sample::select(tables_with_cols)) + (col_name in sample::select( + tables[&table] + .iter() + .map(|cs| cs.name.clone()) + .collect::>()), + new_name in gen_non_id_col_name(), + table in Just(table)) + -> Operation { + Operation::AlterColumnName { table, col_name, new_name } + } +} + +prop_compose! { + fn gen_drop_col(tables: BTreeMap>, tables_with_cols: Vec) + (table in sample::select(tables_with_cols)) + (col_name in sample::select( + tables[&table] + .iter() + .map(|cs| cs.name.clone()) + .collect::>()), + table in Just(table)) + -> Operation { + Operation::DropColumn(table, col_name) + } +} + +prop_compose! { + fn gen_delete_row(non_empty_tables: Vec, pkeys: BTreeMap>) + (table in sample::select(non_empty_tables)) + (key in sample::select(pkeys[&table].clone()), + table in Just(table)) + -> Operation { + Operation::DeleteRow(table, key) + } +} + +prop_compose! { + fn gen_create_simple_view(tables: Vec) + (name in SQL_NAME_REGEX, + table_source in sample::select(tables)) + -> Operation { + Operation::CreateSimpleView { name, table_source } + } +} + +prop_compose! { + fn gen_create_join_view(tables: Vec) + (name in SQL_NAME_REGEX, + source_tables in sample::subsequence(tables, 2..=2)) + -> Operation { + let table_a = source_tables[0].clone(); + let table_b = source_tables[1].clone(); + Operation::CreateJoinView { name, table_a, table_b } + } +} + +prop_compose! { + fn gen_drop_view(views: Vec)(name in sample::select(views)) -> Operation { + Operation::DropView(name) + } +} + +/// A definition for a test view. Currently one of: +/// - Simple (SELECT * FROM table) +/// - Join (SELECT * FROM table_a JOIN table_b ON table_a.id = table_b.id) +#[derive(Clone, Debug)] +enum TestViewDef { + Simple(String), + Join { table_a: String, table_b: String }, +} + +struct DDLTestRunContext { + rs_host: String, + rs_conn: Conn, + mysql_conn: Conn, + shutdown_tx: Option, // Needs to be Option so we can move it out of the struct + _handle: Handle, +} + +/// A model of the current test state, used to help generate operations in a way that we expect to +/// succeed, as well as to assist in shrinking, and to determine postconditions to check during +/// test runtime. +/// +/// Initially we assume an empty database, but as operations are generated, tracking their expected +/// results helps inform which operations we are able to test further along in the test case. For +/// example, when writing a row, we must pick a table to write the row to, so we must look at the +/// model state to see what tables have been previously created. We don't actually run a test case +/// until all the steps have been generated, so [`DDLModelState`] allows us to simulate the +/// expected state of the system for a given test case without having to actually run any of the +/// steps against the system under test. +#[derive(Clone, Debug, Default)] +struct DDLModelState { + // We use BTreeMap instead of HashMap so that the `keys()` method gives us a deterministic + // ordering, which allows us to reliably regenerate the same test case for a given seed. + tables: BTreeMap>, + deleted_tables: HashSet, + pkeys: BTreeMap>, // Primary keys in use for each table + // Map of view name to view definition + views: BTreeMap, + deleted_views: HashSet, +} + +#[async_trait(?Send)] +impl ModelState for DDLModelState { + type Operation = Operation; + type RunContext = DDLTestRunContext; + type OperationStrategy = BoxedStrategy; + + /// Each invocation of this function returns a [`Vec`] of [`Strategy`]s for generating + /// [`Operation`]s *given the current state of the test model*. With a brand new model, the only + /// possible operation is [`Operation::CreateTable`], but as + /// tables/types are created and rows are written, other operations become possible. + /// + /// Note that there is some redundancy between the logic in this function and the logic in + /// [`Operation::preconditions`](enum.Operation.html#method.preconditions). This is necessary + /// because `op_generators` is used for the initial test generation, but the preconditions are + /// used during shrinking. (Technically, we do also check and filter on preconditions at the + /// start of each test, but it's best to depend on that check as little as possible since + /// test filters like that can lead to slow and lopsided test generation.) + fn op_generators(&self) -> Vec { + let create_table_strat = gen_create_table().boxed(); + // We can also always try to issue an eviction: + let evict_strategy = Just(Operation::Evict { + inner: RefCell::new(None), + }) + .boxed(); + + let mut possible_ops = vec![create_table_strat, evict_strategy]; + + // If we have at least one table, we can do any of: + // * delete a table + // * write a row + // * add a column + // * create a simple view + if !self.tables.is_empty() { + let drop_strategy = gen_drop_table(self.tables.keys().cloned().collect()).boxed(); + let write_strategy = gen_write_row(self.tables.clone(), self.pkeys.clone()).boxed(); + let add_col_strat = gen_add_col(self.tables.clone()).boxed(); + let create_simple_view_strat = + gen_create_simple_view(self.tables.keys().cloned().collect()).boxed(); + + possible_ops.extend([ + drop_strategy, + write_strategy, + add_col_strat, + create_simple_view_strat, + ]); + } + + // If we have at least two tables, we can create a join view: + if self.tables.len() > 1 { + let create_join_view_strat = + gen_create_join_view(self.tables.keys().cloned().collect()).boxed(); + possible_ops.push(create_join_view_strat); + } + + // If we have at least one view in existence, we can drop one: + if !self.views.is_empty() { + let drop_view_strategy = gen_drop_view(self.views.keys().cloned().collect()).boxed(); + possible_ops.push(drop_view_strategy); + } + + // If we have a table with at least one (non-pkey) column, we can rename or drop a column: + let tables_with_cols: Vec = self + .tables + .iter() + .filter_map(|(table, columns)| { + if columns.is_empty() { + None + } else { + Some(table) + } + }) + .cloned() + .collect(); + if !tables_with_cols.is_empty() { + // This is cloned so that we can move it into the closures for rename_col_strat: + let rename_col_strat = + gen_rename_col(self.tables.clone(), tables_with_cols.clone()).boxed(); + possible_ops.push(rename_col_strat); + + let _drop_col_strategy = gen_drop_col(self.tables.clone(), tables_with_cols).boxed(); + // Commented out for now because this triggers REA-2216 + // possible_ops.push(drop_col_strategy); + } + // If we have at least one row written to a table, we can generate delete ops: + let non_empty_tables: Vec = self + .pkeys + .iter() + .filter_map(|(table, pkeys)| { + if !pkeys.is_empty() { + Some(table.clone()) + } else { + None + } + }) + .collect(); + if !non_empty_tables.is_empty() { + let delete_strategy = gen_delete_row(non_empty_tables, self.pkeys.clone()).boxed(); + possible_ops.push(delete_strategy); + } + possible_ops + } + + /// This method is used to update `self` based on the expected results of executing a single + /// [`Operation`]. It is used during test generation, but notably, we repeat the same sequence + /// of state updates at runtime since we depend on the current state of the model to check + /// postconditions when we're actually executing a given test case. + /// + /// In theory we could choose to only run through the sequence of `next_state` calls once at + /// test generation time, and save each intermediate state for use at runtime, but that would + /// be more complex to implement and it's questionable whether it would actually be more + /// efficient. Additionally, if we ever want to add symbolic placeholders to the state (for + /// representing return values of operations at runtime) then the runtime state will actually + /// differ from the generation-time state, and running through the sequence of `next_state` + /// calls two separate times will become strictly necessary as a result. + fn next_state(&mut self, op: &Operation) { + match op { + Operation::CreateTable(name, cols) => { + self.tables.insert(name.clone(), cols.clone()); + self.pkeys.insert(name.clone(), vec![]); + self.deleted_tables.remove(name); + // Also remove the name from deleted_views if it exists, since we should no longer + // expect "SELECT * FROM name" to return an error and can stop checking that + // postcondition: + self.deleted_views.remove(name); + } + Operation::DropTable(name) => { + self.tables.remove(name); + self.deleted_tables.insert(name.clone()); + self.pkeys.remove(name); + self.views.retain(|_view_name, view_def| match view_def { + TestViewDef::Simple(table_source) => name != table_source, + TestViewDef::Join { table_a, table_b } => name != table_a && name != table_b, + }); + } + Operation::WriteRow { table, pkey, .. } => { + self.pkeys.get_mut(table).unwrap().push(*pkey); + } + Operation::AddColumn(table, col_spec) => { + let col_specs = self.tables.get_mut(table).unwrap(); + col_specs.push(col_spec.clone()); + } + Operation::DropColumn(table, col_name) => { + let col_specs = self.tables.get_mut(table).unwrap(); + col_specs.retain(|cs| cs.name != *col_name); + } + Operation::AlterColumnName { + table, + col_name, + new_name, + } => { + let col_specs = self.tables.get_mut(table).unwrap(); + let spec = col_specs + .iter_mut() + .find(|cs| cs.name == *col_name) + .unwrap(); + spec.name.clone_from(new_name); + // MySQL does not update the column name in views when the column is renamed in the + // table. We need to drop all views pointing to the table. + self.views.retain(|_view_name, view_def| match view_def { + TestViewDef::Simple(table_source) => table != table_source, + TestViewDef::Join { table_a, table_b } => table != table_a && table != table_b, + }); + } + Operation::DeleteRow(..) => (), + Operation::CreateSimpleView { name, table_source } => { + self.views + .insert(name.clone(), TestViewDef::Simple(table_source.clone())); + self.deleted_views.remove(name); + // Also remove the name from deleted_tables if it exists, since we should no longer + // expect "SELECT * FROM name" to return an error and can stop checking that + // postcondition: + self.deleted_tables.remove(name); + } + Operation::CreateJoinView { + name, + table_a, + table_b, + } => { + let table_a = table_a.clone(); + let table_b = table_b.clone(); + let view_def = TestViewDef::Join { table_a, table_b }; + self.views.insert(name.clone(), view_def); + self.deleted_views.remove(name); + // See comment in CreateSimpleView clause above for why this is needed: + self.deleted_tables.remove(name); + } + Operation::DropView(name) => { + self.views.remove(name); + self.deleted_views.insert(name.clone()); + } + Operation::Evict { .. } => (), + } + } + + /// Checks preconditions for an [`Operation`] given a current test model state. + /// + /// These are primarily needed for shrinking, so that we can make sure that we don't do things + /// like remove a [`Operation::CreateTable`] when a later [`Operation::WriteRow`] operation + /// depends on the corresponding table. + /// + /// We also check preconditions during runtime, and throw out any test cases where the + /// preconditions aren't satisfied. This should be rare, though, because + /// [`DDLModelState::op_generators`] should *usually* only generate cases where the + /// preconditions are already satisfied. It's possible there are weird corner cases though + /// (such as multiple random strings happening to generate the same string value for two + /// different table names) where preconditions could save us from a false positive test + /// failure. + fn preconditions_met(&self, op: &Self::Operation) -> bool { + match op { + Operation::CreateTable(name, _) => !self.name_in_use(name), + Operation::DropTable(name) => self.tables.contains_key(name), + Operation::WriteRow { + table, + pkey, + col_vals: _, + col_types, + } => { + // Make sure that the table doesn't already contain a row with this key, and also + // make sure that the column types in the table also match up with the types in the + // row that we're trying to write: + self.pkeys + .get(table) + .map_or(false, |table_keys| !table_keys.contains(pkey)) + && self.tables.get(table).map_or(false, |table_cols| { + // Must compare lengths before zipping and comparing individual types + // because zip will drop elements if the Vec lengths don't match up: + table_cols.len() == col_types.len() + // Make sure all types in the WriteRow match the table cols: + && table_cols + .iter() + .zip(col_types) + .all(|(cs, row_type)| cs.sql_type == *row_type) + }) + } + Operation::DeleteRow(table, key) => self + .pkeys + .get(table) + .map_or(false, |table_keys| table_keys.contains(key)), + Operation::AddColumn(table, column_spec) => self + .tables + .get(table) + .map_or(false, |t| t.iter().all(|cs| cs.name != *column_spec.name)), + Operation::DropColumn(table, col_name) => self + .tables + .get(table) + .map_or(false, |t| t.iter().any(|cs| cs.name == *col_name)), + Operation::AlterColumnName { + table, + col_name, + new_name, + } => self.tables.get(table).map_or(false, |t| { + t.iter().any(|cs| cs.name == *col_name) && t.iter().all(|cs| cs.name != *new_name) + }), + Operation::CreateSimpleView { name, table_source } => { + !self.name_in_use(name) && self.tables.contains_key(table_source) + } + Operation::CreateJoinView { + name, + table_a, + table_b, + } => { + self.tables.contains_key(table_a) + && self.tables.contains_key(table_b) + && !self.tables.contains_key(name) + && !self.views.contains_key(name) + } + Operation::DropView(name) => self.views.contains_key(name), + // Even if the key is shrunk out, evicting it is a no-op, so we don't need to worry + // about preconditions at all for evictions: + Operation::Evict { .. } => true, + } + } + + /// Get ready to run a single test case by: + /// * Setting up a test instance of ReadySet that connects to an upstream instance of MySQL + /// * Wiping and recreating a fresh copy of the oracle database directly in MySQL, and setting + /// up a connection + async fn init_test_run(&self) -> Self::RunContext { + readyset_tracing::init_test_logging(); + + let (opts, handle, shutdown_tx) = TestBuilder::default() + .fallback(true) + .build::() + .await; + // We need the raw hostname for eviction operations later: + let rs_host = opts.ip_or_hostname().to_string(); + let rs_conn = connect(OptsBuilder::from_opts(opts)).await; + + recreate_oracle_db().await; + let mysql_conn = connect(oracle_db_config()).await; + + DDLTestRunContext { + rs_host, + rs_conn, + mysql_conn, + _handle: handle, + shutdown_tx: Some(shutdown_tx), + } + } + + /// Run the code to test a single operation: + /// * Running each step in `ops`, and checking afterward that: + /// * The contents of the tables tracked by our model match across both ReadySet and MySQL + /// * Any deleted tables appear as deleted in both ReadySet and MySQL + async fn run_op(&self, op: &Self::Operation, ctxt: &mut Self::RunContext) { + let DDLTestRunContext { + rs_conn, + mysql_conn, + .. + } = ctxt; + + match op { + Operation::CreateTable(table_name, cols) => { + let non_pkey_cols = cols.iter().map(|ColumnSpec { name, sql_type, .. }| { + format!("`{name}` {}", sql_type.display(nom_sql::Dialect::MySQL)) + }); + let col_defs: Vec = once("id INT PRIMARY KEY".to_string()) + .chain(non_pkey_cols) + .collect(); + let col_defs = col_defs.join(", "); + let query = format!("CREATE TABLE {table_name} ({col_defs})"); + println!("Creating table: {}", query); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + + let create_cache = format!("CREATE CACHE ALWAYS FROM SELECT * FROM {table_name}"); + eventually!(run_test: { + let result = rs_conn.query_drop(&create_cache).await; + AssertUnwindSafe(move || result) + }, then_assert: |result| { + result().unwrap() + }); + } + Operation::DropTable(name) => { + let query = format!("DROP TABLE {name} CASCADE"); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + } + Operation::WriteRow { + table, + pkey, + col_vals, + .. + } => { + let pkey = DfValue::from(*pkey); + let params: Vec<&DfValue> = once(&pkey).chain(col_vals.iter()).collect(); + let params: Vec = params + .iter() + .map(|v| match v { + DfValue::Int(_) => mysql_async::Value::Int(v.to_string().parse().unwrap()), + DfValue::Float(_) => { + mysql_async::Value::Float(v.to_string().parse().unwrap()) + } + _ => mysql_async::Value::Bytes(v.to_string().as_bytes().to_vec()), + }) + .collect(); + let placeholders: Vec<_> = (1..=params.len()).map(|_| "?".to_string()).collect(); + let placeholders = placeholders.join(", "); + let query = format!("INSERT INTO {table} VALUES ({placeholders})"); + rs_conn.exec_drop(&query, ¶ms).await.unwrap(); + mysql_conn.exec_drop(&query, ¶ms).await.unwrap(); + } + Operation::AddColumn(table_name, col_spec) => { + let query = format!( + "ALTER TABLE {} ADD COLUMN {} {}", + table_name, + col_spec.name, + col_spec.sql_type.display(nom_sql::Dialect::MySQL) + ); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + } + Operation::DropColumn(table_name, col_name) => { + let query = format!("ALTER TABLE {} DROP COLUMN {}", table_name, col_name); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + } + Operation::AlterColumnName { + table, + col_name, + new_name, + } => { + let query = format!( + "ALTER TABLE {} RENAME COLUMN {} TO {}", + table, col_name, new_name + ); + for (view, def) in self.views.iter() { + match def { + TestViewDef::Simple(table_source) => { + if table == table_source { + let drop_view = format!("DROP VIEW {}", view); + rs_conn.query_drop(&drop_view).await.unwrap(); + mysql_conn.query_drop(&drop_view).await.unwrap(); + } + } + TestViewDef::Join { table_a, table_b } => { + if table == table_a || table == table_b { + let drop_view = format!("DROP VIEW {}", view); + rs_conn.query_drop(&drop_view).await.unwrap(); + mysql_conn.query_drop(&drop_view).await.unwrap(); + } + } + } + } + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + } + Operation::DeleteRow(table_name, key) => { + let query = format!("DELETE FROM {table_name} WHERE id = ({key})"); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + } + Operation::CreateSimpleView { name, table_source } => { + let query = format!("CREATE VIEW {name} AS SELECT * FROM {table_source}"); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + let create_cache = format!("CREATE CACHE ALWAYS FROM SELECT * FROM {name}"); + eventually!(run_test: { + let result = rs_conn.query_drop(&create_cache).await; + AssertUnwindSafe(move || result) + }, then_assert: |result| { + result().unwrap() + }); + } + Operation::CreateJoinView { + name, + table_a, + table_b, + } => { + // Must give a unique alias to each column in the source tables to avoid issues + // with duplicate column names in the resulting view + let select_list: Vec = self.tables[table_a] + .iter() + .map(|cs| (table_a, &cs.name)) + .chain(self.tables[table_b].iter().map(|cs| (table_b, &cs.name))) + .enumerate() + .map(|(i, (tab, col))| format!("{tab}.{col} AS c{i}")) + .collect(); + let select_list = select_list.join(", "); + let view_def = format!( + "SELECT {} FROM {} JOIN {} ON {}.id = {}.id", + select_list, table_a, table_b, table_a, table_b + ); + let query = format!("CREATE VIEW {} AS {}", name, view_def); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + let create_cache = format!("CREATE CACHE ALWAYS FROM SELECT * FROM {name}"); + eventually!(run_test: { + let result = rs_conn.query_drop(&create_cache).await; + AssertUnwindSafe(move || result) + }, then_assert: |result| { + result().unwrap() + }); + } + Operation::DropView(name) => { + let query = format!("DROP VIEW {name}"); + rs_conn.query_drop(&query).await.unwrap(); + mysql_conn.query_drop(&query).await.unwrap(); + } + Operation::Evict { inner } => { + let client = reqwest::Client::new(); + let body = + bincode::serialize::>(&*inner.borrow()).unwrap(); + let res = client + .post(format!("http://{}:6033/evict_single", ctxt.rs_host)) + .body(body) + .send() + .await + .unwrap(); + if inner.borrow().is_none() { + let eviction = bincode::deserialize::>( + &res.bytes().await.unwrap(), + ) + .unwrap(); + inner.replace(eviction); + } + } + } + } + + async fn check_postconditions(&self, ctxt: &mut Self::RunContext) { + let DDLTestRunContext { + rs_conn, + mysql_conn, + .. + } = ctxt; + + // After each op, check that all table and view contents match + for relation in self.tables.keys().chain(self.views.keys()) { + eventually!(run_test: { + println!("Checking contents of relation: {}", relation); + let rs_rows = rs_conn + .exec(&format!("SELECT * FROM {relation}"), Params::Empty) + .await + .unwrap(); + let mysql_rows = mysql_conn + .exec(&format!("SELECT * FROM {relation}"), Params::Empty) + .await + .unwrap(); + // Previously, we would run all the result handling in the run_test block, but + // doing it in the then_assert block lets us work around a tokio-MySQL client + // crash caused by ENG-2548 by retrying until ReadySet stops sending us bad + // packets. + AssertUnwindSafe(move || (rs_rows, mysql_rows)) + }, then_assert: |results| { + let (rs_rows, mysql_rows) = results(); + + let mut rs_results = rows_to_dfvalue_vec(rs_rows); + let mut mysql_results = rows_to_dfvalue_vec(mysql_rows); + + rs_results.sort_unstable(); + mysql_results.sort_unstable(); + + assert_eq!(mysql_results, rs_results); + }); + } + // Also make sure all deleted tables were actually deleted: + for table in &self.deleted_tables { + rs_conn + .query_drop(&format!("DROP TABLE {table}")) + .await + .unwrap_err(); + } + // And then do the same for views: + for view in &self.deleted_views { + rs_conn + .query_drop(&format!("DROP VIEW {view}")) + .await + .unwrap_err(); + } + } + + async fn clean_up_test_run(&self, ctxt: &mut Self::RunContext) { + ctxt.shutdown_tx.take().unwrap().shutdown().await + } +} + +impl DDLModelState { + /// Returns whether the given name is in use in the model state as any of a table, a view, or + /// an enum type. + /// + /// This is useful for checking preconditions, because MySQL does not let you reuse the same + /// name for any of these three things (e.g. you're not allowed to name a view and a type the + /// same thing). + fn name_in_use(&self, name: &String) -> bool { + self.tables.contains_key(name) || self.views.contains_key(name) + } +} + +/// Spawns a new connection (either to ReadySet or directly to MySQL). +async fn connect(config: OptsBuilder) -> Conn { + mysql_async::Conn::new(config).await.unwrap() +} + +/// The "oracle" database is the name of the MySQL DB that we're using as an oracle to verify +/// that the ReadySet behavior matches the native MySQL behavior. +const ORACLE_DB_NAME: &str = "vertical_ddl_oracle"; + +/// Gets the [`OptsBuilder`] used to connect to the MySQL oracle DB. +fn oracle_db_config() -> OptsBuilder { + mysql_helpers::upstream_config().db_name(Some(ORACLE_DB_NAME)) +} + +/// Drops and recreates the oracle database prior to each test run. +async fn recreate_oracle_db() { + let config = mysql_helpers::upstream_config(); + let mut client = connect(config).await; + + let drop_query = format!("DROP DATABASE IF EXISTS {ORACLE_DB_NAME}"); + let create_query = format!("CREATE DATABASE {ORACLE_DB_NAME}"); + + client.query_drop(&drop_query).await.unwrap(); + client.query_drop(&create_query).await.unwrap(); +} + +/// Although both are of the exact same type, there is a conflict between reexported versions +fn value_to_value(val: &mysql_async::Value) -> mysql_common::value::Value { + match val { + mysql_async::Value::NULL => mysql_common::value::Value::NULL, + mysql_async::Value::Bytes(b) => mysql_common::value::Value::Bytes(b.clone()), + mysql_async::Value::Int(i) => mysql_common::value::Value::Int(*i), + mysql_async::Value::UInt(u) => mysql_common::value::Value::UInt(*u), + mysql_async::Value::Float(f) => mysql_common::value::Value::Float(*f), + mysql_async::Value::Double(d) => mysql_common::value::Value::Double(*d), + mysql_async::Value::Date(y, m, d, hh, mm, ss, us) => { + mysql_common::value::Value::Date(*y, *m, *d, *hh, *mm, *ss, *us) + } + mysql_async::Value::Time(is_neg, d, hh, mm, ss, us) => { + mysql_common::value::Value::Time(*is_neg, *d, *hh, *mm, *ss, *us) + } + } +} + +/// Converts a [`Vec`] of [`Row`] values to a nested [`Vec`] of [`DfValue`] values. Currently just +/// used as a convenient way to compare two query results, since you can't directly compare +/// [`Row`]s with each other. +fn rows_to_dfvalue_vec(rows: Vec) -> Vec> { + rows.iter() + .map(|row| { + let mut noria_row = Vec::with_capacity(row.len()); + for idx in 0..row.len() { + let val = value_to_value(row.as_ref(idx).unwrap()); + noria_row.push(readyset_data::DfValue::try_from(val).unwrap()); + } + noria_row + }) + .collect() +} + +#[test] +#[cfg_attr(not(feature = "ddl_vertical_tests"), ignore)] +fn run_cases() { + let config = ProptestStatefulConfig { + min_ops: 10, + max_ops: 20, + test_case_timeout: Duration::from_secs(60), + proptest_config: proptest_config_with_local_failure_persistence!(), + }; + + proptest_stateful::test::(config); +} diff --git a/replicators/tests/ddl_vertical.rs b/replicators/tests/ddl_vertical_postgresql.rs similarity index 99% rename from replicators/tests/ddl_vertical.rs rename to replicators/tests/ddl_vertical_postgresql.rs index c4a5e9390e..c2b787df8c 100644 --- a/replicators/tests/ddl_vertical.rs +++ b/replicators/tests/ddl_vertical_postgresql.rs @@ -551,7 +551,7 @@ impl ModelState for DDLModelState { possible_ops.push(rename_col_strat); let _drop_col_strategy = gen_drop_col(self.tables.clone(), tables_with_cols).boxed(); - // Commented out for now because this triggers ENG-2548 + // Commented out for now because this triggers REA-2216 // possible_ops.push(drop_col_strategy); } // If we have at least one row written to a table, we can generate delete ops: @@ -661,7 +661,7 @@ impl ModelState for DDLModelState { .iter_mut() .find(|cs| cs.name == *col_name) .unwrap(); - spec.name = new_name.clone(); + spec.name.clone_from(new_name); } Operation::DeleteRow(..) => (), Operation::CreateSimpleView { name, table_source } => { @@ -731,7 +731,7 @@ impl ModelState for DDLModelState { .iter_mut() .find(|v| *v == value_name) .unwrap(); - *val_ref = new_name.clone(); + val_ref.clone_from(new_name); } Operation::Evict { .. } => (), } diff --git a/replicators/tests/tests.rs b/replicators/tests/tests.rs index dc8ae0cf50..0820386656 100644 --- a/replicators/tests/tests.rs +++ b/replicators/tests/tests.rs @@ -143,6 +143,7 @@ impl TestChannel { } } +#[allow(dead_code)] /// Channel used to send notifications from the controller to replicator. struct TestControllChannel(UnboundedSender); @@ -683,6 +684,243 @@ async fn mysql_datetime_replication() { mysql_datetime_replication_inner().await.unwrap(); } +async fn mysql_binary_collation_padding_inner() -> ReadySetResult<()> { + let url = &mysql_url(); + let mut client = DbConnection::connect(url).await?; + client + .query( + " + DROP TABLE IF EXISTS `col_bin_pad` CASCADE; + CREATE TABLE `col_bin_pad` ( + id int NOT NULL PRIMARY KEY, + c BINARY(3) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + INSERT INTO `col_bin_pad` VALUES (1, 'ࠈ'); + INSERT INTO `col_bin_pad` VALUES (2, 'A'); + INSERT INTO `col_bin_pad` VALUES (3, 'AAA'); + INSERT INTO `col_bin_pad` VALUES (4, '¥');", + ) + .await?; + let (mut ctx, shutdown_tx) = TestHandle::start_noria(url.to_string(), None).await?; + ctx.notification_channel + .as_mut() + .unwrap() + .snapshot_completed() + .await + .unwrap(); + ctx.check_results( + "col_bin_pad", + "Snapshot", + &[ + &[ + DfValue::Int(1), + // 'ࠈ' is the UTF-8 encoding of U+E0A088 + DfValue::ByteArray(vec![0xE0, 0xA0, 0x88].into()), + ], + &[ + DfValue::Int(2), + DfValue::ByteArray(vec![0x41, 0x0, 0x0].into()), + ], + &[ + DfValue::Int(3), + DfValue::ByteArray(vec![0x41, 0x41, 0x41].into()), + ], + &[ + DfValue::Int(4), + // '¥' is the UTF-8 encoding of U+C2A5 + DfValue::ByteArray(vec![0xC2, 0xA5, 0x0].into()), + ], + ], + ) + .await?; + + // Replication and mix of characters from 1st and 2rd byte on the same row + client + .query( + " + INSERT INTO `col_bin_pad` VALUES (5, 'B¥'); + INSERT INTO `col_bin_pad` VALUES (6, 'B'); + INSERT INTO `col_bin_pad` VALUES (7, 'BBB'); + INSERT INTO `col_bin_pad` VALUES (8, '¥'); + ", + ) + .await + .unwrap(); + ctx.check_results( + "col_bin_pad", + "Replication", + &[ + &[ + DfValue::Int(1), + // 'ࠈ' is the UTF-8 encoding of U+E0A088 + DfValue::ByteArray(vec![0xE0, 0xA0, 0x88].into()), + ], + &[ + DfValue::Int(2), + DfValue::ByteArray(vec![0x41, 0x0, 0x0].into()), + ], + &[ + DfValue::Int(3), + DfValue::ByteArray(vec![0x41, 0x41, 0x41].into()), + ], + &[ + DfValue::Int(4), + // '¥' is the UTF-8 encoding of U+C2A5 + DfValue::ByteArray(vec![0xC2, 0xA5, 0x0].into()), + ], + &[ + DfValue::Int(5), + // '¥' is the UTF-8 encoding of U+C2A5 + DfValue::ByteArray(vec![0x42, 0xC2, 0xA5].into()), + ], + &[ + DfValue::Int(6), + DfValue::ByteArray(vec![0x42, 0x0, 0x0].into()), + ], + &[ + DfValue::Int(7), + DfValue::ByteArray(vec![0x42, 0x42, 0x42].into()), + ], + &[ + DfValue::Int(8), + // '¥' is the UTF-8 encoding of U+C2A5 + DfValue::ByteArray(vec![0xC2, 0xA5, 0x0].into()), + ], + ], + ) + .await?; + + client.stop().await; + ctx.stop().await; + shutdown_tx.shutdown().await; + + Ok(()) +} + +async fn mysql_char_collation_padding_inner() -> ReadySetResult<()> { + let url = &mysql_url(); + let mut client = DbConnection::connect(url).await?; + client + .query( + " + DROP TABLE IF EXISTS `col_pad` CASCADE; + CREATE TABLE `col_pad` ( + id int NOT NULL PRIMARY KEY, + c CHAR(3) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + INSERT INTO `col_pad` VALUES (1, 'ࠈࠈ'); + INSERT INTO `col_pad` VALUES (2, 'A'); + INSERT INTO `col_pad` VALUES (3, 'AAA'); + INSERT INTO `col_pad` (id) VALUES (4);", + ) + .await?; + let (mut ctx, shutdown_tx) = TestHandle::start_noria(url.to_string(), None).await?; + ctx.notification_channel + .as_mut() + .unwrap() + .snapshot_completed() + .await + .unwrap(); + ctx.check_results( + "col_pad", + "Snapshot", + &[ + &[ + DfValue::Int(1), + // 'ࠈࠈ ' is the UTF-8 encoding of U+E0A088 U+E0A088 U+20 + DfValue::TinyText( + TinyText::from_slice(vec![0xE0, 0xA0, 0x88, 0xE0, 0xA0, 0x88, 0x20].as_slice()) + .unwrap_or_else(|_| TinyText::from_arr(b"")), + ), + ], + &[ + DfValue::Int(2), + DfValue::TinyText(TinyText::from_arr(b"A ")), + ], + &[ + DfValue::Int(3), + DfValue::TinyText(TinyText::from_arr(b"AAA")), + ], + &[DfValue::Int(4), DfValue::None], + ], + ) + .await?; + + // Replication and mix of characters from 1st and 3rd byte on the same row + client + .query( + " + INSERT INTO `col_pad` VALUES (5, 'Bࠉ'); + INSERT INTO `col_pad` VALUES (6, 'B'); + INSERT INTO `col_pad` VALUES (7, 'BBB'); + INSERT INTO `col_pad` (id) VALUES (8); + ", + ) + .await + .unwrap(); + ctx.check_results( + "col_pad", + "Replication", + &[ + &[ + DfValue::Int(1), + // 'ࠈࠈ ' is the UTF-8 encoding of U+E0A088 U+E0A088 U+20 + DfValue::TinyText( + TinyText::from_slice(vec![0xE0, 0xA0, 0x88, 0xE0, 0xA0, 0x88, 0x20].as_slice()) + .unwrap_or_else(|_| TinyText::from_arr(b"")), + ), + ], + &[ + DfValue::Int(2), + DfValue::TinyText(TinyText::from_arr(b"A ")), + ], + &[ + DfValue::Int(3), + DfValue::TinyText(TinyText::from_arr(b"AAA")), + ], + &[DfValue::Int(4), DfValue::None], + &[ + DfValue::Int(5), + // 'Bࠉ ' is the UTF-8 encoding of U+E42 U+E0A089 U+20 + DfValue::TinyText( + TinyText::from_slice(vec![0x42, 0xE0, 0xA0, 0x89, 0x20].as_slice()) + .unwrap_or_else(|_| TinyText::from_arr(b"")), + ), + ], + &[ + DfValue::Int(6), + DfValue::TinyText(TinyText::from_arr(b"B ")), + ], + &[ + DfValue::Int(7), + DfValue::TinyText(TinyText::from_arr(b"BBB")), + ], + &[DfValue::Int(8), DfValue::None], + ], + ) + .await?; + + client.stop().await; + ctx.stop().await; + shutdown_tx.shutdown().await; + + Ok(()) +} + +#[tokio::test(flavor = "multi_thread")] +#[serial_test::serial] +#[slow] +async fn mysql_binary_collation_padding() { + mysql_binary_collation_padding_inner().await.unwrap(); +} + +#[tokio::test(flavor = "multi_thread")] +#[serial_test::serial] +#[slow] +async fn mysql_char_collation_padding() { + mysql_char_collation_padding_inner().await.unwrap(); +} + #[tokio::test(flavor = "multi_thread")] #[serial_test::serial] #[slow] @@ -2944,3 +3182,131 @@ async fn pgsql_dont_replicate_partitioned_table() { shutdown_tx.shutdown().await; } + +#[tokio::test(flavor = "multi_thread")] +#[serial_test::serial] +async fn mysql_dont_replicate_unsupported_storage_engine() { + readyset_tracing::init_test_logging(); + let url = mysql_url(); + let mut client = DbConnection::connect(&url).await.unwrap(); + + client + .query( + "DROP TABLE IF EXISTS t CASCADE; + CREATE TABLE t (x int) ENGINE=MEMORY;", + ) + .await + .unwrap(); + + let (mut ctx, shutdown_tx) = TestHandle::start_noria(url.to_string(), None) + .await + .unwrap(); + ctx.notification_channel + .as_mut() + .unwrap() + .snapshot_completed() + .await + .unwrap(); + + ctx.noria.table("t").await.unwrap_err(); + let relation = Relation { + schema: Some("public".into()), + name: "t".into(), + }; + + assert!(ctx + .noria + .non_replicated_relations() + .await + .unwrap() + .contains(&NonReplicatedRelation::new(relation.clone()))); + + client + .query( + "DROP TABLE IF EXISTS t2 CASCADE; + CREATE TABLE t2 (y int) ENGINE=MEMORY", + ) + .await + .unwrap(); + let relation = Relation { + schema: Some("public".into()), + name: "t2".into(), + }; + eventually! { + let nrr = ctx + .noria + .non_replicated_relations() + .await + .unwrap(); + debug!(?nrr); + nrr.contains(&NonReplicatedRelation::new(relation.clone())) + } + + shutdown_tx.shutdown().await; +} + +#[tokio::test(flavor = "multi_thread")] +#[serial_test::serial] +#[slow] +async fn mysql_dont_enforce_fk_replication() { + readyset_tracing::init_test_logging(); + let url = mysql_url(); + let mut client = DbConnection::connect(&url).await.unwrap(); + + client + .query( + "DROP TABLE IF EXISTS t_parent CASCADE; + DROP TABLE IF EXISTS t_child CASCADE; + DROP TABLE IF EXISTS t_child2 CASCADE; + CREATE TABLE t_parent (x INT PRIMARY KEY); + CREATE TABLE t_child (y INT, FOREIGN KEY (y) REFERENCES t_parent(x));", + ) + .await + .unwrap(); + + let config = Config { + replication_tables: Some(String::from("public.t_child, public.t_child2").into()), + ..Default::default() + }; + + let (mut ctx, shutdown_tx) = TestHandle::start_noria(url.to_string(), Some(config)) + .await + .unwrap(); + ctx.notification_channel + .as_mut() + .unwrap() + .snapshot_completed() + .await + .unwrap(); + + let t_parent = Relation { + schema: Some("public".into()), + name: "t_parent".into(), + }; + + let t_child = Relation { + schema: Some("public".into()), + name: "t_child".into(), + }; + assert!(ctx + .noria + .non_replicated_relations() + .await + .unwrap() + .contains(&NonReplicatedRelation::new(t_parent.clone()))); + + assert!(ctx.noria.tables().await.unwrap().contains_key(&t_child)); + + client + .query("CREATE TABLE t_child2 (y INT, FOREIGN KEY (y) REFERENCES t_parent(x));") + .await + .unwrap(); + let t_child2 = Relation { + schema: Some("public".into()), + name: "t_child2".into(), + }; + eventually! { + ctx.noria.tables().await.unwrap().contains_key(&t_child2) + } + shutdown_tx.shutdown().await; +} diff --git a/rust-toolchain b/rust-toolchain index fac9292f1d..3548c285ac 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2023-11-09 +nightly-2024-05-02 diff --git a/system-benchmarks/Cargo.toml b/system-benchmarks/Cargo.toml index 3d34083eab..d94f52d3ee 100644 --- a/system-benchmarks/Cargo.toml +++ b/system-benchmarks/Cargo.toml @@ -6,12 +6,12 @@ authors = ["ReadySet Technology, Inc. "] publish = false [dependencies] -anyhow = "1.0" -itertools = "0.10" +anyhow = { workspace = true } +itertools = { workspace = true } tokio = { workspace = true, features = ["full"] } -reqwest = { version = "0.11", features = [ "blocking" ] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" +reqwest = { workspace = true, features = [ "blocking" ] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } tokio-postgres = { workspace = true, features = ["with-chrono-0_4", "with-eui48-1", "with-uuid-0_8", "with-serde_json-1", "with-bit-vec-0_6"] } database-utils = { path = "../database-utils" } readyset-data = { path = "../readyset-data" } @@ -27,20 +27,20 @@ readyset-psql = { path = "../readyset-psql" } readyset = { path = "../readyset" } criterion = { workspace = true, features = ["async_tokio"] } -fork = "0.1" -futures = "0.3" -num_cpus = "1.13" -parking_lot = "0.12" -temp-dir = "0.1" -tikv-jemallocator = "0.5" +fork = { workspace = true } +futures = { workspace = true } +num_cpus = { workspace = true } +parking_lot = { workspace = true } +temp-dir = { workspace = true } +tikv-jemallocator = { workspace = true } -regex = "1.5" +regex = { workspace = true } -bincode = "1.3" +bincode = { workspace = true } nperf-core = { workspace = true } -structopt = "0.2" -libc = "0.2" +structopt = { workspace = true } +libc = { workspace = true } [[bin]] name = "regressions" diff --git a/system-benchmarks/bench_data/mysql/aggregates/count_group_by.yaml b/system-benchmarks/bench_data/mysql/aggregates/count_group_by.yaml new file mode 100644 index 0000000000..4c3a8e8e5a --- /dev/null +++ b/system-benchmarks/bench_data/mysql/aggregates/count_group_by.yaml @@ -0,0 +1,15 @@ +distributions: + - name: ids + range: + start: 0 + end: 100 + zipf: 1.15 +queries: + - spec: >- + SELECT count(*) FROM ints WHERE v = ? GROUP BY i + params: + - sql_type: bigint + distribution: ids + col: 0 + weight: 1 + migrate: true diff --git a/system-benchmarks/bench_data/mysql/aggregates/simple.sql b/system-benchmarks/bench_data/mysql/aggregates/simple.sql new file mode 100644 index 0000000000..3061daeab8 --- /dev/null +++ b/system-benchmarks/bench_data/mysql/aggregates/simple.sql @@ -0,0 +1,8 @@ +SET @ints_rows = 50000; +SET @num_ints = 97; + + +CREATE TABLE ints ( + i int primary key, + v int COMMENT 'UNIFORM 0 @num_ints' +) COMMENT = 'ROWS=@ints_rows'; diff --git a/system-benchmarks/bench_data/mysql/aggregates/simple_count.yaml b/system-benchmarks/bench_data/mysql/aggregates/simple_count.yaml new file mode 100644 index 0000000000..abc5ade375 --- /dev/null +++ b/system-benchmarks/bench_data/mysql/aggregates/simple_count.yaml @@ -0,0 +1,15 @@ +distributions: + - name: ids + range: + start: 0 + end: 100 + zipf: 1.15 +queries: + - spec: >- + SELECT count(*) FROM ints WHERE v = ? + params: + - sql_type: bigint + distribution: ids + col: 0 + weight: 1 + migrate: true diff --git a/system-benchmarks/bench_data/mysql/aggregates/simple_sum.yaml b/system-benchmarks/bench_data/mysql/aggregates/simple_sum.yaml new file mode 100644 index 0000000000..17fc9cf7ca --- /dev/null +++ b/system-benchmarks/bench_data/mysql/aggregates/simple_sum.yaml @@ -0,0 +1,15 @@ +distributions: + - name: ids + range: + start: 0 + end: 100 + zipf: 1.15 +queries: + - spec: >- + SELECT sum(v) FROM ints WHERE i = ? + params: + - sql_type: bigint + distribution: ids + col: 0 + weight: 1 + migrate: true diff --git a/system-benchmarks/bench_data/mysql/aggregates/sum_group_by.yaml b/system-benchmarks/bench_data/mysql/aggregates/sum_group_by.yaml new file mode 100644 index 0000000000..fa77f4d33a --- /dev/null +++ b/system-benchmarks/bench_data/mysql/aggregates/sum_group_by.yaml @@ -0,0 +1,15 @@ +distributions: + - name: ids + range: + start: 0 + end: 100 + zipf: 1.15 +queries: + - spec: >- + SELECT sum(v) FROM ints WHERE v = ? GROUP BY i + params: + - sql_type: bigint + distribution: ids + col: 0 + weight: 1 + migrate: true diff --git a/system-benchmarks/benches/workload.rs b/system-benchmarks/benches/workload.rs index 848122ae8a..41545b0c0e 100644 --- a/system-benchmarks/benches/workload.rs +++ b/system-benchmarks/benches/workload.rs @@ -221,8 +221,8 @@ impl Benchmark { } Benchmark { - name, - schema: schema.expect("No schema for benchmark {name}"), + name: name.clone(), + schema: schema.unwrap_or_else(|| panic!("No schema for benchmark '{}'", name)), workloads, } }) @@ -615,6 +615,7 @@ fn start_adapter(upstream_url: &str) -> anyhow::Result<()> { "--allow-unauthenticated-connections", "--allow-full-materialization", "--enable-experimental-post-lookup", + "--enable-experimental-straddled-joins", "--upstream-db-url", upstream_url, "--durability", diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 316db174f7..ff3ef3461e 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -11,4 +11,4 @@ tokio = { workspace = true, features = ["full"] } # Avoid adding dependencies as this is included in tests. [dev-dependencies] -tokio-scoped = { version = "0.2.0" } +tokio-scoped = { workspace = true } diff --git a/test-utils/proc-macros/Cargo.toml b/test-utils/proc-macros/Cargo.toml index 32df64b2dc..0f2ab17466 100644 --- a/test-utils/proc-macros/Cargo.toml +++ b/test-utils/proc-macros/Cargo.toml @@ -9,5 +9,5 @@ edition = "2021" proc-macro = true [dependencies] -quote = "1.0" -syn = { version = "1", default_features = false, features = ["full", "parsing", "printing", "proc-macro", "extra-traits", "clone-impls"] } +quote = { workspace = true } +syn = { workspace = true, features = ["full", "parsing", "printing", "proc-macro", "extra-traits", "clone-impls"] } diff --git a/timestamp-service/Cargo.toml b/timestamp-service/Cargo.toml index 01f04efab2..3c97f5272c 100644 --- a/timestamp-service/Cargo.toml +++ b/timestamp-service/Cargo.toml @@ -6,6 +6,6 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0" +anyhow = { workspace = true } # local deps readyset-client = { path = "../readyset-client" } diff --git a/tinylb/Cargo.toml b/tinylb/Cargo.toml index 7bdb9d2f64..c74840f6a4 100644 --- a/tinylb/Cargo.toml +++ b/tinylb/Cargo.toml @@ -6,6 +6,6 @@ authors = ["ReadySet Technology, Inc. "] edition = "2021" [dependencies] -anyhow = "1.0" +anyhow = { workspace = true } clap = { workspace = true, features = ["derive", "env"] } tokio = { workspace = true, features = ["full"] } diff --git a/tournament-kway/Cargo.toml b/tournament-kway/Cargo.toml index dcaaec919b..0be932cd50 100644 --- a/tournament-kway/Cargo.toml +++ b/tournament-kway/Cargo.toml @@ -9,8 +9,8 @@ keywords = ["sort", "tournament", "tree", "kway", "merge"] description = "Implementation of a k-way merge using a tournament tree" [dependencies] -streaming-iterator = "0.1" +streaming-iterator = { workspace = true } [dev-dependencies] -proptest = "1.0" -test-strategy = "0.2" +proptest = { workspace = true } +test-strategy = { workspace = true }