mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	DEFAULT handling
Use for 'selct .. into ..' copy of TupleDesc (without constraints) #ifdef NOT_USED for resetVarAttrLenForCreateTable (just free tupdesc copy)
This commit is contained in:
		@@ -26,7 +26,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *    $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.17 1997/08/19 21:31:00 momjian Exp $
 | 
			
		||||
 *    $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.18 1997/08/22 03:12:16 vadim Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -73,6 +73,8 @@ static void ExecDelete(TupleTableSlot *slot, ItemPointer tupleid,
 | 
			
		||||
static void ExecReplace(TupleTableSlot *slot, ItemPointer tupleid,
 | 
			
		||||
			EState *estate, Query *parseTree);
 | 
			
		||||
 | 
			
		||||
static HeapTuple ExecAttrDefault (Relation rel, HeapTuple tuple);
 | 
			
		||||
 | 
			
		||||
/* end of local decls */
 | 
			
		||||
 | 
			
		||||
#ifdef QUERY_LIMIT
 | 
			
		||||
@@ -513,6 +515,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
 | 
			
		||||
	char *intoName;
 | 
			
		||||
	char   archiveMode;
 | 
			
		||||
	Oid    intoRelationId;
 | 
			
		||||
	TupleDesc   tupdesc;
 | 
			
		||||
	
 | 
			
		||||
	if (!parseTree->isPortal) {
 | 
			
		||||
	    /*
 | 
			
		||||
@@ -529,17 +532,24 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
 | 
			
		||||
		 */
 | 
			
		||||
		intoName = parseTree->into;
 | 
			
		||||
		archiveMode = 'n';
 | 
			
		||||
		
 | 
			
		||||
		/*
 | 
			
		||||
		 * have to copy tupType to get rid of constraints
 | 
			
		||||
		 */
 | 
			
		||||
		tupdesc = CreateTupleDescCopy (tupType);
 | 
			
		||||
 | 
			
		||||
		/* fixup to prevent zero-length columns in create */
 | 
			
		||||
		setVarAttrLenForCreateTable(tupType, targetList, rangeTable);
 | 
			
		||||
		setVarAttrLenForCreateTable(tupdesc, targetList, rangeTable);
 | 
			
		||||
		
 | 
			
		||||
		intoRelationId = heap_create(intoName,
 | 
			
		||||
					     intoName, /* not used */
 | 
			
		||||
					     archiveMode,
 | 
			
		||||
					     DEFAULT_SMGR,
 | 
			
		||||
					     tupType);
 | 
			
		||||
		
 | 
			
		||||
		resetVarAttrLenForCreateTable(tupType);
 | 
			
		||||
					     tupdesc);
 | 
			
		||||
#ifdef NOT_USED	/* it's copy ... */
 | 
			
		||||
		resetVarAttrLenForCreateTable(tupdesc);
 | 
			
		||||
#endif
 | 
			
		||||
		FreeTupleDesc (tupdesc);
 | 
			
		||||
 | 
			
		||||
		/* ----------------
 | 
			
		||||
		 *  XXX rather than having to call setheapoverride(true)
 | 
			
		||||
@@ -918,16 +928,34 @@ ExecAppend(TupleTableSlot *slot,
 | 
			
		||||
     * ----------------
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    if (resultRelationDesc->rd_att->constr && resultRelationDesc->rd_att->constr->has_not_null)
 | 
			
		||||
      {
 | 
			
		||||
	int attrChk;
 | 
			
		||||
	for (attrChk = 1; attrChk <= resultRelationDesc->rd_att->natts; attrChk++) {
 | 
			
		||||
	  if (resultRelationDesc->rd_att->attrs[attrChk-1]->attnotnull && heap_attisnull(tuple,attrChk))
 | 
			
		||||
	    elog(WARN,"ExecAppend:  Fail to add null value in not null attribute %s",
 | 
			
		||||
		 resultRelationDesc->rd_att->attrs[attrChk-1]->attname.data);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if ( resultRelationDesc->rd_att->constr )
 | 
			
		||||
    {
 | 
			
		||||
    	if ( resultRelationDesc->rd_att->constr->num_defval > 0 )
 | 
			
		||||
    	{
 | 
			
		||||
    	    HeapTuple newtuple;
 | 
			
		||||
    	    
 | 
			
		||||
    	    newtuple = ExecAttrDefault (resultRelationDesc, tuple);
 | 
			
		||||
    	    
 | 
			
		||||
    	    if ( newtuple != tuple )
 | 
			
		||||
    	    {
 | 
			
		||||
    	    	Assert ( slot->ttc_shouldFree );
 | 
			
		||||
    	    	slot->val = tuple = newtuple;
 | 
			
		||||
    	    }
 | 
			
		||||
    	}
 | 
			
		||||
    	    
 | 
			
		||||
    	if ( resultRelationDesc->rd_att->constr->has_not_null )
 | 
			
		||||
    	{
 | 
			
		||||
	    int attrChk;
 | 
			
		||||
	    
 | 
			
		||||
	    for (attrChk = 1; attrChk <= resultRelationDesc->rd_att->natts; attrChk++)
 | 
			
		||||
	    {
 | 
			
		||||
	    	if (resultRelationDesc->rd_att->attrs[attrChk-1]->attnotnull && heap_attisnull(tuple,attrChk))
 | 
			
		||||
    	    	    elog(WARN,"ExecAppend:  Fail to add null value in not null attribute %s",
 | 
			
		||||
	    	    	resultRelationDesc->rd_att->attrs[attrChk-1]->attname.data);
 | 
			
		||||
    	    }
 | 
			
		||||
    	}
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* ----------------
 | 
			
		||||
     *	insert the tuple
 | 
			
		||||
     * ----------------
 | 
			
		||||
@@ -1106,3 +1134,57 @@ ExecReplace(TupleTableSlot *slot,
 | 
			
		||||
	ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, true);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static HeapTuple
 | 
			
		||||
ExecAttrDefault (Relation rel, HeapTuple tuple)
 | 
			
		||||
{
 | 
			
		||||
    int ndef = rel->rd_att->constr->num_defval;
 | 
			
		||||
    AttrDefault *attrdef = rel->rd_att->constr->defval;
 | 
			
		||||
    ExprContext *econtext = makeNode(ExprContext);
 | 
			
		||||
    Node *expr;
 | 
			
		||||
    bool isnull;
 | 
			
		||||
    bool isdone;
 | 
			
		||||
    Datum val;
 | 
			
		||||
    Datum *replValue = NULL;
 | 
			
		||||
    char *replNull = NULL;
 | 
			
		||||
    char *repl = NULL;
 | 
			
		||||
    int i;
 | 
			
		||||
    
 | 
			
		||||
    for (i = 0; i < ndef; i++)
 | 
			
		||||
    {
 | 
			
		||||
    	if ( !heap_attisnull (tuple, attrdef[i].adnum) )
 | 
			
		||||
    	    continue;
 | 
			
		||||
    	expr = (Node*) stringToNode (attrdef[i].adbin);
 | 
			
		||||
    	econtext->ecxt_scantuple = NULL;		/* scan tuple slot */
 | 
			
		||||
    	econtext->ecxt_innertuple = NULL;		/* inner tuple slot */
 | 
			
		||||
    	econtext->ecxt_outertuple = NULL;		/* outer tuple slot */
 | 
			
		||||
    	econtext->ecxt_relation = NULL;			/* relation */
 | 
			
		||||
    	econtext->ecxt_relid = 0;			/* relid */
 | 
			
		||||
    	econtext->ecxt_param_list_info = NULL;		/* param list info */
 | 
			
		||||
    	econtext->ecxt_range_table = NULL;		/* range table */
 | 
			
		||||
    	
 | 
			
		||||
    	val = ExecEvalExpr (expr, econtext, &isnull, &isdone);
 | 
			
		||||
    	
 | 
			
		||||
    	if ( isnull )
 | 
			
		||||
    	    continue;
 | 
			
		||||
    	
 | 
			
		||||
    	if ( repl == NULL )
 | 
			
		||||
    	{
 | 
			
		||||
    	    repl = (char*) palloc (rel->rd_att->natts * sizeof (char));
 | 
			
		||||
    	    replNull = (char*) palloc (rel->rd_att->natts * sizeof (char));
 | 
			
		||||
    	    replValue = (Datum*) palloc (rel->rd_att->natts * sizeof (Datum));
 | 
			
		||||
    	    memset (repl, ' ', rel->rd_att->natts * sizeof (char));
 | 
			
		||||
    	}
 | 
			
		||||
    	
 | 
			
		||||
    	repl[attrdef[i].adnum - 1] = 'r';
 | 
			
		||||
    	replNull[attrdef[i].adnum - 1] = ' ';
 | 
			
		||||
    	replValue[attrdef[i].adnum - 1] = val;
 | 
			
		||||
    	
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ( repl == NULL )
 | 
			
		||||
    	return (tuple);
 | 
			
		||||
    
 | 
			
		||||
    return (heap_modifytuple (tuple, InvalidBuffer, rel, replValue, replNull, repl));
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *    $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.13 1997/08/21 03:01:42 momjian Exp $
 | 
			
		||||
 *    $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.14 1997/08/22 03:12:19 vadim Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -1182,6 +1182,7 @@ setVarAttrLenForCreateTable(TupleDesc tupType, List *targetList,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef NOT_USED		/* look at execMain.c */
 | 
			
		||||
/* ----------------------------------------------------------------
 | 
			
		||||
 * resetVarAttrLenForCreateTable -
 | 
			
		||||
 *    called when we do a SELECT * INTO TABLE tab
 | 
			
		||||
@@ -1202,3 +1203,4 @@ resetVarAttrLenForCreateTable(TupleDesc tupType)
 | 
			
		||||
	    tupType->attrs[varno]->attlen = -1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user