As reported in [1], pg_attribute.attndims turns to 0 when 'create table
like/as'.
The patch attached is to fix it.
Best Regards,
Alexey
[1]
https://www.postgresql.org/message-id/20150707072942.1186.98151%40wrigleys.postgresql.org
diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
new file mode 100644
index 1bd2599..8fff3d2
*** a/src/backend/nodes/makefuncs.c
--- b/src/backend/nodes/makefuncs.c
*************** makeTypeNameFromOid(Oid typeOid, int32 t
*** 475,480 ****
--- 475,498 ----
n->typeOid = typeOid;
n->typemod = typmod;
n->location = -1;
+
+ return n;
+ }
+
+ /*
+ * makeTypeNameFromOid -
+ * build a TypeName node to represent a type already known by OID/typmod/ndims
+ */
+ TypeName *
+ makeTypeNameWithNdimsFromOid(Oid typeOid, int32 typmod, int32 ndims)
+ {
+ int i;
+ TypeName *n = makeTypeNameFromOid(typeOid, typmod);
+
+ n->arrayBounds = NIL;
+ for (i = 0; i < ndims; i++)
+ n->arrayBounds = lcons_int(-1, n->arrayBounds);
+
return n;
}
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
new file mode 100644
index c6f3628..3eeb5cd
*** a/src/backend/parser/parse_utilcmd.c
--- b/src/backend/parser/parse_utilcmd.c
*************** transformTableLikeClause(CreateStmtConte
*** 981,988 ****
*/
def = makeNode(ColumnDef);
def->colname = pstrdup(attributeName);
! def->typeName = makeTypeNameFromOid(attribute->atttypid,
! attribute->atttypmod);
def->inhcount = 0;
def->is_local = true;
def->is_not_null = attribute->attnotnull;
--- 981,989 ----
*/
def = makeNode(ColumnDef);
def->colname = pstrdup(attributeName);
! def->typeName = makeTypeNameWithNdimsFromOid(attribute->atttypid,
! attribute->atttypmod,
! attribute->attndims);
def->inhcount = 0;
def->is_local = true;
def->is_not_null = attribute->attnotnull;
diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h
new file mode 100644
index 57bd52f..8db4b10
*** a/src/include/nodes/makefuncs.h
--- b/src/include/nodes/makefuncs.h
*************** extern RangeVar *makeRangeVar(char *sche
*** 71,76 ****
--- 71,77 ----
extern TypeName *makeTypeName(char *typnam);
extern TypeName *makeTypeNameFromNameList(List *names);
extern TypeName *makeTypeNameFromOid(Oid typeOid, int32 typmod);
+ extern TypeName *makeTypeNameWithNdimsFromOid(Oid typeOid, int32 typmod, int32 ndims);
extern ColumnDef *makeColumnDef(const char *colname,
Oid typeOid, int32 typmod, Oid collOid);