Skip to content
Advertisement

Why does Postgresql function not work as expected

I have table like this

 id|    booking_id       |       status         |         message             |          created_at
 ----------------------------------------------------------------------------------------------------------
 1 | 1467                | VALIDATE             | Validate Payment            | 2022-03-18 07:43:20.688+00
 2 | 1901                | SUCCESS              |                             | 2022-03-18 07:51:58.072+00
 3 | 1847                | FAILED               | payment is insufficient     | 2022-03-18 08:16:05.79+00


I create get function like this

CREATE OR REPLACE FUNCTION get_booking_status(booking_id BIGINT)
  RETURNS JSONB
  LANGUAGE SQL
  SECURITY DEFINER
AS $$
SELECT to_jsonb(result)
FROM (SELECT * FROM booking.booking_status WHERE booking.booking_status.booking_id = booking_id) AS result
$$;

I tried to call function like this

SELECT get_booking_status(1467)

but return json all 3 row instead of 1 row with booking_id 1467

can you explain root cause ?

Advertisement

Answer

The root cause of you problem is naming your parameter (booking_id) the same as a column name (booking_id) in your table. When processing a query any unqualified reference follows a hierarchy to determine the correct reference; the first being the table column. In this case where booking.booking_status.booking_id = booking_id both references to booking_id are interpreted as referring to the table column. Which is true for every row in the table. You have basically 2 choices: change the parameter name or qualify with the function name.

CREATE OR REPLACE FUNCTION get_booking_status(booking_id BIGINT)
  RETURNS JSONB
  LANGUAGE SQL
  SECURITY DEFINER
AS $$
SELECT to_jsonb(result)
  FROM (SELECT * 
          FROM booking.booking_status 
         WHERE booking.booking_status.booking_id 
             = get_booking_status.booking_id) AS result
$$;

Also see comments from @a_horse_with_no_name and @AdrianKlaver above.

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement