|
118 | 118 |
|
119 | 119 | my%bki_attr; |
120 | 120 | my@attnames; |
| 121 | +my$first = 1; |
| 122 | + |
| 123 | +print BKI" (\n"; |
121 | 124 | foreachmy$column (@{$catalog->{columns} }) |
122 | 125 | { |
123 | | -my ($attname,$atttype) =%$column; |
124 | | -$bki_attr{$attname} =$atttype; |
| 126 | +my$attname =$column->{name}; |
| 127 | +my$atttype =$column->{type}; |
| 128 | +$bki_attr{$attname} =$column; |
125 | 129 | push@attnames,$attname; |
| 130 | + |
| 131 | +if (!$first) |
| 132 | +{ |
| 133 | +print BKI" ,\n"; |
| 134 | +} |
| 135 | +$first = 0; |
| 136 | + |
| 137 | +print BKI"$attname =$atttype"; |
| 138 | + |
| 139 | +if (defined$column->{forcenotnull}) |
| 140 | +{ |
| 141 | +print BKI" FORCE NOT NULL"; |
| 142 | +} |
| 143 | +elsif (defined$column->{forcenull}) |
| 144 | +{ |
| 145 | +print BKI" FORCE NULL"; |
| 146 | +} |
126 | 147 | } |
127 | | -print BKI" (\n"; |
128 | | -print BKIjoin" ,\n",map("$_ =$bki_attr{$_}",@attnames); |
129 | 148 | print BKI"\n )\n"; |
130 | 149 |
|
131 | | -# open it, unless bootstrap case (create bootstrap does this automatically) |
| 150 | +# open it, unless bootstrap case (create bootstrap does this automatically) |
132 | 151 | if ($catalog->{bootstrap}eq'') |
133 | 152 | { |
134 | 153 | print BKI"open$catname\n"; |
|
210 | 229 | # Store schemapg entries for later. |
211 | 230 | $row = |
212 | 231 | emit_schemapg_row($row, |
213 | | -grep {$bki_attr{$_}eq'bool' }@attnames); |
| 232 | +grep {$bki_attr{$_}{type}eq'bool' }@attnames); |
214 | 233 | push @{$schemapg_entries{$table_name} },'{' |
215 | 234 | .join( |
216 | 235 | ',',grep {defined$_ } |
|
223 | 242 | { |
224 | 243 | $attnum = 0; |
225 | 244 | my@SYS_ATTRS = ( |
226 | | -{ctid=>'tid' }, |
227 | | -{oid=>'oid' }, |
228 | | -{xmin=>'xid' }, |
229 | | -{cmin=>'cid' }, |
230 | | -{xmax=>'xid' }, |
231 | | -{cmax=>'cid' }, |
232 | | -{tableoid=>'oid' }); |
| 245 | +{name=>'ctid',type=>'tid' }, |
| 246 | +{name=>'oid',type=>'oid' }, |
| 247 | +{name=>'xmin',type=>'xid' }, |
| 248 | +{name=>'cmin',type=>'cid' }, |
| 249 | +{name=>'xmax',type=>'xid' }, |
| 250 | +{name=>'cmax',type=>'cid' }, |
| 251 | +{name=>'tableoid',type=>'oid' }); |
233 | 252 | foreachmy$attr (@SYS_ATTRS) |
234 | 253 | { |
235 | 254 | $attnum--; |
|
326 | 345 | subemit_pgattr_row |
327 | 346 | { |
328 | 347 | my ($table_name,$attr,$priornotnull) =@_; |
329 | | -my ($attname,$atttype) =%$attr; |
| 348 | +my$attname =$attr->{name}; |
| 349 | +my$atttype =$attr->{type}; |
330 | 350 | my%row; |
331 | 351 |
|
332 | 352 | $row{attrelid} =$catalogs->{$table_name}->{relation_oid}; |
@@ -354,11 +374,20 @@ sub emit_pgattr_row |
354 | 374 | $row{attndims} =$type->{typcategory}eq'A' ?'1' :'0'; |
355 | 375 | $row{attcollation} =$type->{typcollation}; |
356 | 376 |
|
357 | | -# attnotnull must be set true if the type is fixed-width and |
358 | | -# prior columns are too --- compare DefineAttr in bootstrap.c. |
359 | | -# oidvector and int2vector are also treated as not-nullable. |
360 | | -if ($priornotnull) |
| 377 | +if (defined$attr->{forcenotnull}) |
| 378 | +{ |
| 379 | +$row{attnotnull} ='t'; |
| 380 | +} |
| 381 | +elsif (defined$attr->{forcenull}) |
| 382 | +{ |
| 383 | +$row{attnotnull} ='f'; |
| 384 | +} |
| 385 | +elsif ($priornotnull) |
361 | 386 | { |
| 387 | +# attnotnull will automatically be set if the type is |
| 388 | +# fixed-width and prior columns are all NOT NULL --- |
| 389 | +# compare DefineAttr in bootstrap.c. oidvector and |
| 390 | +# int2vector are also treated as not-nullable. |
362 | 391 | $row{attnotnull} = |
363 | 392 | $type->{typname}eq'oidvector' ?'t' |
364 | 393 | :$type->{typname}eq'int2vector' ?'t' |
|