5
-- first, define the datatype. Turn off echoing so that expected file
6
-- does not depend on contents of cube.sql.
9
psql:cube.sql:10: NOTICE: type "cube" is not yet defined
10
DETAIL: Creating a shell type definition.
11
psql:cube.sql:15: NOTICE: argument type cube is only a shell
13
-- testing the input and output functions
15
-- Any number (a one-dimensional point)
16
SELECT '1'::cube AS cube;
22
SELECT '-1'::cube AS cube;
28
SELECT '1.'::cube AS cube;
34
SELECT '-1.'::cube AS cube;
40
SELECT '.1'::cube AS cube;
46
SELECT '-.1'::cube AS cube;
52
SELECT '1.0'::cube AS cube;
58
SELECT '-1.0'::cube AS cube;
64
SELECT '1e27'::cube AS cube;
70
SELECT '-1e27'::cube AS cube;
76
SELECT '1.0e27'::cube AS cube;
82
SELECT '-1.0e27'::cube AS cube;
88
SELECT '1e+27'::cube AS cube;
94
SELECT '-1e+27'::cube AS cube;
100
SELECT '1.0e+27'::cube AS cube;
106
SELECT '-1.0e+27'::cube AS cube;
112
SELECT '1e-7'::cube AS cube;
118
SELECT '-1e-7'::cube AS cube;
124
SELECT '1.0e-7'::cube AS cube;
130
SELECT '-1.0e-7'::cube AS cube;
136
SELECT '1e-700'::cube AS cube;
142
SELECT '-1e-700'::cube AS cube;
148
SELECT '1234567890123456'::cube AS cube;
150
-------------------------
151
(1.23456789012346e+015)
154
SELECT '+1234567890123456'::cube AS cube;
156
-------------------------
157
(1.23456789012346e+015)
160
SELECT '-1234567890123456'::cube AS cube;
162
--------------------------
163
(-1.23456789012346e+015)
166
SELECT '.1234567890123456'::cube AS cube;
168
---------------------
172
SELECT '+.1234567890123456'::cube AS cube;
174
---------------------
178
SELECT '-.1234567890123456'::cube AS cube;
180
----------------------
184
-- simple lists (points)
185
SELECT '1,2'::cube AS cube;
191
SELECT '(1,2)'::cube AS cube;
197
SELECT '1,2,3,4,5'::cube AS cube;
203
SELECT '(1,2,3,4,5)'::cube AS cube;
209
-- double lists (cubes)
210
SELECT '(0),(0)'::cube AS cube;
216
SELECT '(0),(1)'::cube AS cube;
222
SELECT '[(0),(0)]'::cube AS cube;
228
SELECT '[(0),(1)]'::cube AS cube;
234
SELECT '(0,0,0,0),(0,0,0,0)'::cube AS cube;
240
SELECT '(0,0,0,0),(1,0,0,0)'::cube AS cube;
242
---------------------------
243
(0, 0, 0, 0),(1, 0, 0, 0)
246
SELECT '[(0,0,0,0),(0,0,0,0)]'::cube AS cube;
252
SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
254
---------------------------
255
(0, 0, 0, 0),(1, 0, 0, 0)
258
-- invalid input: parse errors
259
SELECT ''::cube AS cube;
260
ERROR: bad cube representation
261
DETAIL: syntax error at end of input
262
SELECT 'ABC'::cube AS cube;
263
ERROR: bad cube representation
264
DETAIL: syntax error at or near "A"
265
SELECT '()'::cube AS cube;
266
ERROR: bad cube representation
267
DETAIL: syntax error at or near ")"
268
SELECT '[]'::cube AS cube;
269
ERROR: bad cube representation
270
DETAIL: syntax error at or near "]"
271
SELECT '[()]'::cube AS cube;
272
ERROR: bad cube representation
273
DETAIL: syntax error at or near ")"
274
SELECT '[(1)]'::cube AS cube;
275
ERROR: bad cube representation
276
DETAIL: syntax error at or near "]"
277
SELECT '[(1),]'::cube AS cube;
278
ERROR: bad cube representation
279
DETAIL: syntax error at or near "]"
280
SELECT '[(1),2]'::cube AS cube;
281
ERROR: bad cube representation
282
DETAIL: syntax error at or near "2"
283
SELECT '[(1),(2),(3)]'::cube AS cube;
284
ERROR: bad cube representation
285
DETAIL: syntax error at or near ","
286
SELECT '1,'::cube AS cube;
287
ERROR: bad cube representation
288
DETAIL: syntax error at end of input
289
SELECT '1,2,'::cube AS cube;
290
ERROR: bad cube representation
291
DETAIL: syntax error at end of input
292
SELECT '1,,2'::cube AS cube;
293
ERROR: bad cube representation
294
DETAIL: syntax error at or near ","
295
SELECT '(1,)'::cube AS cube;
296
ERROR: bad cube representation
297
DETAIL: syntax error at or near ")"
298
SELECT '(1,2,)'::cube AS cube;
299
ERROR: bad cube representation
300
DETAIL: syntax error at or near ")"
301
SELECT '(1,,2)'::cube AS cube;
302
ERROR: bad cube representation
303
DETAIL: syntax error at or near ","
304
-- invalid input: semantic errors and trailing garbage
305
SELECT '[(1),(2)],'::cube AS cube; -- 0
306
ERROR: bad cube representation
307
DETAIL: syntax error at or near ","
308
SELECT '[(1,2,3),(2,3)]'::cube AS cube; -- 1
309
ERROR: bad cube representation
310
DETAIL: different point dimensions in (1,2,3) and (2,3)
311
SELECT '[(1,2),(1,2,3)]'::cube AS cube; -- 1
312
ERROR: bad cube representation
313
DETAIL: different point dimensions in (1,2) and (1,2,3)
314
SELECT '(1),(2),'::cube AS cube; -- 2
315
ERROR: bad cube representation
316
DETAIL: syntax error at or near ","
317
SELECT '(1,2,3),(2,3)'::cube AS cube; -- 3
318
ERROR: bad cube representation
319
DETAIL: different point dimensions in (1,2,3) and (2,3)
320
SELECT '(1,2),(1,2,3)'::cube AS cube; -- 3
321
ERROR: bad cube representation
322
DETAIL: different point dimensions in (1,2) and (1,2,3)
323
SELECT '(1,2,3)ab'::cube AS cube; -- 4
324
ERROR: bad cube representation
325
DETAIL: syntax error at or near "a"
326
SELECT '(1,2,3)a'::cube AS cube; -- 5
327
ERROR: bad cube representation
328
DETAIL: syntax error at or near "a"
329
SELECT '(1,2)('::cube AS cube; -- 5
330
ERROR: bad cube representation
331
DETAIL: syntax error at or near "("
332
SELECT '1,2ab'::cube AS cube; -- 6
333
ERROR: bad cube representation
334
DETAIL: syntax error at or near "a"
335
SELECT '1 e7'::cube AS cube; -- 6
336
ERROR: bad cube representation
337
DETAIL: syntax error at or near "e"
338
SELECT '1,2a'::cube AS cube; -- 7
339
ERROR: bad cube representation
340
DETAIL: syntax error at or near "a"
341
SELECT '1..2'::cube AS cube; -- 7
342
ERROR: bad cube representation
343
DETAIL: syntax error at or near ".2"
345
-- Testing building cubes from float8 values
347
SELECT cube(0::float8);
353
SELECT cube(1::float8);
365
SELECT cube(cube(1,2),3);
371
SELECT cube(cube(1,2),3,4);
377
SELECT cube(cube(cube(1,2),3,4),5);
379
---------------------
383
SELECT cube(cube(cube(1,2),3,4),5,6);
385
---------------------
390
-- Test that the text -> cube cast was installed.
392
SELECT '(0)'::text::cube;
399
-- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
401
select '(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'::cube;
402
ERROR: bad cube representation
403
DETAIL: more than 100 dimensions
404
select '(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'::cube;
405
ERROR: bad cube representation
406
DETAIL: more than 100 dimensions
408
-- testing the operators
410
-- equality/inequality:
412
SELECT '24, 33.20'::cube = '24, 33.20'::cube AS bool;
418
SELECT '24, 33.20'::cube != '24, 33.20'::cube AS bool;
424
SELECT '24, 33.20'::cube = '24, 33.21'::cube AS bool;
430
SELECT '24, 33.20'::cube != '24, 33.21'::cube AS bool;
436
SELECT '(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool;
442
SELECT '(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
448
-- "lower than" / "greater than"
449
-- (these operators are not useful for anything but ordering)
451
SELECT '1'::cube > '2'::cube AS bool;
457
SELECT '1'::cube < '2'::cube AS bool;
463
SELECT '1,1'::cube > '1,2'::cube AS bool;
469
SELECT '1,1'::cube < '1,2'::cube AS bool;
475
SELECT '(2,0),(3,1)'::cube > '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
481
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
487
SELECT '(2,0),(3,1)'::cube > '(2,0,0,0,1),(3,1,0,0,0)'::cube AS bool;
493
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,1),(3,1,0,0,0)'::cube AS bool;
499
SELECT '(2,0),(3,1)'::cube > '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool;
505
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool;
511
SELECT '(2,0,0,0,0),(3,1,0,0,1)'::cube > '(2,0),(3,1)'::cube AS bool;
517
SELECT '(2,0,0,0,0),(3,1,0,0,1)'::cube < '(2,0),(3,1)'::cube AS bool;
523
SELECT '(2,0,0,0,1),(3,1,0,0,0)'::cube > '(2,0),(3,1)'::cube AS bool;
529
SELECT '(2,0,0,0,1),(3,1,0,0,0)'::cube < '(2,0),(3,1)'::cube AS bool;
535
SELECT '(2,0,0,0,0),(3,1,0,0,0)'::cube > '(2,0),(3,1)'::cube AS bool;
541
SELECT '(2,0,0,0,0),(3,1,0,0,0)'::cube < '(2,0),(3,1)'::cube AS bool;
549
SELECT '1'::cube && '1'::cube AS bool;
555
SELECT '1'::cube && '2'::cube AS bool;
561
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '0'::cube AS bool;
567
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '1'::cube AS bool;
573
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '1,1,1'::cube AS bool;
579
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1,1),(2,2,2)]'::cube AS bool;
585
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1),(2,2)]'::cube AS bool;
591
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(2,1,1),(2,2,2)]'::cube AS bool;
597
-- "overlap on the left" / "overlap on the right"
598
-- (these operators are not useful at all but R-tree seems to be
599
-- sensitive to their presence)
601
SELECT '1'::cube &< '0'::cube AS bool;
607
SELECT '1'::cube &< '1'::cube AS bool;
613
SELECT '1'::cube &< '2'::cube AS bool;
619
SELECT '(0),(1)'::cube &< '0'::cube AS bool;
625
SELECT '(0),(1)'::cube &< '1'::cube AS bool;
631
SELECT '(0),(1)'::cube &< '(0),(0.5)'::cube AS bool;
637
SELECT '(0),(1)'::cube &< '(0),(1)'::cube AS bool;
643
SELECT '(0),(1)'::cube &< '(0),(2)'::cube AS bool;
649
SELECT '(0),(1)'::cube &< '(1),(2)'::cube AS bool;
655
SELECT '(0),(1)'::cube &< '(2),(3)'::cube AS bool;
661
SELECT '0'::cube &> '1'::cube AS bool;
667
SELECT '1'::cube &> '1'::cube AS bool;
673
SELECT '2'::cube &> '1'::cube AS bool;
679
SELECT '0'::cube &> '(0),(1)'::cube AS bool;
685
SELECT '1'::cube &> '(0),(1)'::cube AS bool;
691
SELECT '(0),(0.5)' &> '(0),(1)'::cube AS bool;
697
SELECT '(0),(1)'::cube &> '(0),(1)'::cube AS bool;
703
SELECT '(0),(2)'::cube &> '(0),(1)'::cube AS bool;
709
SELECT '(1),(2)'::cube &> '(0),(1)'::cube AS bool;
715
SELECT '(2),(3)'::cube &> '(0),(1)'::cube AS bool;
722
-- (these operators are not useful but for 1-D or 2-D cubes, but R-tree
723
-- seems to want them defined)
725
SELECT '1'::cube << '0'::cube AS bool;
731
SELECT '1'::cube << '1'::cube AS bool;
737
SELECT '1'::cube << '2'::cube AS bool;
743
SELECT '(0),(1)'::cube << '0'::cube AS bool;
749
SELECT '(0),(1)'::cube << '1'::cube AS bool;
755
SELECT '(0),(1)'::cube << '(0),(0.5)'::cube AS bool;
761
SELECT '(0),(1)'::cube << '(0),(1)'::cube AS bool;
767
SELECT '(0),(1)'::cube << '(0),(2)'::cube AS bool;
773
SELECT '(0),(1)'::cube << '(1),(2)'::cube AS bool;
779
SELECT '(0),(1)'::cube << '(2),(3)'::cube AS bool;
785
SELECT '0'::cube >> '1'::cube AS bool;
791
SELECT '1'::cube >> '1'::cube AS bool;
797
SELECT '2'::cube >> '1'::cube AS bool;
803
SELECT '0'::cube >> '(0),(1)'::cube AS bool;
809
SELECT '1'::cube >> '(0),(1)'::cube AS bool;
815
SELECT '(0),(0.5)' >> '(0),(1)'::cube AS bool;
821
SELECT '(0),(1)'::cube >> '(0),(1)'::cube AS bool;
827
SELECT '(0),(2)'::cube >> '(0),(1)'::cube AS bool;
833
SELECT '(1),(2)'::cube >> '(0),(1)'::cube AS bool;
839
SELECT '(2),(3)'::cube >> '(0),(1)'::cube AS bool;
845
-- "contained in" (the left operand is the cube entirely enclosed by
846
-- the right operand):
848
SELECT '0'::cube ~ '0'::cube AS bool;
854
SELECT '0,0,0'::cube ~ '0,0,0'::cube AS bool;
860
SELECT '0,0'::cube ~ '0,0,1'::cube AS bool;
866
SELECT '0,0,0'::cube ~ '0,0,1'::cube AS bool;
872
SELECT '1,0,0'::cube ~ '0,0,1'::cube AS bool;
878
SELECT '(1,0,0),(0,0,1)'::cube ~ '(1,0,0),(0,0,1)'::cube AS bool;
884
SELECT '(1,0,0),(0,0,1)'::cube ~ '(-1,-1,-1),(1,1,1)'::cube AS bool;
890
SELECT '(1,0,0),(0,0,1)'::cube ~ '(-1,-1,-1,-1),(1,1,1,1)'::cube AS bool;
896
SELECT '0'::cube ~ '(-1),(1)'::cube AS bool;
902
SELECT '1'::cube ~ '(-1),(1)'::cube AS bool;
908
SELECT '-1'::cube ~ '(-1),(1)'::cube AS bool;
914
SELECT '(-1),(1)'::cube ~ '(-1),(1)'::cube AS bool;
920
SELECT '(-1),(1)'::cube ~ '(-1,-1),(1,1)'::cube AS bool;
926
SELECT '(-2),(1)'::cube ~ '(-1),(1)'::cube AS bool;
932
SELECT '(-2),(1)'::cube ~ '(-1,-1),(1,1)'::cube AS bool;
938
-- "contains" (the left operand is the cube that entirely encloses the
941
SELECT '0'::cube @ '0'::cube AS bool;
947
SELECT '0,0,0'::cube @ '0,0,0'::cube AS bool;
953
SELECT '0,0,1'::cube @ '0,0'::cube AS bool;
959
SELECT '0,0,1'::cube @ '0,0,0'::cube AS bool;
965
SELECT '0,0,1'::cube @ '1,0,0'::cube AS bool;
971
SELECT '(1,0,0),(0,0,1)'::cube @ '(1,0,0),(0,0,1)'::cube AS bool;
977
SELECT '(-1,-1,-1),(1,1,1)'::cube @ '(1,0,0),(0,0,1)'::cube AS bool;
983
SELECT '(-1,-1,-1,-1),(1,1,1,1)'::cube @ '(1,0,0),(0,0,1)'::cube AS bool;
989
SELECT '(-1),(1)'::cube @ '0'::cube AS bool;
995
SELECT '(-1),(1)'::cube @ '1'::cube AS bool;
1001
SELECT '(-1),(1)'::cube @ '-1'::cube AS bool;
1007
SELECT '(-1),(1)'::cube @ '(-1),(1)'::cube AS bool;
1013
SELECT '(-1,-1),(1,1)'::cube @ '(-1),(1)'::cube AS bool;
1019
SELECT '(-1),(1)'::cube @ '(-2),(1)'::cube AS bool;
1025
SELECT '(-1,-1),(1,1)'::cube @ '(-2),(1)'::cube AS bool;
1031
-- Test of distance function
1033
SELECT cube_distance('(0)'::cube,'(2,2,2,2)'::cube);
1039
SELECT cube_distance('(0)'::cube,'(.3,.4)'::cube);
1045
-- Test of cube function (text to cube)
1047
SELECT cube('('||1||','||1.2||')');
1059
-- Test of cube_dim function (dimensions stored in cube)
1061
SELECT cube_dim('(0)'::cube);
1067
SELECT cube_dim('(0,0)'::cube);
1073
SELECT cube_dim('(0,0,0)'::cube);
1079
-- Test of cube_ll_coord function (retrieves LL coodinate values)
1081
SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 1);
1087
SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 2);
1093
SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 3);
1099
-- Test of cube_ur_coord function (retrieves UR coodinate values)
1101
SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 1);
1107
SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 2);
1113
SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 3);
1119
-- Test of cube_is_point
1121
SELECT cube_is_point('(0)'::cube);
1127
SELECT cube_is_point('(0,1,2)'::cube);
1133
SELECT cube_is_point('(0,1,2),(0,1,2)'::cube);
1139
SELECT cube_is_point('(0,1,2),(-1,1,2)'::cube);
1145
SELECT cube_is_point('(0,1,2),(0,-1,2)'::cube);
1151
SELECT cube_is_point('(0,1,2),(0,1,-2)'::cube);
1157
-- Test of cube_enlarge (enlarging and shrinking cubes)
1159
SELECT cube_enlarge('(0)'::cube, 0, 0);
1165
SELECT cube_enlarge('(0)'::cube, 0, 1);
1171
SELECT cube_enlarge('(0)'::cube, 0, 2);
1177
SELECT cube_enlarge('(2),(-2)'::cube, 0, 4);
1183
SELECT cube_enlarge('(0)'::cube, 1, 0);
1189
SELECT cube_enlarge('(0)'::cube, 1, 1);
1195
SELECT cube_enlarge('(0)'::cube, 1, 2);
1201
SELECT cube_enlarge('(2),(-2)'::cube, 1, 4);
1203
-------------------------------
1204
(-3, -1, -1, -1),(3, 1, 1, 1)
1207
SELECT cube_enlarge('(0)'::cube, -1, 0);
1213
SELECT cube_enlarge('(0)'::cube, -1, 1);
1219
SELECT cube_enlarge('(0)'::cube, -1, 2);
1225
SELECT cube_enlarge('(2),(-2)'::cube, -1, 4);
1231
SELECT cube_enlarge('(0,0,0)'::cube, 1, 0);
1233
------------------------
1234
(-1, -1, -1),(1, 1, 1)
1237
SELECT cube_enlarge('(0,0,0)'::cube, 1, 2);
1239
------------------------
1240
(-1, -1, -1),(1, 1, 1)
1243
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 1, 2);
1249
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 3, 2);
1255
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -1, 2);
1261
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -3, 2);
1263
---------------------
1267
-- Load some example data and build the index
1269
CREATE TABLE test_cube (c cube);
1270
\copy test_cube from 'data/test_cube.data'
1271
CREATE INDEX test_cube_ix ON test_cube USING gist (c);
1272
SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)';
1274
--------------------------
1275
(2424, 160),(2424, 81)
1276
(759, 187),(662, 163)
1277
(1444, 403),(1346, 344)
1278
(337, 455),(240, 359)
1279
(1594, 1043),(1517, 971)
1283
SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' GROUP BY c;
1285
--------------------------
1286
(337, 455),(240, 359)
1287
(759, 187),(662, 163)
1288
(1444, 403),(1346, 344)
1289
(1594, 1043),(1517, 971)
1290
(2424, 160),(2424, 81)