|
56 | 56 | #include"rewrite/rewriteManip.h" |
57 | 57 | #include"utils/acl.h" |
58 | 58 | #include"utils/builtins.h" |
| 59 | +#include"utils/guc.h" |
59 | 60 | #include"utils/lsyscache.h" |
60 | 61 | #include"utils/rel.h" |
61 | 62 | #include"utils/syscache.h" |
@@ -222,7 +223,7 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString) |
222 | 223 | cxt.blist=NIL; |
223 | 224 | cxt.alist=NIL; |
224 | 225 | cxt.pkey=NULL; |
225 | | -cxt.hasoids=interpretOidsOption(stmt->options, true); |
| 226 | +cxt.hasoids=default_with_oids; |
226 | 227 |
|
227 | 228 | Assert(!stmt->ofTypename|| !stmt->inhRelations);/* grammar enforces */ |
228 | 229 |
|
@@ -281,6 +282,17 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString) |
281 | 282 | * Output results. |
282 | 283 | */ |
283 | 284 | stmt->tableElts=cxt.columns; |
| 285 | +/* |
| 286 | + * Add WITH/WITHOUT OIDS, if necessary. A literal statement-specified |
| 287 | + * WITH/WITHOUT OIDS will still take precedence because the first |
| 288 | + * matching "oids" in "options" is used. |
| 289 | + */ |
| 290 | +if (cxt.hasoids&& !interpretOidsOption(stmt->options, true)) |
| 291 | +stmt->options=lappend(stmt->options,makeDefElem("oids", |
| 292 | +(Node*)makeInteger(TRUE))); |
| 293 | +elseif (!cxt.hasoids&&interpretOidsOption(stmt->options, true)) |
| 294 | +stmt->options=lappend(stmt->options,makeDefElem("oids", |
| 295 | +(Node*)makeInteger(FALSE))); |
284 | 296 | stmt->constraints=cxt.ckconstraints; |
285 | 297 |
|
286 | 298 | result=lappend(cxt.blist,stmt); |
@@ -849,6 +861,8 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla |
849 | 861 | } |
850 | 862 | } |
851 | 863 |
|
| 864 | +cxt->hasoids=relation->rd_rel->relhasoids; |
| 865 | + |
852 | 866 | /* |
853 | 867 | * Copy CHECK constraints if requested, being careful to adjust attribute |
854 | 868 | * numbers so they match the child. |
|