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 <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@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
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@pbit.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
