<div dir="ltr"><div dir="auto"><div dir="ltr"><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">Greetings All,</div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">Firstly, apologies for cross posting. </div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif" dir="auto">I would like to create a table which will contain postGIS geometries, specifically linestrings.  Each line string should be unique, unique in the sense that no linestring should st_equals any other. (see <a href="https://postgis.net/docs/manual-3.1/ST_Equals.html">https://postgis.net/docs/manual-3.1/ST_Equals.html</a>)</div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif" dir="auto"><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">So, LINESTRING(10 10, 50 50) and LINESTRING(50 50, 10 10) are "st_equal".</div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"> I did the following:<br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">BEGIN; <br><br>DROP OPERATOR IF EXISTS |*| (geometry, geometry) CASCADE;<br><br>CREATE OPERATOR |*| (<br>       FUNCTION = st_equals,<br> LEFTARG = geometry,<br>   RIGHTARG = geometry,<br>  COMMUTATOR = |*|<br>      );<br><br>CREATE OPERATOR CLASS my_ops FOR TYPE geometry<br>  USING gist FAMILY gist_geometry_ops_2d AS<br>     OPERATOR 99 |*| (geometry, geometry);<br><br>-- This returns True<br>SELECT  'LINESTRING(10 10, 50 50)'::geometry |*| 'LINESTRING(50 50, 10 10)'::geometry;<br><br>DROP TABLE IF EXISTS test_1 ;<br>CREATE TABLE test_1 (<br>        fid integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY,<br> g geometry,<br>   EXCLUDE USING GIST (g WITH |*|)<br>);<br><br>INSERT INTO test_1 (g) VALUES ('LINESTRING(10 10, 50 50)') ON CONFLICT DO NOTHING;<br>INSERT INTO test_1 (g) VALUES ('LINESTRING(50 50, 10 10)') ON CONFLICT DO NOTHING; -- This should do nothing; <br><br>SELECT fid, st_astext(g) FROM test_1; -- both rows returned, exclusion doesn't work as I think it should.<br><br>ROLLBACK;</div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">But where I expected the second insert to 'DO NOTHING', it very much did something. So clearly I am missing something somewhere or my understanding of exclusion constraints is lacking...or both.  Any suggestions to get the desired outcome? (Using a trigger doesn't count :-D )<br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">But <br clear="all"></div><div><div dir="ltr" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>Rhys</div>Peace & Love | Live Long & Prosper</div></div></div></div></div></div></div>
</div>