1--
2-- GEOMETRY
3--
4
5-- Back off displayed precision a little bit to reduce platform-to-platform
6-- variation in results.
7SET extra_float_digits TO -3;
8
9--
10-- Points
11--
12
13SELECT '' AS four, center(f1) AS center
14   FROM BOX_TBL;
15
16SELECT '' AS four, (@@ f1) AS center
17   FROM BOX_TBL;
18
19SELECT '' AS six, point(f1) AS center
20   FROM CIRCLE_TBL;
21
22SELECT '' AS six, (@@ f1) AS center
23   FROM CIRCLE_TBL;
24
25SELECT '' AS two, (@@ f1) AS center
26   FROM POLYGON_TBL
27   WHERE (# f1) > 2;
28
29-- "is horizontal" function
30SELECT '' AS two, p1.f1
31   FROM POINT_TBL p1
32   WHERE ishorizontal(p1.f1, point '(0,0)');
33
34-- "is horizontal" operator
35SELECT '' AS two, p1.f1
36   FROM POINT_TBL p1
37   WHERE p1.f1 ?- point '(0,0)';
38
39-- "is vertical" function
40SELECT '' AS one, p1.f1
41   FROM POINT_TBL p1
42   WHERE isvertical(p1.f1, point '(5.1,34.5)');
43
44-- "is vertical" operator
45SELECT '' AS one, p1.f1
46   FROM POINT_TBL p1
47   WHERE p1.f1 ?| point '(5.1,34.5)';
48
49-- Slope
50SELECT p1.f1, p2.f1, slope(p1.f1, p2.f1) FROM POINT_TBL p1, POINT_TBL p2;
51
52-- Add point
53SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM POINT_TBL p1, POINT_TBL p2;
54
55-- Subtract point
56SELECT p1.f1, p2.f1, p1.f1 - p2.f1 FROM POINT_TBL p1, POINT_TBL p2;
57
58-- Multiply with point
59SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] BETWEEN 1 AND 1000;
60
61-- Underflow error
62SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] < 1;
63
64-- Divide by point
65SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] BETWEEN 1 AND 1000;
66
67-- Overflow error
68SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] > 1000;
69
70-- Division by 0 error
71SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1 ~= '(0,0)'::point;
72
73-- Distance to line
74SELECT p.f1, l.s, p.f1 <-> l.s AS dist_pl, l.s <-> p.f1 AS dist_lp FROM POINT_TBL p, LINE_TBL l;
75
76-- Distance to line segment
77SELECT p.f1, l.s, p.f1 <-> l.s AS dist_ps, l.s <-> p.f1 AS dist_sp FROM POINT_TBL p, LSEG_TBL l;
78
79-- Distance to box
80SELECT p.f1, b.f1, p.f1 <-> b.f1 AS dist_pb, b.f1 <-> p.f1 AS dist_bp FROM POINT_TBL p, BOX_TBL b;
81
82-- Distance to path
83SELECT p.f1, p1.f1, p.f1 <-> p1.f1 AS dist_ppath, p1.f1 <-> p.f1 AS dist_pathp FROM POINT_TBL p, PATH_TBL p1;
84
85-- Distance to polygon
86SELECT p.f1, p1.f1, p.f1 <-> p1.f1 AS dist_ppoly, p1.f1 <-> p.f1 AS dist_polyp FROM POINT_TBL p, POLYGON_TBL p1;
87
88-- Closest point to line
89SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LINE_TBL l;
90
91-- Closest point to line segment
92SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LSEG_TBL l;
93
94-- Closest point to box
95SELECT p.f1, b.f1, p.f1 ## b.f1 FROM POINT_TBL p, BOX_TBL b;
96
97-- On line
98SELECT p.f1, l.s FROM POINT_TBL p, LINE_TBL l WHERE p.f1 <@ l.s;
99
100-- On line segment
101SELECT p.f1, l.s FROM POINT_TBL p, LSEG_TBL l WHERE p.f1 <@ l.s;
102
103-- On path
104SELECT p.f1, p1.f1 FROM POINT_TBL p, PATH_TBL p1 WHERE p.f1 <@ p1.f1;
105
106--
107-- Lines
108--
109
110-- Vertical
111SELECT s FROM LINE_TBL WHERE ?| s;
112
113-- Horizontal
114SELECT s FROM LINE_TBL WHERE ?- s;
115
116-- Same as line
117SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s = l2.s;
118
119-- Parallel to line
120SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?|| l2.s;
121
122-- Perpendicular to line
123SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?-| l2.s;
124
125-- Distance to line
126SELECT l1.s, l2.s, l1.s <-> l2.s FROM LINE_TBL l1, LINE_TBL l2;
127
128-- Distance to box
129SELECT l.s, b.f1, l.s <-> b.f1 FROM LINE_TBL l, BOX_TBL b;
130SELECT l.s, b.f1, b.f1 <-> l.s FROM LINE_TBL l, BOX_TBL b;
131
132-- Intersect with line
133SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?# l2.s;
134
135-- Intersect with box
136SELECT l.s, b.f1 FROM LINE_TBL l, BOX_TBL b WHERE l.s ?# b.f1;
137
138-- Intersection point with line
139SELECT l1.s, l2.s, l1.s # l2.s FROM LINE_TBL l1, LINE_TBL l2;
140
141-- Closest point to line segment
142SELECT l.s, l1.s, l.s ## l1.s FROM LINE_TBL l, LSEG_TBL l1;
143
144-- Closest point to box
145SELECT l.s, b.f1, l.s ## b.f1 FROM LINE_TBL l, BOX_TBL b;
146
147--
148-- Line segments
149--
150
151-- intersection
152SELECT '' AS count, p.f1, l.s, l.s # p.f1 AS intersection
153   FROM LSEG_TBL l, POINT_TBL p;
154
155-- Length
156SELECT s, @-@ s FROM LSEG_TBL;
157
158-- Vertical
159SELECT s FROM LSEG_TBL WHERE ?| s;
160
161-- Horizontal
162SELECT s FROM LSEG_TBL WHERE ?- s;
163
164-- Center
165SELECT s, @@ s FROM LSEG_TBL;
166
167-- To point
168SELECT s, s::point FROM LSEG_TBL;
169
170-- Has points less than line segment
171SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s < l2.s;
172
173-- Has points less than or equal to line segment
174SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s <= l2.s;
175
176-- Has points equal to line segment
177SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s = l2.s;
178
179-- Has points greater than or equal to line segment
180SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s >= l2.s;
181
182-- Has points greater than line segment
183SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s > l2.s;
184
185-- Has points not equal to line segment
186SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s != l2.s;
187
188-- Parallel with line segment
189SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?|| l2.s;
190
191-- Perpendicular with line segment
192SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?-| l2.s;
193
194-- Distance to line
195SELECT l.s, l1.s, l.s <-> l1.s AS dist_sl, l1.s <-> l.s AS dist_ls FROM LSEG_TBL l, LINE_TBL l1;
196
197-- Distance to line segment
198SELECT l1.s, l2.s, l1.s <-> l2.s FROM LSEG_TBL l1, LSEG_TBL l2;
199
200-- Distance to box
201SELECT l.s, b.f1, l.s <-> b.f1 AS dist_sb, b.f1 <-> l.s AS dist_bs FROM LSEG_TBL l, BOX_TBL b;
202
203-- Intersect with line segment
204SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s ?# l1.s;
205
206-- Intersect with box
207SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s ?# b.f1;
208
209-- Intersection point with line segment
210SELECT l1.s, l2.s, l1.s # l2.s FROM LSEG_TBL l1, LSEG_TBL l2;
211
212-- Closest point to line
213SELECT l.s, l1.s, l.s ## l1.s FROM LSEG_TBL l, LINE_TBL l1;
214
215-- Closest point to line segment
216SELECT l1.s, l2.s, l1.s ## l2.s FROM LSEG_TBL l1, LSEG_TBL l2;
217
218-- Closest point to box
219SELECT l.s, b.f1, l.s ## b.f1 FROM LSEG_TBL l, BOX_TBL b;
220
221-- On line
222SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s <@ l1.s;
223
224-- On box
225SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s <@ b.f1;
226
227--
228-- Boxes
229--
230
231SELECT '' as six, box(f1) AS box FROM CIRCLE_TBL;
232
233-- translation
234SELECT '' AS twentyfour, b.f1 + p.f1 AS translation
235   FROM BOX_TBL b, POINT_TBL p;
236
237SELECT '' AS twentyfour, b.f1 - p.f1 AS translation
238   FROM BOX_TBL b, POINT_TBL p;
239
240-- Multiply with point
241SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000;
242
243-- Overflow error
244SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] > 1000;
245
246-- Divide by point
247SELECT b.f1, p.f1, b.f1 / p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000;
248
249-- To box
250SELECT f1::box
251	FROM POINT_TBL;
252
253SELECT bound_box(a.f1, b.f1)
254	FROM BOX_TBL a, BOX_TBL b;
255
256-- Below box
257SELECT b1.f1, b2.f1, b1.f1 <^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
258
259-- Above box
260SELECT b1.f1, b2.f1, b1.f1 >^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
261
262-- Intersection point with box
263SELECT b1.f1, b2.f1, b1.f1 # b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
264
265-- Diagonal
266SELECT f1, diagonal(f1) FROM BOX_TBL;
267
268-- Distance to box
269SELECT b1.f1, b2.f1, b1.f1 <-> b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
270
271--
272-- Paths
273--
274
275-- Points
276SELECT f1, npoints(f1) FROM PATH_TBL;
277
278-- Area
279SELECT f1, area(f1) FROM PATH_TBL;
280
281-- Length
282SELECT f1, @-@ f1 FROM PATH_TBL;
283
284-- Center
285SELECT f1, @@ f1 FROM PATH_TBL;
286
287-- To polygon
288SELECT f1, f1::polygon FROM PATH_TBL WHERE isclosed(f1);
289
290-- Open path cannot be converted to polygon error
291SELECT f1, f1::polygon FROM PATH_TBL WHERE isopen(f1);
292
293-- Has points less than path
294SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 < p2.f1;
295
296-- Has points less than or equal to path
297SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 <= p2.f1;
298
299-- Has points equal to path
300SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 = p2.f1;
301
302-- Has points greater than or equal to path
303SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 >= p2.f1;
304
305-- Has points greater than path
306SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 > p2.f1;
307
308-- Add path
309SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM PATH_TBL p1, PATH_TBL p2;
310
311-- Add point
312SELECT p.f1, p1.f1, p.f1 + p1.f1 FROM PATH_TBL p, POINT_TBL p1;
313
314-- Subtract point
315SELECT p.f1, p1.f1, p.f1 - p1.f1 FROM PATH_TBL p, POINT_TBL p1;
316
317-- Multiply with point
318SELECT p.f1, p1.f1, p.f1 * p1.f1 FROM PATH_TBL p, POINT_TBL p1;
319
320-- Divide by point
321SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1[0] BETWEEN 1 AND 1000;
322
323-- Division by 0 error
324SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1 ~= '(0,0)'::point;
325
326-- Distance to path
327SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM PATH_TBL p1, PATH_TBL p2;
328
329--
330-- Polygons
331--
332
333-- containment
334SELECT '' AS twentyfour, p.f1, poly.f1, poly.f1 @> p.f1 AS contains
335   FROM POLYGON_TBL poly, POINT_TBL p;
336
337SELECT '' AS twentyfour, p.f1, poly.f1, p.f1 <@ poly.f1 AS contained
338   FROM POLYGON_TBL poly, POINT_TBL p;
339
340SELECT '' AS four, npoints(f1) AS npoints, f1 AS polygon
341   FROM POLYGON_TBL;
342
343SELECT '' AS four, polygon(f1)
344   FROM BOX_TBL;
345
346SELECT '' AS four, polygon(f1)
347   FROM PATH_TBL WHERE isclosed(f1);
348
349SELECT '' AS four, f1 AS open_path, polygon( pclose(f1)) AS polygon
350   FROM PATH_TBL
351   WHERE isopen(f1);
352
353-- To box
354SELECT f1, f1::box FROM POLYGON_TBL;
355
356-- To path
357SELECT f1, f1::path FROM POLYGON_TBL;
358
359-- Same as polygon
360SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 ~= p2.f1;
361
362-- Contained by polygon
363SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <@ p2.f1;
364
365-- Contains polygon
366SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 @> p2.f1;
367
368-- Overlap with polygon
369SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 && p2.f1;
370
371-- Left of polygon
372SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 << p2.f1;
373
374-- Overlap of left of polygon
375SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &< p2.f1;
376
377-- Right of polygon
378SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 >> p2.f1;
379
380-- Overlap of right of polygon
381SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &> p2.f1;
382
383-- Below polygon
384SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <<| p2.f1;
385
386-- Overlap or below polygon
387SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &<| p2.f1;
388
389-- Above polygon
390SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |>> p2.f1;
391
392-- Overlap or above polygon
393SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |&> p2.f1;
394
395-- Distance to polygon
396SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2;
397
398--
399-- Circles
400--
401
402SELECT '' AS six, circle(f1, 50.0)
403   FROM POINT_TBL;
404
405SELECT '' AS four, circle(f1)
406   FROM BOX_TBL;
407
408SELECT '' AS two, circle(f1)
409   FROM POLYGON_TBL
410   WHERE (# f1) >= 3;
411
412SELECT '' AS twentyfour, c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS distance
413   FROM CIRCLE_TBL c1, POINT_TBL p1
414   WHERE (p1.f1 <-> c1.f1) > 0
415   ORDER BY distance, area(c1.f1), p1.f1[0];
416
417-- To polygon
418SELECT f1, f1::polygon FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>';
419
420-- To polygon with less points
421SELECT f1, polygon(8, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>';
422
423-- Too less points error
424SELECT f1, polygon(1, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>';
425
426-- Zero radius error
427SELECT f1, polygon(10, f1) FROM CIRCLE_TBL WHERE f1 < '<(0,0),1>';
428
429-- Same as circle
430SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 ~= c2.f1;
431
432-- Overlap with circle
433SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 && c2.f1;
434
435-- Overlap or left of circle
436SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &< c2.f1;
437
438-- Left of circle
439SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 << c2.f1;
440
441-- Right of circle
442SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >> c2.f1;
443
444-- Overlap or right of circle
445SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &> c2.f1;
446
447-- Contained by circle
448SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <@ c2.f1;
449
450-- Contain by circle
451SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 @> c2.f1;
452
453-- Below circle
454SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <<| c2.f1;
455
456-- Above circle
457SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |>> c2.f1;
458
459-- Overlap or below circle
460SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &<| c2.f1;
461
462-- Overlap or above circle
463SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |&> c2.f1;
464
465-- Area equal with circle
466SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 = c2.f1;
467
468-- Area not equal with circle
469SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 != c2.f1;
470
471-- Area less than circle
472SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1;
473
474-- Area greater than circle
475SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 > c2.f1;
476
477-- Area less than or equal circle
478SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <= c2.f1;
479
480-- Area greater than or equal circle
481SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >= c2.f1;
482
483-- Area less than circle
484SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1;
485
486-- Area greater than circle
487SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1;
488
489-- Add point
490SELECT c.f1, p.f1, c.f1 + p.f1 FROM CIRCLE_TBL c, POINT_TBL p;
491
492-- Subtract point
493SELECT c.f1, p.f1, c.f1 - p.f1 FROM CIRCLE_TBL c, POINT_TBL p;
494
495-- Multiply with point
496SELECT c.f1, p.f1, c.f1 * p.f1 FROM CIRCLE_TBL c, POINT_TBL p;
497
498-- Divide by point
499SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000;
500
501-- Overflow error
502SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] > 1000;
503
504-- Division by 0 error
505SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1 ~= '(0,0)'::point;
506
507-- Distance to polygon
508SELECT c.f1, p.f1, c.f1 <-> p.f1 FROM CIRCLE_TBL c, POLYGON_TBL p;
509