Re: [HACKERS] PL/pgSQL - for discussion - Mailing list pgsql-hackers

From Vadim B. Mikheev
Subject Re: [HACKERS] PL/pgSQL - for discussion
Date
Msg-id 3508B8A6.7AC24FEA@sable.krasnoyarsk.su
Whole thread Raw
In response to PL/pgSQL - for discussion  (jwieck@debis.com (Jan Wieck))
Responses Re: [HACKERS] PL/pgSQL - for discussion
List pgsql-hackers
Jan Wieck wrote:
>
> Hi,
>
>     as  I  proposed,  I'm  now  starting on the PL/pgSQL loadable
>     procedural language. As far as I'm now I  have  a  pl_handler
>     with  an  independent  flex/bison  parser  that  can  parse a
>     rudimentary implementation of the language. The next step  is
>     to  start  on the PL/pgSQL executor and look if the generated
>     instruction tree can be used (up to now the  pl_handler  only
>     dumps the instruction tree and returns a 0 Datum.
>
>     If  that  works  I'll  expand  the scanner/parser to the full
>     PL/plSQL language including trigger procedures.

Why PL/pgSQL should be loadable PL? Why not built-in ?
Would it be possible to add dirrect support for PL/pgSQL syntax
to current parser ?
Typing procedure body inside ' is not nice thing, imho.

>     Someone gave a hint about global variables existing during  a
>     session.   What  is  a  session  than?  One  transaction? The
>     backends lifetime?  And should global variables be visible by
      ^^^^^^^^^^^^^^^^^
This.

>     more  than one function?  I vote for NO! In that case we need
>     something like packages of functions that share globals.

Let's leave packages for future, but why session-level variables
shouldn't be visible inside procedures right now?

>
>         PL/pgSQL is a block oriented language. A block is defined as
>
>             [<<label>>]
>             [DECLARE
>                 -- declarations]
>             BEGIN
>                 -- statements
>             END;

Someday we'll have nested transactions...
How about disallow using BEGIN/END as transaction control statements
right now ?
START/COMMIT/ROLLBACK/ABORT and nothing more...

>             <name> <class>%ROWTYPE;
>
>                 Declares a row with the structure of the given class.
>                 Class must be an existing table- or viewname  of  the
>                 database.  The  fields of the row are accessed in the
>                 dot notation. Parameters  to  a  procedure  could  be
>                 tuple   types.   In   that   case  the  corresponding
>                 identifier $n  will  be  a  rowtype.  Only  the  user
>                 attributes  and  the oid of a tuple are accessible in
>                 the row. There must be  no  whitespaces  between  the
>                 classname, the percent and the ROWTYPE keyword.
>
>             <name> RECORD;
>
>                 Records  are  similar  to  rowtypes, but they have no
>                 predefined structure and it's impossible to assign  a
>                 value  into them. They are used in selections and FOR
>                 loops to hold one actual database tuple from a select
>                 operation.  One  and  the  same record can be used in
>                 different selections (but not in nested ones).

Do we really need in both ROWTYPE & RECORD ?
I would get rid of RECORD and let ROWTYPE variables be
'with yet undefined type of row' (make <class> optional). More of that,
why not treat ROWTYPE like structures in C and let the following:

name %ROWTYPE {a    int4, b text};

?

>                 SELECT * INTO myrec FROM EMP WHERE empname = myname;
                                ^^^^^                          ^^^^^^
How about $-prefix ?

>             As indicated above there is an ELOG  statement  that  can
>             throw messages into the PostgreSQL elog mechanism.
>
>                 ELOG level 'format' [identifiers];
                  ^^^^^^^^^^
NO, pls - too postgres-ish! Just let ABORT to have 'format' etc and add
PRINT (or something like this) to put some messages to application (via NOTICE).
What are used in Oracle, Sybase etc here ?

Vadim

pgsql-hackers by date:

Previous
From: Michael Graff
Date:
Subject: RVM -- recoverable virtual memory
Next
From: Brett McCormick
Date:
Subject: casting & type comments