[PATCH] Revive line type - Mailing list pgsql-hackers
From | Peter Eisentraut |
---|---|
Subject | [PATCH] Revive line type |
Date | |
Msg-id | 1371256251.13762.3.camel@vanquo.pezone.net Whole thread Raw |
In response to | Re: line type (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: [PATCH] Revive line type
|
List | pgsql-hackers |
Complete the implementations of line_in, line_out, line_recv, line_send. Remove comments and error messages about the line type not being implemented. Add regression tests for existing line operators and functions. --- This just revives existing functionality, doesn't add anything new. One thing that the original code did not settle was how to convert a line in form Ax+By+C=0 to the two-points output form. Obviously, you can just pick to random points on the line, but I wonder whether there is a more standard solution. doc/src/sgml/datatype.sgml | 34 +++-doc/src/sgml/func.sgml | 6 +src/backend/utils/adt/geo_ops.c | 108 +++++--------src/include/catalog/pg_type.h | 3 +-src/include/utils/geo_decls.h | 7 -src/test/regress/expected/geometry.out | 3 -src/test/regress/expected/line.out | 243 ++++++++++++++++++++++++++++src/test/regress/expected/sanity_check.out| 3 +-src/test/regress/output/misc.source | 3 +-src/test/regress/parallel_schedule | 2 +-src/test/regress/serial_schedule | 1 +src/test/regress/sql/geometry.sql | 4 -src/test/regress/sql/line.sql | 77 +++++++++13 files changed,408 insertions(+), 86 deletions(-)create mode 100644 src/test/regress/expected/line.outcreate mode 100644 src/test/regress/sql/line.sql diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index f73e6b2..ecbbdd8 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -3066,7 +3066,7 @@ <title>Geometric Types</title> <row> <entry><type>line</type></entry> <entry>32bytes</entry> - <entry>Infinite line (not fully implemented)</entry> + <entry>Infinite line</entry> <entry>((x1,y1),(x2,y2))</entry> </row> <row> @@ -3142,6 +3142,38 @@ <title>Points</title> </sect2> <sect2> + <title>Lines</title> + + <indexterm> + <primary>line</primary> + </indexterm> + + <para> + Lines (<type>line</type>) are specified by pairs of points. + Values of type <type>line</type> are specified using any of the following + syntaxes: + +<synopsis> +[ ( <replaceable>x1</replaceable> , <replaceable>y1</replaceable> ) , ( <replaceable>x2</replaceable> , <replaceable>y2</replaceable>) ] +( ( <replaceable>x1</replaceable> , <replaceable>y1</replaceable> ) , ( <replaceable>x2</replaceable> , <replaceable>y2</replaceable>) ) + ( <replaceable>x1</replaceable> , <replaceable>y1</replaceable> ) , ( <replaceable>x2</replaceable> , <replaceable>y2</replaceable>) + <replaceable>x1</replaceable> , <replaceable>y1</replaceable> , <replaceable>x2</replaceable> , <replaceable>y2</replaceable> +</synopsis> + + where + <literal>(<replaceable>x1</replaceable>,<replaceable>y1</replaceable>)</literal> + and + <literal>(<replaceable>x2</replaceable>,<replaceable>y2</replaceable>)</literal> + are two (different) points on the line. + </para> + + <para> + Lines are output using the first syntax. The points used in the output + are not necessarily the points used on input. + </para> + </sect2> + + <sect2> <title>Line Segments</title> <indexterm> diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 4c5af4b..835a189 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -8070,6 +8070,12 @@ <title>Geometric Type Conversion Functions</title> <entry><literal>circle(polygon '((0,0),(1,1),(2,0))')</literal></entry> </row> <row> + <entry><literal><function>line(<type>point</type>, <type>point</type>)</function></literal></entry> + <entry><type>line</type></entry> + <entry>points to line</entry> + <entry><literal>lseg(point '(-1,0)', point '(1,0)')</literal></entry> + </row> + <row> <entry> <indexterm> <primary>lseg</primary> diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index ad18cf0..61a1900 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -933,13 +933,8 @@Datumline_in(PG_FUNCTION_ARGS){ -#ifdef ENABLE_LINE_TYPE char *str = PG_GETARG_CSTRING(0); -#endif LINE *line; - -#ifdef ENABLE_LINE_TYPE - /* when fixed, modify "not implemented", catalog/pg_type.h and SGML */ LSEG lseg; int isopen; char *s; @@ -950,15 +945,13 @@ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid inputsyntax for type line: \"%s\"", str))); + if (FPeq(lseg.p[0].x, lseg.p[1].x) && FPeq(lseg.p[0].y, lseg.p[1].y)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid line specification: must be two distinct points"))); + line = (LINE *) palloc(sizeof(LINE)); line_construct_pts(line, &lseg.p[0], &lseg.p[1]); -#else - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("type \"line\" not yet implemented"))); - - line = NULL; -#endif PG_RETURN_LINE_P(line);} @@ -967,66 +960,31 @@Datumline_out(PG_FUNCTION_ARGS){ -#ifdef ENABLE_LINE_TYPE LINE *line = PG_GETARG_LINE_P(0); -#endif - char *result; - -#ifdef ENABLE_LINE_TYPE - /* when fixed, modify "not implemented", catalog/pg_type.h and SGML */ LSEG lseg; if (FPzero(line->B)) { /* vertical */ /* use "x = C" */ - result->A = -1; - result->B = 0; - result->C = pt1->x; -#ifdef GEODEBUG - printf("line_out- line is vertical\n"); -#endif -#ifdef NOT_USED - result->m = DBL_MAX; -#endif - + lseg.p[0].x = lseg.p[1].x = line->C/line->A; + lseg.p[0].y = 0; + lseg.p[1].y = 1; } else if (FPzero(line->A)) { /* horizontal */ - /* use "x = C" */ - result->A = 0; - result->B = -1; - result->C = pt1->y; -#ifdef GEODEBUG - printf("line_out- line is horizontal\n"); -#endif -#ifdef NOT_USED - result->m = 0.0; -#endif - + lseg.p[0].x = 0; + lseg.p[1].x = 1; + lseg.p[0].y = lseg.p[1].y = line->C/line->B; } else { + lseg.p[0].x = 0; + lseg.p[0].y = - line->C/line->B; + lseg.p[1].x = 1; + lseg.p[1].y = (-line->C - line->A)/line->B; } - if (FPzero(line->A)) /* horizontal? */ - { - } - else if (FPzero(line->B)) /* vertical? */ - { - } - else - { - } - - return path_encode(TRUE, 2, (Point *) &(ls->p[0])); -#else - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("type \"line\" not yet implemented"))); - result = NULL; -#endif - - PG_RETURN_CSTRING(result); + PG_RETURN_CSTRING(path_encode(FALSE, 2, (Point *) &(lseg.p[0])));}/* @@ -1035,10 +993,16 @@Datumline_recv(PG_FUNCTION_ARGS){ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("type \"line\" not yet implemented"))); - return 0; + StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); + LINE *line; + + line = (LINE *) palloc(sizeof(LINE)); + + line->A = pq_getmsgfloat8(buf); + line->B = pq_getmsgfloat8(buf); + line->C = pq_getmsgfloat8(buf); + + PG_RETURN_LINE_P(line);}/* @@ -1047,10 +1011,14 @@Datumline_send(PG_FUNCTION_ARGS){ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("type \"line\" not yet implemented"))); - return 0; + LINE *line = PG_GETARG_LINE_P(0); + StringInfoData buf; + + pq_begintypsend(&buf); + pq_sendfloat8(&buf, line->A); + pq_sendfloat8(&buf, line->B); + pq_sendfloat8(&buf, line->C); + PG_RETURN_BYTEA_P(pq_endtypsend(&buf));} @@ -3036,6 +3004,7 @@Datumclose_sl(PG_FUNCTION_ARGS){ +#ifdef NOT_USED LSEG *lseg = PG_GETARG_LSEG_P(0); LINE *line = PG_GETARG_LINE_P(1); Point *result; @@ -3054,6 +3023,13 @@ result = point_copy(&lseg->p[1]); PG_RETURN_POINT_P(result); +#endif + + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("function \"close_sl\" not implemented"))); + + PG_RETURN_NULL();}/* close_ls() diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h index e3822fa..2081312 100644 --- a/src/include/catalog/pg_type.h +++ b/src/include/catalog/pg_type.h @@ -393,10 +393,9 @@ DESCR("geometric polygon '(pt1,...)'");#define POLYGONOID 604DATA(insert OID = 628 ( line PGNSP PGUID 32 f b G f t \054 0 701 629 line_in line_out line_recv line_send - - - d p f 0 -1 0 0 _null_ _null_ _null_)); -DESCR("geometric line (not implemented)"); +DESCR("geometric line");#define LINEOID 628DATA(insert OID = 629 ( _line PGNSP PGUID -1 f b A f t \0540 628 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ )); -DESCR("");/* OIDS 700 - 799 */ diff --git a/src/include/utils/geo_decls.h b/src/include/utils/geo_decls.h index 5c83a71..1e648c0 100644 --- a/src/include/utils/geo_decls.h +++ b/src/include/utils/geo_decls.h @@ -88,19 +88,12 @@ typedef struct/*--------------------------------------------------------------------- * LINE - Specifiedby its general equation (Ax+By+C=0). - * If there is a y-intercept, it is C, which - * incidentally gives a freebie point on the line - * (if B=0, then C is the x-intercept). - * Slope m is precalculated to save time; if - * the line is not vertical, m == A. *-------------------------------------------------------------------*/typedefstruct{ double A, B, C; - - double m;} LINE; diff --git a/src/test/regress/expected/geometry.out b/src/test/regress/expected/geometry.out index 8123725..21ad555 100644 --- a/src/test/regress/expected/geometry.out +++ b/src/test/regress/expected/geometry.out @@ -146,9 +146,6 @@ SELECT '' AS thirty, p.f1, l.s, p.f1 ## l.s AS closest(30 rows)-- --- Lines --- ----- Boxes--SELECT '' as six, box(f1) AS box FROM CIRCLE_TBL; diff --git a/src/test/regress/expected/line.out b/src/test/regress/expected/line.out new file mode 100644 index 0000000..39b912a --- /dev/null +++ b/src/test/regress/expected/line.out @@ -0,0 +1,243 @@ +-- +-- LINE +-- Infinite lines +-- +--DROP TABLE LINE_TBL; +CREATE TABLE LINE_TBL (s line); +INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)]'); +INSERT INTO LINE_TBL VALUES ('(0,0),(6,6)'); +INSERT INTO LINE_TBL VALUES ('10,-10 ,-3,-4'); +INSERT INTO LINE_TBL VALUES ('[-1e6,2e2,3e5, -4e1]'); +INSERT INTO LINE_TBL VALUES ('(11,22,33,44)'); +INSERT INTO LINE_TBL VALUES ('[(1,0),(1,0)]'); +ERROR: invalid line specification: must be two distinct points +LINE 1: INSERT INTO LINE_TBL VALUES ('[(1,0),(1,0)]'); + ^ +-- bad values for parser testing +INSERT INTO LINE_TBL VALUES ('(3asdf,2 ,3,4r2)'); +ERROR: invalid input syntax for type line: "(3asdf,2 ,3,4r2)" +LINE 1: INSERT INTO LINE_TBL VALUES ('(3asdf,2 ,3,4r2)'); + ^ +INSERT INTO LINE_TBL VALUES ('[1,2,3, 4'); +ERROR: invalid input syntax for type line: "[1,2,3, 4" +LINE 1: INSERT INTO LINE_TBL VALUES ('[1,2,3, 4'); + ^ +INSERT INTO LINE_TBL VALUES ('[(,2),(3,4)]'); +ERROR: invalid input syntax for type line: "[(,2),(3,4)]" +LINE 1: INSERT INTO LINE_TBL VALUES ('[(,2),(3,4)]'); + ^ +INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)'); +ERROR: invalid input syntax for type line: "[(1,2),(3,4)" +LINE 1: INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)'); + ^ +select * from LINE_TBL; + s +----------------------------------------------- + [(0,1),(1,2)] + [(0,0),(1,1)] + [(0,-5.38461538461538),(1,-5.84615384615385)] + [(0,15.3846153846154),(1,15.3844307692308)] + [(0,11),(1,12)] +(5 rows) + +-- functions and operators +SELECT * FROM LINE_TBL WHERE (s <-> line '[(1,2),(3,4)]') < 10; + s +----------------------------------------------- + [(0,1),(1,2)] + [(0,0),(1,1)] + [(0,-5.38461538461538),(1,-5.84615384615385)] + [(0,15.3846153846154),(1,15.3844307692308)] + [(0,11),(1,12)] +(5 rows) + +SELECT * FROM LINE_TBL WHERE (point '(0.1,0.1)' <-> s) < 1; + s +----------------------------------------------- + [(0,1),(1,2)] + [(0,0),(1,1)] + [(0,-5.38461538461538),(1,-5.84615384615385)] +(3 rows) + +SELECT * FROM LINE_TBL WHERE (lseg '[(0.1,0.1),(0.2,0.2)]' <-> s) < 1; + s +----------------------------------------------- + [(0,1),(1,2)] + [(0,0),(1,1)] + [(0,-5.38461538461538),(1,-5.84615384615385)] +(3 rows) + +SELECT lseg '[(1,1),(5,5)]' ?# line '[(2,0),(0,2)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT lseg '[(1,1),(5,5)]' ?# line '[(0,0),(1,0)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT line '[(0,0),(1,1)]' ?# box '(0,0,2,2)'; -- true + ?column? +---------- + t +(1 row) + +SELECT line '[(3,0),(4,1)]' ?# box '(0,0,2,2)'; -- false + ?column? +---------- + f +(1 row) + +SELECT point '(1,1)' <@ line '[(0,0),(2,2)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT point '(1,1)' <@ line '[(0,0),(1,0)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT point '(1,1)' @ line '[(0,0),(2,2)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT point '(1,1)' @ line '[(0,0),(1,0)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT lseg '[(1,1),(2,2)]' <@ line '[(0,0),(2,2)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT lseg '[(1,1),(2,1)]' <@ line '[(0,0),(1,0)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT lseg '[(1,1),(2,2)]' @ line '[(0,0),(2,2)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT lseg '[(1,1),(2,1)]' @ line '[(0,0),(1,0)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT point '(0,1)' ## line '[(0,0),(1,1)]'; + ?column? +----------- + (0.5,0.5) +(1 row) + +SELECT line '[(0,0),(1,1)]' ## lseg '[(1,0),(2,0)]'; + ?column? +---------- + (1,0) +(1 row) + +SELECT line '[(0,0),(1,1)]' ?# line '[(1,0),(2,1)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT line '[(0,0),(1,1)]' ?# line '[(1,0),(1,1)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT line '[(0,0),(1,1)]' # line '[(1,0),(2,1)]'; + ?column? +---------- + +(1 row) + +SELECT line '[(0,0),(1,1)]' # line '[(1,0),(1,1)]'; + ?column? +---------- + (1,1) +(1 row) + +SELECT line '[(0,0),(1,1)]' ?|| line '[(1,0),(2,1)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT line '[(0,0),(1,1)]' ?|| line '[(1,0),(1,1)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT line '[(0,0),(1,0)]' ?-| line '[(0,0),(0,1)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT line '[(0,0),(1,1)]' ?-| line '[(1,0),(1,1)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT ?- line '[(0,0),(1,0)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT ?- line '[(0,0),(1,1)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT ?| line '[(0,0),(0,1)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT ?| line '[(0,0),(1,1)]'; -- false + ?column? +---------- + f +(1 row) + +SELECT line(point '(1,2)', point '(3,4)'); + line +--------------- + [(0,1),(1,2)] +(1 row) + +SELECT line '[(1,2),(3,4)]' = line '[(3,4),(4,5)]'; -- true + ?column? +---------- + t +(1 row) + +SELECT line '[(1,2),(3,4)]' = line '[(3,4),(4,4)]'; -- false + ?column? +---------- + f +(1 row) + diff --git a/src/test/regress/expected/sanity_check.out b/src/test/regress/expected/sanity_check.out index 432d39a..cee35af 100644 --- a/src/test/regress/expected/sanity_check.out +++ b/src/test/regress/expected/sanity_check.out @@ -64,6 +64,7 @@ SELECT relname, relhasindex interval_tbl | f iportaltest | f kd_point_tbl | t + line_tbl | f log_table | f lseg_tbl | f main_table | f @@ -166,7 +167,7 @@ SELECT relname, relhasindex timetz_tbl | f tinterval_tbl | f varchar_tbl | f -(155 rows) +(156 rows)---- another sanity check: every system catalog that has OIDs should have diff --git a/src/test/regress/output/misc.source b/src/test/regress/output/misc.source index 29cbb22..e194f7e 100644 --- a/src/test/regress/output/misc.source +++ b/src/test/regress/output/misc.source @@ -638,6 +638,7 @@ SELECT user_relns() AS user_relns interval_tbl iportaltest kd_point_tbl + line_tbl log_table lseg_tbl main_table @@ -696,7 +697,7 @@ SELECT user_relns() AS user_relns tvvmv varchar_tbl xacttest -(118 rows) +(119 rows)SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); name diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 2af28b1..cbedeb5 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -23,7 +23,7 @@ test: numerology# ----------# The second group of parallel tests# ---------- -test: point lseg box path polygon circle date time timetz timestamp timestamptz interval abstime reltime tinterval inetmacaddr tstypes comments +test: point lseg line box path polygon circle date time timetz timestamp timestamptz interval abstime reltime tintervalinet macaddr tstypes comments# ----------# Another group of parallel tests diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index d6eaa7a..5b86ede 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -23,6 +23,7 @@ test: stringstest: numerologytest: pointtest: lseg +test: linetest: boxtest: pathtest: polygon diff --git a/src/test/regress/sql/geometry.sql b/src/test/regress/sql/geometry.sql index 73f8032..af7f8a5 100644 --- a/src/test/regress/sql/geometry.sql +++ b/src/test/regress/sql/geometry.sql @@ -59,10 +59,6 @@ FROM LSEG_TBL l, POINT_TBL p;-- --- Lines --- - ----- Boxes-- diff --git a/src/test/regress/sql/line.sql b/src/test/regress/sql/line.sql new file mode 100644 index 0000000..25e680d --- /dev/null +++ b/src/test/regress/sql/line.sql @@ -0,0 +1,77 @@ +-- +-- LINE +-- Infinite lines +-- + +--DROP TABLE LINE_TBL; +CREATE TABLE LINE_TBL (s line); + +INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)]'); +INSERT INTO LINE_TBL VALUES ('(0,0),(6,6)'); +INSERT INTO LINE_TBL VALUES ('10,-10 ,-3,-4'); +INSERT INTO LINE_TBL VALUES ('[-1e6,2e2,3e5, -4e1]'); +INSERT INTO LINE_TBL VALUES ('(11,22,33,44)'); + +INSERT INTO LINE_TBL VALUES ('[(1,0),(1,0)]'); + +-- bad values for parser testing +INSERT INTO LINE_TBL VALUES ('(3asdf,2 ,3,4r2)'); +INSERT INTO LINE_TBL VALUES ('[1,2,3, 4'); +INSERT INTO LINE_TBL VALUES ('[(,2),(3,4)]'); +INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)'); + +select * from LINE_TBL; + + +-- functions and operators + +SELECT * FROM LINE_TBL WHERE (s <-> line '[(1,2),(3,4)]') < 10; + +SELECT * FROM LINE_TBL WHERE (point '(0.1,0.1)' <-> s) < 1; + +SELECT * FROM LINE_TBL WHERE (lseg '[(0.1,0.1),(0.2,0.2)]' <-> s) < 1; + +SELECT lseg '[(1,1),(5,5)]' ?# line '[(2,0),(0,2)]'; -- true +SELECT lseg '[(1,1),(5,5)]' ?# line '[(0,0),(1,0)]'; -- false + +SELECT line '[(0,0),(1,1)]' ?# box '(0,0,2,2)'; -- true +SELECT line '[(3,0),(4,1)]' ?# box '(0,0,2,2)'; -- false + +SELECT point '(1,1)' <@ line '[(0,0),(2,2)]'; -- true +SELECT point '(1,1)' <@ line '[(0,0),(1,0)]'; -- false + +SELECT point '(1,1)' @ line '[(0,0),(2,2)]'; -- true +SELECT point '(1,1)' @ line '[(0,0),(1,0)]'; -- false + +SELECT lseg '[(1,1),(2,2)]' <@ line '[(0,0),(2,2)]'; -- true +SELECT lseg '[(1,1),(2,1)]' <@ line '[(0,0),(1,0)]'; -- false + +SELECT lseg '[(1,1),(2,2)]' @ line '[(0,0),(2,2)]'; -- true +SELECT lseg '[(1,1),(2,1)]' @ line '[(0,0),(1,0)]'; -- false + +SELECT point '(0,1)' ## line '[(0,0),(1,1)]'; + +SELECT line '[(0,0),(1,1)]' ## lseg '[(1,0),(2,0)]'; + +SELECT line '[(0,0),(1,1)]' ?# line '[(1,0),(2,1)]'; -- false +SELECT line '[(0,0),(1,1)]' ?# line '[(1,0),(1,1)]'; -- true + +SELECT line '[(0,0),(1,1)]' # line '[(1,0),(2,1)]'; +SELECT line '[(0,0),(1,1)]' # line '[(1,0),(1,1)]'; + +SELECT line '[(0,0),(1,1)]' ?|| line '[(1,0),(2,1)]'; -- true +SELECT line '[(0,0),(1,1)]' ?|| line '[(1,0),(1,1)]'; -- false + +SELECT line '[(0,0),(1,0)]' ?-| line '[(0,0),(0,1)]'; -- true +SELECT line '[(0,0),(1,1)]' ?-| line '[(1,0),(1,1)]'; -- false + +SELECT ?- line '[(0,0),(1,0)]'; -- true +SELECT ?- line '[(0,0),(1,1)]'; -- false + +SELECT ?| line '[(0,0),(0,1)]'; -- true +SELECT ?| line '[(0,0),(1,1)]'; -- false + +SELECT line(point '(1,2)', point '(3,4)'); + +SELECT line '[(1,2),(3,4)]' = line '[(3,4),(4,5)]'; -- true +SELECT line '[(1,2),(3,4)]' = line '[(3,4),(4,4)]'; -- false -- 1.7.10.4
pgsql-hackers by date: