I have this table with two autogenerated columns:
CREATE TABLE driver_orders
(
id SERIAL PRIMARY KEY,
car_id INTEGER NOT NULL,
location_from GEOGRAPHY -- generated
GENERATED ALWAYS AS
(create_point_geography(start_point)) stored,
location_to GEOGRAPHY -- generated
GENERATED ALWAYS AS
(create_point_geography(end_point)) stored
);
I am writing a postgres function that inserts a new row then returns id, location_from and location_to. I am following the answers to this question
Here is what I have come up with (unrelated parts removed):
CREATE OR REPLACE FUNCTION create_driver_order(
car_id INTEGER,
s_point VARCHAR,
e_point VARCHAR
)
RETURNS TABLE (
id INTEGER,
location_from GEOGRAPHY,
location_to GEOGRAPHY
)
LANGUAGE plpgsql
AS $$
DECLARE
active_order_count INTEGER;
BEGIN
-- 1. count active orders
-- ... omitted unrelated parts
-- 2. check if active orders are less than two
-- ... omitted unrelated parts
-- 4. create order
RETURN QUERY INSERT INTO driver_orders (
car_id,
start_point,
end_point
) VALUES (
car_id,
s_point,
e_point
) RETURNING id, location_from, location_to;
END;
$$
Function is created successfully. But when I call it:
select * from create_driver_order(
889,
'(5581326278118 29.220418907676738)'::VARCHAR,
'(5581326274318 29.220548907676738)'::VARCHAR
)
I get this error:
column reference "id" is ambiguous
Can someone point out what I am doing wrong?
When using
returns tablethe columns of that output table are defined in the scope of your function body, so your use ofreturning id, location_from, location_tocould either refer to columns of the output record, or to columns of the table you're inserting to, or even something else. Just specify which one you want, explicitly. Demo: