1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-02 09:02:37 +03:00

Allow forcing nullness of columns during bootstrap.

Bootstrap determines whether a column is null based on simple builtin
rules. Those work surprisingly well, but nonetheless a few existing
columns aren't set correctly. Additionally there is at least one patch
sent to hackers where forcing the nullness of a column would be helpful.

The boostrap format has gained FORCE [NOT] NULL for this, which will be
emitted by genbki.pl when BKI_FORCE_(NOT_)?NULL is specified for a
column in a catalog header.

This patch doesn't change the marking of any existing columns.

Discussion: 20150215170014.GE15326@awork2.anarazel.de
This commit is contained in:
Andres Freund
2015-02-21 22:25:49 +01:00
parent 0627eff360
commit eb68379c38
9 changed files with 131 additions and 49 deletions

View File

@ -642,7 +642,7 @@ closerel(char *name)
* ----------------
*/
void
DefineAttr(char *name, char *type, int attnum)
DefineAttr(char *name, char *type, int attnum, int nullness)
{
Oid typeoid;
@ -697,30 +697,44 @@ DefineAttr(char *name, char *type, int attnum)
attrtypes[attnum]->atttypmod = -1;
attrtypes[attnum]->attislocal = true;
/*
* Mark as "not null" if type is fixed-width and prior columns are too.
* This corresponds to case where column can be accessed directly via C
* struct declaration.
*
* oidvector and int2vector are also treated as not-nullable, even though
* they are no longer fixed-width.
*/
#define MARKNOTNULL(att) \
((att)->attlen > 0 || \
(att)->atttypid == OIDVECTOROID || \
(att)->atttypid == INT2VECTOROID)
if (MARKNOTNULL(attrtypes[attnum]))
if (nullness == BOOTCOL_NULL_FORCE_NOT_NULL)
{
int i;
attrtypes[attnum]->attnotnull = true;
}
else if (nullness == BOOTCOL_NULL_FORCE_NULL)
{
attrtypes[attnum]->attnotnull = false;
}
else
{
Assert(nullness == BOOTCOL_NULL_AUTO);
for (i = 0; i < attnum; i++)
/*
* Mark as "not null" if type is fixed-width and prior columns are
* too. This corresponds to case where column can be accessed
* directly via C struct declaration.
*
* oidvector and int2vector are also treated as not-nullable, even
* though they are no longer fixed-width.
*/
#define MARKNOTNULL(att) \
((att)->attlen > 0 || \
(att)->atttypid == OIDVECTOROID || \
(att)->atttypid == INT2VECTOROID)
if (MARKNOTNULL(attrtypes[attnum]))
{
if (!MARKNOTNULL(attrtypes[i]))
break;
int i;
/* check earlier attributes */
for (i = 0; i < attnum; i++)
{
if (!attrtypes[i]->attnotnull)
break;
}
if (i == attnum)
attrtypes[attnum]->attnotnull = true;
}
if (i == attnum)
attrtypes[attnum]->attnotnull = true;
}
}