Fwd: WIP: CASE statement for PL/pgSQL - Mailing list pgsql-patches

From Pavel Stehule
Subject Fwd: WIP: CASE statement for PL/pgSQL
Date
Msg-id 162867790803310833s43dad00eo6f1c509ca5fea61d@mail.gmail.com
Whole thread Raw
Responses Re: Fwd: WIP: CASE statement for PL/pgSQL  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-patches
correct queue

Hello

 I finished this patch.

 Proposal: http://archives.postgresql.org/pgsql-hackers/2008-01/msg00696.php

 It's compatible with PL/SQL (Oracle) and SQL/PSM (ANSI).

 CASE statements is parsed and transformed to CASE expression and
 statements paths. Result of CASE expression is used as index to array
 of statements paths. It's fast but I have to once time reparse SQL
 queries - it generate about 150 lines code, because I need to get all
 parameter's positions. It's one disadvantage. On second hand, this
 statement needs only one expression evaluation.

 Sample:

 CREATE OR REPLACE FUNCTION foo(int)
 RETURNS void AS $$
 BEGIN
  CASE $1
      WHEN 1,2,3 THEN
         RAISE NOTICE '1,2';
         RAISE NOTICE '3';
      WHEN 4 THEN
         RAISE NOTICE '4';
      ELSE
         RAISE NOTICE 'other than 1,2,3,4';
  END CASE;
  RETURN;
 END;
 $$ LANGUAGE plpgsql;

 This statement is transformated to:
 three statement paths:
 [0]
         RAISE NOTICE 'other than 1,2,3,4';
 [1]
         RAISE NOTICE '1,2';
         RAISE NOTICE '3';
 [2]
         RAISE NOTICE '4';

 and case expression
 CASE $1
  WHEN 1 THEN 1
  WHEN 2 THEN 1
  WHEN 3 THEN 1
  WHEN 4 THEN 2
 END;

 When result is NULL then it uses 0 path.

 Questions:
 a) is possible to use SQL scanner? Now, scanner isn't directly used everywhere.

 any notes and comments are welcome

 Regards

Pavel Stehule

Attachment

pgsql-patches by date:

Previous
From: "Brendan Jurd"
Date:
Subject: Re: Consistent \d commands in psql
Next
From: Gregory Stark
Date:
Subject: Re: Consistent \d commands in psql