1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-27 07:42:10 +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

@@ -107,7 +107,7 @@ static int num_columns_read = 0;
%type <list> boot_index_params
%type <ielem> boot_index_param
%type <str> boot_const boot_ident
%type <ival> optbootstrap optsharedrelation optwithoutoids
%type <ival> optbootstrap optsharedrelation optwithoutoids boot_column_nullness
%type <oidval> oidspec optoideq optrowtypeoid
%token <str> CONST_P ID
@@ -115,6 +115,7 @@ static int num_columns_read = 0;
%token XDECLARE INDEX ON USING XBUILD INDICES UNIQUE XTOAST
%token COMMA EQUALS LPAREN RPAREN
%token OBJ_ID XBOOTSTRAP XSHARED_RELATION XWITHOUT_OIDS XROWTYPE_OID NULLVAL
%token XFORCE XNOT XNULL
%start TopLevel
@@ -427,14 +428,20 @@ boot_column_list:
;
boot_column_def:
boot_ident EQUALS boot_ident
boot_ident EQUALS boot_ident boot_column_nullness
{
if (++numattr > MAXATTR)
elog(FATAL, "too many columns");
DefineAttr($1, $3, numattr-1);
DefineAttr($1, $3, numattr-1, $4);
}
;
boot_column_nullness:
XFORCE XNOT XNULL { $$ = BOOTCOL_NULL_FORCE_NOT_NULL; }
| XFORCE XNULL { $$ = BOOTCOL_NULL_FORCE_NULL; }
| { $$ = BOOTCOL_NULL_AUTO; }
;
oidspec:
boot_ident { $$ = atooid($1); }
;