1616--
1717-- boxes are specified by two points, given by four floats x1,y1,x2,y2
1818CREATE TABLE BOX_TBL (f1 box);
19+ NOTICE: Table doesn't have 'DISTRIBUTED BY' clause, and no column type is suitable for a distribution key. Creating a NULL policy entry.
1920INSERT INTO BOX_TBL (f1) VALUES ('(2.0,2.0,0.0,0.0)');
2021INSERT INTO BOX_TBL (f1) VALUES ('(1.0,1.0,3.0,3.0)');
2122INSERT INTO BOX_TBL (f1) VALUES ('((-8, 2), (-2, -10))');
@@ -47,22 +48,22 @@ LINE 1: INSERT INTO BOX_TBL (f1) VALUES ('asdfasdf(ad');
4748SELECT * FROM BOX_TBL;
4849 f1
4950---------------------
50- (2,2),(0,0)
51- (3,3),(1,1)
5251 (-2,2),(-8,-10)
5352 (2.5,3.5),(2.5,2.5)
5453 (3,3),(3,3)
54+ (2,2),(0,0)
55+ (3,3),(1,1)
5556(5 rows)
5657
5758SELECT b.*, area(b.f1) as barea
5859 FROM BOX_TBL b;
5960 f1 | barea
6061---------------------+-------
61- (2,2),(0,0) | 4
62- (3,3),(1,1) | 4
6362 (-2,2),(-8,-10) | 72
6463 (2.5,3.5),(2.5,2.5) | 0
6564 (3,3),(3,3) | 0
65+ (2,2),(0,0) | 4
66+ (3,3),(1,1) | 4
6667(5 rows)
6768
6869-- overlap
@@ -241,6 +242,7 @@ SELECT height(f1), width(f1) FROM BOX_TBL;
241242-- Test the SP-GiST index
242243--
243244CREATE TEMPORARY TABLE box_temp (f1 box);
245+ NOTICE: Table doesn't have 'DISTRIBUTED BY' clause, and no column type is suitable for a distribution key. Creating a NULL policy entry.
244246INSERT INTO box_temp
245247 SELECT box(point(i, i), point(i * 2, i * 2))
246248 FROM generate_series(1, 50) AS i;
@@ -257,34 +259,35 @@ SET enable_seqscan = false;
257259SELECT * FROM box_temp WHERE f1 << '(10,20),(30,40)';
258260 f1
259261----------------------------
260- (0,Infinity),(0,100)
261- (2,2),(1,1)
262- (4,4),(2,2)
262+ (6,6),(3,3)
263263 (8,8),(4,4)
264264 (0,100),(0,0)
265+ (0,Infinity),(0,100)
265266 (0,Infinity),(-Infinity,0)
266- (6,6),(3,3)
267+ (2,2),(1,1)
268+ (4,4),(2,2)
267269(7 rows)
268270
269271EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 << '(10,20),(30,40)';
270- QUERY PLAN
271- ------------------------------------------------------
272+ QUERY PLAN
273+ ------------------------------------------------
272274 Gather Motion 3:1 (slice1; segments: 3)
273275 -> Seq Scan on box_temp
274276 Filter: (f1 << '(30,40),(10,20)'::box)
277+ Optimizer: GPORCA
275278(4 rows)
276279
277280SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)';
278281 f1
279282----------------------------
280283 (6,6),(3,3)
284+ (8,8),(4,4)
281285 (10,10),(5,5)
286+ (0,100),(0,0)
282287 (0,Infinity),(0,100)
288+ (0,Infinity),(-Infinity,0)
283289 (2,2),(1,1)
284290 (4,4),(2,2)
285- (8,8),(4,4)
286- (0,100),(0,0)
287- (0,Infinity),(-Infinity,0)
288291(8 rows)
289292
290293EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)';
@@ -293,83 +296,87 @@ EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)';
293296 Gather Motion 3:1 (slice1; segments: 3)
294297 -> Seq Scan on box_temp
295298 Filter: (f1 &< '(10,100),(5,4.333334)'::box)
299+ Optimizer: GPORCA
296300(4 rows)
297301
298302SELECT * FROM box_temp WHERE f1 && '(15,20),(25,30)';
299303 f1
300304-------------------------------------------
301- (24,24),(12,12)
302- (28,28),(14,14)
303- (34,34),(17,17)
304- (40,40),(20,20)
305- (50,50),(25,25)
306- (20,20),(10,10)
305+ (22,22),(11,11)
307306 (26,26),(13,13)
308- (30,30),(15,15)
309307 (32,32),(16,16)
310- (36,36),(18,18)
311- (42,42),(21,21)
312- (22,22),(11,11)
313- (38,38),(19,19)
308+ (34,34),(17,17)
309+ (20,20),(10,10)
310+ (24,24),(12,12)
314311 (44,44),(22,22)
315312 (46,46),(23,23)
316313 (48,48),(24,24)
314+ (50,50),(25,25)
315+ (28,28),(14,14)
316+ (30,30),(15,15)
317+ (36,36),(18,18)
318+ (38,38),(19,19)
319+ (40,40),(20,20)
320+ (42,42),(21,21)
317321 (Infinity,Infinity),(-Infinity,-Infinity)
318322(17 rows)
319323
320324EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 && '(15,20),(25,30)';
321- QUERY PLAN
322- ------------------------------------------------------
325+ QUERY PLAN
326+ ------------------------------------------------
323327 Gather Motion 3:1 (slice1; segments: 3)
324328 -> Seq Scan on box_temp
325329 Filter: (f1 && '(25,30),(15,20)'::box)
330+ Optimizer: GPORCA
326331(4 rows)
327332
328333SELECT * FROM box_temp WHERE f1 &> '(40,30),(45,50)';
329334 f1
330335-------------------
331- (80,80),(40,40)
332- (82,82),(41,41)
333336 (86,86),(43,43)
334337 (90,90),(45,45)
335- (92,92),(46,46)
336- (94,94),(47,47)
337338 (96,96),(48,48)
339+ (98,98),(49,49)
338340 (88,88),(44,44)
341+ (94,94),(47,47)
339342 (100,100),(50,50)
343+ (80,80),(40,40)
344+ (82,82),(41,41)
340345 (84,84),(42,42)
341- (98,98 ),(49,49 )
346+ (92,92 ),(46,46 )
342347(11 rows)
343348
344349EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &> '(40,30),(45,50)';
345- QUERY PLAN
346- ------------------------------------------------------
350+ QUERY PLAN
351+ ------------------------------------------------
347352 Gather Motion 3:1 (slice1; segments: 3)
348353 -> Seq Scan on box_temp
349354 Filter: (f1 &> '(45,50),(40,30)'::box)
355+ Optimizer: GPORCA
350356(4 rows)
351357
352358SELECT * FROM box_temp WHERE f1 >> '(30,40),(40,30)';
353359 f1
354360-------------------
361+ (86,86),(43,43)
362+ (90,90),(45,45)
363+ (96,96),(48,48)
364+ (98,98),(49,49)
355365 (88,88),(44,44)
366+ (94,94),(47,47)
356367 (100,100),(50,50)
357- (84,84),(42,42)
358- (98,98),(49,49)
359368 (82,82),(41,41)
360- (86,86),(43,43)
361- (90,90),(45,45)
369+ (84,84),(42,42)
362370 (92,92),(46,46)
363- (94,94),(47,47)
364- (96,96),(48,48)
365371(10 rows)
366372
367373EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 >> '(30,40),(40,30)';
368- QUERY PLAN
369- ------------------------------------------------------
374+ QUERY PLAN
375+ ------------------------------------------------
370376 Gather Motion 3:1 (slice1; segments: 3)
371377 -> Seq Scan on box_temp
372378 Filter: (f1 >> '(40,40),(30,30)'::box)
379+ Optimizer: GPORCA
373380(4 rows)
374381
375382SELECT * FROM box_temp WHERE f1 <<| '(10,4.33334),(5,100)';
@@ -386,6 +393,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 <<| '(10,4.33334),(5,100)';
386393 Gather Motion 3:1 (slice1; segments: 3)
387394 -> Seq Scan on box_temp
388395 Filter: (f1 <<| '(10,100),(5,4.33334)'::box)
396+ Optimizer: GPORCA
389397(4 rows)
390398
391399SELECT * FROM box_temp WHERE f1 &<| '(10,4.3333334),(5,1)';
@@ -402,6 +410,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &<| '(10,4.3333334),(5,1)';
402410 Gather Motion 3:1 (slice1; segments: 3)
403411 -> Seq Scan on box_temp
404412 Filter: (f1 &<| '(10,4.3333334),(5,1)'::box)
413+ Optimizer: GPORCA
405414(4 rows)
406415
407416SELECT * FROM box_temp WHERE f1 |&> '(49.99,49.99),(49.99,49.99)';
@@ -417,47 +426,50 @@ EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 |&> '(49.99,49.99),(49.99,49
417426 Gather Motion 3:1 (slice1; segments: 3)
418427 -> Seq Scan on box_temp
419428 Filter: (f1 |&> '(49.99,49.99),(49.99,49.99)'::box)
429+ Optimizer: GPORCA
420430(4 rows)
421431
422432SELECT * FROM box_temp WHERE f1 |>> '(37,38),(39,40)';
423433 f1
424434----------------------
435+ (86,86),(43,43)
436+ (90,90),(45,45)
437+ (96,96),(48,48)
438+ (98,98),(49,49)
425439 (88,88),(44,44)
440+ (94,94),(47,47)
426441 (100,100),(50,50)
427442 (0,Infinity),(0,100)
428- (84,84),(42,42)
429- (98,98),(49,49)
430443 (82,82),(41,41)
431- (86,86),(43,43)
432- (90,90),(45,45)
444+ (84,84),(42,42)
433445 (92,92),(46,46)
434- (94,94),(47,47)
435- (96,96),(48,48)
436446(11 rows)
437447
438448EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 |>> '(37,38),(39,40)';
439- QUERY PLAN
440- ------------------------------------------------------
449+ QUERY PLAN
450+ -------------------------------------------------
441451 Gather Motion 3:1 (slice1; segments: 3)
442452 -> Seq Scan on box_temp
443453 Filter: (f1 |>> '(39,40),(37,38)'::box)
454+ Optimizer: GPORCA
444455(4 rows)
445456
446457SELECT * FROM box_temp WHERE f1 @> '(10,11),(15,16)';
447458 f1
448459-------------------------------------------
460+ (18,18),(9,9)
449461 (16,16),(8,8)
450- (20,20),(10,10)
451462 (Infinity,Infinity),(-Infinity,-Infinity)
452- (18,18 ),(9,9 )
463+ (20,20 ),(10,10 )
453464(4 rows)
454465
455466EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 @> '(10,11),(15,15)';
456- QUERY PLAN
457- ------------------------------------------------------
467+ QUERY PLAN
468+ ------------------------------------------------
458469 Gather Motion 3:1 (slice1; segments: 3)
459470 -> Seq Scan on box_temp
460471 Filter: (f1 @> '(15,15),(10,11)'::box)
472+ Optimizer: GPORCA
461473(4 rows)
462474
463475SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)';
@@ -467,11 +479,12 @@ SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)';
467479(1 row)
468480
469481EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)';
470- QUERY PLAN
471- ------------------------------------------------------
482+ QUERY PLAN
483+ ------------------------------------------------
472484 Gather Motion 3:1 (slice1; segments: 3)
473485 -> Seq Scan on box_temp
474486 Filter: (f1 <@ '(30,35),(10,15)'::box)
487+ Optimizer: GPORCA
475488(4 rows)
476489
477490SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)';
@@ -481,11 +494,12 @@ SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)';
481494(1 row)
482495
483496EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)';
484- QUERY PLAN
485- ------------------------------------------------------
497+ QUERY PLAN
498+ ------------------------------------------------
486499 Gather Motion 3:1 (slice1; segments: 3)
487500 -> Seq Scan on box_temp
488501 Filter: (f1 ~= '(40,40),(20,20)'::box)
502+ Optimizer: GPORCA
489503(4 rows)
490504
491505RESET enable_seqscan;
@@ -495,6 +509,7 @@ DROP INDEX box_spgist;
495509--
496510CREATE TABLE quad_box_tbl (id int, b box);
497511NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Apache Cloudberry data distribution key for this table.
512+ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
498513INSERT INTO quad_box_tbl
499514 SELECT (x - 1) * 100 + y, box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5))
500515 FROM generate_series(1, 100) x,
@@ -608,11 +623,6 @@ SELECT count(*) FROM quad_box_tbl WHERE b ~= box '((200,300),(205,305))';
608623-- test ORDER BY distance
609624SET enable_indexscan = ON;
610625SET enable_bitmapscan = OFF;
611- -- start_ignore
612- -- GPDB_13_MERGE_FIXME:
613- -- The ORCA sorts the result of seqscan, while the postgres planner uses index scan
614- -- to keep order. Is it better to also use index scan for ORCA?
615- -- end_ignore
616626EXPLAIN (COSTS OFF)
617627SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
618628FROM quad_box_tbl;
@@ -626,7 +636,7 @@ FROM quad_box_tbl;
626636 -> Sort
627637 Sort Key: ((b <-> '(123,456)'::point))
628638 -> Seq Scan on quad_box_tbl
629- Optimizer: Pivotal Optimizer ( GPORCA)
639+ Optimizer: GPORCA
630640(9 rows)
631641
632642CREATE TEMP TABLE quad_box_tbl_ord_idx1 AS
@@ -656,7 +666,7 @@ FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))';
656666 Sort Key: ((b <-> '(123,456)'::point))
657667 -> Seq Scan on quad_box_tbl
658668 Filter: (b <@ '(500,600),(200,300)'::box)
659- Optimizer: Pivotal Optimizer ( GPORCA)
669+ Optimizer: GPORCA
660670(10 rows)
661671
662672CREATE TEMP TABLE quad_box_tbl_ord_idx2 AS
@@ -675,3 +685,28 @@ WHERE seq.id IS NULL OR idx.id IS NULL;
675685RESET enable_seqscan;
676686RESET enable_indexscan;
677687RESET enable_bitmapscan;
688+ -- test non-error-throwing API for some core types
689+ SELECT pg_input_is_valid('200', 'box');
690+ pg_input_is_valid
691+ -------------------
692+ f
693+ (1 row)
694+
695+ SELECT * FROM pg_input_error_info('200', 'box');
696+ message | detail | hint | sql_error_code
697+ ------------------------------------------+--------+------+----------------
698+ invalid input syntax for type box: "200" | | | 22P02
699+ (1 row)
700+
701+ SELECT pg_input_is_valid('((200,300),(500, xyz))', 'box');
702+ pg_input_is_valid
703+ -------------------
704+ f
705+ (1 row)
706+
707+ SELECT * FROM pg_input_error_info('((200,300),(500, xyz))', 'box');
708+ message | detail | hint | sql_error_code
709+ -------------------------------------------------------------+--------+------+----------------
710+ invalid input syntax for type box: "((200,300),(500, xyz))" | | | 22P02
711+ (1 row)
712+
0 commit comments