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

Commitd40885c

Browse files
committed
+ ExecConstraints()
1 parentfaebf2f commitd40885c

File tree

1 file changed

+133
-43
lines changed

1 file changed

+133
-43
lines changed

‎src/backend/executor/execMain.c

Lines changed: 133 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*
2727
*
2828
* IDENTIFICATION
29-
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.18 1997/08/2203:12:16 vadim Exp $
29+
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.19 1997/08/2214:28:20 vadim Exp $
3030
*
3131
*-------------------------------------------------------------------------
3232
*/
@@ -73,8 +73,6 @@ static void ExecDelete(TupleTableSlot *slot, ItemPointer tupleid,
7373
staticvoidExecReplace(TupleTableSlot*slot,ItemPointertupleid,
7474
EState*estate,Query*parseTree);
7575

76-
staticHeapTupleExecAttrDefault (Relationrel,HeapTupletuple);
77-
7876
/* end of local decls */
7977

8078
#ifdefQUERY_LIMIT
@@ -930,29 +928,15 @@ ExecAppend(TupleTableSlot *slot,
930928

931929
if (resultRelationDesc->rd_att->constr )
932930
{
933-
if (resultRelationDesc->rd_att->constr->num_defval>0 )
934-
{
935-
HeapTuplenewtuple;
936-
937-
newtuple=ExecAttrDefault (resultRelationDesc,tuple);
938-
939-
if (newtuple!=tuple )
940-
{
941-
Assert (slot->ttc_shouldFree );
942-
slot->val=tuple=newtuple;
943-
}
944-
}
945-
946-
if (resultRelationDesc->rd_att->constr->has_not_null )
931+
HeapTuplenewtuple;
932+
933+
newtuple=ExecConstraints ("ExecAppend",resultRelationDesc,tuple);
934+
935+
if (newtuple!=tuple )/* modified by DEFAULT */
947936
{
948-
intattrChk;
949-
950-
for (attrChk=1;attrChk <=resultRelationDesc->rd_att->natts;attrChk++)
951-
{
952-
if (resultRelationDesc->rd_att->attrs[attrChk-1]->attnotnull&&heap_attisnull(tuple,attrChk))
953-
elog(WARN,"ExecAppend: Fail to add null value in not null attribute %s",
954-
resultRelationDesc->rd_att->attrs[attrChk-1]->attname.data);
955-
}
937+
Assert (slot->ttc_shouldFree );
938+
pfree (tuple);
939+
slot->val=tuple=newtuple;
956940
}
957941
}
958942

@@ -1081,15 +1065,19 @@ ExecReplace(TupleTableSlot *slot,
10811065
* ----------------
10821066
*/
10831067

1084-
if (resultRelationDesc->rd_att->constr&&resultRelationDesc->rd_att->constr->has_not_null)
1085-
{
1086-
intattrChk;
1087-
for (attrChk=1;attrChk <=resultRelationDesc->rd_att->natts;attrChk++) {
1088-
if (resultRelationDesc->rd_att->attrs[attrChk-1]->attnotnull&&heap_attisnull(tuple,attrChk))
1089-
elog(WARN,"ExecReplace: Fail to update null value in not null attribute %s",
1090-
resultRelationDesc->rd_att->attrs[attrChk-1]->attname.data);
1091-
}
1092-
}
1068+
if (resultRelationDesc->rd_att->constr )
1069+
{
1070+
HeapTuplenewtuple;
1071+
1072+
newtuple=ExecConstraints ("ExecReplace",resultRelationDesc,tuple);
1073+
1074+
if (newtuple!=tuple )/* modified by DEFAULT */
1075+
{
1076+
Assert (slot->ttc_shouldFree );
1077+
pfree (tuple);
1078+
slot->val=tuple=newtuple;
1079+
}
1080+
}
10931081

10941082
/* ----------------
10951083
*replace the heap tuple
@@ -1140,7 +1128,8 @@ ExecAttrDefault (Relation rel, HeapTuple tuple)
11401128
{
11411129
intndef=rel->rd_att->constr->num_defval;
11421130
AttrDefault*attrdef=rel->rd_att->constr->defval;
1143-
ExprContext*econtext=makeNode(ExprContext);
1131+
ExprContext*econtext=makeNode (ExprContext);
1132+
HeapTuplenewtuple;
11441133
Node*expr;
11451134
boolisnull;
11461135
boolisdone;
@@ -1150,21 +1139,23 @@ ExecAttrDefault (Relation rel, HeapTuple tuple)
11501139
char*repl=NULL;
11511140
inti;
11521141

1142+
econtext->ecxt_scantuple=NULL;/* scan tuple slot */
1143+
econtext->ecxt_innertuple=NULL;/* inner tuple slot */
1144+
econtext->ecxt_outertuple=NULL;/* outer tuple slot */
1145+
econtext->ecxt_relation=NULL;/* relation */
1146+
econtext->ecxt_relid=0;/* relid */
1147+
econtext->ecxt_param_list_info=NULL;/* param list info */
1148+
econtext->ecxt_range_table=NULL;/* range table */
11531149
for (i=0;i<ndef;i++)
11541150
{
11551151
if ( !heap_attisnull (tuple,attrdef[i].adnum) )
11561152
continue;
11571153
expr= (Node*)stringToNode (attrdef[i].adbin);
1158-
econtext->ecxt_scantuple=NULL;/* scan tuple slot */
1159-
econtext->ecxt_innertuple=NULL;/* inner tuple slot */
1160-
econtext->ecxt_outertuple=NULL;/* outer tuple slot */
1161-
econtext->ecxt_relation=NULL;/* relation */
1162-
econtext->ecxt_relid=0;/* relid */
1163-
econtext->ecxt_param_list_info=NULL;/* param list info */
1164-
econtext->ecxt_range_table=NULL;/* range table */
11651154

11661155
val=ExecEvalExpr (expr,econtext,&isnull,&isdone);
11671156

1157+
pfree (expr);
1158+
11681159
if (isnull )
11691160
continue;
11701161

@@ -1182,9 +1173,108 @@ ExecAttrDefault (Relation rel, HeapTuple tuple)
11821173

11831174
}
11841175

1176+
pfree (econtext);
1177+
11851178
if (repl==NULL )
11861179
return (tuple);
11871180

1188-
return (heap_modifytuple (tuple,InvalidBuffer,rel,replValue,replNull,repl));
1181+
newtuple=heap_modifytuple (tuple,InvalidBuffer,rel,replValue,replNull,repl);
1182+
1183+
pfree (repl);
1184+
pfree (replNull);
1185+
pfree (replValue);
1186+
1187+
return (newtuple);
1188+
1189+
}
1190+
1191+
staticchar*
1192+
ExecRelCheck (Relationrel,HeapTupletuple)
1193+
{
1194+
intncheck=rel->rd_att->constr->num_check;
1195+
ConstrCheck*check=rel->rd_att->constr->check;
1196+
ExprContext*econtext=makeNode (ExprContext);
1197+
TupleTableSlot*slot=makeNode (TupleTableSlot);
1198+
RangeTblEntry*rte=makeNode (RangeTblEntry);
1199+
List*rtlist;
1200+
List*qual;
1201+
boolres;
1202+
inti;
1203+
1204+
slot->val=tuple;
1205+
slot->ttc_shouldFree= false;
1206+
slot->ttc_descIsNew= true;
1207+
slot->ttc_tupleDescriptor=rel->rd_att;
1208+
slot->ttc_buffer=InvalidBuffer;
1209+
slot->ttc_whichplan=-1;
1210+
rte->relname=nameout (&(rel->rd_rel->relname));
1211+
rte->timeRange=NULL;
1212+
rte->refname=rte->relname;
1213+
rte->relid=rel->rd_id;
1214+
rte->inh= false;
1215+
rte->archive= false;
1216+
rte->inFromCl= true;
1217+
rte->timeQual=NULL;
1218+
rtlist=lcons (rte,NIL);
1219+
econtext->ecxt_scantuple=slot;/* scan tuple slot */
1220+
econtext->ecxt_innertuple=NULL;/* inner tuple slot */
1221+
econtext->ecxt_outertuple=NULL;/* outer tuple slot */
1222+
econtext->ecxt_relation=rel;/* relation */
1223+
econtext->ecxt_relid=0;/* relid */
1224+
econtext->ecxt_param_list_info=NULL;/* param list info */
1225+
econtext->ecxt_range_table=rtlist;/* range table */
1226+
1227+
for (i=0;i<ncheck;i++)
1228+
{
1229+
qual= (List*)stringToNode (check[i].ccbin);
1230+
1231+
res=ExecQual (qual,econtext);
1232+
1233+
pfree (qual);
1234+
1235+
if ( !res )
1236+
return (check[i].ccname);
1237+
}
1238+
1239+
pfree (slot);
1240+
pfree (rte->relname);
1241+
pfree (rte);
1242+
pfree (rtlist);
1243+
pfree (econtext);
1244+
1245+
return ((char*)NULL);
1246+
1247+
}
1248+
1249+
HeapTuple
1250+
ExecConstraints (char*caller,Relationrel,HeapTupletuple)
1251+
{
1252+
HeapTuplenewtuple=tuple;
1253+
1254+
Assert (rel->rd_att->constr );
11891255

1256+
if (rel->rd_att->constr->num_defval>0 )
1257+
newtuple=tuple=ExecAttrDefault (rel,tuple);
1258+
1259+
if (rel->rd_att->constr->has_not_null )
1260+
{
1261+
intattrChk;
1262+
1263+
for (attrChk=1;attrChk <=rel->rd_att->natts;attrChk++)
1264+
{
1265+
if (rel->rd_att->attrs[attrChk-1]->attnotnull&&heap_attisnull (tuple,attrChk))
1266+
elog(WARN,"%s: Fail to add null value in not null attribute %s",
1267+
caller,rel->rd_att->attrs[attrChk-1]->attname.data);
1268+
}
1269+
}
1270+
1271+
if (rel->rd_att->constr->num_check>0 )
1272+
{
1273+
char*failed;
1274+
1275+
if ( (failed=ExecRelCheck (rel,tuple) )!=NULL )
1276+
elog(WARN,"%s: rejected due to CHECK constraint %s",caller,failed);
1277+
}
1278+
1279+
return (newtuple);
11901280
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp