On Wed, Dec 1, 2021 at 12:21 PM Jenda Krynicky <je...@krynicky.cz> wrote:
> > CREATE OR REPLACE FUNCTION public.findorcreatelocker( > lockeruuid text, > ipaddress text) > RETURNS TABLE("Id" integer, "Created" timestamp without time > zone, "Uuid" text, "State" integer, "ConnectionStatus" integer, > "LastConnected" timestamp without time zone, "DoorColumns" bytea, > "IpAddress" text, "LastReportCreated" timestamp without time zone) > > > INSERT INTO "Lockers" ("Uuid", "IpAddress", "State", > "DoorColumns", "ConnectionStatus", "LastConnected", "LastReportId", > "LongOpenedDoors", "Created", "Updated") > VALUES (lockerUuid, ipAddress, 0/*new*/, null, > 0/*connected*/, current, null, null, current, current) > ON CONFLICT ("Uuid") > DO NOTHING; > end if; > > How the (censored) am I supposed to write the ON CONFLICT () clause > so that it works? > > Like this it reports: > > ERROR: column reference "Uuid" is ambiguous > LINE 3: ON CONFLICT ("Uuid") > ^ > DETAIL: It could refer to either a PL/pgSQL variable or a table > column. > > > THERE IS NO (CENSORED) VARIABLE "Uuid"! > Yes, there is. RETURNS TABLE (... "Uuid" text ... ) Changing that to something else should remove the ambiguity. I agree it is not an ideal solution though. I'm not sure what other options exist though. > If I drop the quotes and use just > ON CONFLICT (Uuid) > I get > > ERROR: column "uuid" does not exist > LINE 3: ON CONFLICT (Uuid) > ^ > HINT: Perhaps you meant to reference the column "Lockers.Uuid". > > Yes, thank you, that's exactly what I meant. That's what I wrote too, > you (censored). I didn't write uuid, I wrote Uuid, you imbecile! > This one is on you for removing the double quotes that your choice of identifier names forces you to basically put everywhere. > If I try to include the table name as ON CONFLICT (Lockers.Uuid) or Even if you didn't get a syntax error that isn't the name of your column... > ON CONFLICT ("Lockers"."Uuid"), I get a syntax error. > This is the one that should work so if its giving a syntax error it is the one worth questioning. > If I specify it as > ON CONFLICT ("Lockers.Uuid") > I get quite understandably > ERROR: column "Lockers.Uuid" does not exist > LINE 3: ON CONFLICT ("Lockers.Uuid") > > Yes, the double quotes in the earlier "Perhaps you meant" error message are a readability thing, not a "write this instead" thing. David J.