Skip site navigation (1) Skip section navigation (2)

WIP: CASE statement for PL/pgSQL

From: "Pavel Stehule" <pavel(dot)stehule(at)gmail(dot)com>
To: "PG Hackers" <pgsql-hackers(at)postgresql(dot)org>
Subject: WIP: CASE statement for PL/pgSQL
Date: 2008-03-31 12:48:28
Message-ID: 162867790803310548k2b18aaa4p849df1d780158256@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-hackerspgsql-patches
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: case.diff
Description: text/x-patch (16.1 KB)

Responses

pgsql-hackers by date

Next:From: PFCDate: 2008-03-31 13:07:54
Subject: Re: first time hacker ;) messing with prepared statements
Previous:From: Pavan DeolaseeDate: 2008-03-31 12:34:26
Subject: Re: ANALYZE getting dead tuple count hopelessly wrong

pgsql-patches by date

Next:From: Heikki LinnakangasDate: 2008-03-31 12:57:31
Subject: Re: BUG #4070: Join more then ~15 tables let postgreSQL produces wrong data
Previous:From: Marcello CeschiaDate: 2008-03-31 12:26:54
Subject: BUG #4070: Join more then ~15 tables let postgreSQL produces wrong data

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group