diff --git a/integration/pgdog.toml b/integration/pgdog.toml index 49ea6c0f0..b1d7121a8 100644 --- a/integration/pgdog.toml +++ b/integration/pgdog.toml @@ -368,6 +368,16 @@ name = "sharded_list_uuid" column = "id_uuid" data_type = "uuid" +# ------------------------------------------------------------------------------ +# ----- Hash Sharded :: ClickBench hits ---------------------------------------- + +[[sharded_tables]] +database = "pgdog_sharded" +name = "hits" +column = "userid" +data_type = "bigint" +primary = true + [[sharded_mappings]] database = "pgdog_sharded" table = "sharded_list_uuid" diff --git a/integration/sql/cases/940_clickbench_q01_case.sql b/integration/sql/cases/940_clickbench_q01_case.sql new file mode 100644 index 000000000..a235f59d4 --- /dev/null +++ b/integration/sql/cases/940_clickbench_q01_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 1 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT COUNT(*) FROM hits; diff --git a/integration/sql/cases/940_clickbench_q01_setup.sql b/integration/sql/cases/940_clickbench_q01_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/940_clickbench_q01_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/940_clickbench_q01_teardown.sql b/integration/sql/cases/940_clickbench_q01_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/940_clickbench_q01_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/941_clickbench_q02_case.sql b/integration/sql/cases/941_clickbench_q02_case.sql new file mode 100644 index 000000000..0e3858804 --- /dev/null +++ b/integration/sql/cases/941_clickbench_q02_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 2 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT COUNT(*) FROM hits WHERE AdvEngineID <> 0; diff --git a/integration/sql/cases/941_clickbench_q02_setup.sql b/integration/sql/cases/941_clickbench_q02_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/941_clickbench_q02_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/941_clickbench_q02_teardown.sql b/integration/sql/cases/941_clickbench_q02_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/941_clickbench_q02_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/942_clickbench_q03_case.sql b/integration/sql/cases/942_clickbench_q03_case.sql new file mode 100644 index 000000000..e08bc3842 --- /dev/null +++ b/integration/sql/cases/942_clickbench_q03_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 3 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth) FROM hits; diff --git a/integration/sql/cases/942_clickbench_q03_setup.sql b/integration/sql/cases/942_clickbench_q03_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/942_clickbench_q03_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/942_clickbench_q03_teardown.sql b/integration/sql/cases/942_clickbench_q03_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/942_clickbench_q03_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/943_clickbench_q04_case.sql b/integration/sql/cases/943_clickbench_q04_case.sql new file mode 100644 index 000000000..48ac00335 --- /dev/null +++ b/integration/sql/cases/943_clickbench_q04_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 4 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT AVG(UserID) FROM hits; diff --git a/integration/sql/cases/943_clickbench_q04_setup.sql b/integration/sql/cases/943_clickbench_q04_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/943_clickbench_q04_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/943_clickbench_q04_teardown.sql b/integration/sql/cases/943_clickbench_q04_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/943_clickbench_q04_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/944_clickbench_q05_case.sql b/integration/sql/cases/944_clickbench_q05_case.sql new file mode 100644 index 000000000..d116b9a98 --- /dev/null +++ b/integration/sql/cases/944_clickbench_q05_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 5 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT COUNT(DISTINCT UserID) FROM hits; diff --git a/integration/sql/cases/944_clickbench_q05_setup.sql b/integration/sql/cases/944_clickbench_q05_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/944_clickbench_q05_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/944_clickbench_q05_teardown.sql b/integration/sql/cases/944_clickbench_q05_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/944_clickbench_q05_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/945_clickbench_q06_case.sql b/integration/sql/cases/945_clickbench_q06_case.sql new file mode 100644 index 000000000..ec2ed85c9 --- /dev/null +++ b/integration/sql/cases/945_clickbench_q06_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 6 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT COUNT(DISTINCT SearchPhrase) FROM hits; diff --git a/integration/sql/cases/945_clickbench_q06_setup.sql b/integration/sql/cases/945_clickbench_q06_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/945_clickbench_q06_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/945_clickbench_q06_teardown.sql b/integration/sql/cases/945_clickbench_q06_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/945_clickbench_q06_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/946_clickbench_q07_case.sql b/integration/sql/cases/946_clickbench_q07_case.sql new file mode 100644 index 000000000..21a071f81 --- /dev/null +++ b/integration/sql/cases/946_clickbench_q07_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 7 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT MIN(EventDate), MAX(EventDate) FROM hits; diff --git a/integration/sql/cases/946_clickbench_q07_setup.sql b/integration/sql/cases/946_clickbench_q07_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/946_clickbench_q07_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/946_clickbench_q07_teardown.sql b/integration/sql/cases/946_clickbench_q07_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/946_clickbench_q07_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/947_clickbench_q08_case.sql b/integration/sql/cases/947_clickbench_q08_case.sql new file mode 100644 index 000000000..4a21b59df --- /dev/null +++ b/integration/sql/cases/947_clickbench_q08_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 8 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT AdvEngineID, COUNT(*) FROM hits WHERE AdvEngineID <> 0 GROUP BY AdvEngineID ORDER BY COUNT(*) DESC; diff --git a/integration/sql/cases/947_clickbench_q08_setup.sql b/integration/sql/cases/947_clickbench_q08_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/947_clickbench_q08_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/947_clickbench_q08_teardown.sql b/integration/sql/cases/947_clickbench_q08_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/947_clickbench_q08_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/948_clickbench_q09_case.sql b/integration/sql/cases/948_clickbench_q09_case.sql new file mode 100644 index 000000000..937c41176 --- /dev/null +++ b/integration/sql/cases/948_clickbench_q09_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 9 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT RegionID, COUNT(DISTINCT UserID) AS u FROM hits GROUP BY RegionID ORDER BY u DESC LIMIT 10; diff --git a/integration/sql/cases/948_clickbench_q09_setup.sql b/integration/sql/cases/948_clickbench_q09_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/948_clickbench_q09_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/948_clickbench_q09_teardown.sql b/integration/sql/cases/948_clickbench_q09_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/948_clickbench_q09_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/949_clickbench_q10_case.sql b/integration/sql/cases/949_clickbench_q10_case.sql new file mode 100644 index 000000000..7739e0e43 --- /dev/null +++ b/integration/sql/cases/949_clickbench_q10_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 10 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT RegionID, SUM(AdvEngineID), COUNT(*) AS c, AVG(ResolutionWidth), COUNT(DISTINCT UserID) FROM hits GROUP BY RegionID ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/949_clickbench_q10_setup.sql b/integration/sql/cases/949_clickbench_q10_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/949_clickbench_q10_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/949_clickbench_q10_teardown.sql b/integration/sql/cases/949_clickbench_q10_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/949_clickbench_q10_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/950_clickbench_q11_case.sql b/integration/sql/cases/950_clickbench_q11_case.sql new file mode 100644 index 000000000..716d48412 --- /dev/null +++ b/integration/sql/cases/950_clickbench_q11_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 11 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhoneModel ORDER BY u DESC LIMIT 10; diff --git a/integration/sql/cases/950_clickbench_q11_setup.sql b/integration/sql/cases/950_clickbench_q11_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/950_clickbench_q11_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/950_clickbench_q11_teardown.sql b/integration/sql/cases/950_clickbench_q11_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/950_clickbench_q11_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/951_clickbench_q12_case.sql b/integration/sql/cases/951_clickbench_q12_case.sql new file mode 100644 index 000000000..b2f058456 --- /dev/null +++ b/integration/sql/cases/951_clickbench_q12_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 12 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT MobilePhone, MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhone, MobilePhoneModel ORDER BY u DESC LIMIT 10; diff --git a/integration/sql/cases/951_clickbench_q12_setup.sql b/integration/sql/cases/951_clickbench_q12_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/951_clickbench_q12_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/951_clickbench_q12_teardown.sql b/integration/sql/cases/951_clickbench_q12_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/951_clickbench_q12_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/952_clickbench_q13_case.sql b/integration/sql/cases/952_clickbench_q13_case.sql new file mode 100644 index 000000000..8a2113a43 --- /dev/null +++ b/integration/sql/cases/952_clickbench_q13_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 13 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/952_clickbench_q13_setup.sql b/integration/sql/cases/952_clickbench_q13_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/952_clickbench_q13_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/952_clickbench_q13_teardown.sql b/integration/sql/cases/952_clickbench_q13_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/952_clickbench_q13_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/953_clickbench_q14_case.sql b/integration/sql/cases/953_clickbench_q14_case.sql new file mode 100644 index 000000000..0979042b0 --- /dev/null +++ b/integration/sql/cases/953_clickbench_q14_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 14 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; diff --git a/integration/sql/cases/953_clickbench_q14_setup.sql b/integration/sql/cases/953_clickbench_q14_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/953_clickbench_q14_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/953_clickbench_q14_teardown.sql b/integration/sql/cases/953_clickbench_q14_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/953_clickbench_q14_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/954_clickbench_q15_case.sql b/integration/sql/cases/954_clickbench_q15_case.sql new file mode 100644 index 000000000..cc8dd8f9e --- /dev/null +++ b/integration/sql/cases/954_clickbench_q15_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 15 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchEngineID, SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, SearchPhrase ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/954_clickbench_q15_setup.sql b/integration/sql/cases/954_clickbench_q15_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/954_clickbench_q15_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/954_clickbench_q15_teardown.sql b/integration/sql/cases/954_clickbench_q15_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/954_clickbench_q15_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/955_clickbench_q16_case.sql b/integration/sql/cases/955_clickbench_q16_case.sql new file mode 100644 index 000000000..d6288b3dc --- /dev/null +++ b/integration/sql/cases/955_clickbench_q16_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 16 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT UserID, COUNT(*) FROM hits GROUP BY UserID ORDER BY COUNT(*) DESC LIMIT 10; diff --git a/integration/sql/cases/955_clickbench_q16_setup.sql b/integration/sql/cases/955_clickbench_q16_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/955_clickbench_q16_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/955_clickbench_q16_teardown.sql b/integration/sql/cases/955_clickbench_q16_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/955_clickbench_q16_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/956_clickbench_q17_case.sql b/integration/sql/cases/956_clickbench_q17_case.sql new file mode 100644 index 000000000..1435ae1f5 --- /dev/null +++ b/integration/sql/cases/956_clickbench_q17_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 17 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10; diff --git a/integration/sql/cases/956_clickbench_q17_setup.sql b/integration/sql/cases/956_clickbench_q17_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/956_clickbench_q17_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/956_clickbench_q17_teardown.sql b/integration/sql/cases/956_clickbench_q17_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/956_clickbench_q17_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/957_clickbench_q18_case.sql b/integration/sql/cases/957_clickbench_q18_case.sql new file mode 100644 index 000000000..d29a50c21 --- /dev/null +++ b/integration/sql/cases/957_clickbench_q18_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 18 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase LIMIT 10; diff --git a/integration/sql/cases/957_clickbench_q18_setup.sql b/integration/sql/cases/957_clickbench_q18_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/957_clickbench_q18_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/957_clickbench_q18_teardown.sql b/integration/sql/cases/957_clickbench_q18_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/957_clickbench_q18_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/958_clickbench_q19_case.sql b/integration/sql/cases/958_clickbench_q19_case.sql new file mode 100644 index 000000000..fd09e2e9e --- /dev/null +++ b/integration/sql/cases/958_clickbench_q19_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 19 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT UserID, extract(minute FROM EventTime) AS m, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, m, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10; diff --git a/integration/sql/cases/958_clickbench_q19_setup.sql b/integration/sql/cases/958_clickbench_q19_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/958_clickbench_q19_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/958_clickbench_q19_teardown.sql b/integration/sql/cases/958_clickbench_q19_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/958_clickbench_q19_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/959_clickbench_q20_case.sql b/integration/sql/cases/959_clickbench_q20_case.sql new file mode 100644 index 000000000..6c13e7538 --- /dev/null +++ b/integration/sql/cases/959_clickbench_q20_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 20 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT UserID FROM hits WHERE UserID = 435090932899640449; diff --git a/integration/sql/cases/959_clickbench_q20_setup.sql b/integration/sql/cases/959_clickbench_q20_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/959_clickbench_q20_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/959_clickbench_q20_teardown.sql b/integration/sql/cases/959_clickbench_q20_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/959_clickbench_q20_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/960_clickbench_q21_case.sql b/integration/sql/cases/960_clickbench_q21_case.sql new file mode 100644 index 000000000..031bf8704 --- /dev/null +++ b/integration/sql/cases/960_clickbench_q21_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 21 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT COUNT(*) FROM hits WHERE URL LIKE '%google%'; diff --git a/integration/sql/cases/960_clickbench_q21_setup.sql b/integration/sql/cases/960_clickbench_q21_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/960_clickbench_q21_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/960_clickbench_q21_teardown.sql b/integration/sql/cases/960_clickbench_q21_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/960_clickbench_q21_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/961_clickbench_q22_case.sql b/integration/sql/cases/961_clickbench_q22_case.sql new file mode 100644 index 000000000..62a3df847 --- /dev/null +++ b/integration/sql/cases/961_clickbench_q22_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 22 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase, MIN(URL), COUNT(*) AS c FROM hits WHERE URL LIKE '%google%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/961_clickbench_q22_setup.sql b/integration/sql/cases/961_clickbench_q22_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/961_clickbench_q22_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/961_clickbench_q22_teardown.sql b/integration/sql/cases/961_clickbench_q22_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/961_clickbench_q22_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/962_clickbench_q23_case.sql b/integration/sql/cases/962_clickbench_q23_case.sql new file mode 100644 index 000000000..550397393 --- /dev/null +++ b/integration/sql/cases/962_clickbench_q23_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 23 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase, MIN(URL), MIN(Title), COUNT(*) AS c, COUNT(DISTINCT UserID) FROM hits WHERE Title LIKE '%Google%' AND URL NOT LIKE '%.google.%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/962_clickbench_q23_setup.sql b/integration/sql/cases/962_clickbench_q23_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/962_clickbench_q23_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/962_clickbench_q23_teardown.sql b/integration/sql/cases/962_clickbench_q23_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/962_clickbench_q23_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/963_clickbench_q24_case.sql b/integration/sql/cases/963_clickbench_q24_case.sql new file mode 100644 index 000000000..bc3649221 --- /dev/null +++ b/integration/sql/cases/963_clickbench_q24_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 24 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT * FROM hits WHERE URL LIKE '%google%' ORDER BY EventTime LIMIT 10; diff --git a/integration/sql/cases/963_clickbench_q24_setup.sql b/integration/sql/cases/963_clickbench_q24_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/963_clickbench_q24_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/963_clickbench_q24_teardown.sql b/integration/sql/cases/963_clickbench_q24_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/963_clickbench_q24_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/964_clickbench_q25_case.sql b/integration/sql/cases/964_clickbench_q25_case.sql new file mode 100644 index 000000000..f7e1f0ce5 --- /dev/null +++ b/integration/sql/cases/964_clickbench_q25_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 25 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime LIMIT 10; diff --git a/integration/sql/cases/964_clickbench_q25_setup.sql b/integration/sql/cases/964_clickbench_q25_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/964_clickbench_q25_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/964_clickbench_q25_teardown.sql b/integration/sql/cases/964_clickbench_q25_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/964_clickbench_q25_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/965_clickbench_q26_case.sql b/integration/sql/cases/965_clickbench_q26_case.sql new file mode 100644 index 000000000..63fda5824 --- /dev/null +++ b/integration/sql/cases/965_clickbench_q26_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 26 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY SearchPhrase LIMIT 10; diff --git a/integration/sql/cases/965_clickbench_q26_setup.sql b/integration/sql/cases/965_clickbench_q26_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/965_clickbench_q26_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/965_clickbench_q26_teardown.sql b/integration/sql/cases/965_clickbench_q26_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/965_clickbench_q26_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/966_clickbench_q27_case.sql b/integration/sql/cases/966_clickbench_q27_case.sql new file mode 100644 index 000000000..c0666a108 --- /dev/null +++ b/integration/sql/cases/966_clickbench_q27_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 27 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime, SearchPhrase LIMIT 10; diff --git a/integration/sql/cases/966_clickbench_q27_setup.sql b/integration/sql/cases/966_clickbench_q27_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/966_clickbench_q27_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/966_clickbench_q27_teardown.sql b/integration/sql/cases/966_clickbench_q27_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/966_clickbench_q27_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/967_clickbench_q28_case.sql b/integration/sql/cases/967_clickbench_q28_case.sql new file mode 100644 index 000000000..7c2486cea --- /dev/null +++ b/integration/sql/cases/967_clickbench_q28_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 28 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT CounterID, AVG(length(URL)) AS l, COUNT(*) AS c FROM hits WHERE URL <> '' GROUP BY CounterID HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25; diff --git a/integration/sql/cases/967_clickbench_q28_setup.sql b/integration/sql/cases/967_clickbench_q28_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/967_clickbench_q28_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/967_clickbench_q28_teardown.sql b/integration/sql/cases/967_clickbench_q28_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/967_clickbench_q28_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/968_clickbench_q29_case.sql b/integration/sql/cases/968_clickbench_q29_case.sql new file mode 100644 index 000000000..09182388b --- /dev/null +++ b/integration/sql/cases/968_clickbench_q29_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 29 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '\1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) FROM hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25; diff --git a/integration/sql/cases/968_clickbench_q29_setup.sql b/integration/sql/cases/968_clickbench_q29_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/968_clickbench_q29_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/968_clickbench_q29_teardown.sql b/integration/sql/cases/968_clickbench_q29_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/968_clickbench_q29_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/969_clickbench_q30_case.sql b/integration/sql/cases/969_clickbench_q30_case.sql new file mode 100644 index 000000000..b0c2ba1f0 --- /dev/null +++ b/integration/sql/cases/969_clickbench_q30_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 30 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SUM(ResolutionWidth), SUM(ResolutionWidth + 1), SUM(ResolutionWidth + 2), SUM(ResolutionWidth + 3), SUM(ResolutionWidth + 4), SUM(ResolutionWidth + 5), SUM(ResolutionWidth + 6), SUM(ResolutionWidth + 7), SUM(ResolutionWidth + 8), SUM(ResolutionWidth + 9), SUM(ResolutionWidth + 10), SUM(ResolutionWidth + 11), SUM(ResolutionWidth + 12), SUM(ResolutionWidth + 13), SUM(ResolutionWidth + 14), SUM(ResolutionWidth + 15), SUM(ResolutionWidth + 16), SUM(ResolutionWidth + 17), SUM(ResolutionWidth + 18), SUM(ResolutionWidth + 19), SUM(ResolutionWidth + 20), SUM(ResolutionWidth + 21), SUM(ResolutionWidth + 22), SUM(ResolutionWidth + 23), SUM(ResolutionWidth + 24), SUM(ResolutionWidth + 25), SUM(ResolutionWidth + 26), SUM(ResolutionWidth + 27), SUM(ResolutionWidth + 28), SUM(ResolutionWidth + 29), SUM(ResolutionWidth + 30), SUM(ResolutionWidth + 31), SUM(ResolutionWidth + 32), SUM(ResolutionWidth + 33), SUM(ResolutionWidth + 34), SUM(ResolutionWidth + 35), SUM(ResolutionWidth + 36), SUM(ResolutionWidth + 37), SUM(ResolutionWidth + 38), SUM(ResolutionWidth + 39), SUM(ResolutionWidth + 40), SUM(ResolutionWidth + 41), SUM(ResolutionWidth + 42), SUM(ResolutionWidth + 43), SUM(ResolutionWidth + 44), SUM(ResolutionWidth + 45), SUM(ResolutionWidth + 46), SUM(ResolutionWidth + 47), SUM(ResolutionWidth + 48), SUM(ResolutionWidth + 49), SUM(ResolutionWidth + 50), SUM(ResolutionWidth + 51), SUM(ResolutionWidth + 52), SUM(ResolutionWidth + 53), SUM(ResolutionWidth + 54), SUM(ResolutionWidth + 55), SUM(ResolutionWidth + 56), SUM(ResolutionWidth + 57), SUM(ResolutionWidth + 58), SUM(ResolutionWidth + 59), SUM(ResolutionWidth + 60), SUM(ResolutionWidth + 61), SUM(ResolutionWidth + 62), SUM(ResolutionWidth + 63), SUM(ResolutionWidth + 64), SUM(ResolutionWidth + 65), SUM(ResolutionWidth + 66), SUM(ResolutionWidth + 67), SUM(ResolutionWidth + 68), SUM(ResolutionWidth + 69), SUM(ResolutionWidth + 70), SUM(ResolutionWidth + 71), SUM(ResolutionWidth + 72), SUM(ResolutionWidth + 73), SUM(ResolutionWidth + 74), SUM(ResolutionWidth + 75), SUM(ResolutionWidth + 76), SUM(ResolutionWidth + 77), SUM(ResolutionWidth + 78), SUM(ResolutionWidth + 79), SUM(ResolutionWidth + 80), SUM(ResolutionWidth + 81), SUM(ResolutionWidth + 82), SUM(ResolutionWidth + 83), SUM(ResolutionWidth + 84), SUM(ResolutionWidth + 85), SUM(ResolutionWidth + 86), SUM(ResolutionWidth + 87), SUM(ResolutionWidth + 88), SUM(ResolutionWidth + 89) FROM hits; diff --git a/integration/sql/cases/969_clickbench_q30_setup.sql b/integration/sql/cases/969_clickbench_q30_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/969_clickbench_q30_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/969_clickbench_q30_teardown.sql b/integration/sql/cases/969_clickbench_q30_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/969_clickbench_q30_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/970_clickbench_q31_case.sql b/integration/sql/cases/970_clickbench_q31_case.sql new file mode 100644 index 000000000..eb2866f71 --- /dev/null +++ b/integration/sql/cases/970_clickbench_q31_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 31 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT SearchEngineID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, ClientIP ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/970_clickbench_q31_setup.sql b/integration/sql/cases/970_clickbench_q31_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/970_clickbench_q31_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/970_clickbench_q31_teardown.sql b/integration/sql/cases/970_clickbench_q31_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/970_clickbench_q31_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/971_clickbench_q32_case.sql b/integration/sql/cases/971_clickbench_q32_case.sql new file mode 100644 index 000000000..8375046b3 --- /dev/null +++ b/integration/sql/cases/971_clickbench_q32_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 32 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/971_clickbench_q32_setup.sql b/integration/sql/cases/971_clickbench_q32_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/971_clickbench_q32_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/971_clickbench_q32_teardown.sql b/integration/sql/cases/971_clickbench_q32_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/971_clickbench_q32_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/972_clickbench_q33_case.sql b/integration/sql/cases/972_clickbench_q33_case.sql new file mode 100644 index 000000000..6868de7af --- /dev/null +++ b/integration/sql/cases/972_clickbench_q33_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 33 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/972_clickbench_q33_setup.sql b/integration/sql/cases/972_clickbench_q33_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/972_clickbench_q33_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/972_clickbench_q33_teardown.sql b/integration/sql/cases/972_clickbench_q33_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/972_clickbench_q33_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/973_clickbench_q34_case.sql b/integration/sql/cases/973_clickbench_q34_case.sql new file mode 100644 index 000000000..d017d432b --- /dev/null +++ b/integration/sql/cases/973_clickbench_q34_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 34 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT URL, COUNT(*) AS c FROM hits GROUP BY URL ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/973_clickbench_q34_setup.sql b/integration/sql/cases/973_clickbench_q34_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/973_clickbench_q34_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/973_clickbench_q34_teardown.sql b/integration/sql/cases/973_clickbench_q34_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/973_clickbench_q34_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/974_clickbench_q35_case.sql b/integration/sql/cases/974_clickbench_q35_case.sql new file mode 100644 index 000000000..25e47a615 --- /dev/null +++ b/integration/sql/cases/974_clickbench_q35_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 35 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT 1, URL, COUNT(*) AS c FROM hits GROUP BY 1, URL ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/974_clickbench_q35_setup.sql b/integration/sql/cases/974_clickbench_q35_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/974_clickbench_q35_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/974_clickbench_q35_teardown.sql b/integration/sql/cases/974_clickbench_q35_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/974_clickbench_q35_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/975_clickbench_q36_case.sql b/integration/sql/cases/975_clickbench_q36_case.sql new file mode 100644 index 000000000..6db5ec708 --- /dev/null +++ b/integration/sql/cases/975_clickbench_q36_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 36 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3, COUNT(*) AS c FROM hits GROUP BY ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3 ORDER BY c DESC LIMIT 10; diff --git a/integration/sql/cases/975_clickbench_q36_setup.sql b/integration/sql/cases/975_clickbench_q36_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/975_clickbench_q36_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/975_clickbench_q36_teardown.sql b/integration/sql/cases/975_clickbench_q36_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/975_clickbench_q36_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/976_clickbench_q37_case.sql b/integration/sql/cases/976_clickbench_q37_case.sql new file mode 100644 index 000000000..bc87e05a1 --- /dev/null +++ b/integration/sql/cases/976_clickbench_q37_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 37 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT URL, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND URL <> '' GROUP BY URL ORDER BY PageViews DESC LIMIT 10; diff --git a/integration/sql/cases/976_clickbench_q37_setup.sql b/integration/sql/cases/976_clickbench_q37_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/976_clickbench_q37_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/976_clickbench_q37_teardown.sql b/integration/sql/cases/976_clickbench_q37_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/976_clickbench_q37_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/977_clickbench_q38_case.sql b/integration/sql/cases/977_clickbench_q38_case.sql new file mode 100644 index 000000000..9b0a79345 --- /dev/null +++ b/integration/sql/cases/977_clickbench_q38_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 38 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT Title, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND Title <> '' GROUP BY Title ORDER BY PageViews DESC LIMIT 10; diff --git a/integration/sql/cases/977_clickbench_q38_setup.sql b/integration/sql/cases/977_clickbench_q38_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/977_clickbench_q38_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/977_clickbench_q38_teardown.sql b/integration/sql/cases/977_clickbench_q38_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/977_clickbench_q38_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/978_clickbench_q39_case.sql b/integration/sql/cases/978_clickbench_q39_case.sql new file mode 100644 index 000000000..5ab13aaff --- /dev/null +++ b/integration/sql/cases/978_clickbench_q39_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 39 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT URL, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND IsLink <> 0 AND IsDownload = 0 GROUP BY URL ORDER BY PageViews DESC LIMIT 10 OFFSET 1000; diff --git a/integration/sql/cases/978_clickbench_q39_setup.sql b/integration/sql/cases/978_clickbench_q39_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/978_clickbench_q39_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/978_clickbench_q39_teardown.sql b/integration/sql/cases/978_clickbench_q39_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/978_clickbench_q39_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/979_clickbench_q40_case.sql b/integration/sql/cases/979_clickbench_q40_case.sql new file mode 100644 index 000000000..bf9689e9e --- /dev/null +++ b/integration/sql/cases/979_clickbench_q40_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 40 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT TraficSourceID, SearchEngineID, AdvEngineID, CASE WHEN (SearchEngineID = 0 AND AdvEngineID = 0) THEN Referer ELSE '' END AS Src, URL AS Dst, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 GROUP BY TraficSourceID, SearchEngineID, AdvEngineID, Src, Dst ORDER BY PageViews DESC LIMIT 10 OFFSET 1000; diff --git a/integration/sql/cases/979_clickbench_q40_setup.sql b/integration/sql/cases/979_clickbench_q40_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/979_clickbench_q40_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/979_clickbench_q40_teardown.sql b/integration/sql/cases/979_clickbench_q40_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/979_clickbench_q40_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/980_clickbench_q41_case.sql b/integration/sql/cases/980_clickbench_q41_case.sql new file mode 100644 index 000000000..cf5072203 --- /dev/null +++ b/integration/sql/cases/980_clickbench_q41_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 41 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT URLHash, EventDate, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND TraficSourceID IN (-1, 6) AND RefererHash = 3594120000172545465 GROUP BY URLHash, EventDate ORDER BY PageViews DESC LIMIT 10 OFFSET 100; diff --git a/integration/sql/cases/980_clickbench_q41_setup.sql b/integration/sql/cases/980_clickbench_q41_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/980_clickbench_q41_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/980_clickbench_q41_teardown.sql b/integration/sql/cases/980_clickbench_q41_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/980_clickbench_q41_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/981_clickbench_q42_case.sql b/integration/sql/cases/981_clickbench_q42_case.sql new file mode 100644 index 000000000..949b791a5 --- /dev/null +++ b/integration/sql/cases/981_clickbench_q42_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 42 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT WindowClientWidth, WindowClientHeight, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND DontCountHits = 0 AND URLHash = 2868770270353813622 GROUP BY WindowClientWidth, WindowClientHeight ORDER BY PageViews DESC LIMIT 10 OFFSET 10000; diff --git a/integration/sql/cases/981_clickbench_q42_setup.sql b/integration/sql/cases/981_clickbench_q42_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/981_clickbench_q42_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/981_clickbench_q42_teardown.sql b/integration/sql/cases/981_clickbench_q42_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/981_clickbench_q42_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/982_clickbench_q43_case.sql b/integration/sql/cases/982_clickbench_q43_case.sql new file mode 100644 index 000000000..4964e96f2 --- /dev/null +++ b/integration/sql/cases/982_clickbench_q43_case.sql @@ -0,0 +1,6 @@ +-- description: ClickBench Citus query 43 +-- tags: sharded +-- transactional: true +-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary + +SELECT DATE_TRUNC('minute', EventTime) AS M, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-14' AND EventDate <= '2013-07-15' AND IsRefresh = 0 AND DontCountHits = 0 GROUP BY DATE_TRUNC('minute', EventTime) ORDER BY DATE_TRUNC('minute', EventTime) LIMIT 10 OFFSET 1000; diff --git a/integration/sql/cases/982_clickbench_q43_setup.sql b/integration/sql/cases/982_clickbench_q43_setup.sql new file mode 120000 index 000000000..8c07d7f43 --- /dev/null +++ b/integration/sql/cases/982_clickbench_q43_setup.sql @@ -0,0 +1 @@ +clickbench_setup.sql \ No newline at end of file diff --git a/integration/sql/cases/982_clickbench_q43_teardown.sql b/integration/sql/cases/982_clickbench_q43_teardown.sql new file mode 120000 index 000000000..7a4570acc --- /dev/null +++ b/integration/sql/cases/982_clickbench_q43_teardown.sql @@ -0,0 +1 @@ +clickbench_teardown.sql \ No newline at end of file diff --git a/integration/sql/cases/clickbench_setup.sql b/integration/sql/cases/clickbench_setup.sql new file mode 100644 index 000000000..30bc0a5e1 --- /dev/null +++ b/integration/sql/cases/clickbench_setup.sql @@ -0,0 +1,123 @@ +DROP TABLE IF EXISTS hits; +CREATE TABLE hits ( + WatchID BIGINT NOT NULL, + JavaEnable SMALLINT NOT NULL, + Title TEXT NOT NULL, + GoodEvent SMALLINT NOT NULL, + EventTime TIMESTAMP NOT NULL, + EventDate DATE NOT NULL, + CounterID INTEGER NOT NULL, + ClientIP INTEGER NOT NULL, + RegionID INTEGER NOT NULL, + UserID BIGINT NOT NULL, + CounterClass SMALLINT NOT NULL, + OS SMALLINT NOT NULL, + UserAgent SMALLINT NOT NULL, + URL TEXT NOT NULL, + Referer TEXT NOT NULL, + IsRefresh SMALLINT NOT NULL, + RefererCategoryID SMALLINT NOT NULL, + RefererRegionID INTEGER NOT NULL, + URLCategoryID SMALLINT NOT NULL, + URLRegionID INTEGER NOT NULL, + ResolutionWidth SMALLINT NOT NULL, + ResolutionHeight SMALLINT NOT NULL, + ResolutionDepth SMALLINT NOT NULL, + FlashMajor SMALLINT NOT NULL, + FlashMinor SMALLINT NOT NULL, + FlashMinor2 TEXT NOT NULL, + NetMajor SMALLINT NOT NULL, + NetMinor SMALLINT NOT NULL, + UserAgentMajor SMALLINT NOT NULL, + UserAgentMinor VARCHAR(255) NOT NULL, + CookieEnable SMALLINT NOT NULL, + JavascriptEnable SMALLINT NOT NULL, + IsMobile SMALLINT NOT NULL, + MobilePhone SMALLINT NOT NULL, + MobilePhoneModel TEXT NOT NULL, + Params TEXT NOT NULL, + IPNetworkID INTEGER NOT NULL, + TraficSourceID SMALLINT NOT NULL, + SearchEngineID SMALLINT NOT NULL, + SearchPhrase TEXT NOT NULL, + AdvEngineID SMALLINT NOT NULL, + IsArtifical SMALLINT NOT NULL, + WindowClientWidth SMALLINT NOT NULL, + WindowClientHeight SMALLINT NOT NULL, + ClientTimeZone SMALLINT NOT NULL, + ClientEventTime TIMESTAMP NOT NULL, + SilverlightVersion1 SMALLINT NOT NULL, + SilverlightVersion2 SMALLINT NOT NULL, + SilverlightVersion3 INTEGER NOT NULL, + SilverlightVersion4 SMALLINT NOT NULL, + PageCharset TEXT NOT NULL, + CodeVersion INTEGER NOT NULL, + IsLink SMALLINT NOT NULL, + IsDownload SMALLINT NOT NULL, + IsNotBounce SMALLINT NOT NULL, + FUniqID BIGINT NOT NULL, + OriginalURL TEXT NOT NULL, + HID INTEGER NOT NULL, + IsOldCounter SMALLINT NOT NULL, + IsEvent SMALLINT NOT NULL, + IsParameter SMALLINT NOT NULL, + DontCountHits SMALLINT NOT NULL, + WithHash SMALLINT NOT NULL, + HitColor CHAR NOT NULL, + LocalEventTime TIMESTAMP NOT NULL, + Age SMALLINT NOT NULL, + Sex SMALLINT NOT NULL, + Income SMALLINT NOT NULL, + Interests SMALLINT NOT NULL, + Robotness SMALLINT NOT NULL, + RemoteIP INTEGER NOT NULL, + WindowName INTEGER NOT NULL, + OpenerName INTEGER NOT NULL, + HistoryLength SMALLINT NOT NULL, + BrowserLanguage TEXT NOT NULL, + BrowserCountry TEXT NOT NULL, + SocialNetwork TEXT NOT NULL, + SocialAction TEXT NOT NULL, + HTTPError SMALLINT NOT NULL, + SendTiming INTEGER NOT NULL, + DNSTiming INTEGER NOT NULL, + ConnectTiming INTEGER NOT NULL, + ResponseStartTiming INTEGER NOT NULL, + ResponseEndTiming INTEGER NOT NULL, + FetchTiming INTEGER NOT NULL, + SocialSourceNetworkID SMALLINT NOT NULL, + SocialSourcePage TEXT NOT NULL, + ParamPrice BIGINT NOT NULL, + ParamOrderID TEXT NOT NULL, + ParamCurrency TEXT NOT NULL, + ParamCurrencyID SMALLINT NOT NULL, + OpenstatServiceName TEXT NOT NULL, + OpenstatCampaignID TEXT NOT NULL, + OpenstatAdID TEXT NOT NULL, + OpenstatSourceID TEXT NOT NULL, + UTMSource TEXT NOT NULL, + UTMMedium TEXT NOT NULL, + UTMCampaign TEXT NOT NULL, + UTMContent TEXT NOT NULL, + UTMTerm TEXT NOT NULL, + FromTag TEXT NOT NULL, + HasGCLID SMALLINT NOT NULL, + RefererHash BIGINT NOT NULL, + URLHash BIGINT NOT NULL, + CLID INTEGER NOT NULL +); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100001, 0, '', 0, TIMESTAMP '2013-07-15 10:00:00', DATE '2013-07-15', 62, 0, 1, 435090932899640449, 0, 0, 0, 'http://example.com/', '', 0, 0, 0, 0, 0, 1920, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, 'magic', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100002, 0, 'Search results', 0, TIMESTAMP '2013-07-10 11:30:00', DATE '2013-07-10', 62, 0, 1, 100, 0, 0, 0, 'http://google.com/search?q=test', '', 0, 0, 0, 0, 0, 1920, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, 'hello world', 1, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100003, 0, '', 0, TIMESTAMP '2013-07-20 14:45:00', DATE '2013-07-20', 62, 0, 2, 200, 0, 0, 0, 'http://example.com/page', '', 0, 0, 0, 0, 0, 1366, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, '', 2, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100004, 0, 'Google Maps directions', 0, TIMESTAMP '2013-08-01 09:00:00', DATE '2013-08-01', 42, 0, 3, 300, 0, 0, 0, 'http://maps.example.com/', '', 0, 0, 0, 0, 0, 1024, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, 'directions', 3, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100005, 0, '', 0, TIMESTAMP '2013-07-15 12:00:00', DATE '2013-07-15', 62, 0, 0, 400, 0, 0, 0, 'http://example.com/r', 'https://www.foo.com/p', 0, 0, 0, 0, 0, 1280, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 6, 0, '', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 3594120000172545465, 11111111111111111, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100006, 0, '', 0, TIMESTAMP '2013-07-15 13:00:00', DATE '2013-07-15', 62, 0, 0, 500, 0, 0, 0, 'http://example.com/u', '', 0, 0, 0, 0, 0, 1024, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, '', 0, 0, 1024, 768, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 2868770270353813622, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100007, 0, '', 0, TIMESTAMP '2013-07-12 16:00:00', DATE '2013-07-12', 62, 0, 4, 600, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 1, 'iPhone', '', 0, 0, 0, '', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100008, 0, '', 0, TIMESTAMP '2013-07-13 16:30:00', DATE '2013-07-13', 62, 0, 4, 700, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 2, 'Galaxy', '', 0, 0, 3, 'news', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100009, 0, '', 0, TIMESTAMP '2013-07-16 08:00:00', DATE '2013-07-16', 62, 12345, 10, 800, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 1920, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 2, 'weather', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100010, 0, '', 0, TIMESTAMP '2013-07-17 08:15:00', DATE '2013-07-17', 62, 12345, 10, 900, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 1920, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 2, 'weather', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100011, 0, '', 0, TIMESTAMP '2013-07-18 12:00:00', DATE '2013-07-18', 62, 67890, 20, 1000, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 4, 'news', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100012, 0, '', 0, TIMESTAMP '2013-07-19 12:30:00', DATE '2013-07-19', 62, 67890, 20, 1100, 0, 0, 0, '', '', 1, 0, 0, 0, 0, 800, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 4, 'news', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100013, 0, '', 0, TIMESTAMP '2013-07-21 10:00:00', DATE '2013-07-21', 62, 0, 0, 1200, 0, 0, 0, 'http://google.com/maps', 'https://www.example.com/path/to/resource', 0, 0, 0, 0, 0, 1024, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, 'maps', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100014, 0, '', 0, TIMESTAMP '2013-07-25 11:00:00', DATE '2013-07-25', 62, 0, 0, 1300, 0, 0, 0, 'http://example.com/download', '', 0, 0, 0, 0, 0, 1280, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, '', 0, 0, 0, 0, 0, TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, '', 0, 1, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); +INSERT INTO hits (WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID) VALUES (100015, 0, '', 0, TIMESTAMP '2013-07-14 12:34:56', DATE '2013-07-14', 62, 0, 30, 1400, 0, 0, 0, 'http://example.com/other', '', 0, 0, 0, 0, 0, 1366, 0, 0, 0, 0, '', 0, 0, 0, '', 0, 0, 0, 0, '', '', 0, 0, 0, 'test', 0, 0, 0, 0, 0, TIMESTAMP '2013-07-14 12:34:56', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, '', TIMESTAMP '1970-01-01 00:00:00', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '', '', 0, '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0); diff --git a/integration/sql/cases/clickbench_teardown.sql b/integration/sql/cases/clickbench_teardown.sql new file mode 100644 index 000000000..b8a3a8f3e --- /dev/null +++ b/integration/sql/cases/clickbench_teardown.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS hits; diff --git a/integration/sql/clickbench/generate.py b/integration/sql/clickbench/generate.py new file mode 100644 index 000000000..d9c8a8ed0 --- /dev/null +++ b/integration/sql/clickbench/generate.py @@ -0,0 +1,354 @@ +#!/usr/bin/env python3 +"""Generate ClickBench Citus regression cases for the SQL acceptance suite. + +Reads the upstream queries (one per line) from ClickBench/citus/queries.sql +and emits one regression case per query. Each case runs the query against +direct Postgres (baseline) and PgDog routed through the sharded pool, in +both text and binary wire formats. The point is to surface which queries +PgDog returns identical results for and which it does not. + +The generated layout under integration/sql/cases/ is: + + clickbench_setup.sql -- shared CREATE TABLE + seed INSERTs + clickbench_teardown.sql -- shared DROP TABLE + 9XX_clickbench_qNN_setup.sql -> symlink to clickbench_setup.sql + 9XX_clickbench_qNN_case.sql -- one ClickBench query + 9XX_clickbench_qNN_teardown.sql -> symlink to clickbench_teardown.sql + +The harness ignores files that lack a numeric prefix, so the templates +are not picked up directly. +""" +from __future__ import annotations + +import os +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[3] +SQL_ROOT = REPO_ROOT / "integration" / "sql" +CASES_DIR = SQL_ROOT / "cases" +QUERIES_SRC = REPO_ROOT.parent / "ClickBench" / "citus" / "queries.sql" + +SETUP_TEMPLATE = CASES_DIR / "clickbench_setup.sql" +TEARDOWN_TEMPLATE = CASES_DIR / "clickbench_teardown.sql" + +START_INDEX = 940 # leaves room above the existing 9xx range + +# (column_name, sql_type) — verbatim from ClickBench/citus/create.sql, minus +# the columnar storage clause and the composite primary key. +COLUMNS: list[tuple[str, str]] = [ + ("WatchID", "BIGINT"), + ("JavaEnable", "SMALLINT"), + ("Title", "TEXT"), + ("GoodEvent", "SMALLINT"), + ("EventTime", "TIMESTAMP"), + ("EventDate", "DATE"), + ("CounterID", "INTEGER"), + ("ClientIP", "INTEGER"), + ("RegionID", "INTEGER"), + ("UserID", "BIGINT"), + ("CounterClass", "SMALLINT"), + ("OS", "SMALLINT"), + ("UserAgent", "SMALLINT"), + ("URL", "TEXT"), + ("Referer", "TEXT"), + ("IsRefresh", "SMALLINT"), + ("RefererCategoryID", "SMALLINT"), + ("RefererRegionID", "INTEGER"), + ("URLCategoryID", "SMALLINT"), + ("URLRegionID", "INTEGER"), + ("ResolutionWidth", "SMALLINT"), + ("ResolutionHeight", "SMALLINT"), + ("ResolutionDepth", "SMALLINT"), + ("FlashMajor", "SMALLINT"), + ("FlashMinor", "SMALLINT"), + ("FlashMinor2", "TEXT"), + ("NetMajor", "SMALLINT"), + ("NetMinor", "SMALLINT"), + ("UserAgentMajor", "SMALLINT"), + ("UserAgentMinor", "VARCHAR(255)"), + ("CookieEnable", "SMALLINT"), + ("JavascriptEnable", "SMALLINT"), + ("IsMobile", "SMALLINT"), + ("MobilePhone", "SMALLINT"), + ("MobilePhoneModel", "TEXT"), + ("Params", "TEXT"), + ("IPNetworkID", "INTEGER"), + ("TraficSourceID", "SMALLINT"), + ("SearchEngineID", "SMALLINT"), + ("SearchPhrase", "TEXT"), + ("AdvEngineID", "SMALLINT"), + ("IsArtifical", "SMALLINT"), + ("WindowClientWidth", "SMALLINT"), + ("WindowClientHeight", "SMALLINT"), + ("ClientTimeZone", "SMALLINT"), + ("ClientEventTime", "TIMESTAMP"), + ("SilverlightVersion1", "SMALLINT"), + ("SilverlightVersion2", "SMALLINT"), + ("SilverlightVersion3", "INTEGER"), + ("SilverlightVersion4", "SMALLINT"), + ("PageCharset", "TEXT"), + ("CodeVersion", "INTEGER"), + ("IsLink", "SMALLINT"), + ("IsDownload", "SMALLINT"), + ("IsNotBounce", "SMALLINT"), + ("FUniqID", "BIGINT"), + ("OriginalURL", "TEXT"), + ("HID", "INTEGER"), + ("IsOldCounter", "SMALLINT"), + ("IsEvent", "SMALLINT"), + ("IsParameter", "SMALLINT"), + ("DontCountHits", "SMALLINT"), + ("WithHash", "SMALLINT"), + ("HitColor", "CHAR"), + ("LocalEventTime", "TIMESTAMP"), + ("Age", "SMALLINT"), + ("Sex", "SMALLINT"), + ("Income", "SMALLINT"), + ("Interests", "SMALLINT"), + ("Robotness", "SMALLINT"), + ("RemoteIP", "INTEGER"), + ("WindowName", "INTEGER"), + ("OpenerName", "INTEGER"), + ("HistoryLength", "SMALLINT"), + ("BrowserLanguage", "TEXT"), + ("BrowserCountry", "TEXT"), + ("SocialNetwork", "TEXT"), + ("SocialAction", "TEXT"), + ("HTTPError", "SMALLINT"), + ("SendTiming", "INTEGER"), + ("DNSTiming", "INTEGER"), + ("ConnectTiming", "INTEGER"), + ("ResponseStartTiming", "INTEGER"), + ("ResponseEndTiming", "INTEGER"), + ("FetchTiming", "INTEGER"), + ("SocialSourceNetworkID", "SMALLINT"), + ("SocialSourcePage", "TEXT"), + ("ParamPrice", "BIGINT"), + ("ParamOrderID", "TEXT"), + ("ParamCurrency", "TEXT"), + ("ParamCurrencyID", "SMALLINT"), + ("OpenstatServiceName", "TEXT"), + ("OpenstatCampaignID", "TEXT"), + ("OpenstatAdID", "TEXT"), + ("OpenstatSourceID", "TEXT"), + ("UTMSource", "TEXT"), + ("UTMMedium", "TEXT"), + ("UTMCampaign", "TEXT"), + ("UTMContent", "TEXT"), + ("UTMTerm", "TEXT"), + ("FromTag", "TEXT"), + ("HasGCLID", "SMALLINT"), + ("RefererHash", "BIGINT"), + ("URLHash", "BIGINT"), + ("CLID", "INTEGER"), +] + +# Seed rows. Each row overrides only the columns relevant to the query +# filters; all other columns get a deterministic default for their type. +# UserIDs are distinct so the routing key spreads rows across shards. +ROWS: list[dict] = [ + # Q20: WHERE UserID = 435090932899640449 + dict(WatchID=100001, UserID=435090932899640449, CounterID=62, + EventDate="2013-07-15", EventTime="2013-07-15 10:00:00", + URL="http://example.com/", SearchPhrase="magic", + ResolutionWidth=1920, RegionID=1), + + # Q2/Q8: AdvEngineID <> 0; Q21/Q22: URL LIKE '%google%' + dict(WatchID=100002, UserID=100, CounterID=62, + EventDate="2013-07-10", EventTime="2013-07-10 11:30:00", + URL="http://google.com/search?q=test", SearchPhrase="hello world", + AdvEngineID=1, RegionID=1, ResolutionWidth=1920, + Title="Search results", IsRefresh=0, DontCountHits=0), + + # Q8: another AdvEngineID + dict(WatchID=100003, UserID=200, CounterID=62, + EventDate="2013-07-20", EventTime="2013-07-20 14:45:00", + URL="http://example.com/page", SearchPhrase="", + AdvEngineID=2, RegionID=2, ResolutionWidth=1366, + IsRefresh=0, DontCountHits=0), + + # Q23: Title LIKE '%Google%' AND URL NOT LIKE '%.google.%' + dict(WatchID=100004, UserID=300, CounterID=42, + EventDate="2013-08-01", EventTime="2013-08-01 09:00:00", + URL="http://maps.example.com/", Title="Google Maps directions", + AdvEngineID=3, SearchPhrase="directions", + RegionID=3, ResolutionWidth=1024), + + # Q41: RefererHash = 3594120000172545465 AND TraficSourceID IN (-1, 6) + dict(WatchID=100005, UserID=400, CounterID=62, + EventDate="2013-07-15", EventTime="2013-07-15 12:00:00", + RefererHash=3594120000172545465, TraficSourceID=6, + URLHash=11111111111111111, ResolutionWidth=1280, + IsRefresh=0, DontCountHits=0, + URL="http://example.com/r", Referer="https://www.foo.com/p"), + + # Q42: URLHash = 2868770270353813622 + dict(WatchID=100006, UserID=500, CounterID=62, + EventDate="2013-07-15", EventTime="2013-07-15 13:00:00", + URLHash=2868770270353813622, + WindowClientWidth=1024, WindowClientHeight=768, + ResolutionWidth=1024, IsRefresh=0, DontCountHits=0, + URL="http://example.com/u"), + + # Q11/Q12: non-empty MobilePhoneModel + dict(WatchID=100007, UserID=600, CounterID=62, + EventDate="2013-07-12", EventTime="2013-07-12 16:00:00", + MobilePhoneModel="iPhone", MobilePhone=1, + RegionID=4, ResolutionWidth=375), + dict(WatchID=100008, UserID=700, CounterID=62, + EventDate="2013-07-13", EventTime="2013-07-13 16:30:00", + MobilePhoneModel="Galaxy", MobilePhone=2, + SearchEngineID=3, SearchPhrase="news", + RegionID=4, ResolutionWidth=412), + + # Q13/Q14/Q15: shared SearchPhrase + SearchEngineID for GROUP BY tests + dict(WatchID=100009, UserID=800, CounterID=62, + EventDate="2013-07-16", EventTime="2013-07-16 08:00:00", + SearchEngineID=2, SearchPhrase="weather", + RegionID=10, ResolutionWidth=1920, ClientIP=12345, IsRefresh=0, + DontCountHits=0), + dict(WatchID=100010, UserID=900, CounterID=62, + EventDate="2013-07-17", EventTime="2013-07-17 08:15:00", + SearchEngineID=2, SearchPhrase="weather", + RegionID=10, ResolutionWidth=1920, ClientIP=12345, IsRefresh=0, + DontCountHits=0), + + # Q31/Q32/Q36: shared ClientIP + diverse IsRefresh + dict(WatchID=100011, UserID=1000, CounterID=62, + EventDate="2013-07-18", EventTime="2013-07-18 12:00:00", + RegionID=20, ClientIP=67890, IsRefresh=0, + ResolutionWidth=800, SearchEngineID=4, SearchPhrase="news", + DontCountHits=0), + dict(WatchID=100012, UserID=1100, CounterID=62, + EventDate="2013-07-19", EventTime="2013-07-19 12:30:00", + RegionID=20, ClientIP=67890, IsRefresh=1, + ResolutionWidth=800, SearchEngineID=4, SearchPhrase="news", + DontCountHits=0), + + # Q22/Q29: URL LIKE '%google%' + non-empty Referer + dict(WatchID=100013, UserID=1200, CounterID=62, + EventDate="2013-07-21", EventTime="2013-07-21 10:00:00", + URL="http://google.com/maps", + Referer="https://www.example.com/path/to/resource", + SearchPhrase="maps", ResolutionWidth=1024, + IsRefresh=0, DontCountHits=0), + + # Q39: IsLink <> 0 AND IsDownload = 0 + dict(WatchID=100014, UserID=1300, CounterID=62, + EventDate="2013-07-25", EventTime="2013-07-25 11:00:00", + URL="http://example.com/download", + IsLink=1, IsDownload=0, IsRefresh=0, + ResolutionWidth=1280, DontCountHits=0), + + # Q19/Q43: distinctive minute + DATE_TRUNC date in 2013-07-14..15 + dict(WatchID=100015, UserID=1400, CounterID=62, + EventDate="2013-07-14", EventTime="2013-07-14 12:34:56", + ClientEventTime="2013-07-14 12:34:56", + URL="http://example.com/other", SearchPhrase="test", + ResolutionWidth=1366, RegionID=30, + IsRefresh=0, DontCountHits=0), +] + + +def default_value(sql_type: str): + if sql_type in ("BIGINT", "SMALLINT", "INTEGER"): + return 0 + if sql_type in ("TEXT", "VARCHAR(255)", "CHAR"): + return "" + if sql_type == "DATE": + return "1970-01-01" + if sql_type == "TIMESTAMP": + return "1970-01-01 00:00:00" + raise ValueError(f"unhandled type {sql_type}") + + +def sql_literal(value, sql_type: str) -> str: + if sql_type in ("BIGINT", "SMALLINT", "INTEGER"): + return str(int(value)) + if sql_type in ("TEXT", "VARCHAR(255)", "CHAR"): + s = str(value).replace("'", "''") + return f"'{s}'" + if sql_type == "DATE": + return f"DATE '{value}'" + if sql_type == "TIMESTAMP": + return f"TIMESTAMP '{value}'" + raise ValueError(f"unhandled type {sql_type}") + + +def render_setup() -> str: + out: list[str] = ["DROP TABLE IF EXISTS hits;\n", "CREATE TABLE hits (\n"] + out.append(",\n".join(f" {n} {t} NOT NULL" for n, t in COLUMNS)) + out.append("\n);\n") + for row in ROWS: + col_names = [n for n, _ in COLUMNS] + values = [sql_literal(row.get(n, default_value(t)), t) for n, t in COLUMNS] + out.append( + "INSERT INTO hits (" + + ", ".join(col_names) + + ") VALUES (" + + ", ".join(values) + + ");\n" + ) + return "".join(out) + + +def render_teardown() -> str: + return "DROP TABLE IF EXISTS hits;\n" + + +def parse_queries(text: str) -> list[str]: + queries: list[str] = [] + for raw in text.splitlines(): + stripped = raw.strip() + if not stripped or stripped.startswith("--"): + continue + queries.append(stripped.rstrip(";")) + return queries + + +def render_case(query_no: int, sql: str) -> str: + header = ( + f"-- description: ClickBench Citus query {query_no}\n" + "-- tags: sharded\n" + "-- transactional: true\n" + "-- only-targets: postgres_standard_text pgdog_sharded_text pgdog_sharded_binary\n" + "\n" + ) + return header + sql + ";\n" + + +def force_symlink(link: Path, target_name: str) -> None: + if link.exists() or link.is_symlink(): + link.unlink() + os.symlink(target_name, link) + + +def main() -> None: + if not QUERIES_SRC.exists(): + raise SystemExit(f"queries.sql not found at {QUERIES_SRC}") + queries = parse_queries(QUERIES_SRC.read_text()) + if len(queries) != 43: + raise SystemExit( + f"expected 43 ClickBench queries, found {len(queries)} in {QUERIES_SRC}" + ) + + SETUP_TEMPLATE.write_text(render_setup()) + TEARDOWN_TEMPLATE.write_text(render_teardown()) + + for offset, sql in enumerate(queries): + query_no = offset + 1 + idx = START_INDEX + offset + slug = f"clickbench_q{query_no:02d}" + case_path = CASES_DIR / f"{idx}_{slug}_case.sql" + setup_link = CASES_DIR / f"{idx}_{slug}_setup.sql" + teardown_link = CASES_DIR / f"{idx}_{slug}_teardown.sql" + + case_path.write_text(render_case(query_no, sql)) + force_symlink(setup_link, SETUP_TEMPLATE.name) + force_symlink(teardown_link, TEARDOWN_TEMPLATE.name) + + print(f"wrote {len(queries)} ClickBench cases starting at {START_INDEX}") + + +if __name__ == "__main__": + main() diff --git a/integration/sql/dev.sh b/integration/sql/dev.sh index 4bf6fef68..6f173a1c3 100755 --- a/integration/sql/dev.sh +++ b/integration/sql/dev.sh @@ -11,6 +11,6 @@ source venv/bin/activate pip install --upgrade pip >/dev/null pip install -r requirements.txt -pytest -x +pytest popd >/dev/null diff --git a/pgdog-postgres-types/src/array.rs b/pgdog-postgres-types/src/array.rs index 6c50d5573..816bba3ba 100644 --- a/pgdog-postgres-types/src/array.rs +++ b/pgdog-postgres-types/src/array.rs @@ -77,6 +77,16 @@ impl Array { } } + /// Borrow the decoded element list. `None` entries are SQL NULLs. + pub fn elements(&self) -> &[Option] { + &self.elements + } + + /// OID of the array's element type. + pub fn element_oid(&self) -> i32 { + self.element_oid + } + /// Encode the array to the specified wire format. /// /// Cross-format encoding works because elements are stored as typed diff --git a/pgdog/src/backend/pool/connection/aggregate.rs b/pgdog/src/backend/pool/connection/aggregate.rs index 7c6a3c91b..698394055 100644 --- a/pgdog/src/backend/pool/connection/aggregate.rs +++ b/pgdog/src/backend/pool/connection/aggregate.rs @@ -1,6 +1,6 @@ //! Aggregate buffer. -use std::collections::{HashMap, VecDeque}; +use std::collections::{HashMap, HashSet, VecDeque}; use crate::{ frontend::router::parser::{ @@ -16,7 +16,7 @@ use crate::{ }, }; use rust_decimal::prelude::{FromPrimitive, ToPrimitive}; -use rust_decimal::Decimal; +use rust_decimal::{Decimal, RoundingStrategy}; use super::Error; @@ -50,6 +50,7 @@ struct Accumulator<'a> { datum: Datum, avg: Option, variance: Option, + distinct: Option, } impl<'a> Accumulator<'a> { @@ -71,12 +72,17 @@ impl<'a> Accumulator<'a> { datum: Datum::Null, avg: None, variance: None, + distinct: None, }; if matches!(target.function(), AggregateFunction::Avg) { accumulator.avg = Some(AvgState::new(helper.count)); } + if matches!(target.function(), AggregateFunction::Count) && target.is_distinct() { + accumulator.distinct = Some(DistinctState::new(helper.distinct)); + } + if matches!( target.function(), AggregateFunction::StddevPop @@ -103,7 +109,34 @@ impl<'a> Accumulator<'a> { .ok_or(Error::DecoderRowError)?; match self.target.function() { AggregateFunction::Count => { - if !self.datum.is_null() { + if let Some(state) = self.distinct.as_mut() { + if !state.supported { + return Ok(false); + } + let Some(distinct_column) = state.distinct_column else { + state.supported = false; + return Ok(false); + }; + let helper = row + .get_column(distinct_column, decoder)? + .ok_or(Error::DecoderRowError)?; + match helper.value { + Datum::Null => {} + Datum::Array(array) => { + for element in array.elements() { + if let Some(value) = element { + state.values.insert(value.clone()); + } + } + } + // Helper column wasn't decoded as an array — we can't + // dedupe correctly, so fall back to per-shard rows. + _ => { + state.supported = false; + return Ok(false); + } + } + } else if !self.datum.is_null() { self.datum = self.datum.clone() + column.value; } else { self.datum = column.value; @@ -182,6 +215,14 @@ impl<'a> Accumulator<'a> { } fn finalize(&mut self) -> Result { + if let Some(state) = self.distinct.as_mut() { + if !state.supported { + return Ok(false); + } + self.datum = Datum::Bigint(state.values.len() as i64); + return Ok(true); + } + if let Some(state) = self.avg.as_mut() { if !state.supported { return Ok(false); @@ -242,6 +283,24 @@ struct HelperColumns { count: Option, sum: Option, sumsq: Option, + distinct: Option, +} + +#[derive(Debug)] +struct DistinctState { + distinct_column: Option, + values: HashSet, + supported: bool, +} + +impl DistinctState { + fn new(distinct_column: Option) -> Self { + Self { + distinct_column, + values: HashSet::new(), + supported: distinct_column.is_some(), + } + } } #[derive(Debug, Clone)] @@ -476,12 +535,17 @@ impl<'a> Aggregates<'a> { HelperKind::Count => entry.count = Some(index), HelperKind::Sum => entry.sum = Some(index), HelperKind::SumSquares => entry.sumsq = Some(index), + HelperKind::Distinct => entry.distinct = Some(index), } } let merge_supported = aggregate.targets().iter().all(|target| { let key = (target.expr_id(), target.is_distinct()); match target.function() { + AggregateFunction::Count if target.is_distinct() => helper_columns + .get(&key) + .and_then(|columns| columns.distinct) + .is_some(), AggregateFunction::Avg => helper_columns .get(&key) .and_then(|columns| columns.count) @@ -636,18 +700,34 @@ fn divide_for_average(sum: &Datum, count: &Datum) -> Option { (float.0 as f64 / divisor_i128 as f64) as f32, ))), Datum::Numeric(numeric) => { - let decimal = numeric.as_decimal()?.to_owned(); + let dividend = numeric.as_decimal()?.to_owned(); let divisor = Decimal::from_i128_with_scale(divisor_i128, 0); if divisor == Decimal::ZERO { Some(Datum::Null) } else { - Some(Datum::Numeric(Numeric::from(decimal / divisor))) + // Postgres's numeric_div (used by AVG) picks the result + // scale via select_div_scale: at least NUMERIC_MIN_SIG_DIGITS + // (16), bumped up by the inputs' dscale. rust_decimal's + // Decimal::div returns whatever scale fits in 28 total digits + // -- typically more than 16 for small averages -- so the wire + // format ends up wider than a non-sharded query. Match + // Postgres by rounding to the same scale, half-away-from-zero + // like numeric_div does. + let target_scale = dividend.scale().max(NUMERIC_AVG_MIN_SCALE); + let rescaled = (dividend / divisor) + .round_dp_with_strategy(target_scale, RoundingStrategy::MidpointAwayFromZero); + Some(Datum::Numeric(Numeric::from(rescaled))) } } _ => None, } } +/// Postgres's `select_div_scale` floors the result of `numeric_div` at +/// `NUMERIC_MIN_SIG_DIGITS` (16) decimal places, which is what `AVG` over +/// integer columns ends up emitting on the wire. +const NUMERIC_AVG_MIN_SCALE: u32 = 16; + fn datum_as_i128(datum: &Datum) -> Option { match datum { Datum::Bigint(value) => Some(*value as i128), @@ -738,6 +818,45 @@ mod test { } } + #[test] + fn divide_for_average_numeric_matches_postgres_avg_scale() { + // SELECT AVG(x) FROM hits; where x is int2 -- baseline Postgres + // emits "1228.7333333333333333" (scale 16). Pgdog used to emit + // scale 20 because rust_decimal's Decimal::div picks the widest + // scale that fits in 28 digits. Verify the divider rescales to + // match Postgres. + let sum = Datum::Numeric(Numeric::from(Decimal::from_i128_with_scale(18431, 0))); + let count = Datum::Bigint(15); + let result = divide_for_average(&sum, &count).unwrap(); + match result { + Datum::Numeric(numeric) => { + let decimal = numeric.as_decimal().unwrap(); + assert_eq!(decimal.scale(), 16); + assert_eq!(decimal.to_string(), "1228.7333333333333333"); + } + other => panic!("unexpected datum variant: {other:?}"), + } + } + + #[test] + fn divide_for_average_numeric_preserves_input_scale_when_higher() { + // AVG(numeric(20, 20)) where the input scale (20) exceeds the + // 16-digit floor -- Postgres keeps the larger scale, and so should pgdog. + let sum = Datum::Numeric(Numeric::from(Decimal::from_i128_with_scale( + 12345678901234567890, + 20, + ))); + let count = Datum::Bigint(1); + let result = divide_for_average(&sum, &count).unwrap(); + match result { + Datum::Numeric(numeric) => { + let decimal = numeric.as_decimal().unwrap(); + assert_eq!(decimal.scale(), 20); + } + other => panic!("unexpected datum variant: {other:?}"), + } + } + #[test] fn divide_for_average_zero_count() { let sum = Datum::Double(Double(30.0)); @@ -770,6 +889,18 @@ mod test { } } + fn text_array_field(name: &str) -> Field { + Field { + name: name.into(), + table_oid: 0, + column: 0, + type_oid: 1009, // text[] + type_size: -1, + type_modifier: -1, + format: 0, + } + } + fn interval_array_field(name: &str) -> Field { Field { name: name.into(), @@ -1194,6 +1325,109 @@ mod test { assert!((variance - 20.0).abs() < 1e-9); } + #[test] + fn aggregate_count_distinct_dedupes_across_shards() { + // SELECT COUNT(DISTINCT phrase) FROM hits with two shards where + // some phrases overlap ({a,b,c} vs {b,c,d}). The naive sum gives 6; + // Postgres returns 4. Pgdog now matches by deduping the per-shard + // array_agg(DISTINCT) helper into a HashSet before counting. + let stmt = pg_query::parse("SELECT COUNT(DISTINCT phrase) FROM hits") + .unwrap() + .protobuf + .stmts + .first() + .cloned() + .unwrap(); + let aggregate = match stmt.stmt.unwrap().node.unwrap() { + pg_query::NodeEnum::SelectStmt(stmt) => Aggregate::parse(&stmt), + _ => panic!("expected select stmt"), + }; + + let rd = RowDescription::new(&[ + Field::bigint("count"), + text_array_field("__pgdog_distinct_expr0_col0"), + ]); + let decoder = Decoder::from(&rd); + + let mut rows = VecDeque::new(); + let mut shard0 = DataRow::new(); + shard0.add(3_i64).add(Bytes::from_static(b"{a,b,c}")); + rows.push_back(shard0); + let mut shard1 = DataRow::new(); + shard1.add(3_i64).add(Bytes::from_static(b"{b,c,d}")); + rows.push_back(shard1); + + let mut plan = AggregateRewritePlan::default(); + plan.add_drop_column(1); + plan.add_helper(HelperMapping { + target_column: 0, + helper_column: 1, + expr_id: 0, + distinct: true, + kind: HelperKind::Distinct, + alias: "__pgdog_distinct_expr0_col0".into(), + }); + + let aggregates = Aggregates::new(&rows, &decoder, &aggregate, &plan); + assert!(aggregates.merge_supported); + let mut result = aggregates.aggregate().unwrap(); + + assert_eq!(result.len(), 1); + let row = result.pop_front().unwrap(); + let count = row.get::(0, Format::Text).unwrap(); + assert_eq!(count, 4); + } + + #[test] + fn aggregate_count_distinct_skips_nulls() { + // Postgres COUNT(DISTINCT x) ignores NULLs, but array_agg(DISTINCT x) + // includes a single NULL. Make sure the merger doesn't count it. + let stmt = pg_query::parse("SELECT COUNT(DISTINCT phrase) FROM hits") + .unwrap() + .protobuf + .stmts + .first() + .cloned() + .unwrap(); + let aggregate = match stmt.stmt.unwrap().node.unwrap() { + pg_query::NodeEnum::SelectStmt(stmt) => Aggregate::parse(&stmt), + _ => panic!("expected select stmt"), + }; + + let rd = RowDescription::new(&[ + Field::bigint("count"), + text_array_field("__pgdog_distinct_expr0_col0"), + ]); + let decoder = Decoder::from(&rd); + + let mut rows = VecDeque::new(); + let mut shard0 = DataRow::new(); + shard0.add(2_i64).add(Bytes::from_static(b"{a,NULL}")); + rows.push_back(shard0); + let mut shard1 = DataRow::new(); + shard1.add(2_i64).add(Bytes::from_static(b"{b,NULL}")); + rows.push_back(shard1); + + let mut plan = AggregateRewritePlan::default(); + plan.add_drop_column(1); + plan.add_helper(HelperMapping { + target_column: 0, + helper_column: 1, + expr_id: 0, + distinct: true, + kind: HelperKind::Distinct, + alias: "__pgdog_distinct_expr0_col0".into(), + }); + + let mut result = Aggregates::new(&rows, &decoder, &aggregate, &plan) + .aggregate() + .unwrap(); + assert_eq!(result.len(), 1); + let row = result.pop_front().unwrap(); + let count = row.get::(0, Format::Text).unwrap(); + assert_eq!(count, 2); + } + #[test] fn aggregate_distinct_count_not_paired() { let stmt = pg_query::parse("SELECT COUNT(DISTINCT price), AVG(price) FROM menu") diff --git a/pgdog/src/frontend/router/parser/aggregate.rs b/pgdog/src/frontend/router/parser/aggregate.rs index 759728af6..78c98653d 100644 --- a/pgdog/src/frontend/router/parser/aggregate.rs +++ b/pgdog/src/frontend/router/parser/aggregate.rs @@ -124,15 +124,43 @@ impl Aggregate { pub fn parse(stmt: &SelectStmt) -> Self { let mut targets = vec![]; let mut registry = ExpressionRegistry::new(); + + // Canonical id of every SELECT-list expression, indexed by position. + // Used to match arbitrary GROUP BY expressions like `clientip - 1` + // back to their SELECT-list slot when neither an ordinal nor a bare + // ColumnRef applies. + let mut group_by_registry = ExpressionRegistry::new(); + let target_canonical_ids: Vec> = stmt + .target_list + .iter() + .map(|node| { + let NodeEnum::ResTarget(res) = node.node.as_ref()? else { + return None; + }; + res.val + .as_ref() + .map(|val| group_by_registry.intern(val.as_ref())) + }) + .collect(); + + let lookup_canonical = |registry: &mut ExpressionRegistry, node: &Node| -> Option { + let id = registry.intern(node); + target_canonical_ids + .iter() + .position(|target_id| *target_id == Some(id)) + }; + let group_by = stmt .group_clause .iter() .filter_map(|node| { - node.node.as_ref().map(|node| match node { - NodeEnum::AConst(aconst) => aconst.val.as_ref().map(|val| match val { - Val::Ival(Integer { ival }) => Some(*ival as usize - 1), // We use 0-indexed arrays, Postgres uses 1-indexed. + let inner = node.node.as_ref()?; + match inner { + NodeEnum::AConst(aconst) => match aconst.val.as_ref()? { + // GROUP BY 1 -- 1-based ordinal into the SELECT list. + Val::Ival(Integer { ival }) => (*ival as usize).checked_sub(1), _ => None, - }), + }, NodeEnum::ColumnRef(column_ref) => { let column_names: Vec<&String> = column_ref .fields @@ -145,13 +173,14 @@ impl Aggregate { _ => None, }) .collect(); - Some(target_list_to_index(stmt, column_names)) + target_list_to_index(stmt, column_names) + .or_else(|| lookup_canonical(&mut group_by_registry, node)) } - _ => None, - }) + // Arbitrary expressions (AExpr, FuncCall, TypeCast, ...). + // Match them to a SELECT-list entry by canonical form. + _ => lookup_canonical(&mut group_by_registry, node), + } }) - .flatten() - .flatten() .collect::>(); for (idx, node) in stmt.target_list.iter().enumerate() { @@ -542,6 +571,56 @@ mod test { } } + #[test] + fn test_parse_group_by_arithmetic_expression() { + // ClickBench Q36 shape: arithmetic expressions appear in both + // SELECT and GROUP BY. The parser used to recognize only ordinals + // and bare column refs, so columns 1..3 were dropped and the merger + // emitted NULLs for them. + let query = pg_query::parse( + "SELECT clientip, clientip - 1, clientip - 2, clientip - 3, COUNT(*) \ + FROM hits \ + GROUP BY clientip, clientip - 1, clientip - 2, clientip - 3", + ) + .unwrap() + .protobuf + .stmts + .first() + .cloned() + .unwrap(); + match query.stmt.unwrap().node.unwrap() { + NodeEnum::SelectStmt(stmt) => { + let aggr = Aggregate::parse(&stmt); + assert_eq!(aggr.group_by(), &[0, 1, 2, 3]); + assert_eq!(aggr.targets().len(), 1); + assert_eq!(aggr.targets()[0].column(), 4); + } + _ => panic!("not a select"), + } + } + + #[test] + fn test_parse_group_by_function_expression() { + // GROUP BY DATE_TRUNC(...) -- another non-ColumnRef shape (FuncCall). + let query = pg_query::parse( + "SELECT DATE_TRUNC('minute', t), COUNT(*) FROM hits \ + GROUP BY DATE_TRUNC('minute', t)", + ) + .unwrap() + .protobuf + .stmts + .first() + .cloned() + .unwrap(); + match query.stmt.unwrap().node.unwrap() { + NodeEnum::SelectStmt(stmt) => { + let aggr = Aggregate::parse(&stmt); + assert_eq!(aggr.group_by(), &[0]); + } + _ => panic!("not a select"), + } + } + #[test] fn test_parse_group_by_column_not_in_select() { let query = pg_query::parse("SELECT COUNT(*) FROM example GROUP BY user_id") diff --git a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs index e8e57a695..e5465f9dc 100644 --- a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs +++ b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs @@ -211,6 +211,30 @@ impl AggregatesRewrite { } } + fn build_array_agg_distinct_func(original: &FuncCall) -> Option { + // COUNT(*) has no argument we can wrap in array_agg. + if original.agg_star || original.args.is_empty() { + return None; + } + Some(FuncCall { + funcname: vec![Node { + node: Some(NodeEnum::String(PgString { + sval: "array_agg".into(), + })), + }], + args: original.args.clone(), + agg_order: original.agg_order.clone(), + agg_filter: original.agg_filter.clone(), + over: original.over.clone(), + agg_within_group: original.agg_within_group, + agg_star: false, + agg_distinct: true, + func_variadic: original.func_variadic, + funcformat: original.funcformat, + location: original.location, + }) + } + fn build_sum_of_squares_func(original: &FuncCall, distinct: bool) -> Option { let arg = original.args.first()?.clone(); @@ -293,6 +317,16 @@ impl AggregatesRewrite { helpers } + AggregateFunction::Count if distinct => { + if let Some(func) = Self::build_array_agg_distinct_func(func_call) { + vec![HelperSpec { + func, + kind: HelperKind::Distinct, + }] + } else { + vec![] + } + } _ => vec![], } } @@ -418,6 +452,49 @@ mod tests { ); } + #[test] + fn rewrite_engine_count_distinct_emits_array_agg_helper() { + let (ast, output) = rewrite("SELECT COUNT(DISTINCT phrase) FROM hits"); + assert_eq!(output.plan.drop_columns(), &[1]); + assert_eq!(output.plan.helpers().len(), 1); + + let helper = &output.plan.helpers()[0]; + assert_eq!(helper.target_column, 0); + assert_eq!(helper.helper_column, 1); + assert!(helper.distinct); + assert!(matches!(helper.kind, HelperKind::Distinct)); + + let target_list = &select(&ast).target_list; + assert_eq!(target_list.len(), 2); + let helper_func = match target_list[1].node.as_ref() { + Some(NodeEnum::ResTarget(res)) => match res.val.as_deref().and_then(|v| v.node.as_ref()) + { + Some(NodeEnum::FuncCall(func)) => func.clone(), + other => panic!("expected FuncCall in helper target, got {other:?}"), + }, + other => panic!("expected ResTarget, got {other:?}"), + }; + let func_name = helper_func + .funcname + .first() + .and_then(|n| n.node.as_ref()) + .and_then(|n| match n { + NodeEnum::String(s) => Some(s.sval.as_str()), + _ => None, + }); + assert_eq!(func_name, Some("array_agg")); + assert!(helper_func.agg_distinct); + } + + #[test] + fn rewrite_engine_count_star_distinct_skipped() { + // COUNT(*) cannot be DISTINCT in standard SQL, but be defensive: if a + // user somehow gets a star-flagged DISTINCT count past the parser, + // we should not emit a malformed array_agg(*). + let (_, output) = rewrite("SELECT COUNT(*) FROM hits"); + assert!(output.plan.is_noop()); + } + #[test] fn rewrite_engine_stddev_helpers() { let (ast, output) = rewrite("SELECT STDDEV(price) FROM menu"); diff --git a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/plan.rs b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/plan.rs index 78b349b6b..bf4293414 100644 --- a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/plan.rs +++ b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/plan.rs @@ -7,6 +7,8 @@ pub enum HelperKind { Sum, /// SUM(POWER(column, 2)) SumSquares, + /// array_agg(DISTINCT column) — used to dedupe COUNT(DISTINCT) across shards. + Distinct, } impl HelperKind { @@ -16,6 +18,7 @@ impl HelperKind { HelperKind::Count => "count", HelperKind::Sum => "sum", HelperKind::SumSquares => "sumsq", + HelperKind::Distinct => "distinct", } } }