should be it
This commit is contained in:
570
external/duckdb/test/sql/join/iejoin/iejoin_issue_6314.test_slow
vendored
Normal file
570
external/duckdb/test/sql/join/iejoin/iejoin_issue_6314.test_slow
vendored
Normal file
@@ -0,0 +1,570 @@
|
||||
# name: test/sql/join/iejoin/iejoin_issue_6314.test_slow
|
||||
# description: Issue #6314: Segmentation fault when joining on timestamp with BETWEEN
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
create table ota as select timestamp '2019-04-25 14:10:00' + concat(15 * i, ' minutes')::interval as ts, (i * 5 % 100)::REAL AS val from generate_series(0,167136,1) t(i);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE flags("start" TIMESTAMP, "end" TIMESTAMP, source VARCHAR, "desc" VARCHAR);
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-04-27 06:57:07.210882','2019-05-03 11:47:17.59408','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-04 18:31:02.98257','2019-05-04 18:31:03.779477','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-06 05:39:26.004945','2019-05-06 05:39:26.239315','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-06 20:59:33.37157','2019-05-06 20:59:33.402848','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-06 21:14:39.389213','2019-05-06 21:14:39.389213','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-06 21:29:41.849197','2019-05-06 21:29:41.880455','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-06 23:15:11.014935','2019-05-08 07:04:17.679436','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-08 12:11:59.757938','2019-05-08 12:11:59.757938','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-10 18:10:50.543442','2019-05-17 03:24:07.564913','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-17 10:41:08.933154','2019-05-17 13:11:49.965971','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-18 09:40:48.393364','2019-05-22 06:23:59.900634','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-28 22:13:49.48383','2019-05-28 22:59:02.257043','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-05-28 23:29:10.768931','2019-05-30 16:09:22.471287','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-06-01 22:16:21.233545','2019-06-01 22:16:21.233545','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-06-03 15:34:27.135046','2019-06-09 04:45:09.435281','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-06-12 16:38:47.439035','2019-06-12 16:38:47.439035','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-06-17 02:38:42.389044','2019-06-18 20:50:36.829324','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-06-18 22:21:02.559667','2019-06-18 22:21:02.559667','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-06-19 18:43:23.96448','2019-07-09 19:57:32.802906','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-07-13 21:55:11.56286','2019-07-13 21:55:11.56286','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-07-16 00:54:34.577846','2019-07-27 11:54:57.069538','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-07-28 09:44:50.873531','2019-07-28 09:44:50.873531','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-07-29 04:30:55.210772','2019-07-29 04:30:55.210772','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-01 13:11:12.007762','2019-08-01 13:11:12.007762','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-01 20:53:00.104555','2019-08-10 12:22:04.507877','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-11 13:34:13.847871','2019-08-11 13:34:13.847871','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-12 03:11:45.616815','2019-08-16 12:04:04.771614','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-17 03:30:05.751071','2019-08-17 03:30:09.912299','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-17 10:18:52','2019-08-18 07:01:58.625201','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-18 07:09:41.725062','2019-08-18 07:09:41.725062','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-18 12:51:51.684778','2019-08-18 17:23:38.404315','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-18 17:27:33.87348','2019-08-19 12:48:02.813164','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-19 12:48:03.856232','2019-08-19 12:48:05.153111','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-19 13:03:05.546246','2019-08-19 13:03:07.014976','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-21 18:48:16.020933','2019-08-21 18:48:17.22906','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-21 22:04:12.155626','2019-08-24 20:54:10.580362','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-08-27 01:39:03.415172','2019-09-02 04:50:36.592331','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-02 08:09:54.450194','2019-09-02 08:09:54.450194','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-03 21:32:04.727393','2019-09-04 21:39:40.521211','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-05 01:09:51.078083','2019-09-05 15:59:02.204584','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-05 19:31:12.229758','2019-09-06 00:21:01.320128','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-07 06:39:57.02327','2019-09-07 11:46:21.22316','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-10 17:18:19.409298','2019-09-10 17:18:19.409298','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-11 22:11:24.748004','2019-09-11 22:11:24.748004','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-12 18:02:00.344891','2019-09-12 22:33:17.289047','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-16 08:26:23.586698','2019-09-16 15:13:18.378834','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-16 16:13:35.662604','2019-09-16 16:28:42.196364','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-16 16:43:44.276961','2019-09-16 20:29:47.941955','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-17 08:43:01.263386','2019-09-24 10:06:02.384592','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-24 13:06:51.610235','2019-09-24 13:06:51.610235','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-26 22:53:06.279389','2019-09-26 22:53:06.279389','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-27 23:45:10.455638','2019-09-28 01:45:41.915928','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-28 02:13:58.055097','2019-09-28 02:13:58.055097','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-09-28 05:31:47.220773','2019-09-28 05:31:47.220773','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-03 01:14:37.537529','2019-10-03 15:23:32','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-03 22:40:32','2019-10-03 22:40:32','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-09 15:03:43.289075','2019-10-14 17:43:43.628362','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-15 06:13:34.636141','2019-10-15 06:13:34.636141','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-16 08:37:10.770546','2019-10-17 18:40:28.77581','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-18 08:44:15.480474','2019-10-18 08:44:15.480474','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-19 02:04:31.517173','2019-10-28 01:24:39.438477','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-28 23:56:25.107861','2019-10-28 23:56:25.107861','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-10-30 21:21:25.340815','2019-11-28 14:04:27.737957','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-11-30 16:26:26.326418','2019-11-30 16:26:26.326418','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2019-12-02 03:24:55.442545','2020-01-01 05:06:22.828287','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-01 07:27:16.91793','2020-01-01 07:27:16.91793','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-01 08:21:57.443013','2020-01-02 09:26:22.480784','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-02 15:43:47.533201','2020-01-02 15:43:47.533201','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-03 00:59:06.971364','2020-01-04 16:05:59.965927','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-04 16:36:05.182976','2020-01-04 16:36:05.182976','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-04 22:22:05.185172','2020-01-05 07:08:38.487131','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-05 22:41:22.246919','2020-01-06 05:27:33.573642','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-06 06:12:41.794005','2020-01-06 12:13:45.006863','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-06 15:14:32','2020-01-06 15:44:22.120394','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-06 18:46:28.041729','2020-01-10 03:59:10.738719','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-10 13:10:34.79698','2020-01-10 13:10:34.79698','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-10 22:17:24.164384','2020-01-12 12:13:57.267754','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-13 03:33:05.485806','2020-01-13 03:33:05.485806','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-15 11:16:36.753327','2020-01-16 10:54:45.773417','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-16 11:35:55.106627','2020-01-16 11:35:55.106627','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-19 11:19:37.643996','2020-01-19 11:19:37.643996','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-20 12:24:24.969721','2020-01-20 12:24:24.969721','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-20 21:32:44.037711','2020-01-22 20:42:56.2408','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-23 10:32:58.520895','2020-01-24 03:16:26.692278','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-01-25 00:51:00.831728','2020-02-08 12:12:52.627855','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-02-08 14:48:40.089071','2020-02-08 16:03:54.498861','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-02-08 19:19:32.357072','2020-02-10 09:56:01.144206','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-02-10 11:26:18.500557','2020-02-10 11:26:18.500557','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-02-11 20:13:07.502813','2020-02-15 03:22:04.688344','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-02-15 21:35:30.422594','2020-02-15 21:35:30.422594','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-02-17 10:25:38','2020-03-09 03:09:52','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-03-09 18:25:52','2020-03-09 21:41:12','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-03-12 15:22:52','2020-03-15 04:48:32','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-03-16 06:59:56.26681','2020-03-16 06:59:56.26681','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-03-17 15:13:19.677282','2020-03-18 23:06:58.733077','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-03-21 00:03:09','2020-03-21 00:18:32','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-03-22 05:09:32','2020-04-30 14:47:32','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-04-30 21:38:25.38098','2020-04-30 21:38:25.38098','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-05-01 07:12:52','2020-05-01 22:57:02.230289','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-05-02 17:07:32','2020-05-02 17:07:32','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-05-05 16:25:30.373568','2020-06-07 21:39:38.313439','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-06-08 18:58:10.377347','2020-06-08 18:58:10.377347','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-06-09 15:37:00.810016','2020-07-10 12:34:10.196829','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-07-11 02:11:51.973322','2020-07-11 02:11:51.973322','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-07-23 20:11:20.543131','2020-07-27 01:05:09.67894','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-07-28 21:53:26.927383','2020-07-28 21:53:26.927383','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-07-29 08:52:32.951849','2020-07-31 07:44:09.401172','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-07-31 23:19:12.810416','2020-07-31 23:49:15.699364','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-08-01 01:14:16.073637','2020-09-12 02:34:29.675746','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-09-24 08:26:03.75682','2020-09-24 08:26:03.75682','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-09-25 23:33:02.184214','2020-11-08 21:19:55.639463','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-11-11 00:32:27.659817','2020-11-11 00:32:27.659817','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-11-11 11:53:28.539259','2020-11-12 12:52:03.847271','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-11-12 18:21:13.479285','2020-11-12 18:21:13.479285','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-11-15 07:59:17.818534','2020-12-20 20:04:42.477029','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-12-21 12:06:47.735826','2020-12-21 17:13:08.615317','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2020-12-25 01:43:20.82301','2021-01-14 12:38:40.256447','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-01-15 05:57:25.559778','2021-01-15 05:57:25.559778','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-01-15 17:08:49.239829','2021-03-04 18:05:06.5202','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-03-14 08:30:11.882031','2021-03-14 08:30:11.882031','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-03-14 19:34:35.48081','2021-03-14 19:34:35.48081','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-03-14 22:23:01.795492','2021-03-14 22:23:01.795492','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-03-19 05:18:59.392721','2021-04-17 17:00:28.56746','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-04-17 23:53:35.259154','2021-04-17 23:53:35.259154','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-04-19 11:43:30.867002','2021-04-19 11:43:30.867002','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-04-20 01:03:49.924386','2021-04-20 01:03:49.924386','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-04-21 20:38:53.726282','2021-05-27 03:12:22.242029','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-05-28 17:17:19.470759','2021-05-28 17:17:19.470759','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-05-29 03:51:39.812153','2021-07-03 17:56:45.710948','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-07-17 23:26:55.653867','2021-07-18 00:27:13.16734','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-07-20 19:46:11.260963','2021-08-14 23:02:07.889515','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-08-16 05:25:42.109359','2021-08-16 05:25:42.109359','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-08-17 13:55:39.394138','2021-12-08 09:37:20.089189','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-12-16 18:34:33.00649','2021-12-30 00:19:14.148858','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2021-12-31 13:43:59.460722','2022-01-01 15:02:51.580829','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-01-04 23:18:25.547204','2022-01-04 23:18:25.547204','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-01-11 17:02:04.353917','2022-01-11 17:02:04.353917','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-01-13 21:51:56.523581','2022-01-13 21:51:56.523581','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-02-03 08:43:22.323726','2022-02-12 00:49:09.124772','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-02-18 17:16:30.997815','2022-02-25 22:09:21.674881','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-03-05 09:08:58.713571','2022-03-05 09:08:58.713571','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-03-07 03:52:55.376109','2022-03-07 04:53:12.341127','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-03-27 07:54:31.78461','2022-04-10 20:02:46.477166','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-04-11 18:58:48.622832','2022-04-11 18:58:48.622832','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-04-23 00:44:15.138901','2022-05-04 22:45:57.516436','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-06-09 23:49:56.08389','2022-06-28 03:20:11.764959','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-07-05 12:24:17.554126','2022-07-24 12:10:50.921302','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-07-26 17:32:55.715266','2022-07-26 17:32:55.715266','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-09-12 01:05:19.825468','2022-09-15 09:12:55.833652','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-09-29 20:35:53.243062','2022-09-29 21:06:01.84773','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-11-01 23:59:37.478388','2022-12-04 15:01:19.792983','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-12-05 17:47:12.476835','2022-12-07 17:05:19.118935','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-12-09 14:25:41.405352','2022-12-09 14:25:41.405352','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-12-15 20:02:19.636018','2022-12-15 21:02:36.652083','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2022-12-27 12:59:35.191679','2022-12-29 01:19:07.640399','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2023-01-06 16:31:49.633328','2023-01-06 16:32:10.734747','legacy','2/11');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2023-01-10 21:49:02.442825','2023-01-26 21:10:04.737504','legacy','2/0');
|
||||
|
||||
statement ok
|
||||
INSERT INTO flags VALUES('2023-02-10 20:18:13.432147','2023-02-13 15:22:40.650655','legacy','2/11');
|
||||
|
||||
# INNER join
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
INNER JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
statement ok
|
||||
CREATE TABLE inner_join AS SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
INNER JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
|
||||
query III
|
||||
SELECT COUNT(*), COUNT(ts), COUNT(flag) FROM inner_join
|
||||
----
|
||||
87775 87775 87775
|
||||
|
||||
# LEFT join
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
LEFT JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
statement ok
|
||||
CREATE TABLE left_join AS SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
LEFT JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
|
||||
query III
|
||||
SELECT COUNT(*), COUNT(ts), COUNT(flag) FROM left_join
|
||||
----
|
||||
167137 167137 87775
|
||||
|
||||
# RIGHT join
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
RIGHT JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
statement ok
|
||||
CREATE TABLE right_join AS SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
RIGHT JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
|
||||
query III
|
||||
SELECT COUNT(*), COUNT(ts), COUNT(flag) FROM right_join
|
||||
----
|
||||
87842 87775 87842
|
||||
|
||||
# FULL OUTER join
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
FULL OUTER JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
statement ok
|
||||
CREATE TABLE full_outer_join AS SELECT ota.*, flags.desc as flag
|
||||
FROM ota
|
||||
FULL OUTER JOIN flags ON ota.ts BETWEEN flags.start AND flags.end
|
||||
ORDER BY ts;
|
||||
|
||||
query III
|
||||
SELECT COUNT(*), COUNT(ts), COUNT(flag) FROM full_outer_join
|
||||
----
|
||||
167204 167137 87842
|
||||
72
external/duckdb/test/sql/join/iejoin/iejoin_issue_6861.test
vendored
Normal file
72
external/duckdb/test/sql/join/iejoin/iejoin_issue_6861.test
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
# name: test/sql/join/iejoin/iejoin_issue_6861.test
|
||||
# description: Issue #6861: Index out of bound for all-NULL case.
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test(x INT);
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
SET nested_loop_join_threshold=0;
|
||||
|
||||
query II
|
||||
SELECT *
|
||||
FROM test AS a, test AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
|
||||
statement ok
|
||||
INSERT INTO test(x) VALUES (1), (2), (3), (NULL), (NULL), (NULL);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE all_null AS SELECT * FROM test;
|
||||
|
||||
statement ok
|
||||
UPDATE all_null SET x=(NULL);
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT *
|
||||
FROM all_null AS a, all_null AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT *
|
||||
FROM all_null AS a, all_null AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT *
|
||||
FROM test AS a, all_null AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT *
|
||||
FROM test AS a, all_null AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT *
|
||||
FROM all_null AS a, test AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT *
|
||||
FROM all_null AS a, test AS b
|
||||
WHERE (a.x BETWEEN b.x AND b.x);
|
||||
----
|
||||
156
external/duckdb/test/sql/join/iejoin/iejoin_issue_7278.test
vendored
Normal file
156
external/duckdb/test/sql/join/iejoin/iejoin_issue_7278.test
vendored
Normal file
@@ -0,0 +1,156 @@
|
||||
# name: test/sql/join/iejoin/iejoin_issue_7278.test
|
||||
# description: Issue #7278: Incorrect results (child pipeline / finish event scheduling
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
create table calendar as
|
||||
SELECT
|
||||
start_ts,
|
||||
start_ts + interval '12 hours' as end_ts,
|
||||
date_part('year',start_ts)::bigint * 100 + date_part('week',start_ts)::bigint as yyyyww
|
||||
FROM generate_series(TIMESTAMP '2023-01-01 06:00:00', TIMESTAMP '2023-06-01 00:00:00', INTERVAL '12 hours') tbl(start_ts)
|
||||
;
|
||||
|
||||
statement ok
|
||||
create table snapshot_data as
|
||||
select
|
||||
TIMESTAMP '2023-03-01 08:00:00' as snapshot_ts,
|
||||
1 as snapshot_value
|
||||
from generate_series(1,1000) t(i)
|
||||
;
|
||||
|
||||
# IEJoin is disabled for CTEs for some reason
|
||||
statement ok
|
||||
create table cal_last_13 as(
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
);
|
||||
|
||||
query II
|
||||
explain
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query I
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
----
|
||||
1000
|
||||
|
||||
statement ok
|
||||
create or replace table cal_last_13 as (
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
union all
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
);
|
||||
|
||||
query II
|
||||
explain
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query I
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
----
|
||||
2000
|
||||
|
||||
statement ok
|
||||
create or replace table cal_last_13 as (
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
union all
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
union all
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
);
|
||||
|
||||
query II
|
||||
explain
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query I
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
----
|
||||
3000
|
||||
|
||||
statement ok
|
||||
create or replace table cal_last_13 as (
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
union all
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
union all
|
||||
select * from calendar where yyyyww in (SELECT yyyyww
|
||||
FROM calendar)
|
||||
);
|
||||
|
||||
query II
|
||||
explain
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
join cal_last_13 cal2
|
||||
on data.snapshot_ts >= cal2.start_ts
|
||||
and data.snapshot_ts <= cal2.end_ts
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query I
|
||||
select
|
||||
count(*)
|
||||
from snapshot_data data
|
||||
join cal_last_13 cal
|
||||
on data.snapshot_ts >= cal.start_ts
|
||||
and data.snapshot_ts <= cal.end_ts
|
||||
join cal_last_13 cal2
|
||||
on data.snapshot_ts >= cal2.start_ts
|
||||
and data.snapshot_ts <= cal2.end_ts
|
||||
----
|
||||
9000
|
||||
58
external/duckdb/test/sql/join/iejoin/iejoin_projection_maps.test
vendored
Normal file
58
external/duckdb/test/sql/join/iejoin/iejoin_projection_maps.test
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
# name: test/sql/join/iejoin/iejoin_projection_maps.test
|
||||
# description: Test IEJoin projection mapping
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
PRAGMA threads=1
|
||||
|
||||
set seed 0.8765309
|
||||
|
||||
statement ok
|
||||
CREATE TABLE df (id INTEGER, id2 INTEGER, id3 INTEGER, value_double DOUBLE, value as (value_double::DECIMAL(4,3)), one_min_value as ((1.0 - value_double)::DECIMAL(4,3)))
|
||||
|
||||
statement ok
|
||||
INSERT INTO df
|
||||
SELECT
|
||||
(random() * 100)::INTEGER + 1 as id,
|
||||
(random() * 10)::INTEGER + 1 as id2,
|
||||
(random() * 5)::INTEGER + 1 as id3,
|
||||
(ROUND(random(), 4)) as value_double,
|
||||
FROM range(5000);
|
||||
|
||||
# Verify table contents
|
||||
query IIIIII
|
||||
SELECT SUM(id) AS id, SUM(id2) AS id2, SUM(id3) AS id3, SUM(value) AS sum_value, SUM(one_min_value) AS sum_one_min_value, sum_value + sum_one_min_value AS sum
|
||||
FROM df
|
||||
----
|
||||
252652 29774 17657 2498.192 2502.191 5000.383
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# Test right_projection_map
|
||||
foreach prefer False True
|
||||
|
||||
statement ok
|
||||
PRAGMA prefer_range_joins=${prefer};
|
||||
|
||||
# mode output_hash
|
||||
|
||||
query I
|
||||
SELECT id2, id3, id3_right, sum(value * value_right) as value
|
||||
FROM (
|
||||
SELECT df.*, df2.id3 as id3_right, df2.value as value_right
|
||||
FROM df JOIN df as df2
|
||||
ON (df.id = df2.id
|
||||
AND df.id2 = df2.id2
|
||||
AND df.id3 > df2.id3
|
||||
AND df.id3 < df2.id3 + 30)
|
||||
) tbl
|
||||
GROUP BY ALL
|
||||
ORDER BY ALL
|
||||
----
|
||||
660 values hashing to fe2237dbeb18fe3400d5323bcab26dd2
|
||||
|
||||
endloop
|
||||
|
||||
# Test left_projection_map
|
||||
# (Once it can acutally happen...)
|
||||
51
external/duckdb/test/sql/join/iejoin/merge_join_switch.test
vendored
Normal file
51
external/duckdb/test/sql/join/iejoin/merge_join_switch.test
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
# name: test/sql/join/iejoin/merge_join_switch.test
|
||||
# description: Test switching between merge joins/IE joins/nested loop joins based on settings
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE bigtbl AS FROM range(1000) t(i);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE smalltbl AS SELECT i AS low, i + 1 AS high FROM range(100) t(i);
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = 'PHYSICAL_ONLY';
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
query II
|
||||
EXPLAIN SELECT COUNT(*) FROM bigtbl JOIN smalltbl ON (bigtbl.i BETWEEN low AND high)
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=1000
|
||||
|
||||
query II
|
||||
EXPLAIN SELECT COUNT(*) FROM bigtbl JOIN smalltbl ON (bigtbl.i BETWEEN low AND high)
|
||||
----
|
||||
physical_plan <REGEX>:.*MERGE_JOIN.*
|
||||
|
||||
statement ok
|
||||
SET nested_loop_join_threshold=1000
|
||||
|
||||
query II
|
||||
EXPLAIN SELECT COUNT(*) FROM bigtbl JOIN smalltbl ON (bigtbl.i BETWEEN low AND high)
|
||||
----
|
||||
physical_plan <REGEX>:.*NESTED_LOOP_JOIN.*
|
||||
|
||||
statement ok
|
||||
SET prefer_range_joins=true
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT COUNT(*) FROM bigtbl JOIN smalltbl ON (bigtbl.i BETWEEN low AND high AND bigtbl.i IS NOT DISTINCT FROM high - low)
|
||||
----
|
||||
physical_plan <REGEX>:.*NESTED_LOOP_JOIN.*
|
||||
|
||||
# Execute to trigger the switch case
|
||||
query I
|
||||
SELECT COUNT(*) FROM bigtbl JOIN smalltbl ON (bigtbl.i BETWEEN low AND high AND bigtbl.i IS NOT DISTINCT FROM high - low)
|
||||
----
|
||||
2
|
||||
5
external/duckdb/test/sql/join/iejoin/overlap.left.csv
vendored
Normal file
5
external/duckdb/test/sql/join/iejoin/overlap.left.csv
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
x,y
|
||||
1,10
|
||||
2,11
|
||||
3,12
|
||||
4,13
|
||||
|
5
external/duckdb/test/sql/join/iejoin/overlap.right.csv
vendored
Normal file
5
external/duckdb/test/sql/join/iejoin/overlap.right.csv
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
x,y
|
||||
1,101
|
||||
2,102
|
||||
3,103
|
||||
4,104
|
||||
|
109
external/duckdb/test/sql/join/iejoin/predicate_expressions.test
vendored
Normal file
109
external/duckdb/test/sql/join/iejoin/predicate_expressions.test
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
# name: test/sql/join/iejoin/predicate_expressions.test
|
||||
# description: Predicate expressions should work with multiple chunks
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = PHYSICAL_ONLY;
|
||||
|
||||
# Create a range of dates
|
||||
statement ok
|
||||
create table calendar as SELECT *
|
||||
FROM range(DATE '2022-01-01', DATE '2024-02-01', INTERVAL '1' MONTH);
|
||||
|
||||
# Create an SCD2 dummy table with nullable end dates
|
||||
statement ok
|
||||
create table scd2 as
|
||||
select
|
||||
range as range_start,
|
||||
case when date_part('year', range) < 2023 then range + interval 4 month - interval 1 day end as range_end,
|
||||
n
|
||||
from calendar
|
||||
cross join generate_series(1, 85) as n
|
||||
|
||||
# Create an SCD2 dummy table with non-nullable end dates
|
||||
statement ok
|
||||
create table scd2_non_null as
|
||||
select
|
||||
range as range_start,
|
||||
case when date_part('year', range) < 2023 then range + interval 4 month - interval 1 day else '2099-01-01' end as range_end,
|
||||
n
|
||||
from calendar
|
||||
cross join generate_series(1, 85) as n
|
||||
|
||||
# Aggregate each table by using a range join
|
||||
query II
|
||||
explain
|
||||
select
|
||||
range,
|
||||
count(*) as n
|
||||
from scd2_non_null
|
||||
inner join calendar
|
||||
on range between range_start and ifnull(range_end,'2099-01-01')
|
||||
group by range
|
||||
order by range
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II nosort expected
|
||||
select
|
||||
range,
|
||||
count(*) as n
|
||||
from scd2_non_null
|
||||
inner join calendar
|
||||
on range between range_start and ifnull(range_end,'2099-01-01')
|
||||
group by range
|
||||
order by range
|
||||
|
||||
# First key should work
|
||||
query II
|
||||
explain
|
||||
select
|
||||
range,
|
||||
count(*) as n
|
||||
from scd2
|
||||
inner join calendar
|
||||
on range <= ifnull(range_end,'2099-01-01') and range_start <= range
|
||||
group by range
|
||||
order by range
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II nosort expected
|
||||
select
|
||||
range,
|
||||
count(*) as n
|
||||
from scd2
|
||||
inner join calendar
|
||||
on range <= ifnull(range_end,'2099-01-01') and range_start <= range
|
||||
group by range
|
||||
order by range
|
||||
|
||||
# Second key should work
|
||||
query II
|
||||
explain
|
||||
select
|
||||
range,
|
||||
count(*) as n
|
||||
from scd2
|
||||
inner join calendar
|
||||
on range between range_start and ifnull(range_end,'2099-01-01')
|
||||
group by range
|
||||
order by range
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II nosort expected
|
||||
select
|
||||
range,
|
||||
count(*) as n
|
||||
from scd2
|
||||
inner join calendar
|
||||
on range between range_start and ifnull(range_end,'2099-01-01')
|
||||
group by range
|
||||
order by range
|
||||
201
external/duckdb/test/sql/join/iejoin/test_iejoin.test
vendored
Normal file
201
external/duckdb/test/sql/join/iejoin/test_iejoin.test
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
# name: test/sql/join/iejoin/test_iejoin.test
|
||||
# description: Test IEJoin
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
# Restrictive tail predicates
|
||||
# Use inequalities to prevent future range choice optimisation
|
||||
query II
|
||||
WITH test AS (
|
||||
SELECT
|
||||
i AS id,
|
||||
i AS begin,
|
||||
i + 10 AS end,
|
||||
i % 2 AS p1,
|
||||
i % 3 AS p2
|
||||
FROM range(0, 10) tbl(i)
|
||||
)
|
||||
SELECT lhs.id, rhs.id
|
||||
FROM test lhs, test rhs
|
||||
WHERE lhs.begin < rhs.end
|
||||
AND rhs.begin < lhs.end
|
||||
AND lhs.p1 <> rhs.p1
|
||||
AND lhs.p2 <> rhs.p2
|
||||
ORDER BY ALL
|
||||
----
|
||||
0 1
|
||||
0 5
|
||||
0 7
|
||||
1 0
|
||||
1 2
|
||||
1 6
|
||||
1 8
|
||||
2 1
|
||||
2 3
|
||||
2 7
|
||||
2 9
|
||||
3 2
|
||||
3 4
|
||||
3 8
|
||||
4 3
|
||||
4 5
|
||||
4 9
|
||||
5 0
|
||||
5 4
|
||||
5 6
|
||||
6 1
|
||||
6 5
|
||||
6 7
|
||||
7 0
|
||||
7 2
|
||||
7 6
|
||||
7 8
|
||||
8 1
|
||||
8 3
|
||||
8 7
|
||||
8 9
|
||||
9 2
|
||||
9 4
|
||||
9 8
|
||||
|
||||
# Subquery/CTE
|
||||
query II
|
||||
WITH test AS (
|
||||
SELECT
|
||||
i AS id,
|
||||
i AS begin,
|
||||
i + 10 AS end,
|
||||
i % 2 AS p1,
|
||||
i % 3 AS p2
|
||||
FROM range(0, 10) tbl(i)
|
||||
),
|
||||
sub AS (
|
||||
SELECT lhs.id AS lid, rhs.id AS rid
|
||||
FROM test lhs, test rhs
|
||||
WHERE lhs.begin < rhs.end
|
||||
AND rhs.begin < lhs.end
|
||||
AND lhs.p1 <> rhs.p1
|
||||
AND lhs.p2 <> rhs.p2
|
||||
ORDER BY ALL
|
||||
)
|
||||
SELECT MIN(lid), MAX(rid)
|
||||
FROM sub
|
||||
----
|
||||
0 9
|
||||
|
||||
# RTEs are not (yet) supported
|
||||
# so this should work, but not trigger IEJoin in the physical plan.
|
||||
query I
|
||||
WITH RECURSIVE t AS
|
||||
(
|
||||
SELECT 1 AS x, 0 AS begin, 4 AS end
|
||||
UNION ALL
|
||||
SELECT lhs.x + 1 AS x,
|
||||
GREATEST(lhs.begin, rhs.begin) as begin,
|
||||
LEAST(lhs.end, rhs.end) AS end
|
||||
FROM t lhs, t rhs
|
||||
WHERE lhs.begin + 1 < rhs.end - 1
|
||||
AND rhs.begin + 1 < lhs.end - 1
|
||||
AND lhs.x < 3
|
||||
)
|
||||
SELECT COUNT(*) FROM t
|
||||
----
|
||||
3
|
||||
|
||||
# Fix missing continue statement in right join handler
|
||||
statement ok
|
||||
CREATE TABLE issue3486 AS
|
||||
SELECT generate_series as ts from generate_series(timestamp '2020-01-01', timestamp '2021-01-01', interval 1 day);
|
||||
|
||||
query IIII
|
||||
WITH data_table AS (
|
||||
SELECT epoch(ts) as ts
|
||||
FROM issue3486
|
||||
WHERE ts IS NOT NULL
|
||||
),
|
||||
S AS (
|
||||
SELECT
|
||||
min(ts) as minVal,
|
||||
max(ts) as maxVal,
|
||||
(max(ts) - min(ts)) as range
|
||||
FROM data_table
|
||||
),
|
||||
buckets AS (
|
||||
SELECT
|
||||
range as bucket,
|
||||
(range) * (select range FROM S) / 40 + (select minVal from S) as low,
|
||||
(range + 1) * (select range FROM S) / 40 + (select minVal from S) as high
|
||||
FROM range(0, 40, 1)
|
||||
)
|
||||
SELECT
|
||||
bucket,
|
||||
low,
|
||||
high,
|
||||
count(data_table.ts) as count
|
||||
FROM buckets
|
||||
LEFT JOIN data_table ON (data_table.ts >= low AND data_table.ts < high)
|
||||
GROUP BY bucket, low, high
|
||||
ORDER BY bucket;
|
||||
----
|
||||
0 1577836800 1578627360 10
|
||||
1 1578627360 1579417920 9
|
||||
2 1579417920 1580208480 9
|
||||
3 1580208480 1580999040 9
|
||||
4 1580999040 1581789600 9
|
||||
5 1581789600 1582580160 9
|
||||
6 1582580160 1583370720 10
|
||||
7 1583370720 1584161280 9
|
||||
8 1584161280 1584951840 9
|
||||
9 1584951840 1585742400 9
|
||||
10 1585742400 1586532960 9
|
||||
11 1586532960 1587323520 9
|
||||
12 1587323520 1588114080 9
|
||||
13 1588114080 1588904640 10
|
||||
14 1588904640 1589695200 9
|
||||
15 1589695200 1590485760 9
|
||||
16 1590485760 1591276320 9
|
||||
17 1591276320 1592066880 9
|
||||
18 1592066880 1592857440 9
|
||||
19 1592857440 1593648000 9
|
||||
20 1593648000 1594438560 10
|
||||
21 1594438560 1595229120 9
|
||||
22 1595229120 1596019680 9
|
||||
23 1596019680 1596810240 9
|
||||
24 1596810240 1597600800 9
|
||||
25 1597600800 1598391360 9
|
||||
26 1598391360 1599181920 10
|
||||
27 1599181920 1599972480 9
|
||||
28 1599972480 1600763040 9
|
||||
29 1600763040 1601553600 9
|
||||
30 1601553600 1602344160 9
|
||||
31 1602344160 1603134720 9
|
||||
32 1603134720 1603925280 9
|
||||
33 1603925280 1604715840 10
|
||||
34 1604715840 1605506400 9
|
||||
35 1605506400 1606296960 9
|
||||
36 1606296960 1607087520 9
|
||||
37 1607087520 1607878080 9
|
||||
38 1607878080 1608668640 9
|
||||
39 1608668640 1609459200 9
|
||||
|
||||
# internal issue 5197
|
||||
statement ok
|
||||
create table test_big as select range i, range + 100_000 j, 'hello' k from range (20_000)
|
||||
|
||||
statement ok
|
||||
create table test_small as select range i, range + 100_000 j, 'hello' k from range (0,20_000,10)
|
||||
|
||||
statement ok
|
||||
select *
|
||||
from test_small t1
|
||||
join test_small t2
|
||||
on (t1.i = t2.j)
|
||||
join test_small t3
|
||||
on (true)
|
||||
join test_big t4
|
||||
on (t3.i < t4.i and t3.j > t4.j)
|
||||
118
external/duckdb/test/sql/join/iejoin/test_iejoin_east_west.test
vendored
Normal file
118
external/duckdb/test/sql/join/iejoin/test_iejoin_east_west.test
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
# name: test/sql/join/iejoin/test_iejoin_east_west.test
|
||||
# description: Test IEJoin
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = PHYSICAL_ONLY;
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
SET nested_loop_join_threshold=0;
|
||||
|
||||
# create tables
|
||||
statement ok
|
||||
CREATE TABLE east AS SELECT * FROM (VALUES
|
||||
('r1', 100, 140, 12, 2),
|
||||
('r2', 101, 100, 12, 8),
|
||||
('r3', 103, 90, 5, 4)
|
||||
) east(rid, id, dur, rev, cores)
|
||||
|
||||
statement ok
|
||||
CREATE TABLE west AS SELECT * FROM (VALUES
|
||||
('s1', 404, 100, 6, 4),
|
||||
('s2', 498, 140, 11, 2),
|
||||
('s3', 676, 80, 10, 1),
|
||||
('s4', 742, 90, 5, 4)
|
||||
) west(rid, t_id, time, cost, cores)
|
||||
|
||||
# Qs
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT s1.rid, s2.rid
|
||||
FROM west s1, west s2
|
||||
WHERE s1.time > s2.time
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
physical_plan <REGEX>:.*PIECEWISE_MERGE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT s1.rid, s2.rid
|
||||
FROM west s1, west s2
|
||||
WHERE s1.time > s2.time
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
s1 s3
|
||||
s1 s4
|
||||
s2 s1
|
||||
s2 s3
|
||||
s2 s4
|
||||
s4 s3
|
||||
|
||||
# Qp
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT s1.rid, s2.rid
|
||||
FROM west s1, west s2
|
||||
WHERE s1.time > s2.time AND s1.cost < s2.cost
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT s1.rid, s2.rid
|
||||
FROM west s1, west s2
|
||||
WHERE s1.time > s2.time AND s1.cost < s2.cost
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
s1 s3
|
||||
s4 s3
|
||||
|
||||
# Qt
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT east.rid, west.rid
|
||||
FROM east, west
|
||||
WHERE east.dur < west.time AND east.rev > west.cost
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT east.rid, west.rid
|
||||
FROM east, west
|
||||
WHERE east.dur < west.time AND east.rev > west.cost
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
r2 s2
|
||||
|
||||
# Test string comparisons
|
||||
statement ok
|
||||
CREATE TABLE weststr AS (
|
||||
SELECT rid, time::VARCHAR AS time, cost::VARCHAR as cost
|
||||
FROM west
|
||||
);
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT s1.rid, s2.rid
|
||||
FROM weststr s1, weststr s2
|
||||
WHERE s1.time > s2.time AND s1.cost < s2.cost
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT s1.rid, s2.rid
|
||||
FROM weststr s1, weststr s2
|
||||
WHERE s1.time > s2.time AND s1.cost < s2.cost
|
||||
ORDER BY 1, 2
|
||||
----
|
||||
s2 s1
|
||||
s3 s1
|
||||
s3 s2
|
||||
s4 s1
|
||||
56
external/duckdb/test/sql/join/iejoin/test_iejoin_events.test
vendored
Normal file
56
external/duckdb/test/sql/join/iejoin/test_iejoin_events.test
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
# name: test/sql/join/iejoin/test_iejoin_events.test
|
||||
# description: Test IEJoin
|
||||
# group: [iejoin]
|
||||
|
||||
require skip_reload
|
||||
|
||||
# RNG order depends on vector size
|
||||
require vector_size 1024
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
# Use small 1K table to test Q2 because it melts down the other operators at larger scales
|
||||
set seed 0.8675309
|
||||
|
||||
statement ok
|
||||
CREATE TABLE events AS (
|
||||
SELECT *,
|
||||
"start" + INTERVAL (CASE WHEN random() < 0.1 THEN 120 ELSE (5 + round(random() * 50, 0)::BIGINT) END) MINUTE
|
||||
AS "end"
|
||||
FROM (
|
||||
SELECT id,
|
||||
'Event ' || id::VARCHAR as "name",
|
||||
(5 + round(random() * 5000, 0)::BIGINT) AS audience,
|
||||
'1992-01-01'::TIMESTAMP
|
||||
+ INTERVAL (round(random() * 40 * 365, 0)::BIGINT) DAY
|
||||
+ INTERVAL (round(random() * 23, 0)::BIGINT) HOUR
|
||||
AS "start",
|
||||
'Sponsor ' || (1 + round(random() * 10, 0)::BIGINT) AS sponsor
|
||||
FROM range(1, 1000) tbl(id)
|
||||
) q
|
||||
);
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT COUNT(*) FROM (
|
||||
SELECT r.id, s.id
|
||||
FROM events r, events s
|
||||
WHERE r.start <= s.end AND r.end >= s.start
|
||||
AND r.id <> s.id
|
||||
) q2;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query I
|
||||
SELECT COUNT(*) FROM (
|
||||
SELECT r.id, s.id
|
||||
FROM events r, events s
|
||||
WHERE r.start <= s.end AND r.end >= s.start
|
||||
AND r.id <> s.id
|
||||
) q2;
|
||||
----
|
||||
2
|
||||
89
external/duckdb/test/sql/join/iejoin/test_iejoin_null_keys.test
vendored
Normal file
89
external/duckdb/test/sql/join/iejoin/test_iejoin_null_keys.test
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
# name: test/sql/join/iejoin/test_iejoin_null_keys.test
|
||||
# description: Issue #10122: wrong result in IEJoin
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = PHYSICAL_ONLY;
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
SET nested_loop_join_threshold=0
|
||||
|
||||
statement ok
|
||||
create table tt (x int, y int, z int);
|
||||
|
||||
statement ok
|
||||
insert into tt select nullif(r % 3, 0), nullif (r % 5, 0), r from range(10) tbl(r);
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
select *
|
||||
from tt t1 left join tt t2
|
||||
on t1.x < t2.x and t1.y < t2.y
|
||||
order by t1.x nulls first, t1.y nulls first, t1.z, t2.x, t2.y, t2.z;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query IIIIII
|
||||
select *
|
||||
from tt t1 left join tt t2
|
||||
on t1.x < t2.x and t1.y < t2.y
|
||||
order by t1.x nulls first, t1.y nulls first, t1.z, t2.x, t2.y, t2.z;
|
||||
----
|
||||
NULL NULL 0 NULL NULL NULL
|
||||
NULL 1 6 NULL NULL NULL
|
||||
NULL 3 3 NULL NULL NULL
|
||||
NULL 4 9 NULL NULL NULL
|
||||
1 1 1 2 2 2
|
||||
1 1 1 2 3 8
|
||||
1 2 7 2 3 8
|
||||
1 4 4 NULL NULL NULL
|
||||
2 NULL 5 NULL NULL NULL
|
||||
2 2 2 NULL NULL NULL
|
||||
2 3 8 NULL NULL NULL
|
||||
|
||||
statement ok
|
||||
pragma disable_optimizer;
|
||||
|
||||
statement ok
|
||||
create table tt2 (x int);
|
||||
|
||||
statement ok
|
||||
insert into tt2 select * from range(10);
|
||||
|
||||
query II
|
||||
explain
|
||||
select t1.x, t1.y
|
||||
from (
|
||||
select (case when x < 100 then null else 99 end) x, (case when x < 100 then 99 else 99 end) y
|
||||
from tt2
|
||||
) t1 left join tt2 t2
|
||||
on t1.x < t2.x and t1.y < t2.x
|
||||
order by t1.x nulls first, t1.y nulls first;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
select t1.x, t1.y
|
||||
from (
|
||||
select (case when x < 100 then null else 99 end) x, (case when x < 100 then 99 else 99 end) y
|
||||
from tt2
|
||||
) t1 left join tt2 t2
|
||||
on t1.x < t2.x and t1.y < t2.x
|
||||
order by t1.x nulls first, t1.y nulls first;
|
||||
----
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
NULL 99
|
||||
46
external/duckdb/test/sql/join/iejoin/test_iejoin_overlaps.test
vendored
Normal file
46
external/duckdb/test/sql/join/iejoin/test_iejoin_overlaps.test
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# name: test/sql/join/iejoin/test_iejoin_overlaps.test
|
||||
# description: IEJoin block short circuiting
|
||||
# group: [iejoin]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
statement ok
|
||||
SET nested_loop_join_threshold=0;
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = PHYSICAL_ONLY;
|
||||
|
||||
# We read from CSVs to prevent the optimiser from
|
||||
# using statistics to decide the join is a NOP
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT t1.x, t2.x
|
||||
FROM 'test/sql/join/iejoin/overlap.left.csv' t1, 'test/sql/join/iejoin/overlap.right.csv' t2
|
||||
WHERE t1.x < t2.x AND t1.y > t2.y;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT t1.x, t2.x
|
||||
FROM 'test/sql/join/iejoin/overlap.left.csv' t1, 'test/sql/join/iejoin/overlap.right.csv' t2
|
||||
WHERE t1.x < t2.x AND t1.y > t2.y;
|
||||
----
|
||||
|
||||
# Reverse order to test op2 short circuit
|
||||
query II
|
||||
SELECT t1.x, t2.x
|
||||
FROM 'test/sql/join/iejoin/overlap.left.csv' t1, 'test/sql/join/iejoin/overlap.right.csv' t2
|
||||
WHERE t1.y > t2.y AND t1.x < t2.x;
|
||||
----
|
||||
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT t1.x, t2.x
|
||||
FROM 'test/sql/join/iejoin/overlap.left.csv' t1, 'test/sql/join/iejoin/overlap.right.csv' t2
|
||||
WHERE t1.y > t2.y AND t1.x < t2.x;
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
50
external/duckdb/test/sql/join/iejoin/test_iejoin_sort_tasks.test_slow
vendored
Normal file
50
external/duckdb/test/sql/join/iejoin/test_iejoin_sort_tasks.test_slow
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# name: test/sql/join/iejoin/test_iejoin_sort_tasks.test_slow
|
||||
# description: Test IEJoin
|
||||
# group: [iejoin]
|
||||
|
||||
# No verification - it doesn't scale
|
||||
|
||||
# Otherwise we run out of memory
|
||||
require 64bit
|
||||
|
||||
statement ok
|
||||
PRAGMA verify_parallelism
|
||||
|
||||
statement ok
|
||||
SET merge_join_threshold=0
|
||||
|
||||
# Stream tables with minimal overlap that require merge tasks on both sides.
|
||||
query II
|
||||
EXPLAIN
|
||||
SELECT lhs.begin, rhs.begin
|
||||
FROM (
|
||||
SELECT
|
||||
i AS id,
|
||||
i AS begin,
|
||||
i + 1 AS end
|
||||
FROM range(1, 10000002) tbl(i)) lhs,
|
||||
(SELECT
|
||||
i - 100000000 AS id,
|
||||
i AS begin,
|
||||
i + 1 AS end
|
||||
FROM range(10000001, 20000002) tbl(i)) rhs
|
||||
WHERE lhs.begin < rhs.end AND rhs.begin < lhs.end
|
||||
----
|
||||
physical_plan <REGEX>:.*IE_JOIN.*
|
||||
|
||||
query II
|
||||
SELECT lhs.begin, rhs.begin
|
||||
FROM (
|
||||
SELECT
|
||||
i AS id,
|
||||
i AS begin,
|
||||
i + 1 AS end
|
||||
FROM range(1, 10000002) tbl(i)) lhs,
|
||||
(SELECT
|
||||
i - 100000000 AS id,
|
||||
i AS begin,
|
||||
i + 1 AS end
|
||||
FROM range(10000001, 20000002) tbl(i)) rhs
|
||||
WHERE lhs.begin < rhs.end AND rhs.begin < lhs.end
|
||||
----
|
||||
10000001 10000001
|
||||
Reference in New Issue
Block a user