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@pbit.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@pbit.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 table_ref %type joined_table %type relation_expr ! %type target_el, update_target_el %type ParamNo %type Typename, SimpleTypename, ConstTypename --- 253,259 ---- %type table_ref %type joined_table %type relation_expr ! %type target_el, update_target_el, insert_target_el %type ParamNo %type 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@pbit.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@pbit.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