44 * procedural language
55 *
66 * IDENTIFICATION
7- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.15 2001/02/10 22:53:40 momjian Exp $
7+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.16 2001/02/19 19:49:53 tgl Exp $
88 *
99 * This software is copyrighted by Jan Wieck - Hamburg.
1010 *
@@ -63,7 +63,13 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row);
6363 {
6464 int nalloc;
6565 int nused;
66- int *dtnums;
66+ int *nums;
67+ } intlist;
68+ struct
69+ {
70+ int nalloc;
71+ int nused;
72+ PLpgSQL_diag_item *dtitems;
6773 } dtlist;
6874 struct
6975 {
@@ -119,11 +125,11 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row);
119125%type <stmt> stmt_fors , stmt_select , stmt_perform
120126%type <stmt> stmt_dynexecute , stmt_dynfors , stmt_getdiag
121127
122- %type <dtlist > raise_params
128+ %type <intlist > raise_params
123129%type <ival> raise_level , raise_param
124130%type <str> raise_msg
125131
126- %type <dtlist> getdiag_items , getdiag_targets
132+ %type <dtlist> getdiag_list
127133%type <ival> getdiag_item , getdiag_target
128134
129135%type <ival> lno
@@ -156,11 +162,11 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row);
156162%token K_NOTICE
157163%token K_NULL
158164%token K_PERFORM
159- %token K_PROCESSED
165+ %token K_ROW_COUNT
160166%token K_RAISE
161167%token K_RECORD
162168%token K_RENAME
163- %token K_RESULT
169+ %token K_RESULT_OID
164170%token K_RETURN
165171%token K_REVERSE
166172%token K_SELECT
@@ -607,7 +613,7 @@ stmt_assign : assign_var lno K_ASSIGN expr_until_semi
607613 }
608614 ;
609615
610- stmt_getdiag : K_GET K_DIAGNOSTICS lno K_SELECT getdiag_items K_INTO getdiag_targets ' ;'
616+ stmt_getdiag : K_GET K_DIAGNOSTICS lno getdiag_list ' ;'
611617 {
612618 PLpgSQL_stmt_getdiag *new ;
613619
@@ -616,80 +622,50 @@ stmt_getdiag : K_GET K_DIAGNOSTICS lno K_SELECT getdiag_items K_INTO getdiag_tar
616622
617623 new ->cmd_type = PLPGSQL_STMT_GETDIAG;
618624 new ->lineno = $3 ;
619- new ->nitems = $5 .nused;
620- new ->items = malloc(sizeof (int ) * $5 .nused);
621- new ->ntargets = $7 .nused;
622- new ->targets = malloc(sizeof (int ) * $7 .nused);
623- memcpy (new ->items, $5 .dtnums, sizeof (int ) * $5.nused);
624- memcpy (new ->targets, $7 .dtnums, sizeof (int ) * $7.nused);
625-
626- if (new ->nitems != new ->ntargets)
627- {
628- plpgsql_error_lineno = new ->lineno;
629- plpgsql_comperrinfo ();
630- elog (ERROR, " number of diagnostic items does not match target list" );
631- };
625+ new ->ndtitems = $4 .nused;
626+ new ->dtitems = malloc(sizeof (PLpgSQL_diag_item) * $4 .nused);
627+ memcpy (new ->dtitems, $4 .dtitems, sizeof (PLpgSQL_diag_item) * $4.nused);
632628
633629 $$ = (PLpgSQL_stmt *)new ;
634630 }
635631 ;
636632
637- getdiag_items : getdiag_items ' ,' getdiag_item
633+ getdiag_list : getdiag_list ' ,' getdiag_target K_ASSIGN getdiag_item
638634 {
639635 if ($1 .nused == $1 .nalloc)
640636 {
641637 $1 .nalloc *= 2 ;
642- $1 .dtnums = repalloc($1 .dtnums , sizeof (int ) * $1 .nalloc);
638+ $1 .dtitems = repalloc($1 .dtitems , sizeof (PLpgSQL_diag_item ) * $1 .nalloc);
643639 }
644- $1 .dtnums[$1 .nused++] = $3 ;
640+ $1 .dtitems[$1 .nused].target = $3 ;
641+ $1 .dtitems[$1 .nused].item = $5 ;
642+ $1 .nused++;
645643
646644 $$ .nalloc = $1 .nalloc;
647645 $$ .nused = $1 .nused;
648- $$ .dtnums = $1 .dtnums ;
646+ $$ .dtitems = $1 .dtitems ;
649647 }
650- | getdiag_item
648+ | getdiag_target K_ASSIGN getdiag_item
651649 {
652650 $$ .nalloc = 1 ;
653651 $$ .nused = 1 ;
654- $$ .dtnums = palloc(sizeof (int ) * $$ .nalloc);
655- $$ .dtnums[0 ] = $1 ;
656- }
657- ;
658-
659- getdiag_item : K_PROCESSED
660- {
661- $$ = PLPGSQL_GETDIAG_PROCESSED;
662- }
663- | K_RESULT
664- {
665- $$ = PLPGSQL_GETDIAG_RESULT;
652+ $$ .dtitems = palloc(sizeof (PLpgSQL_diag_item) * $$ .nalloc);
653+ $$ .dtitems[0 ].target = $1 ;
654+ $$ .dtitems[0 ].item = $3 ;
666655 }
667656 ;
668657
669- getdiag_targets : getdiag_targets ' , ' getdiag_target
658+ getdiag_item : K_ROW_COUNT
670659 {
671- if ($1 .nused == $1 .nalloc)
672- {
673- $1 .nalloc *= 2 ;
674- $1 .dtnums = repalloc($1 .dtnums, sizeof (int ) * $1 .nalloc);
675- }
676- $1 .dtnums[$1 .nused++] = $3 ;
677-
678- $$ .nalloc = $1 .nalloc;
679- $$ .nused = $1 .nused;
680- $$ .dtnums = $1 .dtnums;
660+ $$ = PLPGSQL_GETDIAG_ROW_COUNT;
681661 }
682- | getdiag_target
662+ | K_RESULT_OID
683663 {
684- $$ .nalloc = 1 ;
685- $$ .nused = 1 ;
686- $$ .dtnums = palloc(sizeof (int ) * $$ .nalloc);
687- $$ .dtnums[0 ] = $1 ;
664+ $$ = PLPGSQL_GETDIAG_RESULT_OID;
688665 }
689666 ;
690667
691-
692- getdiag_target : T_VARIABLE
668+ getdiag_target : T_VARIABLE
693669 {
694670 if (yylval.var->isconst)
695671 {
@@ -1070,7 +1046,7 @@ stmt_raise : K_RAISE lno raise_level raise_msg raise_params ';'
10701046 new ->message = $4 ;
10711047 new ->nparams = $5 .nused;
10721048 new ->params = malloc(sizeof (int ) * $5 .nused);
1073- memcpy (new ->params, $5 .dtnums , sizeof (int ) * $5.nused);
1049+ memcpy (new ->params, $5 .nums , sizeof (int ) * $5.nused);
10741050
10751051 $$ = (PLpgSQL_stmt *)new ;
10761052 }
@@ -1116,20 +1092,20 @@ raise_params : raise_params raise_param
11161092 if ($1 .nused == $1 .nalloc)
11171093 {
11181094 $1 .nalloc *= 2 ;
1119- $1 .dtnums = repalloc($1 .dtnums , sizeof (int ) * $1 .nalloc);
1095+ $1 .nums = repalloc($1 .nums , sizeof (int ) * $1 .nalloc);
11201096 }
1121- $1 .dtnums [$1 .nused++] = $2 ;
1097+ $1 .nums [$1 .nused++] = $2 ;
11221098
11231099 $$ .nalloc = $1 .nalloc;
11241100 $$ .nused = $1 .nused;
1125- $$ .dtnums = $1 .dtnums ;
1101+ $$ .nums = $1 .nums ;
11261102 }
11271103 | raise_param
11281104 {
11291105 $$ .nalloc = 1 ;
11301106 $$ .nused = 1 ;
1131- $$ .dtnums = palloc(sizeof (int ) * $$ .nalloc);
1132- $$ .dtnums [0 ] = $1 ;
1107+ $$ .nums = palloc(sizeof (int ) * $$ .nalloc);
1108+ $$ .nums [0 ] = $1 ;
11331109 }
11341110 ;
11351111
0 commit comments