From 2d8f4f58bd42696fe9db2039039bab1c94d8a72d Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 3 Jul 2023 07:39:25 +0200 Subject: [PATCH v2 6/6] WIP: Generate ObjectProperty from catalog files --- src/backend/catalog/.gitignore | 1 + src/backend/catalog/genbki.pl | 81 ++++++++++++++++++++++++++++++ src/tools/pginclude/cpluspluscheck | 3 ++ src/tools/pginclude/headerscheck | 3 ++ 4 files changed, 88 insertions(+) diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore index ff65560379..d817798dc0 100644 --- a/src/backend/catalog/.gitignore +++ b/src/backend/catalog/.gitignore @@ -1,3 +1,4 @@ +/objectproperty_info.c.h /postgres.bki /schemapg.h /syscache_info.c.h diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index 80a7828d6c..e0813d1286 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -19,8 +19,10 @@ use FindBin; use lib $FindBin::RealBin; +use lib "$FindBin::RealBin/../../tools"; use Catalog; +use PerfectHash; my $output_path = ''; my $major_version; @@ -59,6 +61,7 @@ my %syscaches; my %oidcounts; my @system_constraints; +my @object_properties; foreach my $header (@ARGV) { @@ -133,6 +136,7 @@ $oidcounts{ $toast->{toast_oid} }++; $oidcounts{ $toast->{toast_index_oid} }++; } + my ($oid_index, $oid_syscache, $name_syscache, $is_nsp_name_unique); foreach my $index (@{ $catalog->{indexing} }) { push @index_decls, @@ -142,6 +146,7 @@ $index->{table_name}, $index->{index_decl}; $oidcounts{ $index->{index_oid} }++; + $oid_index = $index->{index_oid_macro} if $index->{index_decl} eq 'btree(oid oid_ops)'; if ($index->{is_unique}) { @@ -152,6 +157,11 @@ $index->{index_name}; } + if ($index->{is_unique} && $index->{index_decl} =~ /\(\w+name name_ops, \w+namespace oid_ops\)/) + { + $is_nsp_name_unique = 1; + } + if ($index->{syscache_name}) { my $tbl = $index->{table_name}; @@ -165,8 +175,51 @@ key => $key, nbuckets => $index->{syscache_nbuckets}, }; + + $oid_syscache = $index->{syscache_name} if $index->{index_decl} eq 'btree(oid oid_ops)'; + $name_syscache = $index->{syscache_name} if $index->{index_decl} =~ /^btree\(\w+name name_ops\)$/; + } + } + + my ($attnum_oid, $attnum_name, $attnum_namespace, $attnum_owner, $attnum_acl); + foreach my $att (@$schema) + { + if ($att->{name} eq 'oid' && $att->{type} eq 'oid') + { + $attnum_oid = "Anum_${catname}_" . $att->{name}; + } + elsif ($att->{name} =~ /name$/ && $att->{type} eq 'name') + { + $attnum_name = "Anum_${catname}_" . $att->{name}; + } + elsif ($att->{name} =~ /namespace$/ && $att->{type} eq 'oid') + { + $attnum_namespace = "Anum_${catname}_" . $att->{name}; + } + elsif ($att->{name} =~ /owner$/ && $att->{type} eq 'oid') + { + $attnum_owner = "Anum_${catname}_" . $att->{name}; + } + elsif ($att->{name} =~ /acl$/ && $att->{type} eq '_aclitem') + { + $attnum_acl = "Anum_${catname}_" . $att->{name}; } } + push @object_properties, { + #class_descr => q{"TODO"}, + class_oid => $catalog->{relation_oid_macro}, + _class_oid => $catalog->{relation_oid}, + oid_index_oid => $oid_index, + oid_catcache_id => $oid_syscache || '-1', + name_catcache_id => $name_syscache || '-1', + attnum_oid => $attnum_oid, + attnum_name => $attnum_name, + attnum_namespace => $attnum_namespace, + attnum_owner => $attnum_owner, + attnum_acl => $attnum_acl, + #objtype => TODO, + is_nsp_name_unique => $is_nsp_name_unique ? 'true' : 'false', + }; } # Complain and exit if we found any duplicate OIDs. @@ -441,6 +494,9 @@ my $syscache_info_c = $output_path . 'syscache_info.c.h'; open my $syscache_info_c_fh, '>', $syscache_info_c . $tmpext or die "can't open $syscache_info_c$tmpext: $!"; +my $objectproperty_info = $output_path . 'objectproperty_info.c.h'; +open my $objectproperty_info_fh, '>', $objectproperty_info . $tmpext + or die "can't open $objectproperty_info$tmpext: $!"; # Generate postgres.bki and pg_*_d.h headers. @@ -802,6 +858,29 @@ print $syscache_info_c_fh "};\n"; +# Now generate objectproperty_info + +print_boilerplate($objectproperty_info_fh, "objectproperty_info.h", "object property data"); +print $objectproperty_info_fh "static const ObjectPropertyType ObjectProperty[] = +{ +"; + +my @class_oids; +foreach my $op (@object_properties) +{ + print $objectproperty_info_fh "\t{\n"; + foreach my $p (sort keys %{$op}) + { + printf $objectproperty_info_fh "\t\t%s = %s,\n", $p, ${$op}{$p} if $p !~ /^_/ && ${$op}{$p}; + } + push @class_oids, pack('N', ${$op}{_class_oid}); + print $objectproperty_info_fh "\t},\n"; +} + +print $objectproperty_info_fh "};\n"; + +print $objectproperty_info_fh "\nstatic " . PerfectHash::generate_hash_function(\@class_oids, 'objectproperty_hash_func', fixed_key_length => 4); + # We're done emitting data close $bki; close $schemapg; @@ -809,6 +888,7 @@ close $constraints; close $syscache_info_h_fh; close $syscache_info_c_fh; +close $objectproperty_info_fh; # Finally, rename the completed files into place. Catalog::RenameTempFile($bkifile, $tmpext); @@ -817,6 +897,7 @@ Catalog::RenameTempFile($constraints_file, $tmpext); Catalog::RenameTempFile($syscache_info_h, $tmpext); Catalog::RenameTempFile($syscache_info_c, $tmpext); +Catalog::RenameTempFile($objectproperty_info, $tmpext); exit($num_errors != 0 ? 1 : 0); diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck index 56ed423567..49e3ca7a7b 100755 --- a/src/tools/pginclude/cpluspluscheck +++ b/src/tools/pginclude/cpluspluscheck @@ -119,6 +119,9 @@ do test "$f" = src/include/common/unicode_nonspacing_table.h && continue test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue + test "$f" = src/backend/catalog/objectproperty_info.c.h && continue + test "$f" = src/include/catalog/objectproperty_info.c.h && continue + test "$f" = src/backend/catalog/syscache_info.c.h && continue test "$f" = src/backend/catalog/syscache_info.h && continue test "$f" = src/include/catalog/syscache_info.c.h && continue diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck index 477e4dd7e6..a1ea2ef692 100755 --- a/src/tools/pginclude/headerscheck +++ b/src/tools/pginclude/headerscheck @@ -114,6 +114,9 @@ do test "$f" = src/include/common/unicode_nonspacing_table.h && continue test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue + test "$f" = src/backend/catalog/objectproperty_info.c.h && continue + test "$f" = src/include/catalog/objectproperty_info.c.h && continue + test "$f" = src/backend/catalog/syscache_info.c.h && continue test "$f" = src/backend/catalog/syscache_info.h && continue test "$f" = src/include/catalog/syscache_info.c.h && continue -- 2.41.0