<div dir="ltr"><div class="gmail_default"><div class="gmail_default"><font face="trebuchet ms, sans-serif">Greetings all,</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">I maintain a medium size table of customer locations, which, for business purposes now needs to not have any coincident points. Table definition follows:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">service.location</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">(</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  premises text NOT NULL,</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  matchtype text,</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  matchdate date,</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  connectedtransformer text,</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  g geometry(Point,3448),</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  CONSTRAINT servicelocation_pkey PRIMARY KEY (premises),</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  CONSTRAINT servicelocation_premisesnumber_check CHECK (char_length(premises) = 6 OR char_length(premises) = 7),</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">  CONSTRAINT servicelocation_premisesnumber_is_a_number_check CHECK (premises !~* '[A-z]+'::text)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">There are approximately 866k rows, and a gist index on g. I update the table so that no geometries are coincident ( see <a href="https://gist.github.com/rhysallister/bcb4bb07a99d69938fff88f150883bee">https://gist.github.com/rhysallister/bcb4bb07a99d69938fff88f150883bee</a> for the sql to remove the coincident geoms) I ran the sql in the gist until it said 0 rows affected.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">To prevent one from inserting or updating a coincident geometry I try to create a unique index on g. Since gist doesn't support unique indices I do:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">CREATE unique INDEX unique_g ON service.location (st_astext(g) );</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">---------------------------------------------------------------------</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">ERROR:  could not create unique index "unique_g"</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">DETAIL:  Key (st_astext(g))=(POINT(727895.4 663599.3)) is duplicated.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">This makes me slightly flummoxed. I'm pretty sure the query in the gist returned 0 affected rows. But, maybe I missed a step. I try to find the offending rows with:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">select premises, st_astext(g), g from service.location </font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">where st_equals(g, 'SRID=3448;POINT(727895.4 663599.3)'::geometry)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">---------------------------------------------------------------------</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">premises<span class="Apple-tab-span" style="white-space:pre">   </span>st_astext<span class="Apple-tab-span" style="white-space:pre">   </span>g</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">267077<span class="Apple-tab-span" style="white-space:pre">   </span>POINT(727895.4 663599.3)<span class="Apple-tab-span" style="white-space:pre">    </span>0101000020780D0000CDCCCCCCAE3626419A9999995E402441</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Strange. I now move to being slightly perturbed. I'm very sure the previous error message made mention of duplicity. I then run </font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">select premises, st_astext(g), g from service.location </font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">where st_astext(g) = 'POINT(727895.4 663599.3)'</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">---------------------------------------------------------------------</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">premises<span class="Apple-tab-span" style="white-space:pre">     </span>st_astext<span class="Apple-tab-span" style="white-space:pre">   </span>g</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">267077<span class="Apple-tab-span" style="white-space:pre">   </span>POINT(727895.4 663599.3)<span class="Apple-tab-span" style="white-space:pre">    </span>0101000020780D0000CDCCCCCCAE3626419A9999995E402441</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">267053<span class="Apple-tab-span" style="white-space:pre">  </span>POINT(727895.4 663599.3)<span class="Apple-tab-span" style="white-space:pre">    </span>0101000020780D0000CDCCCCCCAE362641999999995E402441</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">=====================================================================</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Now I'm just confused, the 2 premises have the same st_astext, but different wkb representations and as such are not being caught in the st_equals call.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Is there some gotcha that I don't know about, maybe something in the docs that I missed or is this not supposed to happen?</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Rhys</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Peace & Love|Live Long & Prosper</font></div></div>
</div>