Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita8d2820

Browse files
committed
Fix for DEFAULT ''.
1 parent9710995 commita8d2820

File tree

8 files changed

+40
-45
lines changed

8 files changed

+40
-45
lines changed

‎src/backend/catalog/heap.c

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.83 1999/05/21 18:33:12 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.84 1999/05/22 04:12:24 momjian Exp $
1111
*
1212
*
1313
* INTERFACE ROUTINES
@@ -1538,26 +1538,11 @@ StoreAttrDefault(Relation rel, AttrDefault *attrdef)
15381538

15391539
if (type!=atp->atttypid)
15401540
{
1541-
/*
1542-
*Though these types are binary compatible, bpchar has a fixed
1543-
*length on the disk, requiring non-bpchar types to be padded
1544-
*before storage in the default table. bjm 1999/05/18
1545-
*/
1546-
if (1==0&&atp->atttypid==BPCHAROID&&
1547-
(type==TEXTOID||type==BPCHAROID||type==UNKNOWNOID))
1548-
{
1549-
1550-
FuncCall*n=makeNode(FuncCall);
1551-
1552-
n->funcname=typeidTypeName(atp->atttypid);
1553-
n->args=lcons((Node*)expr,NIL);
1554-
expr=transformExpr(NULL, (Node*)n,EXPR_COLUMN_FIRST);
1555-
1556-
}
1557-
elseif (IS_BINARY_COMPATIBLE(type,atp->atttypid))
1541+
if (IS_BINARY_COMPATIBLE(type,atp->atttypid))
15581542
;/* use without change */
15591543
elseif (can_coerce_type(1,&(type),&(atp->atttypid)))
1560-
expr=coerce_type(NULL, (Node*)expr,type,atp->atttypid);
1544+
expr=coerce_type(NULL, (Node*)expr,type,atp->atttypid,
1545+
atp->atttypmod);
15611546
elseif (IsA(expr,Const))
15621547
{
15631548
if (*cast!=0)

‎src/backend/parser/parse_coerce.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.14 1999/05/2202:55:57 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.15 1999/05/2204:12:26 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -35,7 +35,8 @@ static Oid PreferredType(CATEGORY category, Oid type);
3535
* Convert a function argument to a different type.
3636
*/
3737
Node*
38-
coerce_type(ParseState*pstate,Node*node,OidinputTypeId,OidtargetTypeId)
38+
coerce_type(ParseState*pstate,Node*node,OidinputTypeId,OidtargetTypeId,
39+
int32atttypmod)
3940
{
4041
Node*result=NULL;
4142
Oidinfunc;
@@ -82,11 +83,16 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, Oid targetTypeId)
8283
con->consttype=targetTypeId;
8384
con->constlen=typeLen(typeidType(targetTypeId));
8485

85-
/* use "-1" for varchar() type */
86+
/*
87+
*Use "-1" for varchar() type.
88+
*For char(), we need to pad out the type with the proper
89+
*number of spaces. This was a major problem for
90+
* DEFAULT string constants to char() types.
91+
*/
8692
con->constvalue= (Datum)fmgr(infunc,
8793
val,
8894
typeidTypElem(targetTypeId),
89-
-1);
95+
(targetTypeId!=BPCHAROID) ?-1 :atttypmod);
9096
con->constisnull= false;
9197
con->constbyval=typeByVal(typeidType(targetTypeId));
9298
con->constisset= false;
@@ -100,7 +106,7 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, Oid targetTypeId)
100106
result=node;
101107

102108
returnresult;
103-
}/* coerce_type() */
109+
}
104110

105111

106112
/* can_coerce_type()
@@ -178,7 +184,7 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids)
178184
}
179185

180186
return true;
181-
}/* can_coerce_type() */
187+
}
182188

183189

184190
/* TypeCategory()

‎src/backend/parser/parse_expr.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.46 1999/05/18 23:40:05 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.47 1999/05/22 04:12:26 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -417,7 +417,8 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
417417
}
418418
elseif (can_coerce_type(1,&c->casetype,&ptype))
419419
{
420-
c->defresult=coerce_type(pstate,c->defresult,c->casetype,ptype);
420+
c->defresult=coerce_type(pstate,c->defresult,
421+
c->casetype,ptype,-1);
421422
c->casetype=ptype;
422423
}
423424
else
@@ -439,7 +440,8 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
439440
{
440441
if (can_coerce_type(1,&wtype,&ptype))
441442
{
442-
w->result=coerce_type(pstate,w->result,wtype,ptype);
443+
w->result=coerce_type(pstate,w->result,wtype,
444+
ptype,-1);
443445
}
444446
else
445447
{

‎src/backend/parser/parse_func.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.44 1999/05/17 17:03:33 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.45 1999/05/22 04:12:27 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -352,7 +352,6 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
352352
}
353353
else
354354
{
355-
356355
/*
357356
* Parsing aggregates.
358357
*/
@@ -361,7 +360,6 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
361360
intncandidates;
362361
CandidateListcandidates;
363362

364-
365363
/*
366364
* the aggregate COUNT is a special case, ignore its base
367365
* type. Treat it as zero
@@ -392,7 +390,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
392390
type=agg_select_candidate(basetype,candidates);
393391
if (OidIsValid(type))
394392
{
395-
lfirst(fargs)=coerce_type(pstate,lfirst(fargs),basetype,type);
393+
lfirst(fargs)=coerce_type(pstate,lfirst(fargs),
394+
basetype,type,-1);
396395
basetype=type;
397396

398397
return (Node*)ParseAgg(pstate,funcname,basetype,
@@ -1316,7 +1315,7 @@ make_arguments(ParseState *pstate,
13161315
lfirst(current_fargs)=coerce_type(pstate,
13171316
lfirst(current_fargs),
13181317
input_typeids[i],
1319-
function_typeids[i]);
1318+
function_typeids[i],-1);
13201319
}
13211320
}
13221321
}

‎src/backend/parser/parse_node.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.25 1999/05/10 00:45:28 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.26 1999/05/22 04:12:27 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -75,9 +75,7 @@ make_operand(char *opname,
7575

7676
/* must coerce? */
7777
if (true_typeId!=orig_typeId)
78-
{
79-
result=coerce_type(NULL,tree,orig_typeId,true_typeId);
80-
}
78+
result=coerce_type(NULL,tree,orig_typeId,true_typeId,-1);
8179
}
8280
/* otherwise, this is a NULL value */
8381
else

‎src/backend/parser/parse_relation.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.20 1999/05/17 17:03:34 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.21 1999/05/22 04:12:28 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -445,7 +445,9 @@ checkTargetTypes(ParseState *pstate, char *target_colname,
445445
{
446446
if (can_coerce_type(1,&attrtype_id,&attrtype_target))
447447
{
448-
Node*expr=coerce_type(pstate,expr,attrtype_id,attrtype_target);
448+
Node*expr=coerce_type(pstate,expr,attrtype_id,
449+
attrtype_target,
450+
get_atttypmod(pstate->p_target_relation->rd_id,resdomno_target));
449451

450452
elog(ERROR,"Type %s(%d) can be coerced to match target column %s(%d)",
451453
colname,get_atttypmod(rte->relid,resdomno_id),

‎src/backend/parser/parse_target.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.37 1999/05/17 17:03:35 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.38 1999/05/22 04:12:28 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -121,7 +121,9 @@ MakeTargetEntryIdent(ParseState *pstate,
121121
{
122122
if (can_coerce_type(1,&attrtype_id,&attrtype_target))
123123
{
124-
expr=coerce_type(pstate,node,attrtype_id,attrtype_target);
124+
expr=coerce_type(pstate,node,attrtype_id,
125+
attrtype_target,
126+
get_atttypmod(pstate->p_target_relation->rd_id,resdomno_target));
125127
expr=transformExpr(pstate,expr,EXPR_COLUMN_FIRST);
126128
tent=MakeTargetEntryExpr(pstate,*resname,expr, false, false);
127129
expr=tent->expr;
@@ -666,7 +668,7 @@ CoerceTargetExpr(ParseState *pstate,
666668
{
667669
if (can_coerce_type(1,&type_id,&attrtype))
668670
{
669-
expr=coerce_type(pstate,expr,type_id,attrtype);
671+
expr=coerce_type(pstate,expr,type_id,attrtype,-1);
670672
}
671673

672674
#ifndefDISABLE_STRING_HACKS
@@ -683,7 +685,7 @@ CoerceTargetExpr(ParseState *pstate,
683685
{
684686
}
685687
elseif (can_coerce_type(1,&type_id,&text_id))
686-
expr=coerce_type(pstate,expr,type_id,text_id);
688+
expr=coerce_type(pstate,expr,type_id,text_id,-1);
687689
else
688690
expr=NULL;
689691
}

‎src/include/parser/parse_coerce.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: parse_coerce.h,v 1.9 1999/03/10 05:05:58 tgl Exp $
9+
* $Id: parse_coerce.h,v 1.10 1999/05/22 04:12:29 momjian Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -121,6 +121,7 @@ extern bool IsPreferredType(CATEGORY category, Oid type);
121121
externCATEGORYTypeCategory(Oidtype);
122122

123123
externboolcan_coerce_type(intnargs,Oid*input_typeids,Oid*func_typeids);
124-
externNode*coerce_type(ParseState*pstate,Node*node,OidinputTypeId,OidtargetTypeId);
124+
externNode*coerce_type(ParseState*pstate,Node*node,OidinputTypeId,
125+
OidtargetTypeId,int32atttypmod);
125126

126127
#endif/* PARSE_COERCE_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp