]> granicus.if.org Git - postgresql/commitdiff
the following little patch adds array references to query
authorBruce Momjian <bruce@momjian.us>
Fri, 2 Oct 1998 16:23:07 +0000 (16:23 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 2 Oct 1998 16:23:07 +0000 (16:23 +0000)
    parameters. With it applied a function like

    CREATE FUNCTION getname(oid8, int4) RETURNS name AS
        'SELECT typname FROM pg_type WHERE oid = $1[$2]'
        LANGUAGE 'sql';

    is possible. Mainly I need this to enable array references in
    expressions for PL/pgSQL. Complete regression test ran O.K.

Jan

src/backend/parser/gram.y
src/backend/parser/parse_expr.c
src/include/nodes/parsenodes.h

index 4d3ccc03d1ed760c411e7441067595d4ebba7911..05366b6cbf329e431f311957d550fa2afbee1709 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.33 1998/09/30 05:47:56 thomas Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.34 1998/10/02 16:23:04 momjian Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -4598,10 +4598,11 @@ AexprConst:  Iconst
                                }
                ;
 
-ParamNo:  PARAM
+ParamNo:  PARAM opt_indirection
                                {
                                        $$ = makeNode(ParamNo);
                                        $$->number = $1;
+                                       $$->indirection = $2;
                                }
                ;
 
index 6bb923afce027feb2b36796373b1229af52d10b4..0c2a40a190a4e227c2e5823b04ed264c5471dc0c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.35 1998/10/01 22:51:20 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.36 1998/10/02 16:23:05 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -122,7 +122,39 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
                                param->paramtype = (Oid) toid;
                                param->param_tlist = (List *) NULL;
 
-                               result = (Node *) param;
+                               if (pno->indirection != NIL)
+                               {
+                                       List       *idx = pno->indirection;
+
+                                       while (idx != NIL)
+                                       {
+                                               A_Indices  *ai = (A_Indices *) lfirst(idx);
+                                               Node       *lexpr = NULL,
+                                                                  *uexpr;
+
+                                               uexpr = transformExpr(pstate, ai->uidx, precedence);    /* must exists */
+                                               if (exprType(uexpr) != INT4OID)
+                                                       elog(ERROR, "array index expressions must be int4's");
+                                               if (ai->lidx != NULL)
+                                               {
+                                                       lexpr = transformExpr(pstate, ai->lidx, precedence);
+                                                       if (exprType(lexpr) != INT4OID)
+                                                               elog(ERROR, "array index expressions must be int4's");
+                                               }
+                                               ai->lidx = lexpr;
+                                               ai->uidx = uexpr;
+
+                                               /*
+                                                * note we reuse the list of indices, make sure we
+                                                * don't free them! Otherwise, make a new list
+                                                * here
+                                                */
+                                               idx = lnext(idx);
+                                       }
+                                       result = (Node *) make_array_ref((Node *)param, pno->indirection);
+                               }
+                               else
+                                       result = (Node *) param;
                                break;
                        }
                case T_A_Expr:
index 26bdc420dd8db83a59ea27bad9bce57c2e9a1ca0..0608c3101f2eec8c3e311687a0229a8c28355426 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parsenodes.h,v 1.59 1998/09/01 04:36:43 momjian Exp $
+ * $Id: parsenodes.h,v 1.60 1998/10/02 16:23:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -667,6 +667,7 @@ typedef struct ParamNo
        NodeTag         type;
        int                     number;                 /* the number of the parameter */
        TypeName   *typename;           /* the typecast */
+       List       *indirection;        /* array references */
 } ParamNo;
 
 /*