Re: TODO question

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Pavlo Baron <pb(at)pbit(dot)org>
Cc: PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: TODO question
Date: 2002-03-08 01:03:52
Message-ID: 200203080103.g2813qA25085@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Double-oops. There is a later one under a different email subject
called TODO questino that is a context diff. I just need to know if
this is the newest version and if anyone doesn't like it.

This adds DEFAULT functionality to the INSERT values list.

> oops, a new patch attached: the last one wouldn't compile because of missing
> T_Default value I just forgot to diff-in (or out) - sorry
>
> rgds
> Pavlo Baron
>
>
> Index: src/backend/parser/parse_target.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/parser/parse_target.c,v
> retrieving revision 1.76
> diff -c -r1.76 parse_target.c
> *** src/backend/parser/parse_target.c 2001/11/05 17:46:26 1.76
> --- src/backend/parser/parse_target.c 2001/12/28 23:13:43
> ***************
> *** 60,65 ****
> --- 60,77 ----
> if (IsA(expr, Ident) &&((Ident *) expr)->isRel)
> elog(ERROR, "You can't use relation names alone in the target list, try
> relation.*.");
>
> + /* pavlo (pb(at)pbit(dot)org: 2001-12-27: handle the DEFAULT in INSERT
> INTO foo VALUES (..., DEFAULT, ...))*/
> + if (IsA(expr, Default))
> + {
> + if (pstate->p_target_relation->rd_att->attrs[(AttrNumber)
> pstate->p_last_resno - 1]->atthasdef)
> + {
> + Const *con = (Const *)
> stringToNode(pstate->p_target_relation->rd_att->constr->defval[(AttrNumber)
> pstate->p_last_resno - 1].adbin);
> + expr = con;
> + }
> + else
> + elog(ERROR, "no default value for column \"%s\"
> found\nDEFAULT cannot be inserted", colname);
> + }
> +
> type_id = exprType(expr);
> type_mod = exprTypmod(expr);
>
> ***************
> *** 260,266 ****
> {
> tle->expr = CoerceTargetExpr(pstate, tle->expr, type_id,
> attrtype, attrtypmod);
> ! if (tle->expr == NULL)
> elog(ERROR, "column \"%s\" is of type '%s'"
> " but expression is of type '%s'"
> "\n\tYou will need to rewrite or cast the expression",
> --- 272,278 ----
> {
> tle->expr = CoerceTargetExpr(pstate, tle->expr, type_id,
> attrtype, attrtypmod);
> ! if (tle->expr == NULL)
> elog(ERROR, "column \"%s\" is of type '%s'"
> " but expression is of type '%s'"
> "\n\tYou will need to rewrite or cast the expression",
> ***************
> *** 299,305 ****
> int32 attrtypmod)
> {
> if (can_coerce_type(1, &type_id, &attrtype))
> ! expr = coerce_type(pstate, expr, type_id, attrtype, attrtypmod);
>
> #ifndef DISABLE_STRING_HACKS
>
> --- 311,317 ----
> int32 attrtypmod)
> {
> if (can_coerce_type(1, &type_id, &attrtype))
> ! expr = coerce_type(pstate, expr, type_id, attrtype,
> attrtypmod);
>
> #ifndef DISABLE_STRING_HACKS
>
> ***************
> *** 525,528 ****
> }
>
> return strength;
> ! }
> --- 537,540 ----
> }
>
> return strength;
> ! }
> \ No newline at end of file
> Index: src/backend/parser/parse_expr.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/parser/parse_expr.c,v
> retrieving revision 1.105
> diff -c -r1.105 parse_expr.c
> *** src/backend/parser/parse_expr.c 2001/11/12 20:05:24 1.105
> --- src/backend/parser/parse_expr.c 2001/12/28 23:15:08
> ***************
> *** 121,126 ****
> --- 121,131 ----
> result = (Node *) make_const(val);
> break;
> }
> + case T_Default: /* pavlo (pb(at)pbit(dot)org): 2001-12-27:
> transormation for the DEFAULT value for INSERT INTO foo VALUES (...,
> DEFAULT, ...)*/
> + {
> + result = (Default *) expr;
> + break;
> + }
> case T_ParamNo:
> {
> ParamNo *pno = (ParamNo *) expr;
> ***************
> *** 1066,1069 ****
> }
> else
> return typename->name;
> ! }
> --- 1071,1074 ----
> }
> else
> return typename->name;
> ! }
> \ No newline at end of file
> Index: src/backend/parser/gram.y
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v
> retrieving revision 2.276
> diff -c -r2.276 gram.y
> *** src/backend/parser/gram.y 2001/12/09 04:39:39 2.276
> --- src/backend/parser/gram.y 2001/12/28 23:15:39
> ***************
> *** 195,201 ****
> opt_column_list, columnList, opt_name_list,
> sort_clause, sortby_list, index_params, index_list, name_list,
> from_clause, from_list, opt_array_bounds,
> ! expr_list, attrs, target_list, update_target_list,
> def_list, opt_indirection, group_clause, TriggerFuncArgs,
> select_limit, opt_select_limit
>
> --- 195,201 ----
> opt_column_list, columnList, opt_name_list,
> sort_clause, sortby_list, index_params, index_list, name_list,
> from_clause, from_list, opt_array_bounds,
> ! expr_list, attrs, target_list, insert_target_list, update_target_list,
> def_list, opt_indirection, group_clause, TriggerFuncArgs,
> select_limit, opt_select_limit
>
> ***************
> *** 253,259 ****
> %type <node> table_ref
> %type <jexpr> joined_table
> %type <range> relation_expr
> ! %type <target> target_el, update_target_el
> %type <paramno> ParamNo
>
> %type <typnam> Typename, SimpleTypename, ConstTypename
> --- 253,259 ----
> %type <node> table_ref
> %type <jexpr> joined_table
> %type <range> relation_expr
> ! %type <target> target_el, update_target_el, insert_target_el
> %type <paramno> ParamNo
>
> %type <typnam> Typename, SimpleTypename, ConstTypename
> ***************
> *** 3302,3308 ****
> }
> ;
>
> ! insert_rest: VALUES '(' target_list ')'
> {
> $$ = makeNode(InsertStmt);
> $$->cols = NIL;
> --- 3302,3308 ----
> }
> ;
>
> ! insert_rest: VALUES '(' insert_target_list ')'
> {
> $$ = makeNode(InsertStmt);
> $$->cols = NIL;
> ***************
> *** 5482,5488 ****
> *
>
> ****************************************************************************
> */
>
> ! /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
>
> target_list: target_list ',' target_el
> { $$ = lappend($1, $3); }
> --- 5482,5488 ----
> *
>
> ****************************************************************************
> */
>
> ! /* Target lists as found in SELECT ... */
>
> target_list: target_list ',' target_el
> { $$ = lappend($1, $3); }
> ***************
> *** 5490,5496 ****
> --- 5490,5522 ----
> { $$ = makeList1($1); }
> ;
>
> + /* Target lists as found in INSERT VALUES ( ... ) */
> +
> + /* pavlo (pb(at)pbit(dot)org): 2001-12-27: parse node based handling for the
> DEFAULT value added;
> + now it's possible to INSERT INTO ... VALUES (..., FEFAULT, ...)!
> + */
> + insert_target_list: insert_target_list ',' insert_target_el
> + { $$ = lappend($1, $3); }
> + | insert_target_el
> + { $$ = makeList1($1); }
> + | insert_target_list ',' target_el
> + { $$ = lappend($1, $3); }
> + | target_el
> + { $$ = makeList1($1); }
> + ;
> +
> + insert_target_el: DEFAULT
> + {
> + Default *n = makeNode(Default);
> + $$ = makeNode(ResTarget);
> + $$->name = NULL;
> + $$->indirection = NULL;
> + $$->val = (Node *)n;
> + }
> + ;
> +
> /* AS is not optional because shift/red conflict with unary ops */
> +
> target_el: a_expr AS ColLabel
> {
> $$ = makeNode(ResTarget);
> ***************
> *** 6380,6383 ****
> strcpy(newval+1, oldval);
> v->val.str = newval;
> }
> ! }
> --- 6406,6409 ----
> strcpy(newval+1, oldval);
> v->val.str = newval;
> }
> ! }
> \ No newline at end of file
> Index: src/include/nodes/parsenodes.h
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/include/nodes/parsenodes.h,v
> retrieving revision 1.151
> diff -c -r1.151 parsenodes.h
> *** src/include/nodes/parsenodes.h 2001/11/05 17:46:34 1.151
> --- src/include/nodes/parsenodes.h 2001/12/28 23:16:30
> ***************
> *** 1005,1010 ****
> --- 1005,1019 ----
> } A_Const;
>
> /*
> + * pavlo (pb(at)pbit(dot)org): 2001.12.27:
> + * Default - the DEFAULT constant expression used in the target list of
> INSERT INTO ... VALUES (..., DEFAULT, ...)
> + */
> + typedef struct Default
> + {
> + NodeTag type;
> + } Default;
> +
> + /*
> * TypeCast - a CAST expression
> *
> * NOTE: for mostly historical reasons, A_Const and ParamNo parsenodes
> contain
> ***************
> *** 1355,1358 ****
> */
> typedef SortClause GroupClause;
>
> ! #endif /* PARSENODES_H */
> --- 1364,1367 ----
> */
> typedef SortClause GroupClause;
>
> ! #endif /* PARSENODES_H */
> \ No newline at end of file
> Index: src/include/nodes/nodes.h
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/include/nodes/nodes.h,v
> retrieving revision 1.96
> diff -c -r1.96 nodes.h
> *** src/include/nodes/nodes.h 2001/11/05 17:46:34 1.96
> --- src/include/nodes/nodes.h 2001/12/29 09:23:37
> ***************
> *** 222,227 ****
> --- 222,228 ----
> T_CaseWhen,
> T_FkConstraint,
> T_PrivGrantee,
> + T_Default, /* pavlo (pb(at)pbit(dot)org) : 2001.12.27: DEFAULT element of
> the INSERT INTO target list*/
>
> /*
> * TAGS FOR FUNCTION-CALL CONTEXT AND RESULTINFO NODES (see fmgr.h)
> ***************
> *** 365,368 ****
> (jointype) == JOIN_FULL || \
> (jointype) == JOIN_RIGHT)
>
> ! #endif /* NODES_H */
> --- 366,369 ----
> (jointype) == JOIN_FULL || \
> (jointype) == JOIN_RIGHT)
>
> ! #endif /* NODES_H */
> \ No newline at end of file
>

[ Attachment, skipping... ]

>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2002-03-08 01:16:26 Re: new module contrib/tree for 7.2 ?
Previous Message Tom Lane 2002-03-08 01:03:07 Re: point in time recovery and moving datafiles online