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