agora inbox for [email protected]
help / color / mirror / Atom feedRe: inconsistency and inefficiency in setup_conversion()
29+ messages / 10 participants
[nested] [flat]
* Re: inconsistency and inefficiency in setup_conversion()
@ 2018-11-26 08:31 John Naylor <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: John Naylor @ 2018-11-26 08:31 UTC (permalink / raw)
To: pgsql-hackers
v7 is a rebase over recent catalog changes.
-John Naylor
Attachments:
[text/x-patch] v7-0001-Add-pg_language-lookup.patch (25.3K, ../../CAJVSVGU5WU3FTJO8qDupnTuUfPdEzE_GmGASijKN2MRxV1tBgQ@mail.gmail.com/2-v7-0001-Add-pg_language-lookup.patch)
download | inline diff:
From 52aff43dcc91733c1b941fed4582d9c0602004d0 Mon Sep 17 00:00:00 2001
From: John Naylor <[email protected]>
Date: Sat, 13 Oct 2018 19:28:08 +0700
Subject: [PATCH v7 1/2] Add pg_language lookup.
This didn't seem worth doing before, but an upcoming commit will add
88 entries to pg_proc whose languge is 'c'. In addition, we can
now use 'internal' in Gen_fmgr.pl instead of looking up the OID.
This simplifies that script and its Makefile a bit.
---
doc/src/sgml/bki.sgml | 6 +--
src/backend/catalog/genbki.pl | 8 +++
src/backend/utils/Gen_fmgrtab.pl | 9 ++--
src/backend/utils/Makefile | 8 +--
src/include/catalog/pg_proc.dat | 92 ++++++++++++++++----------------
src/include/catalog/pg_proc.h | 2 +-
src/tools/msvc/Solution.pm | 4 +-
7 files changed, 65 insertions(+), 64 deletions(-)
diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml
index 786abb95d4..37bb7a2346 100644
--- a/doc/src/sgml/bki.sgml
+++ b/doc/src/sgml/bki.sgml
@@ -409,8 +409,8 @@
that's error-prone and hard to understand, so for frequently-referenced
catalogs, <filename>genbki.pl</filename> provides mechanisms to write
symbolic references instead. Currently this is possible for references
- to access methods, functions, operators, opclasses, opfamilies, and
- types. The rules are as follows:
+ to access methods, functions, languages, operators, opclasses, opfamilies,
+ and types. The rules are as follows:
</para>
<itemizedlist>
@@ -420,7 +420,7 @@
Use of symbolic references is enabled in a particular catalog column
by attaching <literal>BKI_LOOKUP(<replaceable>lookuprule</replaceable>)</literal>
to the column's definition, where <replaceable>lookuprule</replaceable>
- is <literal>pg_am</literal>, <literal>pg_proc</literal>,
+ is <literal>pg_am</literal>, <literal>pg_proc</literal>, <literal>pg_language</literal>,
<literal>pg_operator</literal>, <literal>pg_opclass</literal>,
<literal>pg_opfamily</literal>, or <literal>pg_type</literal>.
<literal>BKI_LOOKUP</literal> can be attached to columns of
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index edc8ea9f53..3410816882 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -175,6 +175,13 @@ foreach my $row (@{ $catalog_data{pg_am} })
$amoids{ $row->{amname} } = $row->{oid};
}
+# language OID lookup
+my %langoids;
+foreach my $row (@{ $catalog_data{pg_language} })
+{
+ $langoids{ $row->{lanname} } = $row->{oid};
+}
+
# opclass OID lookup
my %opcoids;
foreach my $row (@{ $catalog_data{pg_opclass} })
@@ -249,6 +256,7 @@ foreach my $row (@{ $catalog_data{pg_type} })
# Map catalog name to OID lookup.
my %lookup_kind = (
pg_am => \%amoids,
+ pg_language => \%langoids,
pg_opclass => \%opcoids,
pg_operator => \%operoids,
pg_opfamily => \%opfoids,
diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
index ca28291355..87d250f318 100644
--- a/src/backend/utils/Gen_fmgrtab.pl
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -59,6 +59,8 @@ die "No include path; you must specify -I.\n" if !$include_path;
# Note: We pass data file names as arguments and then look for matching
# headers to parse the schema from. This is backwards from genbki.pl,
# but the Makefile dependencies look more sensible this way.
+# We currently only need pg_proc, but retain the possibility of reading
+# more than one data file.
my %catalogs;
my %catalog_data;
foreach my $datfile (@input_files)
@@ -78,13 +80,10 @@ foreach my $datfile (@input_files)
$catalog_data{$catname} = Catalog::ParseData($datfile, $schema, 0);
}
-# Fetch some values for later.
+# Fetch a value for later.
my $FirstBootstrapObjectId =
Catalog::FindDefinedSymbol('access/transam.h', $include_path,
'FirstBootstrapObjectId');
-my $INTERNALlanguageId =
- Catalog::FindDefinedSymbolFromData($catalog_data{pg_language},
- 'INTERNALlanguageId');
# Collect certain fields from pg_proc.dat.
my @fmgr = ();
@@ -94,7 +93,7 @@ foreach my $row (@{ $catalog_data{pg_proc} })
my %bki_values = %$row;
# Select out just the rows for internal-language procedures.
- next if $bki_values{prolang} ne $INTERNALlanguageId;
+ next if $bki_values{prolang} ne 'internal';
push @fmgr,
{
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index e797539d09..da40f6b6c4 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -31,15 +31,11 @@ generated-header-symlinks: $(top_builddir)/src/include/utils/header-stamp $(top_
$(SUBDIRS:%=%-recursive): fmgr-stamp errcodes.h
-FMGR_DATA := $(addprefix $(top_srcdir)/src/include/catalog/,\
- pg_language.dat pg_proc.dat \
- )
-
# fmgr-stamp records the last time we ran Gen_fmgrtab.pl. We don't rely on
# the timestamps of the individual output files, because the Perl script
# won't update them if they didn't change (to avoid unnecessary recompiles).
-fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(FMGR_DATA) $(top_srcdir)/src/include/access/transam.h
- $(PERL) -I $(catalogdir) $< -I $(top_srcdir)/src/include/ $(FMGR_DATA)
+fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.dat $(top_srcdir)/src/include/access/transam.h
+ $(PERL) -I $(catalogdir) $< -I $(top_srcdir)/src/include/ $(top_srcdir)/src/include/catalog/pg_proc.dat
touch $@
errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 034a41eb55..277cee6f5e 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -2210,7 +2210,7 @@
proname => 'justify_days', prorettype => 'interval',
proargtypes => 'interval', prosrc => 'interval_justify_days' },
{ oid => '1176', descr => 'convert date and time to timestamp with time zone',
- proname => 'timestamptz', prolang => '14', provolatile => 's',
+ proname => 'timestamptz', prolang => 'sql', provolatile => 's',
prorettype => 'timestamptz', proargtypes => 'date time',
prosrc => 'select cast(($1 + $2) as timestamp with time zone)' },
{ oid => '1178', descr => 'convert timestamp with time zone to date',
@@ -2263,16 +2263,16 @@
prosrc => 'interval_scale' },
{ oid => '1215', descr => 'get description for object id and catalog name',
- proname => 'obj_description', prolang => '14', procost => '100',
+ proname => 'obj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid name',
prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP) and objsubid = 0' },
{ oid => '1216', descr => 'get description for table column',
- proname => 'col_description', prolang => '14', procost => '100',
+ proname => 'col_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid int4',
prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and classoid = \'pg_catalog.pg_class\'::pg_catalog.regclass and objsubid = $2' },
{ oid => '1993',
descr => 'get description for object id and shared catalog name',
- proname => 'shobj_description', prolang => '14', procost => '100',
+ proname => 'shobj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid name',
prosrc => 'select description from pg_catalog.pg_shdescription where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP)' },
@@ -2439,13 +2439,13 @@
prosrc => 'tidsmaller' },
{ oid => '1296',
- proname => 'timedate_pl', prolang => '14', prorettype => 'timestamp',
+ proname => 'timedate_pl', prolang => 'sql', prorettype => 'timestamp',
proargtypes => 'time date', prosrc => 'select ($2 + $1)' },
{ oid => '1297',
proname => 'datetimetz_pl', prorettype => 'timestamptz',
proargtypes => 'date timetz', prosrc => 'datetimetz_timestamptz' },
{ oid => '1298',
- proname => 'timetzdate_pl', prolang => '14', prorettype => 'timestamptz',
+ proname => 'timetzdate_pl', prolang => 'sql', prorettype => 'timestamptz',
proargtypes => 'timetz date', prosrc => 'select ($2 + $1)' },
{ oid => '1299', descr => 'current transaction time',
proname => 'now', provolatile => 's', prorettype => 'timestamptz',
@@ -2487,17 +2487,17 @@
proargtypes => 'timestamptz timestamptz timestamptz timestamptz',
prosrc => 'overlaps_timestamp' },
{ oid => '1305', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'bool',
proargtypes => 'timestamptz interval timestamptz interval',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))' },
{ oid => '1306', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'bool',
proargtypes => 'timestamptz timestamptz timestamptz interval',
prosrc => 'select ($1, $2) overlaps ($3, ($3 + $4))' },
{ oid => '1307', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'bool',
proargtypes => 'timestamptz interval timestamptz timestamptz',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, $4)' },
@@ -2506,15 +2506,15 @@
proname => 'overlaps', proisstrict => 'f', prorettype => 'bool',
proargtypes => 'time time time time', prosrc => 'overlaps_time' },
{ oid => '1309', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'time interval time interval',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))' },
{ oid => '1310', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'time time time interval',
prosrc => 'select ($1, $2) overlaps ($3, ($3 + $4))' },
{ oid => '1311', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'time interval time time',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, $4)' },
@@ -2592,7 +2592,7 @@
# This form of obj_description is now deprecated, since it will fail if
# OIDs are not unique across system catalogs. Use the other form instead.
{ oid => '1348', descr => 'deprecated, use two-argument form instead',
- proname => 'obj_description', prolang => '14', procost => '100',
+ proname => 'obj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid',
prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and objsubid = 0' },
@@ -2676,7 +2676,7 @@
prosrc => 'textlen' },
{ oid => '1384', descr => 'extract field from date',
- proname => 'date_part', prolang => '14', prorettype => 'float8',
+ proname => 'date_part', prolang => 'sql', prorettype => 'float8',
proargtypes => 'text date',
prosrc => 'select pg_catalog.date_part($1, cast($2 as timestamp without time zone))' },
{ oid => '1385', descr => 'extract field from time',
@@ -2684,7 +2684,7 @@
prosrc => 'time_part' },
{ oid => '1386',
descr => 'date difference from today preserving months and years',
- proname => 'age', prolang => '14', provolatile => 's',
+ proname => 'age', prolang => 'sql', provolatile => 's',
prorettype => 'interval', proargtypes => 'timestamptz',
prosrc => 'select pg_catalog.age(cast(current_date as timestamp with time zone), $1)' },
@@ -2799,7 +2799,7 @@
proname => 'box_div', prorettype => 'box', proargtypes => 'box point',
prosrc => 'box_div' },
{ oid => '1426',
- proname => 'path_contain_pt', prolang => '14', prorettype => 'bool',
+ proname => 'path_contain_pt', prolang => 'sql', prorettype => 'bool',
proargtypes => 'path point', prosrc => 'select pg_catalog.on_ppath($2, $1)' },
{ oid => '1428',
proname => 'poly_contain_pt', prorettype => 'bool',
@@ -3059,7 +3059,7 @@
proname => 'center', prorettype => 'point', proargtypes => 'circle',
prosrc => 'circle_center' },
{ oid => '1544', descr => 'convert circle to 12-vertex polygon',
- proname => 'polygon', prolang => '14', prorettype => 'polygon',
+ proname => 'polygon', prolang => 'sql', prorettype => 'polygon',
proargtypes => 'circle', prosrc => 'select pg_catalog.polygon(12, $1)' },
{ oid => '1545', descr => 'number of points',
proname => 'npoints', prorettype => 'int4', proargtypes => 'path',
@@ -3326,11 +3326,11 @@
proname => 'translate', prorettype => 'text', proargtypes => 'text text text',
prosrc => 'translate' },
{ oid => '879', descr => 'left-pad string to length',
- proname => 'lpad', prolang => '14', prorettype => 'text',
+ proname => 'lpad', prolang => 'sql', prorettype => 'text',
proargtypes => 'text int4',
prosrc => 'select pg_catalog.lpad($1, $2, \' \')' },
{ oid => '880', descr => 'right-pad string to length',
- proname => 'rpad', prolang => '14', prorettype => 'text',
+ proname => 'rpad', prolang => 'sql', prorettype => 'text',
proargtypes => 'text int4',
prosrc => 'select pg_catalog.rpad($1, $2, \' \')' },
{ oid => '881', descr => 'trim spaces from left end of string',
@@ -3915,7 +3915,7 @@
proname => 'inetpl', prorettype => 'inet', proargtypes => 'inet int8',
prosrc => 'inetpl' },
{ oid => '2631',
- proname => 'int8pl_inet', prolang => '14', prorettype => 'inet',
+ proname => 'int8pl_inet', prolang => 'sql', prorettype => 'inet',
proargtypes => 'int8 inet', prosrc => 'select $2 + $1' },
{ oid => '2632',
proname => 'inetmi_int8', prorettype => 'inet', proargtypes => 'inet int8',
@@ -4047,13 +4047,13 @@
proname => 'round', prorettype => 'numeric', proargtypes => 'numeric int4',
prosrc => 'numeric_round' },
{ oid => '1708', descr => 'value rounded to \'scale\' of zero',
- proname => 'round', prolang => '14', prorettype => 'numeric',
+ proname => 'round', prolang => 'sql', prorettype => 'numeric',
proargtypes => 'numeric', prosrc => 'select pg_catalog.round($1,0)' },
{ oid => '1709', descr => 'value truncated to \'scale\'',
proname => 'trunc', prorettype => 'numeric', proargtypes => 'numeric int4',
prosrc => 'numeric_trunc' },
{ oid => '1710', descr => 'value truncated to \'scale\' of zero',
- proname => 'trunc', prolang => '14', prorettype => 'numeric',
+ proname => 'trunc', prolang => 'sql', prorettype => 'numeric',
proargtypes => 'numeric', prosrc => 'select pg_catalog.trunc($1,0)' },
{ oid => '1711', descr => 'nearest integer >= value',
proname => 'ceil', prorettype => 'numeric', proargtypes => 'numeric',
@@ -4140,7 +4140,7 @@
proname => 'numeric', prorettype => 'numeric', proargtypes => 'int4',
prosrc => 'int4_numeric' },
{ oid => '1741', descr => 'base 10 logarithm',
- proname => 'log', prolang => '14', prorettype => 'numeric',
+ proname => 'log', prolang => 'sql', prorettype => 'numeric',
proargtypes => 'numeric', prosrc => 'select pg_catalog.log(10, $1)' },
{ oid => '1742', descr => 'convert float4 to numeric',
proname => 'numeric', prorettype => 'numeric', proargtypes => 'float4',
@@ -4273,7 +4273,7 @@
proname => 'quote_literal', prorettype => 'text', proargtypes => 'text',
prosrc => 'quote_literal' },
{ oid => '1285', descr => 'quote a data value for usage in a querystring',
- proname => 'quote_literal', prolang => '14', provolatile => 's',
+ proname => 'quote_literal', prolang => 'sql', provolatile => 's',
prorettype => 'text', proargtypes => 'anyelement',
prosrc => 'select pg_catalog.quote_literal($1::pg_catalog.text)' },
{ oid => '1289',
@@ -4282,7 +4282,7 @@
proargtypes => 'text', prosrc => 'quote_nullable' },
{ oid => '1290',
descr => 'quote a possibly-null data value for usage in a querystring',
- proname => 'quote_nullable', prolang => '14', proisstrict => 'f',
+ proname => 'quote_nullable', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'text', proargtypes => 'anyelement',
prosrc => 'select pg_catalog.quote_nullable($1::pg_catalog.text)' },
@@ -4321,13 +4321,13 @@
prorettype => 'text', proargtypes => 'text', prosrc => 'text_format_nv' },
{ oid => '1810', descr => 'length in bits',
- proname => 'bit_length', prolang => '14', prorettype => 'int4',
+ proname => 'bit_length', prolang => 'sql', prorettype => 'int4',
proargtypes => 'bytea', prosrc => 'select pg_catalog.octet_length($1) * 8' },
{ oid => '1811', descr => 'length in bits',
- proname => 'bit_length', prolang => '14', prorettype => 'int4',
+ proname => 'bit_length', prolang => 'sql', prorettype => 'int4',
proargtypes => 'text', prosrc => 'select pg_catalog.octet_length($1) * 8' },
{ oid => '1812', descr => 'length in bits',
- proname => 'bit_length', prolang => '14', prorettype => 'int4',
+ proname => 'bit_length', prolang => 'sql', prorettype => 'int4',
proargtypes => 'bit', prosrc => 'select pg_catalog.length($1)' },
# Selectivity estimators for LIKE and related operators
@@ -4646,7 +4646,7 @@
prosrc => 'to_ascii_encname' },
{ oid => '1848',
- proname => 'interval_pl_time', prolang => '14', prorettype => 'time',
+ proname => 'interval_pl_time', prolang => 'sql', prorettype => 'time',
proargtypes => 'interval time', prosrc => 'select $2 + $1' },
{ oid => '1850',
@@ -5426,11 +5426,11 @@
proargtypes => 'timetz int4', prosrc => 'timetz_scale' },
{ oid => '2003',
- proname => 'textanycat', prolang => '14', provolatile => 's',
+ proname => 'textanycat', prolang => 'sql', provolatile => 's',
prorettype => 'text', proargtypes => 'text anynonarray',
prosrc => 'select $1 || $2::pg_catalog.text' },
{ oid => '2004',
- proname => 'anytextcat', prolang => '14', provolatile => 's',
+ proname => 'anytextcat', prolang => 'sql', provolatile => 's',
prorettype => 'text', proargtypes => 'anynonarray text',
prosrc => 'select $1::pg_catalog.text || $2' },
@@ -5530,15 +5530,15 @@
proargtypes => 'timestamp timestamp timestamp timestamp',
prosrc => 'overlaps_timestamp' },
{ oid => '2042', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'timestamp interval timestamp interval',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))' },
{ oid => '2043', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'timestamp timestamp timestamp interval',
prosrc => 'select ($1, $2) overlaps ($3, ($3 + $4))' },
{ oid => '2044', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'timestamp interval timestamp timestamp',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, $4)' },
{ oid => '2045', descr => 'less-equal-greater',
@@ -5604,7 +5604,7 @@
proargtypes => 'timestamp timestamp', prosrc => 'timestamp_age' },
{ oid => '2059',
descr => 'date difference from today preserving months and years',
- proname => 'age', prolang => '14', provolatile => 's',
+ proname => 'age', prolang => 'sql', provolatile => 's',
prorettype => 'interval', proargtypes => 'timestamp',
prosrc => 'select pg_catalog.age(cast(current_date as timestamp without time zone), $1)' },
@@ -5627,7 +5627,7 @@
proname => 'substring', prorettype => 'text', proargtypes => 'text text',
prosrc => 'textregexsubstr' },
{ oid => '2074', descr => 'extract text matching SQL99 regular expression',
- proname => 'substring', prolang => '14', prorettype => 'text',
+ proname => 'substring', prolang => 'sql', prorettype => 'text',
proargtypes => 'text text text',
prosrc => 'select pg_catalog.substring($1, pg_catalog.similar_escape($2, $3))' },
@@ -5966,11 +5966,11 @@
proname => 'pg_sleep', provolatile => 'v', prorettype => 'void',
proargtypes => 'float8', prosrc => 'pg_sleep' },
{ oid => '3935', descr => 'sleep for the specified interval',
- proname => 'pg_sleep_for', prolang => '14', provolatile => 'v',
+ proname => 'pg_sleep_for', prolang => 'sql', provolatile => 'v',
prorettype => 'void', proargtypes => 'interval',
prosrc => 'select pg_catalog.pg_sleep(extract(epoch from pg_catalog.clock_timestamp() operator(pg_catalog.+) $1) operator(pg_catalog.-) extract(epoch from pg_catalog.clock_timestamp()))' },
{ oid => '3936', descr => 'sleep until the specified time',
- proname => 'pg_sleep_until', prolang => '14', provolatile => 'v',
+ proname => 'pg_sleep_until', prolang => 'sql', provolatile => 'v',
prorettype => 'void', proargtypes => 'timestamptz',
prosrc => 'select pg_catalog.pg_sleep(extract(epoch from $1) operator(pg_catalog.-) extract(epoch from pg_catalog.clock_timestamp()))' },
{ oid => '315', descr => 'Is JIT compilation available in this session?',
@@ -6765,7 +6765,7 @@
proargtypes => 'name', prosrc => 'pg_database_size_name' },
{ oid => '2325',
descr => 'disk space usage for the main fork of the specified table or index',
- proname => 'pg_relation_size', prolang => '14', provolatile => 'v',
+ proname => 'pg_relation_size', prolang => 'sql', provolatile => 'v',
prorettype => 'int8', proargtypes => 'regclass',
prosrc => 'select pg_catalog.pg_relation_size($1, \'main\')' },
{ oid => '2332',
@@ -7586,21 +7586,21 @@
# formerly-missing interval + datetime operators
{ oid => '2546',
- proname => 'interval_pl_date', prolang => '14', prorettype => 'timestamp',
+ proname => 'interval_pl_date', prolang => 'sql', prorettype => 'timestamp',
proargtypes => 'interval date', prosrc => 'select $2 + $1' },
{ oid => '2547',
- proname => 'interval_pl_timetz', prolang => '14', prorettype => 'timetz',
+ proname => 'interval_pl_timetz', prolang => 'sql', prorettype => 'timetz',
proargtypes => 'interval timetz', prosrc => 'select $2 + $1' },
{ oid => '2548',
- proname => 'interval_pl_timestamp', prolang => '14',
+ proname => 'interval_pl_timestamp', prolang => 'sql',
prorettype => 'timestamp', proargtypes => 'interval timestamp',
prosrc => 'select $2 + $1' },
{ oid => '2549',
- proname => 'interval_pl_timestamptz', prolang => '14', provolatile => 's',
+ proname => 'interval_pl_timestamptz', prolang => 'sql', provolatile => 's',
prorettype => 'timestamptz', proargtypes => 'interval timestamptz',
prosrc => 'select $2 + $1' },
{ oid => '2550',
- proname => 'integer_pl_date', prolang => '14', prorettype => 'date',
+ proname => 'integer_pl_date', prolang => 'sql', prorettype => 'date',
proargtypes => 'int4 date', prosrc => 'select $2 + $1' },
{ oid => '2556', descr => 'get OIDs of databases in a tablespace',
@@ -7985,7 +7985,7 @@
proname => 'xpath', prorettype => '_xml', proargtypes => 'text xml _text',
prosrc => 'xpath' },
{ oid => '2932', descr => 'evaluate XPath expression',
- proname => 'xpath', prolang => '14', prorettype => '_xml',
+ proname => 'xpath', prolang => 'sql', prorettype => '_xml',
proargtypes => 'text xml',
prosrc => 'select pg_catalog.xpath($1, $2, \'{}\'::pg_catalog.text[])' },
@@ -7998,7 +7998,7 @@
proname => 'xpath_exists', prorettype => 'bool',
proargtypes => 'text xml _text', prosrc => 'xpath_exists' },
{ oid => '3050', descr => 'test XML value against XPath expression',
- proname => 'xpath_exists', prolang => '14', prorettype => 'bool',
+ proname => 'xpath_exists', prolang => 'sql', prorettype => 'bool',
proargtypes => 'text xml',
prosrc => 'select pg_catalog.xpath_exists($1, $2, \'{}\'::pg_catalog.text[])' },
{ oid => '3051', descr => 'determine if a string is well formed XML',
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index b25dec6c31..498afd0bdb 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -42,7 +42,7 @@ CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,Proce
Oid proowner BKI_DEFAULT(PGUID);
/* OID of pg_language entry */
- Oid prolang BKI_DEFAULT(12);
+ Oid prolang BKI_DEFAULT(internal) BKI_LOOKUP(pg_language);
/* estimated execution cost */
float4 procost BKI_DEFAULT(1);
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 68cf812f01..bb9031a4e5 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -269,16 +269,14 @@ sub GenerateFiles
"LIBPGTYPES");
chdir('src/backend/utils');
- my $pg_language_dat = '../../../src/include/catalog/pg_language.dat';
my $pg_proc_dat = '../../../src/include/catalog/pg_proc.dat';
if ( IsNewer('fmgr-stamp', 'Gen_fmgrtab.pl')
|| IsNewer('fmgr-stamp', '../catalog/Catalog.pm')
- || IsNewer('fmgr-stamp', $pg_language_dat)
|| IsNewer('fmgr-stamp', $pg_proc_dat)
|| IsNewer('fmgr-stamp', '../../../src/include/access/transam.h'))
{
system(
- "perl -I ../catalog Gen_fmgrtab.pl -I../../../src/include/ $pg_language_dat $pg_proc_dat"
+ "perl -I ../catalog Gen_fmgrtab.pl -I../../../src/include/ $pg_proc_dat"
);
open(my $f, '>', 'fmgr-stamp')
|| confess "Could not touch fmgr-stamp";
--
2.17.1
[text/x-patch] v7-0002-Replace-ad-hoc-format-for-conversion-functions.patch (73.7K, ../../CAJVSVGU5WU3FTJO8qDupnTuUfPdEzE_GmGASijKN2MRxV1tBgQ@mail.gmail.com/3-v7-0002-Replace-ad-hoc-format-for-conversion-functions.patch)
download | inline diff:
From 8a735d9c41951e123319171647f8c98daa31fd50 Mon Sep 17 00:00:00 2001
From: John Naylor <[email protected]>
Date: Sun, 25 Nov 2018 21:43:45 +0700
Subject: [PATCH v7 2/2] Replace ad hoc format for conversion functions
Convert info for conversion functions into entries in pg_proc.dat
and the new file pg_conversion.dat. This fixes incorrect comments
on some functions, simplifies some build files, and shaves a few
tens of milliseconds off of initdb.
Functional changes:
1. Conversions are now pinned.
2. The functions are now declared IMMUTABLE (previously VOLATILE, the
default).
Neither of these new behaviors are necessary for the patch, but they
make sense, and it seems the previous state of affairs was accidental.
---
src/backend/catalog/Makefile | 2 +-
src/backend/catalog/genbki.pl | 49 +-
.../utils/mb/conversion_procs/Makefile | 177 +-------
src/bin/initdb/initdb.c | 26 --
src/include/catalog/genbki.h | 5 +-
src/include/catalog/pg_conversion.dat | 417 ++++++++++++++++++
src/include/catalog/pg_conversion.h | 51 ++-
src/include/catalog/pg_proc.dat | 410 ++++++++++++++++-
src/test/regress/expected/misc_sanity.out | 1 -
src/tools/msvc/Install.pm | 39 --
src/tools/msvc/Solution.pm | 4 +-
11 files changed, 915 insertions(+), 266 deletions(-)
create mode 100644 src/include/catalog/pg_conversion.dat
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index 0865240f11..abfc798003 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -88,7 +88,7 @@ generated-header-symlinks: $(top_builddir)/src/include/catalog/header-stamp
# instead is cheating a bit, but it will achieve the goal of updating the
# version number when it changes.
bki-stamp: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.in
- $(PERL) -I $(catalogdir) $< --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS)
+ $(PERL) -I $(catalogdir) $< -I $(top_srcdir)/src/include/ --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS)
touch $@
# The generated headers must all be symlinked into builddir/src/include/,
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 3410816882..b4b7cdaf50 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -20,6 +20,7 @@ use strict;
use warnings;
my @input_files;
+my $include_path;
my $output_path = '';
my $major_version;
@@ -35,6 +36,10 @@ while (@ARGV)
{
$output_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
}
+ elsif ($arg =~ /^-I/)
+ {
+ $include_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
+ }
elsif ($arg =~ /^--set-version=(.*)$/)
{
$major_version = $1;
@@ -49,13 +54,18 @@ while (@ARGV)
# Sanity check arguments.
die "No input files.\n" if !@input_files;
+die "No include path; you must specify -I.\n" if !$include_path;
die "--set-version must be specified.\n" if !defined $major_version;
-# Make sure output_path ends in a slash.
+# Make sure paths end in a slash.
if ($output_path ne '' && substr($output_path, -1) ne '/')
{
$output_path .= '/';
}
+if (substr($include_path, -1) ne '/')
+{
+ $include_path .= '/';
+}
# Read all the files into internal data structures.
my @catnames;
@@ -165,8 +175,35 @@ my $PG_CATALOG_NAMESPACE =
'PG_CATALOG_NAMESPACE');
-# Build lookup tables for OID macro substitutions and for pg_attribute
-# copies of pg_type values.
+# Build lookup tables.
+
+# Encoding identifier lookup. This uses the same machinery as for OIDs.
+my %encids;
+my $collect_encodings = 0;
+
+my $encfile = $include_path . 'mb/pg_wchar.h';
+open(my $ef, '<', $encfile) || die "$encfile: $!";
+
+# We're parsing an enum, so start with 0 and increment
+# every time we find an enum member.
+my $encid = 0;
+while (<$ef>)
+{
+ if (/typedef\s+enum\s+pg_enc/)
+ {
+ $collect_encodings = 1;
+ next;
+ }
+
+ last if /_PG_LAST_ENCODING_/;
+
+ if ($collect_encodings and /^\s+(PG_\w+)/)
+ {
+ $encids{$1} = $encid;
+ $encid++;
+ }
+}
+close $ef;
# index access method OID lookup
my %amoids;
@@ -249,12 +286,16 @@ my %typeoids;
my %types;
foreach my $row (@{ $catalog_data{pg_type} })
{
+ # for OID macro substitutions
$typeoids{ $row->{typname} } = $row->{oid};
+
+ # for pg_attribute copies of pg_type values
$types{ $row->{typname} } = $row;
}
-# Map catalog name to OID lookup.
+# Map lookup name to the corresponding hash table.
my %lookup_kind = (
+ encoding => \%encids,
pg_am => \%amoids,
pg_language => \%langoids,
pg_opclass => \%opcoids,
diff --git a/src/backend/utils/mb/conversion_procs/Makefile b/src/backend/utils/mb/conversion_procs/Makefile
index 879467ea5e..9669fbb9d4 100644
--- a/src/backend/utils/mb/conversion_procs/Makefile
+++ b/src/backend/utils/mb/conversion_procs/Makefile
@@ -1,10 +1,11 @@
#-------------------------------------------------------------------------
#
-# Makefile--
-# Makefile for utils/mb/conversion_procs
+# Makefile for utils/mb/conversion_procs
#
-# IDENTIFICATION
-# src/backend/utils/mb/conversion_procs/Makefile
+# Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/backend/utils/mb/conversion_procs/Makefile
#
#-------------------------------------------------------------------------
@@ -12,8 +13,6 @@ subdir = src/backend/utils/mb/conversion_procs
top_builddir = ../../../../..
include $(top_builddir)/src/Makefile.global
-SQLSCRIPT = conversion_create.sql
-
SUBDIRS = \
ascii_and_mic cyrillic_and_mic euc_cn_and_mic euc_jp_and_sjis \
euc_kr_and_mic euc_tw_and_big5 latin2_and_win1250 latin_and_mic \
@@ -25,170 +24,4 @@ SUBDIRS = \
$(recurse)
-# conversion_name source_encoding destination_encoding function object
-CONVERSIONS = \
- ascii_to_mic SQL_ASCII MULE_INTERNAL ascii_to_mic ascii_and_mic \
- mic_to_ascii MULE_INTERNAL SQL_ASCII mic_to_ascii ascii_and_mic \
- koi8_r_to_mic KOI8R MULE_INTERNAL koi8r_to_mic cyrillic_and_mic \
- mic_to_koi8_r MULE_INTERNAL KOI8R mic_to_koi8r cyrillic_and_mic \
- iso_8859_5_to_mic ISO-8859-5 MULE_INTERNAL iso_to_mic cyrillic_and_mic \
- mic_to_iso_8859_5 MULE_INTERNAL ISO-8859-5 mic_to_iso cyrillic_and_mic \
- windows_1251_to_mic WIN1251 MULE_INTERNAL win1251_to_mic cyrillic_and_mic \
- mic_to_windows_1251 MULE_INTERNAL WIN1251 mic_to_win1251 cyrillic_and_mic \
- windows_866_to_mic WIN866 MULE_INTERNAL win866_to_mic cyrillic_and_mic \
- mic_to_windows_866 MULE_INTERNAL WIN866 mic_to_win866 cyrillic_and_mic \
- koi8_r_to_windows_1251 KOI8R WIN1251 koi8r_to_win1251 cyrillic_and_mic \
- windows_1251_to_koi8_r WIN1251 KOI8R win1251_to_koi8r cyrillic_and_mic \
- koi8_r_to_windows_866 KOI8R WIN866 koi8r_to_win866 cyrillic_and_mic \
- windows_866_to_koi8_r WIN866 KOI8R win866_to_koi8r cyrillic_and_mic \
- windows_866_to_windows_1251 WIN866 WIN1251 win866_to_win1251 cyrillic_and_mic \
- windows_1251_to_windows_866 WIN1251 WIN866 win1251_to_win866 cyrillic_and_mic \
- iso_8859_5_to_koi8_r ISO-8859-5 KOI8R iso_to_koi8r cyrillic_and_mic \
- koi8_r_to_iso_8859_5 KOI8R ISO-8859-5 koi8r_to_iso cyrillic_and_mic \
- iso_8859_5_to_windows_1251 ISO-8859-5 WIN1251 iso_to_win1251 cyrillic_and_mic \
- windows_1251_to_iso_8859_5 WIN1251 ISO-8859-5 win1251_to_iso cyrillic_and_mic \
- iso_8859_5_to_windows_866 ISO-8859-5 WIN866 iso_to_win866 cyrillic_and_mic \
- windows_866_to_iso_8859_5 WIN866 ISO-8859-5 win866_to_iso cyrillic_and_mic \
- euc_cn_to_mic EUC_CN MULE_INTERNAL euc_cn_to_mic euc_cn_and_mic \
- mic_to_euc_cn MULE_INTERNAL EUC_CN mic_to_euc_cn euc_cn_and_mic \
- euc_jp_to_sjis EUC_JP SJIS euc_jp_to_sjis euc_jp_and_sjis \
- sjis_to_euc_jp SJIS EUC_JP sjis_to_euc_jp euc_jp_and_sjis \
- euc_jp_to_mic EUC_JP MULE_INTERNAL euc_jp_to_mic euc_jp_and_sjis \
- sjis_to_mic SJIS MULE_INTERNAL sjis_to_mic euc_jp_and_sjis \
- mic_to_euc_jp MULE_INTERNAL EUC_JP mic_to_euc_jp euc_jp_and_sjis \
- mic_to_sjis MULE_INTERNAL SJIS mic_to_sjis euc_jp_and_sjis \
- euc_kr_to_mic EUC_KR MULE_INTERNAL euc_kr_to_mic euc_kr_and_mic \
- mic_to_euc_kr MULE_INTERNAL EUC_KR mic_to_euc_kr euc_kr_and_mic \
- euc_tw_to_big5 EUC_TW BIG5 euc_tw_to_big5 euc_tw_and_big5 \
- big5_to_euc_tw BIG5 EUC_TW big5_to_euc_tw euc_tw_and_big5 \
- euc_tw_to_mic EUC_TW MULE_INTERNAL euc_tw_to_mic euc_tw_and_big5 \
- big5_to_mic BIG5 MULE_INTERNAL big5_to_mic euc_tw_and_big5 \
- mic_to_euc_tw MULE_INTERNAL EUC_TW mic_to_euc_tw euc_tw_and_big5 \
- mic_to_big5 MULE_INTERNAL BIG5 mic_to_big5 euc_tw_and_big5 \
- iso_8859_2_to_mic LATIN2 MULE_INTERNAL latin2_to_mic latin2_and_win1250 \
- mic_to_iso_8859_2 MULE_INTERNAL LATIN2 mic_to_latin2 latin2_and_win1250 \
- windows_1250_to_mic WIN1250 MULE_INTERNAL win1250_to_mic latin2_and_win1250 \
- mic_to_windows_1250 MULE_INTERNAL WIN1250 mic_to_win1250 latin2_and_win1250 \
- iso_8859_2_to_windows_1250 LATIN2 WIN1250 latin2_to_win1250 latin2_and_win1250 \
- windows_1250_to_iso_8859_2 WIN1250 LATIN2 win1250_to_latin2 latin2_and_win1250 \
- iso_8859_1_to_mic LATIN1 MULE_INTERNAL latin1_to_mic latin_and_mic \
- mic_to_iso_8859_1 MULE_INTERNAL LATIN1 mic_to_latin1 latin_and_mic \
- iso_8859_3_to_mic LATIN3 MULE_INTERNAL latin3_to_mic latin_and_mic \
- mic_to_iso_8859_3 MULE_INTERNAL LATIN3 mic_to_latin3 latin_and_mic \
- iso_8859_4_to_mic LATIN4 MULE_INTERNAL latin4_to_mic latin_and_mic \
- mic_to_iso_8859_4 MULE_INTERNAL LATIN4 mic_to_latin4 latin_and_mic \
- ascii_to_utf8 SQL_ASCII UTF8 ascii_to_utf8 utf8_and_ascii \
- utf8_to_ascii UTF8 SQL_ASCII utf8_to_ascii utf8_and_ascii \
- big5_to_utf8 BIG5 UTF8 big5_to_utf8 utf8_and_big5 \
- utf8_to_big5 UTF8 BIG5 utf8_to_big5 utf8_and_big5 \
- utf8_to_koi8_r UTF8 KOI8R utf8_to_koi8r utf8_and_cyrillic \
- koi8_r_to_utf8 KOI8R UTF8 koi8r_to_utf8 utf8_and_cyrillic \
- utf8_to_koi8_u UTF8 KOI8U utf8_to_koi8u utf8_and_cyrillic \
- koi8_u_to_utf8 KOI8U UTF8 koi8u_to_utf8 utf8_and_cyrillic \
- utf8_to_windows_866 UTF8 WIN866 utf8_to_win utf8_and_win \
- windows_866_to_utf8 WIN866 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_874 UTF8 WIN874 utf8_to_win utf8_and_win \
- windows_874_to_utf8 WIN874 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1250 UTF8 WIN1250 utf8_to_win utf8_and_win \
- windows_1250_to_utf8 WIN1250 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1251 UTF8 WIN1251 utf8_to_win utf8_and_win \
- windows_1251_to_utf8 WIN1251 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1252 UTF8 WIN1252 utf8_to_win utf8_and_win \
- windows_1252_to_utf8 WIN1252 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1253 UTF8 WIN1253 utf8_to_win utf8_and_win \
- windows_1253_to_utf8 WIN1253 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1254 UTF8 WIN1254 utf8_to_win utf8_and_win \
- windows_1254_to_utf8 WIN1254 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1255 UTF8 WIN1255 utf8_to_win utf8_and_win \
- windows_1255_to_utf8 WIN1255 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1256 UTF8 WIN1256 utf8_to_win utf8_and_win \
- windows_1256_to_utf8 WIN1256 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1257 UTF8 WIN1257 utf8_to_win utf8_and_win \
- windows_1257_to_utf8 WIN1257 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1258 UTF8 WIN1258 utf8_to_win utf8_and_win \
- windows_1258_to_utf8 WIN1258 UTF8 win_to_utf8 utf8_and_win \
- euc_cn_to_utf8 EUC_CN UTF8 euc_cn_to_utf8 utf8_and_euc_cn \
- utf8_to_euc_cn UTF8 EUC_CN utf8_to_euc_cn utf8_and_euc_cn \
- euc_jp_to_utf8 EUC_JP UTF8 euc_jp_to_utf8 utf8_and_euc_jp \
- utf8_to_euc_jp UTF8 EUC_JP utf8_to_euc_jp utf8_and_euc_jp \
- euc_kr_to_utf8 EUC_KR UTF8 euc_kr_to_utf8 utf8_and_euc_kr \
- utf8_to_euc_kr UTF8 EUC_KR utf8_to_euc_kr utf8_and_euc_kr \
- euc_tw_to_utf8 EUC_TW UTF8 euc_tw_to_utf8 utf8_and_euc_tw \
- utf8_to_euc_tw UTF8 EUC_TW utf8_to_euc_tw utf8_and_euc_tw \
- gb18030_to_utf8 GB18030 UTF8 gb18030_to_utf8 utf8_and_gb18030 \
- utf8_to_gb18030 UTF8 GB18030 utf8_to_gb18030 utf8_and_gb18030 \
- gbk_to_utf8 GBK UTF8 gbk_to_utf8 utf8_and_gbk \
- utf8_to_gbk UTF8 GBK utf8_to_gbk utf8_and_gbk \
- utf8_to_iso_8859_2 UTF8 LATIN2 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_2_to_utf8 LATIN2 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_3 UTF8 LATIN3 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_3_to_utf8 LATIN3 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_4 UTF8 LATIN4 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_4_to_utf8 LATIN4 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_9 UTF8 LATIN5 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_9_to_utf8 LATIN5 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_10 UTF8 LATIN6 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_10_to_utf8 LATIN6 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_13 UTF8 LATIN7 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_13_to_utf8 LATIN7 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_14 UTF8 LATIN8 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_14_to_utf8 LATIN8 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_15 UTF8 LATIN9 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_15_to_utf8 LATIN9 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_16 UTF8 LATIN10 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_16_to_utf8 LATIN10 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_5 UTF8 ISO-8859-5 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_5_to_utf8 ISO-8859-5 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_6 UTF8 ISO-8859-6 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_6_to_utf8 ISO-8859-6 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_7 UTF8 ISO-8859-7 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_7_to_utf8 ISO-8859-7 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_8 UTF8 ISO-8859-8 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_8_to_utf8 ISO-8859-8 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- iso_8859_1_to_utf8 LATIN1 UTF8 iso8859_1_to_utf8 utf8_and_iso8859_1 \
- utf8_to_iso_8859_1 UTF8 LATIN1 utf8_to_iso8859_1 utf8_and_iso8859_1 \
- johab_to_utf8 JOHAB UTF8 johab_to_utf8 utf8_and_johab \
- utf8_to_johab UTF8 JOHAB utf8_to_johab utf8_and_johab \
- sjis_to_utf8 SJIS UTF8 sjis_to_utf8 utf8_and_sjis \
- utf8_to_sjis UTF8 SJIS utf8_to_sjis utf8_and_sjis \
- uhc_to_utf8 UHC UTF8 uhc_to_utf8 utf8_and_uhc \
- utf8_to_uhc UTF8 UHC utf8_to_uhc utf8_and_uhc \
- euc_jis_2004_to_utf8 EUC_JIS_2004 UTF8 euc_jis_2004_to_utf8 utf8_and_euc2004 \
- utf8_to_euc_jis_2004 UTF8 EUC_JIS_2004 utf8_to_euc_jis_2004 utf8_and_euc2004 \
- shift_jis_2004_to_utf8 SHIFT_JIS_2004 UTF8 shift_jis_2004_to_utf8 utf8_and_sjis2004 \
- utf8_to_shift_jis_2004 UTF8 SHIFT_JIS_2004 utf8_to_shift_jis_2004 utf8_and_sjis2004 \
- euc_jis_2004_to_shift_jis_2004 EUC_JIS_2004 SHIFT_JIS_2004 euc_jis_2004_to_shift_jis_2004 euc2004_sjis2004 \
- shift_jis_2004_to_euc_jis_2004 SHIFT_JIS_2004 EUC_JIS_2004 shift_jis_2004_to_euc_jis_2004 euc2004_sjis2004
-
-all: $(SQLSCRIPT)
-
-$(SQLSCRIPT): Makefile
- @set -e; \
- set $(CONVERSIONS) ; \
- while [ "$$#" -gt 0 ] ; \
- do \
- name=$$1;shift; \
- se=$$1;shift; \
- de=$$1; shift; \
- func=$$1; shift; \
- obj=$$1; shift; \
- echo "-- $$se --> $$de"; \
- echo "CREATE OR REPLACE FUNCTION $$func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '$$"libdir"/$$obj', '$$func' LANGUAGE C STRICT PARALLEL SAFE;"; \
- echo "COMMENT ON FUNCTION $$func(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) IS 'internal conversion function for $$se to $$de';"; \
- echo "DROP CONVERSION pg_catalog.$$name;"; \
- echo "CREATE DEFAULT CONVERSION pg_catalog.$$name FOR '$$se' TO '$$de' FROM $$func;"; \
- echo "COMMENT ON CONVERSION pg_catalog.$$name IS 'conversion for $$se to $$de';"; \
- echo; \
- done > $@
-
-install: $(SQLSCRIPT) installdirs
- $(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
-
-installdirs:
- $(MKDIR_P) '$(DESTDIR)$(datadir)' '$(DESTDIR)$(pkglibdir)'
-
-uninstall:
- rm -f '$(DESTDIR)$(datadir)/$(SQLSCRIPT)'
-clean distclean maintainer-clean:
- rm -f $(SQLSCRIPT)
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 211a96380e..e378a9a095 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -155,7 +155,6 @@ static char *shdesc_file;
static char *hba_file;
static char *ident_file;
static char *conf_file;
-static char *conversion_file;
static char *dictionary_file;
static char *info_schema_file;
static char *features_file;
@@ -254,7 +253,6 @@ static void setup_depend(FILE *cmdfd);
static void setup_sysviews(FILE *cmdfd);
static void setup_description(FILE *cmdfd);
static void setup_collation(FILE *cmdfd);
-static void setup_conversion(FILE *cmdfd);
static void setup_dictionary(FILE *cmdfd);
static void setup_privileges(FILE *cmdfd);
static void set_info_version(void);
@@ -1774,26 +1772,6 @@ setup_collation(FILE *cmdfd)
PG_CMD_PUTS("SELECT pg_import_system_collations('pg_catalog');\n\n");
}
-/*
- * load conversion functions
- */
-static void
-setup_conversion(FILE *cmdfd)
-{
- char **line;
- char **conv_lines;
-
- conv_lines = readfile(conversion_file);
- for (line = conv_lines; *line != NULL; line++)
- {
- if (strstr(*line, "DROP CONVERSION") != *line)
- PG_CMD_PUTS(*line);
- free(*line);
- }
-
- free(conv_lines);
-}
-
/*
* load extra dictionaries (Snowball stemmers)
*/
@@ -2679,7 +2657,6 @@ setup_data_file_paths(void)
set_input(&hba_file, "pg_hba.conf.sample");
set_input(&ident_file, "pg_ident.conf.sample");
set_input(&conf_file, "postgresql.conf.sample");
- set_input(&conversion_file, "conversion_create.sql");
set_input(&dictionary_file, "snowball_create.sql");
set_input(&info_schema_file, "information_schema.sql");
set_input(&features_file, "sql_features.txt");
@@ -2710,7 +2687,6 @@ setup_data_file_paths(void)
check_input(hba_file);
check_input(ident_file);
check_input(conf_file);
- check_input(conversion_file);
check_input(dictionary_file);
check_input(info_schema_file);
check_input(features_file);
@@ -3070,8 +3046,6 @@ initialize_data_directory(void)
setup_collation(cmdfd);
- setup_conversion(cmdfd);
-
setup_dictionary(cmdfd);
setup_privileges(cmdfd);
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index c6a7feac24..1ace1d36a7 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -35,7 +35,10 @@
#define BKI_DEFAULT(value)
/* Specifies a default value for auto-generated array types */
#define BKI_ARRAY_DEFAULT(value)
-/* Indicates how to perform name lookups for an OID or OID-array field */
+/*
+ * Indicates how to perform name lookups, typically for an OID or
+ * OID-array field
+ */
#define BKI_LOOKUP(catalog)
/* The following are never defined; they are here only for documentation. */
diff --git a/src/include/catalog/pg_conversion.dat b/src/include/catalog/pg_conversion.dat
new file mode 100644
index 0000000000..fc5efe3218
--- /dev/null
+++ b/src/include/catalog/pg_conversion.dat
@@ -0,0 +1,417 @@
+#----------------------------------------------------------------------
+#
+# pg_conversion.dat
+# Initial contents of the pg_conversion system catalog.
+#
+# Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/include/catalog/pg_conversion.dat
+#
+#----------------------------------------------------------------------
+
+# Note: conforencoding and contoencoding must match the spelling of
+# the labels used in the enum pg_enc in mb/pg_wchar.h.
+
+[
+
+{ oid => '4800', descr => 'conversion for SQL_ASCII to MULE_INTERNAL',
+ conname => 'ascii_to_mic', conforencoding => 'PG_SQL_ASCII',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'ascii_to_mic' },
+{ oid => '4801', descr => 'conversion for MULE_INTERNAL to SQL_ASCII',
+ conname => 'mic_to_ascii', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_SQL_ASCII', conproc => 'mic_to_ascii' },
+{ oid => '4802', descr => 'conversion for KOI8R to MULE_INTERNAL',
+ conname => 'koi8_r_to_mic', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'koi8r_to_mic' },
+{ oid => '4803', descr => 'conversion for MULE_INTERNAL to KOI8R',
+ conname => 'mic_to_koi8_r', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_KOI8R', conproc => 'mic_to_koi8r' },
+{ oid => '4804', descr => 'conversion for ISO-8859-5 to MULE_INTERNAL',
+ conname => 'iso_8859_5_to_mic', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'iso_to_mic' },
+{ oid => '4805', descr => 'conversion for MULE_INTERNAL to ISO-8859-5',
+ conname => 'mic_to_iso_8859_5', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'mic_to_iso' },
+{ oid => '4806', descr => 'conversion for WIN1251 to MULE_INTERNAL',
+ conname => 'windows_1251_to_mic', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'win1251_to_mic' },
+{ oid => '4807', descr => 'conversion for MULE_INTERNAL to WIN1251',
+ conname => 'mic_to_windows_1251', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_WIN1251', conproc => 'mic_to_win1251' },
+{ oid => '4808', descr => 'conversion for WIN866 to MULE_INTERNAL',
+ conname => 'windows_866_to_mic', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'win866_to_mic' },
+{ oid => '4809', descr => 'conversion for MULE_INTERNAL to WIN866',
+ conname => 'mic_to_windows_866', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_WIN866', conproc => 'mic_to_win866' },
+{ oid => '4810', descr => 'conversion for KOI8R to WIN1251',
+ conname => 'koi8_r_to_windows_1251', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_WIN1251', conproc => 'koi8r_to_win1251' },
+{ oid => '4811', descr => 'conversion for WIN1251 to KOI8R',
+ conname => 'windows_1251_to_koi8_r', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_KOI8R', conproc => 'win1251_to_koi8r' },
+{ oid => '4812', descr => 'conversion for KOI8R to WIN866',
+ conname => 'koi8_r_to_windows_866', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_WIN866', conproc => 'koi8r_to_win866' },
+{ oid => '4813', descr => 'conversion for WIN866 to KOI8R',
+ conname => 'windows_866_to_koi8_r', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_KOI8R', conproc => 'win866_to_koi8r' },
+{ oid => '4814', descr => 'conversion for WIN866 to WIN1251',
+ conname => 'windows_866_to_windows_1251', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_WIN1251', conproc => 'win866_to_win1251' },
+{ oid => '4815', descr => 'conversion for WIN1251 to WIN866',
+ conname => 'windows_1251_to_windows_866', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_WIN866', conproc => 'win1251_to_win866' },
+{ oid => '4816', descr => 'conversion for ISO-8859-5 to KOI8R',
+ conname => 'iso_8859_5_to_koi8_r', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_KOI8R', conproc => 'iso_to_koi8r' },
+{ oid => '4817', descr => 'conversion for KOI8R to ISO-8859-5',
+ conname => 'koi8_r_to_iso_8859_5', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'koi8r_to_iso' },
+{ oid => '4818', descr => 'conversion for ISO-8859-5 to WIN1251',
+ conname => 'iso_8859_5_to_windows_1251', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_WIN1251', conproc => 'iso_to_win1251' },
+{ oid => '4819', descr => 'conversion for WIN1251 to ISO-8859-5',
+ conname => 'windows_1251_to_iso_8859_5', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'win1251_to_iso' },
+{ oid => '4820', descr => 'conversion for ISO-8859-5 to WIN866',
+ conname => 'iso_8859_5_to_windows_866', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_WIN866', conproc => 'iso_to_win866' },
+{ oid => '4821', descr => 'conversion for WIN866 to ISO-8859-5',
+ conname => 'windows_866_to_iso_8859_5', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'win866_to_iso' },
+{ oid => '4822', descr => 'conversion for EUC_CN to MULE_INTERNAL',
+ conname => 'euc_cn_to_mic', conforencoding => 'PG_EUC_CN',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_cn_to_mic' },
+{ oid => '4823', descr => 'conversion for MULE_INTERNAL to EUC_CN',
+ conname => 'mic_to_euc_cn', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_CN', conproc => 'mic_to_euc_cn' },
+{ oid => '4824', descr => 'conversion for EUC_JP to SJIS',
+ conname => 'euc_jp_to_sjis', conforencoding => 'PG_EUC_JP',
+ contoencoding => 'PG_SJIS', conproc => 'euc_jp_to_sjis' },
+{ oid => '4825', descr => 'conversion for SJIS to EUC_JP',
+ conname => 'sjis_to_euc_jp', conforencoding => 'PG_SJIS',
+ contoencoding => 'PG_EUC_JP', conproc => 'sjis_to_euc_jp' },
+{ oid => '4826', descr => 'conversion for EUC_JP to MULE_INTERNAL',
+ conname => 'euc_jp_to_mic', conforencoding => 'PG_EUC_JP',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_jp_to_mic' },
+{ oid => '4827', descr => 'conversion for SJIS to MULE_INTERNAL',
+ conname => 'sjis_to_mic', conforencoding => 'PG_SJIS',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'sjis_to_mic' },
+{ oid => '4828', descr => 'conversion for MULE_INTERNAL to EUC_JP',
+ conname => 'mic_to_euc_jp', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_JP', conproc => 'mic_to_euc_jp' },
+{ oid => '4829', descr => 'conversion for MULE_INTERNAL to SJIS',
+ conname => 'mic_to_sjis', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_SJIS', conproc => 'mic_to_sjis' },
+{ oid => '4830', descr => 'conversion for EUC_KR to MULE_INTERNAL',
+ conname => 'euc_kr_to_mic', conforencoding => 'PG_EUC_KR',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_kr_to_mic' },
+{ oid => '4831', descr => 'conversion for MULE_INTERNAL to EUC_KR',
+ conname => 'mic_to_euc_kr', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_KR', conproc => 'mic_to_euc_kr' },
+{ oid => '4832', descr => 'conversion for EUC_TW to BIG5',
+ conname => 'euc_tw_to_big5', conforencoding => 'PG_EUC_TW',
+ contoencoding => 'PG_BIG5', conproc => 'euc_tw_to_big5' },
+{ oid => '4833', descr => 'conversion for BIG5 to EUC_TW',
+ conname => 'big5_to_euc_tw', conforencoding => 'PG_BIG5',
+ contoencoding => 'PG_EUC_TW', conproc => 'big5_to_euc_tw' },
+{ oid => '4834', descr => 'conversion for EUC_TW to MULE_INTERNAL',
+ conname => 'euc_tw_to_mic', conforencoding => 'PG_EUC_TW',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_tw_to_mic' },
+{ oid => '4835', descr => 'conversion for BIG5 to MULE_INTERNAL',
+ conname => 'big5_to_mic', conforencoding => 'PG_BIG5',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'big5_to_mic' },
+{ oid => '4836', descr => 'conversion for MULE_INTERNAL to EUC_TW',
+ conname => 'mic_to_euc_tw', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_TW', conproc => 'mic_to_euc_tw' },
+{ oid => '4837', descr => 'conversion for MULE_INTERNAL to BIG5',
+ conname => 'mic_to_big5', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_BIG5', conproc => 'mic_to_big5' },
+{ oid => '4838', descr => 'conversion for LATIN2 to MULE_INTERNAL',
+ conname => 'iso_8859_2_to_mic', conforencoding => 'PG_LATIN2',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin2_to_mic' },
+{ oid => '4839', descr => 'conversion for MULE_INTERNAL to LATIN2',
+ conname => 'mic_to_iso_8859_2', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN2', conproc => 'mic_to_latin2' },
+{ oid => '4840', descr => 'conversion for WIN1250 to MULE_INTERNAL',
+ conname => 'windows_1250_to_mic', conforencoding => 'PG_WIN1250',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'win1250_to_mic' },
+{ oid => '4841', descr => 'conversion for MULE_INTERNAL to WIN1250',
+ conname => 'mic_to_windows_1250', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_WIN1250', conproc => 'mic_to_win1250' },
+{ oid => '4842', descr => 'conversion for LATIN2 to WIN1250',
+ conname => 'iso_8859_2_to_windows_1250', conforencoding => 'PG_LATIN2',
+ contoencoding => 'PG_WIN1250', conproc => 'latin2_to_win1250' },
+{ oid => '4843', descr => 'conversion for WIN1250 to LATIN2',
+ conname => 'windows_1250_to_iso_8859_2', conforencoding => 'PG_WIN1250',
+ contoencoding => 'PG_LATIN2', conproc => 'win1250_to_latin2' },
+{ oid => '4844', descr => 'conversion for LATIN1 to MULE_INTERNAL',
+ conname => 'iso_8859_1_to_mic', conforencoding => 'PG_LATIN1',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin1_to_mic' },
+{ oid => '4845', descr => 'conversion for MULE_INTERNAL to LATIN1',
+ conname => 'mic_to_iso_8859_1', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN1', conproc => 'mic_to_latin1' },
+{ oid => '4846', descr => 'conversion for LATIN3 to MULE_INTERNAL',
+ conname => 'iso_8859_3_to_mic', conforencoding => 'PG_LATIN3',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin3_to_mic' },
+{ oid => '4847', descr => 'conversion for MULE_INTERNAL to LATIN3',
+ conname => 'mic_to_iso_8859_3', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN3', conproc => 'mic_to_latin3' },
+{ oid => '4848', descr => 'conversion for LATIN4 to MULE_INTERNAL',
+ conname => 'iso_8859_4_to_mic', conforencoding => 'PG_LATIN4',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin4_to_mic' },
+{ oid => '4849', descr => 'conversion for MULE_INTERNAL to LATIN4',
+ conname => 'mic_to_iso_8859_4', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN4', conproc => 'mic_to_latin4' },
+{ oid => '4850', descr => 'conversion for SQL_ASCII to UTF8',
+ conname => 'ascii_to_utf8', conforencoding => 'PG_SQL_ASCII',
+ contoencoding => 'PG_UTF8', conproc => 'ascii_to_utf8' },
+{ oid => '4851', descr => 'conversion for UTF8 to SQL_ASCII',
+ conname => 'utf8_to_ascii', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_SQL_ASCII', conproc => 'utf8_to_ascii' },
+{ oid => '4852', descr => 'conversion for BIG5 to UTF8',
+ conname => 'big5_to_utf8', conforencoding => 'PG_BIG5',
+ contoencoding => 'PG_UTF8', conproc => 'big5_to_utf8' },
+{ oid => '4853', descr => 'conversion for UTF8 to BIG5',
+ conname => 'utf8_to_big5', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_BIG5', conproc => 'utf8_to_big5' },
+{ oid => '4854', descr => 'conversion for UTF8 to KOI8R',
+ conname => 'utf8_to_koi8_r', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_KOI8R', conproc => 'utf8_to_koi8r' },
+{ oid => '4855', descr => 'conversion for KOI8R to UTF8',
+ conname => 'koi8_r_to_utf8', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_UTF8', conproc => 'koi8r_to_utf8' },
+{ oid => '4856', descr => 'conversion for UTF8 to KOI8U',
+ conname => 'utf8_to_koi8_u', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_KOI8U', conproc => 'utf8_to_koi8u' },
+{ oid => '4857', descr => 'conversion for KOI8U to UTF8',
+ conname => 'koi8_u_to_utf8', conforencoding => 'PG_KOI8U',
+ contoencoding => 'PG_UTF8', conproc => 'koi8u_to_utf8' },
+{ oid => '4858', descr => 'conversion for UTF8 to WIN866',
+ conname => 'utf8_to_windows_866', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN866', conproc => 'utf8_to_win' },
+{ oid => '4859', descr => 'conversion for WIN866 to UTF8',
+ conname => 'windows_866_to_utf8', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4860', descr => 'conversion for UTF8 to WIN874',
+ conname => 'utf8_to_windows_874', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN874', conproc => 'utf8_to_win' },
+{ oid => '4861', descr => 'conversion for WIN874 to UTF8',
+ conname => 'windows_874_to_utf8', conforencoding => 'PG_WIN874',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4862', descr => 'conversion for UTF8 to WIN1250',
+ conname => 'utf8_to_windows_1250', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1250', conproc => 'utf8_to_win' },
+{ oid => '4863', descr => 'conversion for WIN1250 to UTF8',
+ conname => 'windows_1250_to_utf8', conforencoding => 'PG_WIN1250',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4864', descr => 'conversion for UTF8 to WIN1251',
+ conname => 'utf8_to_windows_1251', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1251', conproc => 'utf8_to_win' },
+{ oid => '4865', descr => 'conversion for WIN1251 to UTF8',
+ conname => 'windows_1251_to_utf8', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4866', descr => 'conversion for UTF8 to WIN1252',
+ conname => 'utf8_to_windows_1252', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1252', conproc => 'utf8_to_win' },
+{ oid => '4867', descr => 'conversion for WIN1252 to UTF8',
+ conname => 'windows_1252_to_utf8', conforencoding => 'PG_WIN1252',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4868', descr => 'conversion for UTF8 to WIN1253',
+ conname => 'utf8_to_windows_1253', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1253', conproc => 'utf8_to_win' },
+{ oid => '4869', descr => 'conversion for WIN1253 to UTF8',
+ conname => 'windows_1253_to_utf8', conforencoding => 'PG_WIN1253',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4870', descr => 'conversion for UTF8 to WIN1254',
+ conname => 'utf8_to_windows_1254', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1254', conproc => 'utf8_to_win' },
+{ oid => '4871', descr => 'conversion for WIN1254 to UTF8',
+ conname => 'windows_1254_to_utf8', conforencoding => 'PG_WIN1254',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4872', descr => 'conversion for UTF8 to WIN1255',
+ conname => 'utf8_to_windows_1255', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1255', conproc => 'utf8_to_win' },
+{ oid => '4873', descr => 'conversion for WIN1255 to UTF8',
+ conname => 'windows_1255_to_utf8', conforencoding => 'PG_WIN1255',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4874', descr => 'conversion for UTF8 to WIN1256',
+ conname => 'utf8_to_windows_1256', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1256', conproc => 'utf8_to_win' },
+{ oid => '4875', descr => 'conversion for WIN1256 to UTF8',
+ conname => 'windows_1256_to_utf8', conforencoding => 'PG_WIN1256',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4876', descr => 'conversion for UTF8 to WIN1257',
+ conname => 'utf8_to_windows_1257', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1257', conproc => 'utf8_to_win' },
+{ oid => '4877', descr => 'conversion for WIN1257 to UTF8',
+ conname => 'windows_1257_to_utf8', conforencoding => 'PG_WIN1257',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4878', descr => 'conversion for UTF8 to WIN1258',
+ conname => 'utf8_to_windows_1258', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1258', conproc => 'utf8_to_win' },
+{ oid => '4879', descr => 'conversion for WIN1258 to UTF8',
+ conname => 'windows_1258_to_utf8', conforencoding => 'PG_WIN1258',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4880', descr => 'conversion for EUC_CN to UTF8',
+ conname => 'euc_cn_to_utf8', conforencoding => 'PG_EUC_CN',
+ contoencoding => 'PG_UTF8', conproc => 'euc_cn_to_utf8' },
+{ oid => '4881', descr => 'conversion for UTF8 to EUC_CN',
+ conname => 'utf8_to_euc_cn', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_CN', conproc => 'utf8_to_euc_cn' },
+{ oid => '4882', descr => 'conversion for EUC_JP to UTF8',
+ conname => 'euc_jp_to_utf8', conforencoding => 'PG_EUC_JP',
+ contoencoding => 'PG_UTF8', conproc => 'euc_jp_to_utf8' },
+{ oid => '4883', descr => 'conversion for UTF8 to EUC_JP',
+ conname => 'utf8_to_euc_jp', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_JP', conproc => 'utf8_to_euc_jp' },
+{ oid => '4884', descr => 'conversion for EUC_KR to UTF8',
+ conname => 'euc_kr_to_utf8', conforencoding => 'PG_EUC_KR',
+ contoencoding => 'PG_UTF8', conproc => 'euc_kr_to_utf8' },
+{ oid => '4885', descr => 'conversion for UTF8 to EUC_KR',
+ conname => 'utf8_to_euc_kr', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_KR', conproc => 'utf8_to_euc_kr' },
+{ oid => '4886', descr => 'conversion for EUC_TW to UTF8',
+ conname => 'euc_tw_to_utf8', conforencoding => 'PG_EUC_TW',
+ contoencoding => 'PG_UTF8', conproc => 'euc_tw_to_utf8' },
+{ oid => '4887', descr => 'conversion for UTF8 to EUC_TW',
+ conname => 'utf8_to_euc_tw', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_TW', conproc => 'utf8_to_euc_tw' },
+{ oid => '4888', descr => 'conversion for GB18030 to UTF8',
+ conname => 'gb18030_to_utf8', conforencoding => 'PG_GB18030',
+ contoencoding => 'PG_UTF8', conproc => 'gb18030_to_utf8' },
+{ oid => '4889', descr => 'conversion for UTF8 to GB18030',
+ conname => 'utf8_to_gb18030', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_GB18030', conproc => 'utf8_to_gb18030' },
+{ oid => '4890', descr => 'conversion for GBK to UTF8',
+ conname => 'gbk_to_utf8', conforencoding => 'PG_GBK',
+ contoencoding => 'PG_UTF8', conproc => 'gbk_to_utf8' },
+{ oid => '4891', descr => 'conversion for UTF8 to GBK',
+ conname => 'utf8_to_gbk', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_GBK', conproc => 'utf8_to_gbk' },
+{ oid => '4892', descr => 'conversion for UTF8 to LATIN2',
+ conname => 'utf8_to_iso_8859_2', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN2', conproc => 'utf8_to_iso8859' },
+{ oid => '4893', descr => 'conversion for LATIN2 to UTF8',
+ conname => 'iso_8859_2_to_utf8', conforencoding => 'PG_LATIN2',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4894', descr => 'conversion for UTF8 to LATIN3',
+ conname => 'utf8_to_iso_8859_3', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN3', conproc => 'utf8_to_iso8859' },
+{ oid => '4895', descr => 'conversion for LATIN3 to UTF8',
+ conname => 'iso_8859_3_to_utf8', conforencoding => 'PG_LATIN3',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4896', descr => 'conversion for UTF8 to LATIN4',
+ conname => 'utf8_to_iso_8859_4', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN4', conproc => 'utf8_to_iso8859' },
+{ oid => '4897', descr => 'conversion for LATIN4 to UTF8',
+ conname => 'iso_8859_4_to_utf8', conforencoding => 'PG_LATIN4',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4898', descr => 'conversion for UTF8 to LATIN5',
+ conname => 'utf8_to_iso_8859_9', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN5', conproc => 'utf8_to_iso8859' },
+{ oid => '4899', descr => 'conversion for LATIN5 to UTF8',
+ conname => 'iso_8859_9_to_utf8', conforencoding => 'PG_LATIN5',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4900', descr => 'conversion for UTF8 to LATIN6',
+ conname => 'utf8_to_iso_8859_10', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN6', conproc => 'utf8_to_iso8859' },
+{ oid => '4901', descr => 'conversion for LATIN6 to UTF8',
+ conname => 'iso_8859_10_to_utf8', conforencoding => 'PG_LATIN6',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4902', descr => 'conversion for UTF8 to LATIN7',
+ conname => 'utf8_to_iso_8859_13', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN7', conproc => 'utf8_to_iso8859' },
+{ oid => '4903', descr => 'conversion for LATIN7 to UTF8',
+ conname => 'iso_8859_13_to_utf8', conforencoding => 'PG_LATIN7',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4904', descr => 'conversion for UTF8 to LATIN8',
+ conname => 'utf8_to_iso_8859_14', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN8', conproc => 'utf8_to_iso8859' },
+{ oid => '4905', descr => 'conversion for LATIN8 to UTF8',
+ conname => 'iso_8859_14_to_utf8', conforencoding => 'PG_LATIN8',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4906', descr => 'conversion for UTF8 to LATIN9',
+ conname => 'utf8_to_iso_8859_15', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN9', conproc => 'utf8_to_iso8859' },
+{ oid => '4907', descr => 'conversion for LATIN9 to UTF8',
+ conname => 'iso_8859_15_to_utf8', conforencoding => 'PG_LATIN9',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4908', descr => 'conversion for UTF8 to LATIN10',
+ conname => 'utf8_to_iso_8859_16', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN10', conproc => 'utf8_to_iso8859' },
+{ oid => '4909', descr => 'conversion for LATIN10 to UTF8',
+ conname => 'iso_8859_16_to_utf8', conforencoding => 'PG_LATIN10',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4910', descr => 'conversion for UTF8 to ISO-8859-5',
+ conname => 'utf8_to_iso_8859_5', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'utf8_to_iso8859' },
+{ oid => '4911', descr => 'conversion for ISO-8859-5 to UTF8',
+ conname => 'iso_8859_5_to_utf8', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4912', descr => 'conversion for UTF8 to ISO-8859-6',
+ conname => 'utf8_to_iso_8859_6', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_6', conproc => 'utf8_to_iso8859' },
+{ oid => '4913', descr => 'conversion for ISO-8859-6 to UTF8',
+ conname => 'iso_8859_6_to_utf8', conforencoding => 'PG_ISO_8859_6',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4914', descr => 'conversion for UTF8 to ISO-8859-7',
+ conname => 'utf8_to_iso_8859_7', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_7', conproc => 'utf8_to_iso8859' },
+{ oid => '4915', descr => 'conversion for ISO-8859-7 to UTF8',
+ conname => 'iso_8859_7_to_utf8', conforencoding => 'PG_ISO_8859_7',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4916', descr => 'conversion for UTF8 to ISO-8859-8',
+ conname => 'utf8_to_iso_8859_8', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_8', conproc => 'utf8_to_iso8859' },
+{ oid => '4917', descr => 'conversion for ISO-8859-8 to UTF8',
+ conname => 'iso_8859_8_to_utf8', conforencoding => 'PG_ISO_8859_8',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4918', descr => 'conversion for LATIN1 to UTF8',
+ conname => 'iso_8859_1_to_utf8', conforencoding => 'PG_LATIN1',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_1_to_utf8' },
+{ oid => '4919', descr => 'conversion for UTF8 to LATIN1',
+ conname => 'utf8_to_iso_8859_1', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN1', conproc => 'utf8_to_iso8859_1' },
+{ oid => '4920', descr => 'conversion for JOHAB to UTF8',
+ conname => 'johab_to_utf8', conforencoding => 'PG_JOHAB',
+ contoencoding => 'PG_UTF8', conproc => 'johab_to_utf8' },
+{ oid => '4921', descr => 'conversion for UTF8 to JOHAB',
+ conname => 'utf8_to_johab', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_JOHAB', conproc => 'utf8_to_johab' },
+{ oid => '4922', descr => 'conversion for SJIS to UTF8',
+ conname => 'sjis_to_utf8', conforencoding => 'PG_SJIS',
+ contoencoding => 'PG_UTF8', conproc => 'sjis_to_utf8' },
+{ oid => '4923', descr => 'conversion for UTF8 to SJIS',
+ conname => 'utf8_to_sjis', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_SJIS', conproc => 'utf8_to_sjis' },
+{ oid => '4924', descr => 'conversion for UHC to UTF8',
+ conname => 'uhc_to_utf8', conforencoding => 'PG_UHC',
+ contoencoding => 'PG_UTF8', conproc => 'uhc_to_utf8' },
+{ oid => '4925', descr => 'conversion for UTF8 to UHC',
+ conname => 'utf8_to_uhc', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_UHC', conproc => 'utf8_to_uhc' },
+{ oid => '4926', descr => 'conversion for EUC_JIS_2004 to UTF8',
+ conname => 'euc_jis_2004_to_utf8', conforencoding => 'PG_EUC_JIS_2004',
+ contoencoding => 'PG_UTF8', conproc => 'euc_jis_2004_to_utf8' },
+{ oid => '4927', descr => 'conversion for UTF8 to EUC_JIS_2004',
+ conname => 'utf8_to_euc_jis_2004', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_JIS_2004', conproc => 'utf8_to_euc_jis_2004' },
+{ oid => '4928', descr => 'conversion for SHIFT_JIS_2004 to UTF8',
+ conname => 'shift_jis_2004_to_utf8', conforencoding => 'PG_SHIFT_JIS_2004',
+ contoencoding => 'PG_UTF8', conproc => 'shift_jis_2004_to_utf8' },
+{ oid => '4929', descr => 'conversion for UTF8 to SHIFT_JIS_2004',
+ conname => 'utf8_to_shift_jis_2004', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_SHIFT_JIS_2004', conproc => 'utf8_to_shift_jis_2004' },
+{ oid => '4930', descr => 'conversion for EUC_JIS_2004 to SHIFT_JIS_2004',
+ conname => 'euc_jis_2004_to_shift_jis_2004',
+ conforencoding => 'PG_EUC_JIS_2004', contoencoding => 'PG_SHIFT_JIS_2004',
+ conproc => 'euc_jis_2004_to_shift_jis_2004' },
+{ oid => '4931', descr => 'conversion for SHIFT_JIS_2004 to EUC_JIS_2004',
+ conname => 'shift_jis_2004_to_euc_jis_2004',
+ conforencoding => 'PG_SHIFT_JIS_2004', contoencoding => 'PG_EUC_JIS_2004',
+ conproc => 'shift_jis_2004_to_euc_jis_2004' },
+
+]
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index 6e8f054306..9f31d41272 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -23,30 +23,41 @@
#include "catalog/objectaddress.h"
-/* ----------------------------------------------------------------
- * pg_conversion definition.
- *
- * cpp turns this into typedef struct FormData_pg_namespace
- *
- * conname name of the conversion
- * connamespace name space which the conversion belongs to
- * conowner owner of the conversion
- * conforencoding FOR encoding id
- * contoencoding TO encoding id
- * conproc OID of the conversion proc
- * condefault true if this is a default conversion
- * ----------------------------------------------------------------
+/* ----------------
+ * pg_conversion definition. cpp turns this into
+ * typedef struct FormData_pg_conversion
+ * ----------------
*/
CATALOG(pg_conversion,2607,ConversionRelationId)
{
- Oid oid; /* oid */
+ /* oid */
+ Oid oid;
+
+ /* name of the conversion */
NameData conname;
- Oid connamespace;
- Oid conowner;
- int32 conforencoding;
- int32 contoencoding;
- regproc conproc;
- bool condefault;
+
+ /* name space which the conversion belongs to */
+ Oid connamespace BKI_DEFAULT(PGNSP);
+
+ /* owner of the conversion */
+ Oid conowner BKI_DEFAULT(PGUID);
+
+ /*
+ * Note: The encoding lookups don't refer to other catalogs,
+ * but to values found in mb/pg_wchar.h
+ */
+
+ /* FOR encoding id */
+ int32 conforencoding BKI_LOOKUP(encoding);
+
+ /* TO encoding id */
+ int32 contoencoding BKI_LOOKUP(encoding);
+
+ /* OID of the conversion proc */
+ regproc conproc BKI_LOOKUP(pg_proc);
+
+ /* true if this is a default conversion */
+ bool condefault BKI_DEFAULT(t);
} FormData_pg_conversion;
/* ----------------
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 277cee6f5e..895071ead2 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -21,7 +21,7 @@
# Try to follow the style of existing functions' comments.
# Some recommended conventions:
-
+#
# "I/O" for typinput, typoutput, typreceive, typsend functions
# "I/O typmod" for typmodin, typmodout functions
# "aggregate transition function" for aggtransfn functions, unless
@@ -10048,4 +10048,412 @@
proargnames => '{rootrelid,relid,parentrelid,isleaf,level}',
prosrc => 'pg_partition_tree' },
+# conversion functions
+{ oid => '4600',
+ descr => 'internal conversion function for SQL_ASCII to MULE_INTERNAL',
+ proname => 'ascii_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'ascii_to_mic',
+ probin => '$libdir/ascii_and_mic' },
+{ oid => '4601',
+ descr => 'internal conversion function for MULE_INTERNAL to SQL_ASCII',
+ proname => 'mic_to_ascii', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_ascii',
+ probin => '$libdir/ascii_and_mic' },
+{ oid => '4602',
+ descr => 'internal conversion function for KOI8R to MULE_INTERNAL',
+ proname => 'koi8r_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4603',
+ descr => 'internal conversion function for MULE_INTERNAL to KOI8R',
+ proname => 'mic_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_koi8r',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4604',
+ descr => 'internal conversion function for ISO-8859-5 to MULE_INTERNAL',
+ proname => 'iso_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4605',
+ descr => 'internal conversion function for MULE_INTERNAL to ISO-8859-5',
+ proname => 'mic_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4606',
+ descr => 'internal conversion function for WIN1251 to MULE_INTERNAL',
+ proname => 'win1251_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win1251_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4607',
+ descr => 'internal conversion function for MULE_INTERNAL to WIN1251',
+ proname => 'mic_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_win1251',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4608',
+ descr => 'internal conversion function for WIN866 to MULE_INTERNAL',
+ proname => 'win866_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win866_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4609',
+ descr => 'internal conversion function for MULE_INTERNAL to WIN866',
+ proname => 'mic_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_win866',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4610', descr => 'internal conversion function for KOI8R to WIN1251',
+ proname => 'koi8r_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'koi8r_to_win1251', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4611', descr => 'internal conversion function for WIN1251 to KOI8R',
+ proname => 'win1251_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win1251_to_koi8r', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4612', descr => 'internal conversion function for KOI8R to WIN866',
+ proname => 'koi8r_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_win866',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4613', descr => 'internal conversion function for WIN866 to KOI8R',
+ proname => 'win866_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win866_to_koi8r',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4614',
+ descr => 'internal conversion function for WIN866 to WIN1251',
+ proname => 'win866_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win866_to_win1251', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4615',
+ descr => 'internal conversion function for WIN1251 to WIN866',
+ proname => 'win1251_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win1251_to_win866', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4616',
+ descr => 'internal conversion function for ISO-8859-5 to KOI8R',
+ proname => 'iso_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_koi8r',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4617',
+ descr => 'internal conversion function for KOI8R to ISO-8859-5',
+ proname => 'koi8r_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4618',
+ descr => 'internal conversion function for ISO-8859-5 to WIN1251',
+ proname => 'iso_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_win1251',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4619',
+ descr => 'internal conversion function for WIN1251 to ISO-8859-5',
+ proname => 'win1251_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win1251_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4620',
+ descr => 'internal conversion function for ISO-8859-5 to WIN866',
+ proname => 'iso_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_win866',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4621',
+ descr => 'internal conversion function for WIN866 to ISO-8859-5',
+ proname => 'win866_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win866_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4622',
+ descr => 'internal conversion function for EUC_CN to MULE_INTERNAL',
+ proname => 'euc_cn_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_cn_to_mic',
+ probin => '$libdir/euc_cn_and_mic' },
+{ oid => '4623',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_CN',
+ proname => 'mic_to_euc_cn', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_cn',
+ probin => '$libdir/euc_cn_and_mic' },
+{ oid => '4624', descr => 'internal conversion function for EUC_JP to SJIS',
+ proname => 'euc_jp_to_sjis', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_jp_to_sjis',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4625', descr => 'internal conversion function for SJIS to EUC_JP',
+ proname => 'sjis_to_euc_jp', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'sjis_to_euc_jp',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4626',
+ descr => 'internal conversion function for EUC_JP to MULE_INTERNAL',
+ proname => 'euc_jp_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_jp_to_mic',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4627',
+ descr => 'internal conversion function for SJIS to MULE_INTERNAL',
+ proname => 'sjis_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'sjis_to_mic',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4628',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_JP',
+ proname => 'mic_to_euc_jp', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_jp',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4629',
+ descr => 'internal conversion function for MULE_INTERNAL to SJIS',
+ proname => 'mic_to_sjis', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_sjis',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4630',
+ descr => 'internal conversion function for EUC_KR to MULE_INTERNAL',
+ proname => 'euc_kr_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_kr_to_mic',
+ probin => '$libdir/euc_kr_and_mic' },
+{ oid => '4631',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_KR',
+ proname => 'mic_to_euc_kr', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_kr',
+ probin => '$libdir/euc_kr_and_mic' },
+{ oid => '4632', descr => 'internal conversion function for EUC_TW to BIG5',
+ proname => 'euc_tw_to_big5', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_tw_to_big5',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4633', descr => 'internal conversion function for BIG5 to EUC_TW',
+ proname => 'big5_to_euc_tw', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'big5_to_euc_tw',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4634',
+ descr => 'internal conversion function for EUC_TW to MULE_INTERNAL',
+ proname => 'euc_tw_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_tw_to_mic',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4635',
+ descr => 'internal conversion function for BIG5 to MULE_INTERNAL',
+ proname => 'big5_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'big5_to_mic',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4636',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_TW',
+ proname => 'mic_to_euc_tw', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_tw',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4637',
+ descr => 'internal conversion function for MULE_INTERNAL to BIG5',
+ proname => 'mic_to_big5', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_big5',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4638',
+ descr => 'internal conversion function for LATIN2 to MULE_INTERNAL',
+ proname => 'latin2_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin2_to_mic',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4639',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN2',
+ proname => 'mic_to_latin2', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin2',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4640',
+ descr => 'internal conversion function for WIN1250 to MULE_INTERNAL',
+ proname => 'win1250_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win1250_to_mic',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4641',
+ descr => 'internal conversion function for MULE_INTERNAL to WIN1250',
+ proname => 'mic_to_win1250', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_win1250',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4642',
+ descr => 'internal conversion function for LATIN2 to WIN1250',
+ proname => 'latin2_to_win1250', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'latin2_to_win1250', probin => '$libdir/latin2_and_win1250' },
+{ oid => '4643',
+ descr => 'internal conversion function for WIN1250 to LATIN2',
+ proname => 'win1250_to_latin2', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win1250_to_latin2', probin => '$libdir/latin2_and_win1250' },
+{ oid => '4644',
+ descr => 'internal conversion function for LATIN1 to MULE_INTERNAL',
+ proname => 'latin1_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin1_to_mic',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4645',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN1',
+ proname => 'mic_to_latin1', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin1',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4646',
+ descr => 'internal conversion function for LATIN3 to MULE_INTERNAL',
+ proname => 'latin3_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin3_to_mic',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4647',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN3',
+ proname => 'mic_to_latin3', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin3',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4648',
+ descr => 'internal conversion function for LATIN4 to MULE_INTERNAL',
+ proname => 'latin4_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin4_to_mic',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4649',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN4',
+ proname => 'mic_to_latin4', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin4',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4650',
+ descr => 'internal conversion function for SQL_ASCII to UTF8',
+ proname => 'ascii_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'ascii_to_utf8',
+ probin => '$libdir/utf8_and_ascii' },
+{ oid => '4651',
+ descr => 'internal conversion function for UTF8 to SQL_ASCII',
+ proname => 'utf8_to_ascii', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_ascii',
+ probin => '$libdir/utf8_and_ascii' },
+{ oid => '4652', descr => 'internal conversion function for BIG5 to UTF8',
+ proname => 'big5_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'big5_to_utf8',
+ probin => '$libdir/utf8_and_big5' },
+{ oid => '4653', descr => 'internal conversion function for UTF8 to BIG5',
+ proname => 'utf8_to_big5', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_big5',
+ probin => '$libdir/utf8_and_big5' },
+{ oid => '4654', descr => 'internal conversion function for UTF8 to KOI8R',
+ proname => 'utf8_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_koi8r',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4655', descr => 'internal conversion function for KOI8R to UTF8',
+ proname => 'koi8r_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_utf8',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4656', descr => 'internal conversion function for UTF8 to KOI8U',
+ proname => 'utf8_to_koi8u', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_koi8u',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4657', descr => 'internal conversion function for KOI8U to UTF8',
+ proname => 'koi8u_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8u_to_utf8',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4658', descr => 'internal conversion function for UTF8 to WIN',
+ proname => 'utf8_to_win', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_win',
+ probin => '$libdir/utf8_and_win' },
+{ oid => '4659', descr => 'internal conversion function for WIN to UTF8',
+ proname => 'win_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win_to_utf8',
+ probin => '$libdir/utf8_and_win' },
+{ oid => '4660', descr => 'internal conversion function for EUC_CN to UTF8',
+ proname => 'euc_cn_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_cn_to_utf8',
+ probin => '$libdir/utf8_and_euc_cn' },
+{ oid => '4661', descr => 'internal conversion function for UTF8 to EUC_CN',
+ proname => 'utf8_to_euc_cn', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_cn',
+ probin => '$libdir/utf8_and_euc_cn' },
+{ oid => '4662', descr => 'internal conversion function for EUC_JP to UTF8',
+ proname => 'euc_jp_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_jp_to_utf8',
+ probin => '$libdir/utf8_and_euc_jp' },
+{ oid => '4663', descr => 'internal conversion function for UTF8 to EUC_JP',
+ proname => 'utf8_to_euc_jp', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_jp',
+ probin => '$libdir/utf8_and_euc_jp' },
+{ oid => '4664', descr => 'internal conversion function for EUC_KR to UTF8',
+ proname => 'euc_kr_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_kr_to_utf8',
+ probin => '$libdir/utf8_and_euc_kr' },
+{ oid => '4665', descr => 'internal conversion function for UTF8 to EUC_KR',
+ proname => 'utf8_to_euc_kr', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_kr',
+ probin => '$libdir/utf8_and_euc_kr' },
+{ oid => '4666', descr => 'internal conversion function for EUC_TW to UTF8',
+ proname => 'euc_tw_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_tw_to_utf8',
+ probin => '$libdir/utf8_and_euc_tw' },
+{ oid => '4667', descr => 'internal conversion function for UTF8 to EUC_TW',
+ proname => 'utf8_to_euc_tw', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_tw',
+ probin => '$libdir/utf8_and_euc_tw' },
+{ oid => '4668', descr => 'internal conversion function for GB18030 to UTF8',
+ proname => 'gb18030_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'gb18030_to_utf8',
+ probin => '$libdir/utf8_and_gb18030' },
+{ oid => '4669', descr => 'internal conversion function for UTF8 to GB18030',
+ proname => 'utf8_to_gb18030', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_gb18030',
+ probin => '$libdir/utf8_and_gb18030' },
+{ oid => '4670', descr => 'internal conversion function for GBK to UTF8',
+ proname => 'gbk_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'gbk_to_utf8',
+ probin => '$libdir/utf8_and_gbk' },
+{ oid => '4671', descr => 'internal conversion function for UTF8 to GBK',
+ proname => 'utf8_to_gbk', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_gbk',
+ probin => '$libdir/utf8_and_gbk' },
+{ oid => '4672',
+ descr => 'internal conversion function for UTF8 to ISO-8859 2-16',
+ proname => 'utf8_to_iso8859', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_iso8859',
+ probin => '$libdir/utf8_and_iso8859' },
+{ oid => '4673',
+ descr => 'internal conversion function for ISO-8859 2-16 to UTF8',
+ proname => 'iso8859_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso8859_to_utf8',
+ probin => '$libdir/utf8_and_iso8859' },
+{ oid => '4674', descr => 'internal conversion function for LATIN1 to UTF8',
+ proname => 'iso8859_1_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'iso8859_1_to_utf8', probin => '$libdir/utf8_and_iso8859_1' },
+{ oid => '4675', descr => 'internal conversion function for UTF8 to LATIN1',
+ proname => 'utf8_to_iso8859_1', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'utf8_to_iso8859_1', probin => '$libdir/utf8_and_iso8859_1' },
+{ oid => '4676', descr => 'internal conversion function for JOHAB to UTF8',
+ proname => 'johab_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'johab_to_utf8',
+ probin => '$libdir/utf8_and_johab' },
+{ oid => '4677', descr => 'internal conversion function for UTF8 to JOHAB',
+ proname => 'utf8_to_johab', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_johab',
+ probin => '$libdir/utf8_and_johab' },
+{ oid => '4678', descr => 'internal conversion function for SJIS to UTF8',
+ proname => 'sjis_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'sjis_to_utf8',
+ probin => '$libdir/utf8_and_sjis' },
+{ oid => '4679', descr => 'internal conversion function for UTF8 to SJIS',
+ proname => 'utf8_to_sjis', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_sjis',
+ probin => '$libdir/utf8_and_sjis' },
+{ oid => '4680', descr => 'internal conversion function for UHC to UTF8',
+ proname => 'uhc_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'uhc_to_utf8',
+ probin => '$libdir/utf8_and_uhc' },
+{ oid => '4681', descr => 'internal conversion function for UTF8 to UHC',
+ proname => 'utf8_to_uhc', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_uhc',
+ probin => '$libdir/utf8_and_uhc' },
+{ oid => '4682',
+ descr => 'internal conversion function for EUC_JIS_2004 to UTF8',
+ proname => 'euc_jis_2004_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'euc_jis_2004_to_utf8', probin => '$libdir/utf8_and_euc2004' },
+{ oid => '4683',
+ descr => 'internal conversion function for UTF8 to EUC_JIS_2004',
+ proname => 'utf8_to_euc_jis_2004', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'utf8_to_euc_jis_2004', probin => '$libdir/utf8_and_euc2004' },
+{ oid => '4684',
+ descr => 'internal conversion function for SHIFT_JIS_2004 to UTF8',
+ proname => 'shift_jis_2004_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'shift_jis_2004_to_utf8', probin => '$libdir/utf8_and_sjis2004' },
+{ oid => '4685',
+ descr => 'internal conversion function for UTF8 to SHIFT_JIS_2004',
+ proname => 'utf8_to_shift_jis_2004', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'utf8_to_shift_jis_2004', probin => '$libdir/utf8_and_sjis2004' },
+{ oid => '4686',
+ descr => 'internal conversion function for EUC_JIS_2004 to SHIFT_JIS_2004',
+ proname => 'euc_jis_2004_to_shift_jis_2004', prolang => 'c',
+ prorettype => 'void', proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'euc_jis_2004_to_shift_jis_2004',
+ probin => '$libdir/euc2004_sjis2004' },
+{ oid => '4687',
+ descr => 'internal conversion function for SHIFT_JIS_2004 to EUC_JIS_2004',
+ proname => 'shift_jis_2004_to_euc_jis_2004', prolang => 'c',
+ prorettype => 'void', proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'shift_jis_2004_to_euc_jis_2004',
+ probin => '$libdir/euc2004_sjis2004' },
+
]
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 1d4b000acf..8538173ff8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -74,7 +74,6 @@ loop
end loop;
end$$;
NOTICE: pg_constraint contains unpinned initdb-created object(s)
-NOTICE: pg_conversion contains unpinned initdb-created object(s)
NOTICE: pg_database contains unpinned initdb-created object(s)
NOTICE: pg_extension contains unpinned initdb-created object(s)
NOTICE: pg_rewrite contains unpinned initdb-created object(s)
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 7e1c9ac848..7494bfa004 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -139,7 +139,6 @@ sub Install
CopyFiles(
'Error code data', $target . '/share/',
'src/backend/utils/', 'errcodes.txt');
- GenerateConversionScript($target);
GenerateTimezoneFiles($target, $conf);
GenerateTsearchFiles($target);
CopySetOfFiles(
@@ -348,44 +347,6 @@ sub CopySolutionOutput
return;
}
-sub GenerateConversionScript
-{
- my $target = shift;
- my $sql = "";
- my $F;
-
- print "Generating conversion proc script...";
- my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
- $mf =~ s{\\\r?\n}{}g;
- $mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
- || die "Could not find CONVERSIONS line in conversions Makefile\n";
- my @pieces = split /\s+/, $1;
- while ($#pieces > 0)
- {
- my $name = shift @pieces;
- my $se = shift @pieces;
- my $de = shift @pieces;
- my $func = shift @pieces;
- my $obj = shift @pieces;
- $sql .= "-- $se --> $de\n";
- $sql .=
- "CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
- $sql .=
- "COMMENT ON FUNCTION $func(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) IS 'internal conversion function for $se to $de';\n";
- $sql .= "DROP CONVERSION pg_catalog.$name;\n";
- $sql .=
- "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
- $sql .=
- "COMMENT ON CONVERSION pg_catalog.$name IS 'conversion for $se to $de';\n\n";
- }
- open($F, '>', "$target/share/conversion_create.sql")
- || die "Could not write to conversion_create.sql\n";
- print $F $sql;
- close($F);
- print "\n";
- return;
-}
-
sub GenerateTimezoneFiles
{
my $target = shift;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index bb9031a4e5..b5e8710133 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -491,7 +491,9 @@ EOF
{
chdir('src/backend/catalog');
my $bki_srcs = join(' ../../../src/include/catalog/', @bki_srcs);
- system("perl genbki.pl --set-version=$self->{majorver} $bki_srcs");
+ system(
+"perl genbki.pl -I ../../../src/include/ --set-version=$self->{majorver} $bki_srcs"
+ );
open(my $f, '>', 'bki-stamp')
|| confess "Could not touch bki-stamp";
close($f);
--
2.17.1
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: inconsistency and inefficiency in setup_conversion()
@ 2018-12-01 12:26 Dmitry Dolgov <[email protected]>
parent: John Naylor <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Dmitry Dolgov @ 2018-12-01 12:26 UTC (permalink / raw)
To: [email protected]; +Cc: pgsql-hackers; [email protected]
> On Mon, Nov 26, 2018 at 9:31 AM John Naylor <[email protected]> wrote:
>
> v7 is a rebase over recent catalog changes.
Thanks for working on this,
I see that the author keeps patch updated, but I'm a bit worried because of
lack of full review since probably May. I'm moving it to the next CF, let's see
if there would be more feedback.
P.S. adding Daniel, since he is assigned as a reviewer.
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: inconsistency and inefficiency in setup_conversion()
@ 2018-12-14 21:28 John Naylor <[email protected]>
parent: Dmitry Dolgov <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: John Naylor @ 2018-12-14 21:28 UTC (permalink / raw)
To: pgsql-hackers
On 12/1/18, Dmitry Dolgov <[email protected]> wrote:
> I see that the author keeps patch updated, but I'm a bit worried because of
> lack of full review since probably May. I'm moving it to the next CF, let's
> see
> if there would be more feedback.
>
> P.S. adding Daniel, since he is assigned as a reviewer.
Having heard nothing in a while, I've removed Daniel as a reviewer to
make room for someone else. He is, of course free to re-add himself.
v8 is attached.
Since it's been a few months since last discussion, I'd like to
summarize the purpose of this patch and advocate for its inclusion in
v12:
1. Correctness
In the intro thread [1], I showed that object comments on some
conversions are wrong, and hard to fix given the current setup. This
is a documentation bug of sorts.
2. Clean-up
Currently, utils/mb/conversion_procs/Makefile has an ad-hoc script to
generate the SQL file, which has to be duplicated in the MSVC tooling,
and executed by initdb.c. Storing the conversions in .dat files
removes the need for any of that.
3. Performance
This patch shaves 5-6% off of initdb. Not as much as hoped, but still
a nice bonus.
[1] https://www.postgresql.org/message-id/CAJVSVGWtUqxpfAaxS88vEGvi%2BjKzWZb2EStu5io-UPc4p9rSJg%40mail.g...
--John Naylor
Attachments:
[text/x-patch] v8-0001-Add-pg_language-lookup.patch (25.2K, ../../CAJVSVGWnoXG-xU5YyVH1G0cMOiqVAUc93GQzTv_2T0PsGQsMSQ@mail.gmail.com/2-v8-0001-Add-pg_language-lookup.patch)
download | inline diff:
From bdbdb36129708d1d417f8db9009b377c3d4e3e90 Mon Sep 17 00:00:00 2001
From: John Naylor <[email protected]>
Date: Fri, 14 Dec 2018 15:19:54 -0500
Subject: [PATCH v8 1/2] Add pg_language lookup.
This didn't seem worth doing before, but an upcoming commit will add
88 entries to pg_proc whose languge is 'c'. In addition, we can
now use 'internal' in Gen_fmgr.pl instead of looking up the OID.
This simplifies that script and its Makefile a bit.
---
doc/src/sgml/bki.sgml | 6 +--
src/backend/catalog/genbki.pl | 8 +++
src/backend/utils/Gen_fmgrtab.pl | 7 ++-
src/backend/utils/Makefile | 8 +--
src/include/catalog/pg_proc.dat | 92 ++++++++++++++++----------------
src/include/catalog/pg_proc.h | 2 +-
src/tools/msvc/Solution.pm | 4 +-
7 files changed, 64 insertions(+), 63 deletions(-)
diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml
index 786abb95d4..37bb7a2346 100644
--- a/doc/src/sgml/bki.sgml
+++ b/doc/src/sgml/bki.sgml
@@ -409,8 +409,8 @@
that's error-prone and hard to understand, so for frequently-referenced
catalogs, <filename>genbki.pl</filename> provides mechanisms to write
symbolic references instead. Currently this is possible for references
- to access methods, functions, operators, opclasses, opfamilies, and
- types. The rules are as follows:
+ to access methods, functions, languages, operators, opclasses, opfamilies,
+ and types. The rules are as follows:
</para>
<itemizedlist>
@@ -420,7 +420,7 @@
Use of symbolic references is enabled in a particular catalog column
by attaching <literal>BKI_LOOKUP(<replaceable>lookuprule</replaceable>)</literal>
to the column's definition, where <replaceable>lookuprule</replaceable>
- is <literal>pg_am</literal>, <literal>pg_proc</literal>,
+ is <literal>pg_am</literal>, <literal>pg_proc</literal>, <literal>pg_language</literal>,
<literal>pg_operator</literal>, <literal>pg_opclass</literal>,
<literal>pg_opfamily</literal>, or <literal>pg_type</literal>.
<literal>BKI_LOOKUP</literal> can be attached to columns of
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 8e2a2480be..8ccfcb7724 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -182,6 +182,13 @@ foreach my $row (@{ $catalog_data{pg_am} })
$amoids{ $row->{amname} } = $row->{oid};
}
+# language OID lookup
+my %langoids;
+foreach my $row (@{ $catalog_data{pg_language} })
+{
+ $langoids{ $row->{lanname} } = $row->{oid};
+}
+
# opclass OID lookup
my %opcoids;
foreach my $row (@{ $catalog_data{pg_opclass} })
@@ -256,6 +263,7 @@ foreach my $row (@{ $catalog_data{pg_type} })
# Map catalog name to OID lookup.
my %lookup_kind = (
pg_am => \%amoids,
+ pg_language => \%langoids,
pg_opclass => \%opcoids,
pg_operator => \%operoids,
pg_opfamily => \%opfoids,
diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
index ed16737a6a..b6809c7277 100644
--- a/src/backend/utils/Gen_fmgrtab.pl
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -59,6 +59,8 @@ die "No include path; you must specify -I.\n" if !$include_path;
# Note: We pass data file names as arguments and then look for matching
# headers to parse the schema from. This is backwards from genbki.pl,
# but the Makefile dependencies look more sensible this way.
+# We currently only need pg_proc, but retain the possibility of reading
+# more than one data file.
my %catalogs;
my %catalog_data;
foreach my $datfile (@input_files)
@@ -82,9 +84,6 @@ foreach my $datfile (@input_files)
my $FirstGenbkiObjectId =
Catalog::FindDefinedSymbol('access/transam.h', $include_path,
'FirstGenbkiObjectId');
-my $INTERNALlanguageId =
- Catalog::FindDefinedSymbolFromData($catalog_data{pg_language},
- 'INTERNALlanguageId');
# Collect certain fields from pg_proc.dat.
my @fmgr = ();
@@ -94,7 +93,7 @@ foreach my $row (@{ $catalog_data{pg_proc} })
my %bki_values = %$row;
# Select out just the rows for internal-language procedures.
- next if $bki_values{prolang} ne $INTERNALlanguageId;
+ next if $bki_values{prolang} ne 'internal';
push @fmgr,
{
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index e797539d09..da40f6b6c4 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -31,15 +31,11 @@ generated-header-symlinks: $(top_builddir)/src/include/utils/header-stamp $(top_
$(SUBDIRS:%=%-recursive): fmgr-stamp errcodes.h
-FMGR_DATA := $(addprefix $(top_srcdir)/src/include/catalog/,\
- pg_language.dat pg_proc.dat \
- )
-
# fmgr-stamp records the last time we ran Gen_fmgrtab.pl. We don't rely on
# the timestamps of the individual output files, because the Perl script
# won't update them if they didn't change (to avoid unnecessary recompiles).
-fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(FMGR_DATA) $(top_srcdir)/src/include/access/transam.h
- $(PERL) -I $(catalogdir) $< -I $(top_srcdir)/src/include/ $(FMGR_DATA)
+fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.dat $(top_srcdir)/src/include/access/transam.h
+ $(PERL) -I $(catalogdir) $< -I $(top_srcdir)/src/include/ $(top_srcdir)/src/include/catalog/pg_proc.dat
touch $@
errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index f79fcfe029..c8c27948f0 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -2210,7 +2210,7 @@
proname => 'justify_days', prorettype => 'interval',
proargtypes => 'interval', prosrc => 'interval_justify_days' },
{ oid => '1176', descr => 'convert date and time to timestamp with time zone',
- proname => 'timestamptz', prolang => '14', provolatile => 's',
+ proname => 'timestamptz', prolang => 'sql', provolatile => 's',
prorettype => 'timestamptz', proargtypes => 'date time',
prosrc => 'select cast(($1 + $2) as timestamp with time zone)' },
{ oid => '1178', descr => 'convert timestamp with time zone to date',
@@ -2263,16 +2263,16 @@
prosrc => 'interval_scale' },
{ oid => '1215', descr => 'get description for object id and catalog name',
- proname => 'obj_description', prolang => '14', procost => '100',
+ proname => 'obj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid name',
prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP) and objsubid = 0' },
{ oid => '1216', descr => 'get description for table column',
- proname => 'col_description', prolang => '14', procost => '100',
+ proname => 'col_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid int4',
prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and classoid = \'pg_catalog.pg_class\'::pg_catalog.regclass and objsubid = $2' },
{ oid => '1993',
descr => 'get description for object id and shared catalog name',
- proname => 'shobj_description', prolang => '14', procost => '100',
+ proname => 'shobj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid name',
prosrc => 'select description from pg_catalog.pg_shdescription where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP)' },
@@ -2439,13 +2439,13 @@
prosrc => 'tidsmaller' },
{ oid => '1296',
- proname => 'timedate_pl', prolang => '14', prorettype => 'timestamp',
+ proname => 'timedate_pl', prolang => 'sql', prorettype => 'timestamp',
proargtypes => 'time date', prosrc => 'select ($2 + $1)' },
{ oid => '1297',
proname => 'datetimetz_pl', prorettype => 'timestamptz',
proargtypes => 'date timetz', prosrc => 'datetimetz_timestamptz' },
{ oid => '1298',
- proname => 'timetzdate_pl', prolang => '14', prorettype => 'timestamptz',
+ proname => 'timetzdate_pl', prolang => 'sql', prorettype => 'timestamptz',
proargtypes => 'timetz date', prosrc => 'select ($2 + $1)' },
{ oid => '1299', descr => 'current transaction time',
proname => 'now', provolatile => 's', prorettype => 'timestamptz',
@@ -2487,17 +2487,17 @@
proargtypes => 'timestamptz timestamptz timestamptz timestamptz',
prosrc => 'overlaps_timestamp' },
{ oid => '1305', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'bool',
proargtypes => 'timestamptz interval timestamptz interval',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))' },
{ oid => '1306', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'bool',
proargtypes => 'timestamptz timestamptz timestamptz interval',
prosrc => 'select ($1, $2) overlaps ($3, ($3 + $4))' },
{ oid => '1307', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'bool',
proargtypes => 'timestamptz interval timestamptz timestamptz',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, $4)' },
@@ -2506,15 +2506,15 @@
proname => 'overlaps', proisstrict => 'f', prorettype => 'bool',
proargtypes => 'time time time time', prosrc => 'overlaps_time' },
{ oid => '1309', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'time interval time interval',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))' },
{ oid => '1310', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'time time time interval',
prosrc => 'select ($1, $2) overlaps ($3, ($3 + $4))' },
{ oid => '1311', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'time interval time time',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, $4)' },
@@ -2592,7 +2592,7 @@
# This form of obj_description is now deprecated, since it will fail if
# OIDs are not unique across system catalogs. Use the other form instead.
{ oid => '1348', descr => 'deprecated, use two-argument form instead',
- proname => 'obj_description', prolang => '14', procost => '100',
+ proname => 'obj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid',
prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and objsubid = 0' },
@@ -2676,7 +2676,7 @@
prosrc => 'textlen' },
{ oid => '1384', descr => 'extract field from date',
- proname => 'date_part', prolang => '14', prorettype => 'float8',
+ proname => 'date_part', prolang => 'sql', prorettype => 'float8',
proargtypes => 'text date',
prosrc => 'select pg_catalog.date_part($1, cast($2 as timestamp without time zone))' },
{ oid => '1385', descr => 'extract field from time',
@@ -2684,7 +2684,7 @@
prosrc => 'time_part' },
{ oid => '1386',
descr => 'date difference from today preserving months and years',
- proname => 'age', prolang => '14', provolatile => 's',
+ proname => 'age', prolang => 'sql', provolatile => 's',
prorettype => 'interval', proargtypes => 'timestamptz',
prosrc => 'select pg_catalog.age(cast(current_date as timestamp with time zone), $1)' },
@@ -2799,7 +2799,7 @@
proname => 'box_div', prorettype => 'box', proargtypes => 'box point',
prosrc => 'box_div' },
{ oid => '1426',
- proname => 'path_contain_pt', prolang => '14', prorettype => 'bool',
+ proname => 'path_contain_pt', prolang => 'sql', prorettype => 'bool',
proargtypes => 'path point', prosrc => 'select pg_catalog.on_ppath($2, $1)' },
{ oid => '1428',
proname => 'poly_contain_pt', prorettype => 'bool',
@@ -3059,7 +3059,7 @@
proname => 'center', prorettype => 'point', proargtypes => 'circle',
prosrc => 'circle_center' },
{ oid => '1544', descr => 'convert circle to 12-vertex polygon',
- proname => 'polygon', prolang => '14', prorettype => 'polygon',
+ proname => 'polygon', prolang => 'sql', prorettype => 'polygon',
proargtypes => 'circle', prosrc => 'select pg_catalog.polygon(12, $1)' },
{ oid => '1545', descr => 'number of points',
proname => 'npoints', prorettype => 'int4', proargtypes => 'path',
@@ -3326,11 +3326,11 @@
proname => 'translate', prorettype => 'text', proargtypes => 'text text text',
prosrc => 'translate' },
{ oid => '879', descr => 'left-pad string to length',
- proname => 'lpad', prolang => '14', prorettype => 'text',
+ proname => 'lpad', prolang => 'sql', prorettype => 'text',
proargtypes => 'text int4',
prosrc => 'select pg_catalog.lpad($1, $2, \' \')' },
{ oid => '880', descr => 'right-pad string to length',
- proname => 'rpad', prolang => '14', prorettype => 'text',
+ proname => 'rpad', prolang => 'sql', prorettype => 'text',
proargtypes => 'text int4',
prosrc => 'select pg_catalog.rpad($1, $2, \' \')' },
{ oid => '881', descr => 'trim spaces from left end of string',
@@ -3915,7 +3915,7 @@
proname => 'inetpl', prorettype => 'inet', proargtypes => 'inet int8',
prosrc => 'inetpl' },
{ oid => '2631',
- proname => 'int8pl_inet', prolang => '14', prorettype => 'inet',
+ proname => 'int8pl_inet', prolang => 'sql', prorettype => 'inet',
proargtypes => 'int8 inet', prosrc => 'select $2 + $1' },
{ oid => '2632',
proname => 'inetmi_int8', prorettype => 'inet', proargtypes => 'inet int8',
@@ -4047,13 +4047,13 @@
proname => 'round', prorettype => 'numeric', proargtypes => 'numeric int4',
prosrc => 'numeric_round' },
{ oid => '1708', descr => 'value rounded to \'scale\' of zero',
- proname => 'round', prolang => '14', prorettype => 'numeric',
+ proname => 'round', prolang => 'sql', prorettype => 'numeric',
proargtypes => 'numeric', prosrc => 'select pg_catalog.round($1,0)' },
{ oid => '1709', descr => 'value truncated to \'scale\'',
proname => 'trunc', prorettype => 'numeric', proargtypes => 'numeric int4',
prosrc => 'numeric_trunc' },
{ oid => '1710', descr => 'value truncated to \'scale\' of zero',
- proname => 'trunc', prolang => '14', prorettype => 'numeric',
+ proname => 'trunc', prolang => 'sql', prorettype => 'numeric',
proargtypes => 'numeric', prosrc => 'select pg_catalog.trunc($1,0)' },
{ oid => '1711', descr => 'nearest integer >= value',
proname => 'ceil', prorettype => 'numeric', proargtypes => 'numeric',
@@ -4140,7 +4140,7 @@
proname => 'numeric', prorettype => 'numeric', proargtypes => 'int4',
prosrc => 'int4_numeric' },
{ oid => '1741', descr => 'base 10 logarithm',
- proname => 'log', prolang => '14', prorettype => 'numeric',
+ proname => 'log', prolang => 'sql', prorettype => 'numeric',
proargtypes => 'numeric', prosrc => 'select pg_catalog.log(10, $1)' },
{ oid => '1742', descr => 'convert float4 to numeric',
proname => 'numeric', prorettype => 'numeric', proargtypes => 'float4',
@@ -4273,7 +4273,7 @@
proname => 'quote_literal', prorettype => 'text', proargtypes => 'text',
prosrc => 'quote_literal' },
{ oid => '1285', descr => 'quote a data value for usage in a querystring',
- proname => 'quote_literal', prolang => '14', provolatile => 's',
+ proname => 'quote_literal', prolang => 'sql', provolatile => 's',
prorettype => 'text', proargtypes => 'anyelement',
prosrc => 'select pg_catalog.quote_literal($1::pg_catalog.text)' },
{ oid => '1289',
@@ -4282,7 +4282,7 @@
proargtypes => 'text', prosrc => 'quote_nullable' },
{ oid => '1290',
descr => 'quote a possibly-null data value for usage in a querystring',
- proname => 'quote_nullable', prolang => '14', proisstrict => 'f',
+ proname => 'quote_nullable', prolang => 'sql', proisstrict => 'f',
provolatile => 's', prorettype => 'text', proargtypes => 'anyelement',
prosrc => 'select pg_catalog.quote_nullable($1::pg_catalog.text)' },
@@ -4321,13 +4321,13 @@
prorettype => 'text', proargtypes => 'text', prosrc => 'text_format_nv' },
{ oid => '1810', descr => 'length in bits',
- proname => 'bit_length', prolang => '14', prorettype => 'int4',
+ proname => 'bit_length', prolang => 'sql', prorettype => 'int4',
proargtypes => 'bytea', prosrc => 'select pg_catalog.octet_length($1) * 8' },
{ oid => '1811', descr => 'length in bits',
- proname => 'bit_length', prolang => '14', prorettype => 'int4',
+ proname => 'bit_length', prolang => 'sql', prorettype => 'int4',
proargtypes => 'text', prosrc => 'select pg_catalog.octet_length($1) * 8' },
{ oid => '1812', descr => 'length in bits',
- proname => 'bit_length', prolang => '14', prorettype => 'int4',
+ proname => 'bit_length', prolang => 'sql', prorettype => 'int4',
proargtypes => 'bit', prosrc => 'select pg_catalog.length($1)' },
# Selectivity estimators for LIKE and related operators
@@ -4646,7 +4646,7 @@
prosrc => 'to_ascii_encname' },
{ oid => '1848',
- proname => 'interval_pl_time', prolang => '14', prorettype => 'time',
+ proname => 'interval_pl_time', prolang => 'sql', prorettype => 'time',
proargtypes => 'interval time', prosrc => 'select $2 + $1' },
{ oid => '1850',
@@ -5426,11 +5426,11 @@
proargtypes => 'timetz int4', prosrc => 'timetz_scale' },
{ oid => '2003',
- proname => 'textanycat', prolang => '14', provolatile => 's',
+ proname => 'textanycat', prolang => 'sql', provolatile => 's',
prorettype => 'text', proargtypes => 'text anynonarray',
prosrc => 'select $1 || $2::pg_catalog.text' },
{ oid => '2004',
- proname => 'anytextcat', prolang => '14', provolatile => 's',
+ proname => 'anytextcat', prolang => 'sql', provolatile => 's',
prorettype => 'text', proargtypes => 'anynonarray text',
prosrc => 'select $1::pg_catalog.text || $2' },
@@ -5530,15 +5530,15 @@
proargtypes => 'timestamp timestamp timestamp timestamp',
prosrc => 'overlaps_timestamp' },
{ oid => '2042', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'timestamp interval timestamp interval',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))' },
{ oid => '2043', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'timestamp timestamp timestamp interval',
prosrc => 'select ($1, $2) overlaps ($3, ($3 + $4))' },
{ oid => '2044', descr => 'intervals overlap?',
- proname => 'overlaps', prolang => '14', proisstrict => 'f',
+ proname => 'overlaps', prolang => 'sql', proisstrict => 'f',
prorettype => 'bool', proargtypes => 'timestamp interval timestamp timestamp',
prosrc => 'select ($1, ($1 + $2)) overlaps ($3, $4)' },
{ oid => '2045', descr => 'less-equal-greater',
@@ -5604,7 +5604,7 @@
proargtypes => 'timestamp timestamp', prosrc => 'timestamp_age' },
{ oid => '2059',
descr => 'date difference from today preserving months and years',
- proname => 'age', prolang => '14', provolatile => 's',
+ proname => 'age', prolang => 'sql', provolatile => 's',
prorettype => 'interval', proargtypes => 'timestamp',
prosrc => 'select pg_catalog.age(cast(current_date as timestamp without time zone), $1)' },
@@ -5627,7 +5627,7 @@
proname => 'substring', prorettype => 'text', proargtypes => 'text text',
prosrc => 'textregexsubstr' },
{ oid => '2074', descr => 'extract text matching SQL99 regular expression',
- proname => 'substring', prolang => '14', prorettype => 'text',
+ proname => 'substring', prolang => 'sql', prorettype => 'text',
proargtypes => 'text text text',
prosrc => 'select pg_catalog.substring($1, pg_catalog.similar_escape($2, $3))' },
@@ -5966,11 +5966,11 @@
proname => 'pg_sleep', provolatile => 'v', prorettype => 'void',
proargtypes => 'float8', prosrc => 'pg_sleep' },
{ oid => '3935', descr => 'sleep for the specified interval',
- proname => 'pg_sleep_for', prolang => '14', provolatile => 'v',
+ proname => 'pg_sleep_for', prolang => 'sql', provolatile => 'v',
prorettype => 'void', proargtypes => 'interval',
prosrc => 'select pg_catalog.pg_sleep(extract(epoch from pg_catalog.clock_timestamp() operator(pg_catalog.+) $1) operator(pg_catalog.-) extract(epoch from pg_catalog.clock_timestamp()))' },
{ oid => '3936', descr => 'sleep until the specified time',
- proname => 'pg_sleep_until', prolang => '14', provolatile => 'v',
+ proname => 'pg_sleep_until', prolang => 'sql', provolatile => 'v',
prorettype => 'void', proargtypes => 'timestamptz',
prosrc => 'select pg_catalog.pg_sleep(extract(epoch from $1) operator(pg_catalog.-) extract(epoch from pg_catalog.clock_timestamp()))' },
{ oid => '315', descr => 'Is JIT compilation available in this session?',
@@ -6765,7 +6765,7 @@
proargtypes => 'name', prosrc => 'pg_database_size_name' },
{ oid => '2325',
descr => 'disk space usage for the main fork of the specified table or index',
- proname => 'pg_relation_size', prolang => '14', provolatile => 'v',
+ proname => 'pg_relation_size', prolang => 'sql', provolatile => 'v',
prorettype => 'int8', proargtypes => 'regclass',
prosrc => 'select pg_catalog.pg_relation_size($1, \'main\')' },
{ oid => '2332',
@@ -7586,21 +7586,21 @@
# formerly-missing interval + datetime operators
{ oid => '2546',
- proname => 'interval_pl_date', prolang => '14', prorettype => 'timestamp',
+ proname => 'interval_pl_date', prolang => 'sql', prorettype => 'timestamp',
proargtypes => 'interval date', prosrc => 'select $2 + $1' },
{ oid => '2547',
- proname => 'interval_pl_timetz', prolang => '14', prorettype => 'timetz',
+ proname => 'interval_pl_timetz', prolang => 'sql', prorettype => 'timetz',
proargtypes => 'interval timetz', prosrc => 'select $2 + $1' },
{ oid => '2548',
- proname => 'interval_pl_timestamp', prolang => '14',
+ proname => 'interval_pl_timestamp', prolang => 'sql',
prorettype => 'timestamp', proargtypes => 'interval timestamp',
prosrc => 'select $2 + $1' },
{ oid => '2549',
- proname => 'interval_pl_timestamptz', prolang => '14', provolatile => 's',
+ proname => 'interval_pl_timestamptz', prolang => 'sql', provolatile => 's',
prorettype => 'timestamptz', proargtypes => 'interval timestamptz',
prosrc => 'select $2 + $1' },
{ oid => '2550',
- proname => 'integer_pl_date', prolang => '14', prorettype => 'date',
+ proname => 'integer_pl_date', prolang => 'sql', prorettype => 'date',
proargtypes => 'int4 date', prosrc => 'select $2 + $1' },
{ oid => '2556', descr => 'get OIDs of databases in a tablespace',
@@ -7985,7 +7985,7 @@
proname => 'xpath', prorettype => '_xml', proargtypes => 'text xml _text',
prosrc => 'xpath' },
{ oid => '2932', descr => 'evaluate XPath expression',
- proname => 'xpath', prolang => '14', prorettype => '_xml',
+ proname => 'xpath', prolang => 'sql', prorettype => '_xml',
proargtypes => 'text xml',
prosrc => 'select pg_catalog.xpath($1, $2, \'{}\'::pg_catalog.text[])' },
@@ -7998,7 +7998,7 @@
proname => 'xpath_exists', prorettype => 'bool',
proargtypes => 'text xml _text', prosrc => 'xpath_exists' },
{ oid => '3050', descr => 'test XML value against XPath expression',
- proname => 'xpath_exists', prolang => '14', prorettype => 'bool',
+ proname => 'xpath_exists', prolang => 'sql', prorettype => 'bool',
proargtypes => 'text xml',
prosrc => 'select pg_catalog.xpath_exists($1, $2, \'{}\'::pg_catalog.text[])' },
{ oid => '3051', descr => 'determine if a string is well formed XML',
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index b25dec6c31..498afd0bdb 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -42,7 +42,7 @@ CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,Proce
Oid proowner BKI_DEFAULT(PGUID);
/* OID of pg_language entry */
- Oid prolang BKI_DEFAULT(12);
+ Oid prolang BKI_DEFAULT(internal) BKI_LOOKUP(pg_language);
/* estimated execution cost */
float4 procost BKI_DEFAULT(1);
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 0b7cdf8dd5..eb2346b8d3 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -269,16 +269,14 @@ sub GenerateFiles
"LIBPGTYPES");
chdir('src/backend/utils');
- my $pg_language_dat = '../../../src/include/catalog/pg_language.dat';
my $pg_proc_dat = '../../../src/include/catalog/pg_proc.dat';
if ( IsNewer('fmgr-stamp', 'Gen_fmgrtab.pl')
|| IsNewer('fmgr-stamp', '../catalog/Catalog.pm')
- || IsNewer('fmgr-stamp', $pg_language_dat)
|| IsNewer('fmgr-stamp', $pg_proc_dat)
|| IsNewer('fmgr-stamp', '../../../src/include/access/transam.h'))
{
system(
- "perl -I ../catalog Gen_fmgrtab.pl -I../../../src/include/ $pg_language_dat $pg_proc_dat"
+ "perl -I ../catalog Gen_fmgrtab.pl -I../../../src/include/ $pg_proc_dat"
);
open(my $f, '>', 'fmgr-stamp')
|| confess "Could not touch fmgr-stamp";
--
2.17.1
[text/x-patch] v8-0002-Replace-ad-hoc-format-for-conversion-functions.patch (72.1K, ../../CAJVSVGWnoXG-xU5YyVH1G0cMOiqVAUc93GQzTv_2T0PsGQsMSQ@mail.gmail.com/3-v8-0002-Replace-ad-hoc-format-for-conversion-functions.patch)
download | inline diff:
From d8654e82da8012761c67ae8b04ad3c1c079f4a71 Mon Sep 17 00:00:00 2001
From: John Naylor <[email protected]>
Date: Fri, 14 Dec 2018 15:44:10 -0500
Subject: [PATCH v8 2/2] Replace ad hoc format for conversion functions
Convert info for conversion functions into entries in pg_proc.dat
and the new file pg_conversion.dat. This fixes incorrect comments
on some functions, simplifies some build files, and shaves a few
tens of milliseconds off of initdb.
Functional changes:
1. Conversions are now pinned.
2. The functions are now declared IMMUTABLE (previously VOLATILE, the
default).
Neither of these new behaviors are necessary for the patch, but they
make sense, and it seems the previous state of affairs was accidental.
---
src/backend/catalog/genbki.pl | 47 +-
.../utils/mb/conversion_procs/Makefile | 177 +-------
src/bin/initdb/initdb.c | 26 --
src/include/catalog/genbki.h | 5 +-
src/include/catalog/pg_conversion.dat | 417 ++++++++++++++++++
src/include/catalog/pg_conversion.h | 51 ++-
src/include/catalog/pg_proc.dat | 410 ++++++++++++++++-
src/test/regress/expected/misc_sanity.out | 1 -
src/tools/msvc/Install.pm | 39 --
9 files changed, 909 insertions(+), 264 deletions(-)
create mode 100644 src/include/catalog/pg_conversion.dat
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 8ccfcb7724..c42c1563aa 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -40,6 +40,10 @@ while (@ARGV)
{
$output_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
}
+ elsif ($arg =~ /^-I/)
+ {
+ $include_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
+ }
elsif ($arg =~ /^--set-version=(.*)$/)
{
$major_version = $1;
@@ -57,11 +61,15 @@ die "No input files.\n" if !@input_files;
die "--set-version must be specified.\n" if !defined $major_version;
die "-I, the header include path, must be specified.\n" if !$include_path;
-# Make sure output_path ends in a slash.
+# Make sure paths ends in a slash.
if ($output_path ne '' && substr($output_path, -1) ne '/')
{
$output_path .= '/';
}
+if (substr($include_path, -1) ne '/')
+{
+ $include_path .= '/';
+}
# Read all the files into internal data structures.
my @catnames;
@@ -172,8 +180,35 @@ my $PG_CATALOG_NAMESPACE =
'PG_CATALOG_NAMESPACE');
-# Build lookup tables for OID macro substitutions and for pg_attribute
-# copies of pg_type values.
+# Build lookup tables.
+
+# Encoding identifier lookup. This uses the same machinery as for OIDs.
+my %encids;
+my $collect_encodings = 0;
+
+my $encfile = $include_path . 'mb/pg_wchar.h';
+open(my $ef, '<', $encfile) || die "$encfile: $!";
+
+# We're parsing an enum, so start with 0 and increment
+# every time we find an enum member.
+my $encid = 0;
+while (<$ef>)
+{
+ if (/typedef\s+enum\s+pg_enc/)
+ {
+ $collect_encodings = 1;
+ next;
+ }
+
+ last if /_PG_LAST_ENCODING_/;
+
+ if ($collect_encodings and /^\s+(PG_\w+)/)
+ {
+ $encids{$1} = $encid;
+ $encid++;
+ }
+}
+close $ef;
# index access method OID lookup
my %amoids;
@@ -256,12 +291,16 @@ my %typeoids;
my %types;
foreach my $row (@{ $catalog_data{pg_type} })
{
+ # for OID macro substitutions
$typeoids{ $row->{typname} } = $row->{oid};
+
+ # for pg_attribute copies of pg_type values
$types{ $row->{typname} } = $row;
}
-# Map catalog name to OID lookup.
+# Map lookup name to the corresponding hash table.
my %lookup_kind = (
+ encoding => \%encids,
pg_am => \%amoids,
pg_language => \%langoids,
pg_opclass => \%opcoids,
diff --git a/src/backend/utils/mb/conversion_procs/Makefile b/src/backend/utils/mb/conversion_procs/Makefile
index 879467ea5e..9669fbb9d4 100644
--- a/src/backend/utils/mb/conversion_procs/Makefile
+++ b/src/backend/utils/mb/conversion_procs/Makefile
@@ -1,10 +1,11 @@
#-------------------------------------------------------------------------
#
-# Makefile--
-# Makefile for utils/mb/conversion_procs
+# Makefile for utils/mb/conversion_procs
#
-# IDENTIFICATION
-# src/backend/utils/mb/conversion_procs/Makefile
+# Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/backend/utils/mb/conversion_procs/Makefile
#
#-------------------------------------------------------------------------
@@ -12,8 +13,6 @@ subdir = src/backend/utils/mb/conversion_procs
top_builddir = ../../../../..
include $(top_builddir)/src/Makefile.global
-SQLSCRIPT = conversion_create.sql
-
SUBDIRS = \
ascii_and_mic cyrillic_and_mic euc_cn_and_mic euc_jp_and_sjis \
euc_kr_and_mic euc_tw_and_big5 latin2_and_win1250 latin_and_mic \
@@ -25,170 +24,4 @@ SUBDIRS = \
$(recurse)
-# conversion_name source_encoding destination_encoding function object
-CONVERSIONS = \
- ascii_to_mic SQL_ASCII MULE_INTERNAL ascii_to_mic ascii_and_mic \
- mic_to_ascii MULE_INTERNAL SQL_ASCII mic_to_ascii ascii_and_mic \
- koi8_r_to_mic KOI8R MULE_INTERNAL koi8r_to_mic cyrillic_and_mic \
- mic_to_koi8_r MULE_INTERNAL KOI8R mic_to_koi8r cyrillic_and_mic \
- iso_8859_5_to_mic ISO-8859-5 MULE_INTERNAL iso_to_mic cyrillic_and_mic \
- mic_to_iso_8859_5 MULE_INTERNAL ISO-8859-5 mic_to_iso cyrillic_and_mic \
- windows_1251_to_mic WIN1251 MULE_INTERNAL win1251_to_mic cyrillic_and_mic \
- mic_to_windows_1251 MULE_INTERNAL WIN1251 mic_to_win1251 cyrillic_and_mic \
- windows_866_to_mic WIN866 MULE_INTERNAL win866_to_mic cyrillic_and_mic \
- mic_to_windows_866 MULE_INTERNAL WIN866 mic_to_win866 cyrillic_and_mic \
- koi8_r_to_windows_1251 KOI8R WIN1251 koi8r_to_win1251 cyrillic_and_mic \
- windows_1251_to_koi8_r WIN1251 KOI8R win1251_to_koi8r cyrillic_and_mic \
- koi8_r_to_windows_866 KOI8R WIN866 koi8r_to_win866 cyrillic_and_mic \
- windows_866_to_koi8_r WIN866 KOI8R win866_to_koi8r cyrillic_and_mic \
- windows_866_to_windows_1251 WIN866 WIN1251 win866_to_win1251 cyrillic_and_mic \
- windows_1251_to_windows_866 WIN1251 WIN866 win1251_to_win866 cyrillic_and_mic \
- iso_8859_5_to_koi8_r ISO-8859-5 KOI8R iso_to_koi8r cyrillic_and_mic \
- koi8_r_to_iso_8859_5 KOI8R ISO-8859-5 koi8r_to_iso cyrillic_and_mic \
- iso_8859_5_to_windows_1251 ISO-8859-5 WIN1251 iso_to_win1251 cyrillic_and_mic \
- windows_1251_to_iso_8859_5 WIN1251 ISO-8859-5 win1251_to_iso cyrillic_and_mic \
- iso_8859_5_to_windows_866 ISO-8859-5 WIN866 iso_to_win866 cyrillic_and_mic \
- windows_866_to_iso_8859_5 WIN866 ISO-8859-5 win866_to_iso cyrillic_and_mic \
- euc_cn_to_mic EUC_CN MULE_INTERNAL euc_cn_to_mic euc_cn_and_mic \
- mic_to_euc_cn MULE_INTERNAL EUC_CN mic_to_euc_cn euc_cn_and_mic \
- euc_jp_to_sjis EUC_JP SJIS euc_jp_to_sjis euc_jp_and_sjis \
- sjis_to_euc_jp SJIS EUC_JP sjis_to_euc_jp euc_jp_and_sjis \
- euc_jp_to_mic EUC_JP MULE_INTERNAL euc_jp_to_mic euc_jp_and_sjis \
- sjis_to_mic SJIS MULE_INTERNAL sjis_to_mic euc_jp_and_sjis \
- mic_to_euc_jp MULE_INTERNAL EUC_JP mic_to_euc_jp euc_jp_and_sjis \
- mic_to_sjis MULE_INTERNAL SJIS mic_to_sjis euc_jp_and_sjis \
- euc_kr_to_mic EUC_KR MULE_INTERNAL euc_kr_to_mic euc_kr_and_mic \
- mic_to_euc_kr MULE_INTERNAL EUC_KR mic_to_euc_kr euc_kr_and_mic \
- euc_tw_to_big5 EUC_TW BIG5 euc_tw_to_big5 euc_tw_and_big5 \
- big5_to_euc_tw BIG5 EUC_TW big5_to_euc_tw euc_tw_and_big5 \
- euc_tw_to_mic EUC_TW MULE_INTERNAL euc_tw_to_mic euc_tw_and_big5 \
- big5_to_mic BIG5 MULE_INTERNAL big5_to_mic euc_tw_and_big5 \
- mic_to_euc_tw MULE_INTERNAL EUC_TW mic_to_euc_tw euc_tw_and_big5 \
- mic_to_big5 MULE_INTERNAL BIG5 mic_to_big5 euc_tw_and_big5 \
- iso_8859_2_to_mic LATIN2 MULE_INTERNAL latin2_to_mic latin2_and_win1250 \
- mic_to_iso_8859_2 MULE_INTERNAL LATIN2 mic_to_latin2 latin2_and_win1250 \
- windows_1250_to_mic WIN1250 MULE_INTERNAL win1250_to_mic latin2_and_win1250 \
- mic_to_windows_1250 MULE_INTERNAL WIN1250 mic_to_win1250 latin2_and_win1250 \
- iso_8859_2_to_windows_1250 LATIN2 WIN1250 latin2_to_win1250 latin2_and_win1250 \
- windows_1250_to_iso_8859_2 WIN1250 LATIN2 win1250_to_latin2 latin2_and_win1250 \
- iso_8859_1_to_mic LATIN1 MULE_INTERNAL latin1_to_mic latin_and_mic \
- mic_to_iso_8859_1 MULE_INTERNAL LATIN1 mic_to_latin1 latin_and_mic \
- iso_8859_3_to_mic LATIN3 MULE_INTERNAL latin3_to_mic latin_and_mic \
- mic_to_iso_8859_3 MULE_INTERNAL LATIN3 mic_to_latin3 latin_and_mic \
- iso_8859_4_to_mic LATIN4 MULE_INTERNAL latin4_to_mic latin_and_mic \
- mic_to_iso_8859_4 MULE_INTERNAL LATIN4 mic_to_latin4 latin_and_mic \
- ascii_to_utf8 SQL_ASCII UTF8 ascii_to_utf8 utf8_and_ascii \
- utf8_to_ascii UTF8 SQL_ASCII utf8_to_ascii utf8_and_ascii \
- big5_to_utf8 BIG5 UTF8 big5_to_utf8 utf8_and_big5 \
- utf8_to_big5 UTF8 BIG5 utf8_to_big5 utf8_and_big5 \
- utf8_to_koi8_r UTF8 KOI8R utf8_to_koi8r utf8_and_cyrillic \
- koi8_r_to_utf8 KOI8R UTF8 koi8r_to_utf8 utf8_and_cyrillic \
- utf8_to_koi8_u UTF8 KOI8U utf8_to_koi8u utf8_and_cyrillic \
- koi8_u_to_utf8 KOI8U UTF8 koi8u_to_utf8 utf8_and_cyrillic \
- utf8_to_windows_866 UTF8 WIN866 utf8_to_win utf8_and_win \
- windows_866_to_utf8 WIN866 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_874 UTF8 WIN874 utf8_to_win utf8_and_win \
- windows_874_to_utf8 WIN874 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1250 UTF8 WIN1250 utf8_to_win utf8_and_win \
- windows_1250_to_utf8 WIN1250 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1251 UTF8 WIN1251 utf8_to_win utf8_and_win \
- windows_1251_to_utf8 WIN1251 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1252 UTF8 WIN1252 utf8_to_win utf8_and_win \
- windows_1252_to_utf8 WIN1252 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1253 UTF8 WIN1253 utf8_to_win utf8_and_win \
- windows_1253_to_utf8 WIN1253 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1254 UTF8 WIN1254 utf8_to_win utf8_and_win \
- windows_1254_to_utf8 WIN1254 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1255 UTF8 WIN1255 utf8_to_win utf8_and_win \
- windows_1255_to_utf8 WIN1255 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1256 UTF8 WIN1256 utf8_to_win utf8_and_win \
- windows_1256_to_utf8 WIN1256 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1257 UTF8 WIN1257 utf8_to_win utf8_and_win \
- windows_1257_to_utf8 WIN1257 UTF8 win_to_utf8 utf8_and_win \
- utf8_to_windows_1258 UTF8 WIN1258 utf8_to_win utf8_and_win \
- windows_1258_to_utf8 WIN1258 UTF8 win_to_utf8 utf8_and_win \
- euc_cn_to_utf8 EUC_CN UTF8 euc_cn_to_utf8 utf8_and_euc_cn \
- utf8_to_euc_cn UTF8 EUC_CN utf8_to_euc_cn utf8_and_euc_cn \
- euc_jp_to_utf8 EUC_JP UTF8 euc_jp_to_utf8 utf8_and_euc_jp \
- utf8_to_euc_jp UTF8 EUC_JP utf8_to_euc_jp utf8_and_euc_jp \
- euc_kr_to_utf8 EUC_KR UTF8 euc_kr_to_utf8 utf8_and_euc_kr \
- utf8_to_euc_kr UTF8 EUC_KR utf8_to_euc_kr utf8_and_euc_kr \
- euc_tw_to_utf8 EUC_TW UTF8 euc_tw_to_utf8 utf8_and_euc_tw \
- utf8_to_euc_tw UTF8 EUC_TW utf8_to_euc_tw utf8_and_euc_tw \
- gb18030_to_utf8 GB18030 UTF8 gb18030_to_utf8 utf8_and_gb18030 \
- utf8_to_gb18030 UTF8 GB18030 utf8_to_gb18030 utf8_and_gb18030 \
- gbk_to_utf8 GBK UTF8 gbk_to_utf8 utf8_and_gbk \
- utf8_to_gbk UTF8 GBK utf8_to_gbk utf8_and_gbk \
- utf8_to_iso_8859_2 UTF8 LATIN2 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_2_to_utf8 LATIN2 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_3 UTF8 LATIN3 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_3_to_utf8 LATIN3 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_4 UTF8 LATIN4 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_4_to_utf8 LATIN4 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_9 UTF8 LATIN5 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_9_to_utf8 LATIN5 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_10 UTF8 LATIN6 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_10_to_utf8 LATIN6 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_13 UTF8 LATIN7 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_13_to_utf8 LATIN7 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_14 UTF8 LATIN8 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_14_to_utf8 LATIN8 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_15 UTF8 LATIN9 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_15_to_utf8 LATIN9 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_16 UTF8 LATIN10 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_16_to_utf8 LATIN10 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_5 UTF8 ISO-8859-5 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_5_to_utf8 ISO-8859-5 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_6 UTF8 ISO-8859-6 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_6_to_utf8 ISO-8859-6 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_7 UTF8 ISO-8859-7 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_7_to_utf8 ISO-8859-7 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- utf8_to_iso_8859_8 UTF8 ISO-8859-8 utf8_to_iso8859 utf8_and_iso8859 \
- iso_8859_8_to_utf8 ISO-8859-8 UTF8 iso8859_to_utf8 utf8_and_iso8859 \
- iso_8859_1_to_utf8 LATIN1 UTF8 iso8859_1_to_utf8 utf8_and_iso8859_1 \
- utf8_to_iso_8859_1 UTF8 LATIN1 utf8_to_iso8859_1 utf8_and_iso8859_1 \
- johab_to_utf8 JOHAB UTF8 johab_to_utf8 utf8_and_johab \
- utf8_to_johab UTF8 JOHAB utf8_to_johab utf8_and_johab \
- sjis_to_utf8 SJIS UTF8 sjis_to_utf8 utf8_and_sjis \
- utf8_to_sjis UTF8 SJIS utf8_to_sjis utf8_and_sjis \
- uhc_to_utf8 UHC UTF8 uhc_to_utf8 utf8_and_uhc \
- utf8_to_uhc UTF8 UHC utf8_to_uhc utf8_and_uhc \
- euc_jis_2004_to_utf8 EUC_JIS_2004 UTF8 euc_jis_2004_to_utf8 utf8_and_euc2004 \
- utf8_to_euc_jis_2004 UTF8 EUC_JIS_2004 utf8_to_euc_jis_2004 utf8_and_euc2004 \
- shift_jis_2004_to_utf8 SHIFT_JIS_2004 UTF8 shift_jis_2004_to_utf8 utf8_and_sjis2004 \
- utf8_to_shift_jis_2004 UTF8 SHIFT_JIS_2004 utf8_to_shift_jis_2004 utf8_and_sjis2004 \
- euc_jis_2004_to_shift_jis_2004 EUC_JIS_2004 SHIFT_JIS_2004 euc_jis_2004_to_shift_jis_2004 euc2004_sjis2004 \
- shift_jis_2004_to_euc_jis_2004 SHIFT_JIS_2004 EUC_JIS_2004 shift_jis_2004_to_euc_jis_2004 euc2004_sjis2004
-
-all: $(SQLSCRIPT)
-
-$(SQLSCRIPT): Makefile
- @set -e; \
- set $(CONVERSIONS) ; \
- while [ "$$#" -gt 0 ] ; \
- do \
- name=$$1;shift; \
- se=$$1;shift; \
- de=$$1; shift; \
- func=$$1; shift; \
- obj=$$1; shift; \
- echo "-- $$se --> $$de"; \
- echo "CREATE OR REPLACE FUNCTION $$func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '$$"libdir"/$$obj', '$$func' LANGUAGE C STRICT PARALLEL SAFE;"; \
- echo "COMMENT ON FUNCTION $$func(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) IS 'internal conversion function for $$se to $$de';"; \
- echo "DROP CONVERSION pg_catalog.$$name;"; \
- echo "CREATE DEFAULT CONVERSION pg_catalog.$$name FOR '$$se' TO '$$de' FROM $$func;"; \
- echo "COMMENT ON CONVERSION pg_catalog.$$name IS 'conversion for $$se to $$de';"; \
- echo; \
- done > $@
-
-install: $(SQLSCRIPT) installdirs
- $(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)'
-
-installdirs:
- $(MKDIR_P) '$(DESTDIR)$(datadir)' '$(DESTDIR)$(pkglibdir)'
-
-uninstall:
- rm -f '$(DESTDIR)$(datadir)/$(SQLSCRIPT)'
-clean distclean maintainer-clean:
- rm -f $(SQLSCRIPT)
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 211a96380e..e378a9a095 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -155,7 +155,6 @@ static char *shdesc_file;
static char *hba_file;
static char *ident_file;
static char *conf_file;
-static char *conversion_file;
static char *dictionary_file;
static char *info_schema_file;
static char *features_file;
@@ -254,7 +253,6 @@ static void setup_depend(FILE *cmdfd);
static void setup_sysviews(FILE *cmdfd);
static void setup_description(FILE *cmdfd);
static void setup_collation(FILE *cmdfd);
-static void setup_conversion(FILE *cmdfd);
static void setup_dictionary(FILE *cmdfd);
static void setup_privileges(FILE *cmdfd);
static void set_info_version(void);
@@ -1774,26 +1772,6 @@ setup_collation(FILE *cmdfd)
PG_CMD_PUTS("SELECT pg_import_system_collations('pg_catalog');\n\n");
}
-/*
- * load conversion functions
- */
-static void
-setup_conversion(FILE *cmdfd)
-{
- char **line;
- char **conv_lines;
-
- conv_lines = readfile(conversion_file);
- for (line = conv_lines; *line != NULL; line++)
- {
- if (strstr(*line, "DROP CONVERSION") != *line)
- PG_CMD_PUTS(*line);
- free(*line);
- }
-
- free(conv_lines);
-}
-
/*
* load extra dictionaries (Snowball stemmers)
*/
@@ -2679,7 +2657,6 @@ setup_data_file_paths(void)
set_input(&hba_file, "pg_hba.conf.sample");
set_input(&ident_file, "pg_ident.conf.sample");
set_input(&conf_file, "postgresql.conf.sample");
- set_input(&conversion_file, "conversion_create.sql");
set_input(&dictionary_file, "snowball_create.sql");
set_input(&info_schema_file, "information_schema.sql");
set_input(&features_file, "sql_features.txt");
@@ -2710,7 +2687,6 @@ setup_data_file_paths(void)
check_input(hba_file);
check_input(ident_file);
check_input(conf_file);
- check_input(conversion_file);
check_input(dictionary_file);
check_input(info_schema_file);
check_input(features_file);
@@ -3070,8 +3046,6 @@ initialize_data_directory(void)
setup_collation(cmdfd);
- setup_conversion(cmdfd);
-
setup_dictionary(cmdfd);
setup_privileges(cmdfd);
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index c6a7feac24..1ace1d36a7 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -35,7 +35,10 @@
#define BKI_DEFAULT(value)
/* Specifies a default value for auto-generated array types */
#define BKI_ARRAY_DEFAULT(value)
-/* Indicates how to perform name lookups for an OID or OID-array field */
+/*
+ * Indicates how to perform name lookups, typically for an OID or
+ * OID-array field
+ */
#define BKI_LOOKUP(catalog)
/* The following are never defined; they are here only for documentation. */
diff --git a/src/include/catalog/pg_conversion.dat b/src/include/catalog/pg_conversion.dat
new file mode 100644
index 0000000000..fc5efe3218
--- /dev/null
+++ b/src/include/catalog/pg_conversion.dat
@@ -0,0 +1,417 @@
+#----------------------------------------------------------------------
+#
+# pg_conversion.dat
+# Initial contents of the pg_conversion system catalog.
+#
+# Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/include/catalog/pg_conversion.dat
+#
+#----------------------------------------------------------------------
+
+# Note: conforencoding and contoencoding must match the spelling of
+# the labels used in the enum pg_enc in mb/pg_wchar.h.
+
+[
+
+{ oid => '4800', descr => 'conversion for SQL_ASCII to MULE_INTERNAL',
+ conname => 'ascii_to_mic', conforencoding => 'PG_SQL_ASCII',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'ascii_to_mic' },
+{ oid => '4801', descr => 'conversion for MULE_INTERNAL to SQL_ASCII',
+ conname => 'mic_to_ascii', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_SQL_ASCII', conproc => 'mic_to_ascii' },
+{ oid => '4802', descr => 'conversion for KOI8R to MULE_INTERNAL',
+ conname => 'koi8_r_to_mic', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'koi8r_to_mic' },
+{ oid => '4803', descr => 'conversion for MULE_INTERNAL to KOI8R',
+ conname => 'mic_to_koi8_r', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_KOI8R', conproc => 'mic_to_koi8r' },
+{ oid => '4804', descr => 'conversion for ISO-8859-5 to MULE_INTERNAL',
+ conname => 'iso_8859_5_to_mic', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'iso_to_mic' },
+{ oid => '4805', descr => 'conversion for MULE_INTERNAL to ISO-8859-5',
+ conname => 'mic_to_iso_8859_5', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'mic_to_iso' },
+{ oid => '4806', descr => 'conversion for WIN1251 to MULE_INTERNAL',
+ conname => 'windows_1251_to_mic', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'win1251_to_mic' },
+{ oid => '4807', descr => 'conversion for MULE_INTERNAL to WIN1251',
+ conname => 'mic_to_windows_1251', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_WIN1251', conproc => 'mic_to_win1251' },
+{ oid => '4808', descr => 'conversion for WIN866 to MULE_INTERNAL',
+ conname => 'windows_866_to_mic', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'win866_to_mic' },
+{ oid => '4809', descr => 'conversion for MULE_INTERNAL to WIN866',
+ conname => 'mic_to_windows_866', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_WIN866', conproc => 'mic_to_win866' },
+{ oid => '4810', descr => 'conversion for KOI8R to WIN1251',
+ conname => 'koi8_r_to_windows_1251', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_WIN1251', conproc => 'koi8r_to_win1251' },
+{ oid => '4811', descr => 'conversion for WIN1251 to KOI8R',
+ conname => 'windows_1251_to_koi8_r', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_KOI8R', conproc => 'win1251_to_koi8r' },
+{ oid => '4812', descr => 'conversion for KOI8R to WIN866',
+ conname => 'koi8_r_to_windows_866', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_WIN866', conproc => 'koi8r_to_win866' },
+{ oid => '4813', descr => 'conversion for WIN866 to KOI8R',
+ conname => 'windows_866_to_koi8_r', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_KOI8R', conproc => 'win866_to_koi8r' },
+{ oid => '4814', descr => 'conversion for WIN866 to WIN1251',
+ conname => 'windows_866_to_windows_1251', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_WIN1251', conproc => 'win866_to_win1251' },
+{ oid => '4815', descr => 'conversion for WIN1251 to WIN866',
+ conname => 'windows_1251_to_windows_866', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_WIN866', conproc => 'win1251_to_win866' },
+{ oid => '4816', descr => 'conversion for ISO-8859-5 to KOI8R',
+ conname => 'iso_8859_5_to_koi8_r', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_KOI8R', conproc => 'iso_to_koi8r' },
+{ oid => '4817', descr => 'conversion for KOI8R to ISO-8859-5',
+ conname => 'koi8_r_to_iso_8859_5', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'koi8r_to_iso' },
+{ oid => '4818', descr => 'conversion for ISO-8859-5 to WIN1251',
+ conname => 'iso_8859_5_to_windows_1251', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_WIN1251', conproc => 'iso_to_win1251' },
+{ oid => '4819', descr => 'conversion for WIN1251 to ISO-8859-5',
+ conname => 'windows_1251_to_iso_8859_5', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'win1251_to_iso' },
+{ oid => '4820', descr => 'conversion for ISO-8859-5 to WIN866',
+ conname => 'iso_8859_5_to_windows_866', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_WIN866', conproc => 'iso_to_win866' },
+{ oid => '4821', descr => 'conversion for WIN866 to ISO-8859-5',
+ conname => 'windows_866_to_iso_8859_5', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'win866_to_iso' },
+{ oid => '4822', descr => 'conversion for EUC_CN to MULE_INTERNAL',
+ conname => 'euc_cn_to_mic', conforencoding => 'PG_EUC_CN',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_cn_to_mic' },
+{ oid => '4823', descr => 'conversion for MULE_INTERNAL to EUC_CN',
+ conname => 'mic_to_euc_cn', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_CN', conproc => 'mic_to_euc_cn' },
+{ oid => '4824', descr => 'conversion for EUC_JP to SJIS',
+ conname => 'euc_jp_to_sjis', conforencoding => 'PG_EUC_JP',
+ contoencoding => 'PG_SJIS', conproc => 'euc_jp_to_sjis' },
+{ oid => '4825', descr => 'conversion for SJIS to EUC_JP',
+ conname => 'sjis_to_euc_jp', conforencoding => 'PG_SJIS',
+ contoencoding => 'PG_EUC_JP', conproc => 'sjis_to_euc_jp' },
+{ oid => '4826', descr => 'conversion for EUC_JP to MULE_INTERNAL',
+ conname => 'euc_jp_to_mic', conforencoding => 'PG_EUC_JP',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_jp_to_mic' },
+{ oid => '4827', descr => 'conversion for SJIS to MULE_INTERNAL',
+ conname => 'sjis_to_mic', conforencoding => 'PG_SJIS',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'sjis_to_mic' },
+{ oid => '4828', descr => 'conversion for MULE_INTERNAL to EUC_JP',
+ conname => 'mic_to_euc_jp', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_JP', conproc => 'mic_to_euc_jp' },
+{ oid => '4829', descr => 'conversion for MULE_INTERNAL to SJIS',
+ conname => 'mic_to_sjis', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_SJIS', conproc => 'mic_to_sjis' },
+{ oid => '4830', descr => 'conversion for EUC_KR to MULE_INTERNAL',
+ conname => 'euc_kr_to_mic', conforencoding => 'PG_EUC_KR',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_kr_to_mic' },
+{ oid => '4831', descr => 'conversion for MULE_INTERNAL to EUC_KR',
+ conname => 'mic_to_euc_kr', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_KR', conproc => 'mic_to_euc_kr' },
+{ oid => '4832', descr => 'conversion for EUC_TW to BIG5',
+ conname => 'euc_tw_to_big5', conforencoding => 'PG_EUC_TW',
+ contoencoding => 'PG_BIG5', conproc => 'euc_tw_to_big5' },
+{ oid => '4833', descr => 'conversion for BIG5 to EUC_TW',
+ conname => 'big5_to_euc_tw', conforencoding => 'PG_BIG5',
+ contoencoding => 'PG_EUC_TW', conproc => 'big5_to_euc_tw' },
+{ oid => '4834', descr => 'conversion for EUC_TW to MULE_INTERNAL',
+ conname => 'euc_tw_to_mic', conforencoding => 'PG_EUC_TW',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'euc_tw_to_mic' },
+{ oid => '4835', descr => 'conversion for BIG5 to MULE_INTERNAL',
+ conname => 'big5_to_mic', conforencoding => 'PG_BIG5',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'big5_to_mic' },
+{ oid => '4836', descr => 'conversion for MULE_INTERNAL to EUC_TW',
+ conname => 'mic_to_euc_tw', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_EUC_TW', conproc => 'mic_to_euc_tw' },
+{ oid => '4837', descr => 'conversion for MULE_INTERNAL to BIG5',
+ conname => 'mic_to_big5', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_BIG5', conproc => 'mic_to_big5' },
+{ oid => '4838', descr => 'conversion for LATIN2 to MULE_INTERNAL',
+ conname => 'iso_8859_2_to_mic', conforencoding => 'PG_LATIN2',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin2_to_mic' },
+{ oid => '4839', descr => 'conversion for MULE_INTERNAL to LATIN2',
+ conname => 'mic_to_iso_8859_2', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN2', conproc => 'mic_to_latin2' },
+{ oid => '4840', descr => 'conversion for WIN1250 to MULE_INTERNAL',
+ conname => 'windows_1250_to_mic', conforencoding => 'PG_WIN1250',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'win1250_to_mic' },
+{ oid => '4841', descr => 'conversion for MULE_INTERNAL to WIN1250',
+ conname => 'mic_to_windows_1250', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_WIN1250', conproc => 'mic_to_win1250' },
+{ oid => '4842', descr => 'conversion for LATIN2 to WIN1250',
+ conname => 'iso_8859_2_to_windows_1250', conforencoding => 'PG_LATIN2',
+ contoencoding => 'PG_WIN1250', conproc => 'latin2_to_win1250' },
+{ oid => '4843', descr => 'conversion for WIN1250 to LATIN2',
+ conname => 'windows_1250_to_iso_8859_2', conforencoding => 'PG_WIN1250',
+ contoencoding => 'PG_LATIN2', conproc => 'win1250_to_latin2' },
+{ oid => '4844', descr => 'conversion for LATIN1 to MULE_INTERNAL',
+ conname => 'iso_8859_1_to_mic', conforencoding => 'PG_LATIN1',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin1_to_mic' },
+{ oid => '4845', descr => 'conversion for MULE_INTERNAL to LATIN1',
+ conname => 'mic_to_iso_8859_1', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN1', conproc => 'mic_to_latin1' },
+{ oid => '4846', descr => 'conversion for LATIN3 to MULE_INTERNAL',
+ conname => 'iso_8859_3_to_mic', conforencoding => 'PG_LATIN3',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin3_to_mic' },
+{ oid => '4847', descr => 'conversion for MULE_INTERNAL to LATIN3',
+ conname => 'mic_to_iso_8859_3', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN3', conproc => 'mic_to_latin3' },
+{ oid => '4848', descr => 'conversion for LATIN4 to MULE_INTERNAL',
+ conname => 'iso_8859_4_to_mic', conforencoding => 'PG_LATIN4',
+ contoencoding => 'PG_MULE_INTERNAL', conproc => 'latin4_to_mic' },
+{ oid => '4849', descr => 'conversion for MULE_INTERNAL to LATIN4',
+ conname => 'mic_to_iso_8859_4', conforencoding => 'PG_MULE_INTERNAL',
+ contoencoding => 'PG_LATIN4', conproc => 'mic_to_latin4' },
+{ oid => '4850', descr => 'conversion for SQL_ASCII to UTF8',
+ conname => 'ascii_to_utf8', conforencoding => 'PG_SQL_ASCII',
+ contoencoding => 'PG_UTF8', conproc => 'ascii_to_utf8' },
+{ oid => '4851', descr => 'conversion for UTF8 to SQL_ASCII',
+ conname => 'utf8_to_ascii', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_SQL_ASCII', conproc => 'utf8_to_ascii' },
+{ oid => '4852', descr => 'conversion for BIG5 to UTF8',
+ conname => 'big5_to_utf8', conforencoding => 'PG_BIG5',
+ contoencoding => 'PG_UTF8', conproc => 'big5_to_utf8' },
+{ oid => '4853', descr => 'conversion for UTF8 to BIG5',
+ conname => 'utf8_to_big5', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_BIG5', conproc => 'utf8_to_big5' },
+{ oid => '4854', descr => 'conversion for UTF8 to KOI8R',
+ conname => 'utf8_to_koi8_r', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_KOI8R', conproc => 'utf8_to_koi8r' },
+{ oid => '4855', descr => 'conversion for KOI8R to UTF8',
+ conname => 'koi8_r_to_utf8', conforencoding => 'PG_KOI8R',
+ contoencoding => 'PG_UTF8', conproc => 'koi8r_to_utf8' },
+{ oid => '4856', descr => 'conversion for UTF8 to KOI8U',
+ conname => 'utf8_to_koi8_u', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_KOI8U', conproc => 'utf8_to_koi8u' },
+{ oid => '4857', descr => 'conversion for KOI8U to UTF8',
+ conname => 'koi8_u_to_utf8', conforencoding => 'PG_KOI8U',
+ contoencoding => 'PG_UTF8', conproc => 'koi8u_to_utf8' },
+{ oid => '4858', descr => 'conversion for UTF8 to WIN866',
+ conname => 'utf8_to_windows_866', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN866', conproc => 'utf8_to_win' },
+{ oid => '4859', descr => 'conversion for WIN866 to UTF8',
+ conname => 'windows_866_to_utf8', conforencoding => 'PG_WIN866',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4860', descr => 'conversion for UTF8 to WIN874',
+ conname => 'utf8_to_windows_874', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN874', conproc => 'utf8_to_win' },
+{ oid => '4861', descr => 'conversion for WIN874 to UTF8',
+ conname => 'windows_874_to_utf8', conforencoding => 'PG_WIN874',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4862', descr => 'conversion for UTF8 to WIN1250',
+ conname => 'utf8_to_windows_1250', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1250', conproc => 'utf8_to_win' },
+{ oid => '4863', descr => 'conversion for WIN1250 to UTF8',
+ conname => 'windows_1250_to_utf8', conforencoding => 'PG_WIN1250',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4864', descr => 'conversion for UTF8 to WIN1251',
+ conname => 'utf8_to_windows_1251', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1251', conproc => 'utf8_to_win' },
+{ oid => '4865', descr => 'conversion for WIN1251 to UTF8',
+ conname => 'windows_1251_to_utf8', conforencoding => 'PG_WIN1251',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4866', descr => 'conversion for UTF8 to WIN1252',
+ conname => 'utf8_to_windows_1252', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1252', conproc => 'utf8_to_win' },
+{ oid => '4867', descr => 'conversion for WIN1252 to UTF8',
+ conname => 'windows_1252_to_utf8', conforencoding => 'PG_WIN1252',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4868', descr => 'conversion for UTF8 to WIN1253',
+ conname => 'utf8_to_windows_1253', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1253', conproc => 'utf8_to_win' },
+{ oid => '4869', descr => 'conversion for WIN1253 to UTF8',
+ conname => 'windows_1253_to_utf8', conforencoding => 'PG_WIN1253',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4870', descr => 'conversion for UTF8 to WIN1254',
+ conname => 'utf8_to_windows_1254', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1254', conproc => 'utf8_to_win' },
+{ oid => '4871', descr => 'conversion for WIN1254 to UTF8',
+ conname => 'windows_1254_to_utf8', conforencoding => 'PG_WIN1254',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4872', descr => 'conversion for UTF8 to WIN1255',
+ conname => 'utf8_to_windows_1255', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1255', conproc => 'utf8_to_win' },
+{ oid => '4873', descr => 'conversion for WIN1255 to UTF8',
+ conname => 'windows_1255_to_utf8', conforencoding => 'PG_WIN1255',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4874', descr => 'conversion for UTF8 to WIN1256',
+ conname => 'utf8_to_windows_1256', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1256', conproc => 'utf8_to_win' },
+{ oid => '4875', descr => 'conversion for WIN1256 to UTF8',
+ conname => 'windows_1256_to_utf8', conforencoding => 'PG_WIN1256',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4876', descr => 'conversion for UTF8 to WIN1257',
+ conname => 'utf8_to_windows_1257', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1257', conproc => 'utf8_to_win' },
+{ oid => '4877', descr => 'conversion for WIN1257 to UTF8',
+ conname => 'windows_1257_to_utf8', conforencoding => 'PG_WIN1257',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4878', descr => 'conversion for UTF8 to WIN1258',
+ conname => 'utf8_to_windows_1258', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_WIN1258', conproc => 'utf8_to_win' },
+{ oid => '4879', descr => 'conversion for WIN1258 to UTF8',
+ conname => 'windows_1258_to_utf8', conforencoding => 'PG_WIN1258',
+ contoencoding => 'PG_UTF8', conproc => 'win_to_utf8' },
+{ oid => '4880', descr => 'conversion for EUC_CN to UTF8',
+ conname => 'euc_cn_to_utf8', conforencoding => 'PG_EUC_CN',
+ contoencoding => 'PG_UTF8', conproc => 'euc_cn_to_utf8' },
+{ oid => '4881', descr => 'conversion for UTF8 to EUC_CN',
+ conname => 'utf8_to_euc_cn', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_CN', conproc => 'utf8_to_euc_cn' },
+{ oid => '4882', descr => 'conversion for EUC_JP to UTF8',
+ conname => 'euc_jp_to_utf8', conforencoding => 'PG_EUC_JP',
+ contoencoding => 'PG_UTF8', conproc => 'euc_jp_to_utf8' },
+{ oid => '4883', descr => 'conversion for UTF8 to EUC_JP',
+ conname => 'utf8_to_euc_jp', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_JP', conproc => 'utf8_to_euc_jp' },
+{ oid => '4884', descr => 'conversion for EUC_KR to UTF8',
+ conname => 'euc_kr_to_utf8', conforencoding => 'PG_EUC_KR',
+ contoencoding => 'PG_UTF8', conproc => 'euc_kr_to_utf8' },
+{ oid => '4885', descr => 'conversion for UTF8 to EUC_KR',
+ conname => 'utf8_to_euc_kr', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_KR', conproc => 'utf8_to_euc_kr' },
+{ oid => '4886', descr => 'conversion for EUC_TW to UTF8',
+ conname => 'euc_tw_to_utf8', conforencoding => 'PG_EUC_TW',
+ contoencoding => 'PG_UTF8', conproc => 'euc_tw_to_utf8' },
+{ oid => '4887', descr => 'conversion for UTF8 to EUC_TW',
+ conname => 'utf8_to_euc_tw', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_TW', conproc => 'utf8_to_euc_tw' },
+{ oid => '4888', descr => 'conversion for GB18030 to UTF8',
+ conname => 'gb18030_to_utf8', conforencoding => 'PG_GB18030',
+ contoencoding => 'PG_UTF8', conproc => 'gb18030_to_utf8' },
+{ oid => '4889', descr => 'conversion for UTF8 to GB18030',
+ conname => 'utf8_to_gb18030', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_GB18030', conproc => 'utf8_to_gb18030' },
+{ oid => '4890', descr => 'conversion for GBK to UTF8',
+ conname => 'gbk_to_utf8', conforencoding => 'PG_GBK',
+ contoencoding => 'PG_UTF8', conproc => 'gbk_to_utf8' },
+{ oid => '4891', descr => 'conversion for UTF8 to GBK',
+ conname => 'utf8_to_gbk', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_GBK', conproc => 'utf8_to_gbk' },
+{ oid => '4892', descr => 'conversion for UTF8 to LATIN2',
+ conname => 'utf8_to_iso_8859_2', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN2', conproc => 'utf8_to_iso8859' },
+{ oid => '4893', descr => 'conversion for LATIN2 to UTF8',
+ conname => 'iso_8859_2_to_utf8', conforencoding => 'PG_LATIN2',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4894', descr => 'conversion for UTF8 to LATIN3',
+ conname => 'utf8_to_iso_8859_3', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN3', conproc => 'utf8_to_iso8859' },
+{ oid => '4895', descr => 'conversion for LATIN3 to UTF8',
+ conname => 'iso_8859_3_to_utf8', conforencoding => 'PG_LATIN3',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4896', descr => 'conversion for UTF8 to LATIN4',
+ conname => 'utf8_to_iso_8859_4', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN4', conproc => 'utf8_to_iso8859' },
+{ oid => '4897', descr => 'conversion for LATIN4 to UTF8',
+ conname => 'iso_8859_4_to_utf8', conforencoding => 'PG_LATIN4',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4898', descr => 'conversion for UTF8 to LATIN5',
+ conname => 'utf8_to_iso_8859_9', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN5', conproc => 'utf8_to_iso8859' },
+{ oid => '4899', descr => 'conversion for LATIN5 to UTF8',
+ conname => 'iso_8859_9_to_utf8', conforencoding => 'PG_LATIN5',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4900', descr => 'conversion for UTF8 to LATIN6',
+ conname => 'utf8_to_iso_8859_10', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN6', conproc => 'utf8_to_iso8859' },
+{ oid => '4901', descr => 'conversion for LATIN6 to UTF8',
+ conname => 'iso_8859_10_to_utf8', conforencoding => 'PG_LATIN6',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4902', descr => 'conversion for UTF8 to LATIN7',
+ conname => 'utf8_to_iso_8859_13', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN7', conproc => 'utf8_to_iso8859' },
+{ oid => '4903', descr => 'conversion for LATIN7 to UTF8',
+ conname => 'iso_8859_13_to_utf8', conforencoding => 'PG_LATIN7',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4904', descr => 'conversion for UTF8 to LATIN8',
+ conname => 'utf8_to_iso_8859_14', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN8', conproc => 'utf8_to_iso8859' },
+{ oid => '4905', descr => 'conversion for LATIN8 to UTF8',
+ conname => 'iso_8859_14_to_utf8', conforencoding => 'PG_LATIN8',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4906', descr => 'conversion for UTF8 to LATIN9',
+ conname => 'utf8_to_iso_8859_15', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN9', conproc => 'utf8_to_iso8859' },
+{ oid => '4907', descr => 'conversion for LATIN9 to UTF8',
+ conname => 'iso_8859_15_to_utf8', conforencoding => 'PG_LATIN9',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4908', descr => 'conversion for UTF8 to LATIN10',
+ conname => 'utf8_to_iso_8859_16', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN10', conproc => 'utf8_to_iso8859' },
+{ oid => '4909', descr => 'conversion for LATIN10 to UTF8',
+ conname => 'iso_8859_16_to_utf8', conforencoding => 'PG_LATIN10',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4910', descr => 'conversion for UTF8 to ISO-8859-5',
+ conname => 'utf8_to_iso_8859_5', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_5', conproc => 'utf8_to_iso8859' },
+{ oid => '4911', descr => 'conversion for ISO-8859-5 to UTF8',
+ conname => 'iso_8859_5_to_utf8', conforencoding => 'PG_ISO_8859_5',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4912', descr => 'conversion for UTF8 to ISO-8859-6',
+ conname => 'utf8_to_iso_8859_6', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_6', conproc => 'utf8_to_iso8859' },
+{ oid => '4913', descr => 'conversion for ISO-8859-6 to UTF8',
+ conname => 'iso_8859_6_to_utf8', conforencoding => 'PG_ISO_8859_6',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4914', descr => 'conversion for UTF8 to ISO-8859-7',
+ conname => 'utf8_to_iso_8859_7', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_7', conproc => 'utf8_to_iso8859' },
+{ oid => '4915', descr => 'conversion for ISO-8859-7 to UTF8',
+ conname => 'iso_8859_7_to_utf8', conforencoding => 'PG_ISO_8859_7',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4916', descr => 'conversion for UTF8 to ISO-8859-8',
+ conname => 'utf8_to_iso_8859_8', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_ISO_8859_8', conproc => 'utf8_to_iso8859' },
+{ oid => '4917', descr => 'conversion for ISO-8859-8 to UTF8',
+ conname => 'iso_8859_8_to_utf8', conforencoding => 'PG_ISO_8859_8',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_to_utf8' },
+{ oid => '4918', descr => 'conversion for LATIN1 to UTF8',
+ conname => 'iso_8859_1_to_utf8', conforencoding => 'PG_LATIN1',
+ contoencoding => 'PG_UTF8', conproc => 'iso8859_1_to_utf8' },
+{ oid => '4919', descr => 'conversion for UTF8 to LATIN1',
+ conname => 'utf8_to_iso_8859_1', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_LATIN1', conproc => 'utf8_to_iso8859_1' },
+{ oid => '4920', descr => 'conversion for JOHAB to UTF8',
+ conname => 'johab_to_utf8', conforencoding => 'PG_JOHAB',
+ contoencoding => 'PG_UTF8', conproc => 'johab_to_utf8' },
+{ oid => '4921', descr => 'conversion for UTF8 to JOHAB',
+ conname => 'utf8_to_johab', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_JOHAB', conproc => 'utf8_to_johab' },
+{ oid => '4922', descr => 'conversion for SJIS to UTF8',
+ conname => 'sjis_to_utf8', conforencoding => 'PG_SJIS',
+ contoencoding => 'PG_UTF8', conproc => 'sjis_to_utf8' },
+{ oid => '4923', descr => 'conversion for UTF8 to SJIS',
+ conname => 'utf8_to_sjis', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_SJIS', conproc => 'utf8_to_sjis' },
+{ oid => '4924', descr => 'conversion for UHC to UTF8',
+ conname => 'uhc_to_utf8', conforencoding => 'PG_UHC',
+ contoencoding => 'PG_UTF8', conproc => 'uhc_to_utf8' },
+{ oid => '4925', descr => 'conversion for UTF8 to UHC',
+ conname => 'utf8_to_uhc', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_UHC', conproc => 'utf8_to_uhc' },
+{ oid => '4926', descr => 'conversion for EUC_JIS_2004 to UTF8',
+ conname => 'euc_jis_2004_to_utf8', conforencoding => 'PG_EUC_JIS_2004',
+ contoencoding => 'PG_UTF8', conproc => 'euc_jis_2004_to_utf8' },
+{ oid => '4927', descr => 'conversion for UTF8 to EUC_JIS_2004',
+ conname => 'utf8_to_euc_jis_2004', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_EUC_JIS_2004', conproc => 'utf8_to_euc_jis_2004' },
+{ oid => '4928', descr => 'conversion for SHIFT_JIS_2004 to UTF8',
+ conname => 'shift_jis_2004_to_utf8', conforencoding => 'PG_SHIFT_JIS_2004',
+ contoencoding => 'PG_UTF8', conproc => 'shift_jis_2004_to_utf8' },
+{ oid => '4929', descr => 'conversion for UTF8 to SHIFT_JIS_2004',
+ conname => 'utf8_to_shift_jis_2004', conforencoding => 'PG_UTF8',
+ contoencoding => 'PG_SHIFT_JIS_2004', conproc => 'utf8_to_shift_jis_2004' },
+{ oid => '4930', descr => 'conversion for EUC_JIS_2004 to SHIFT_JIS_2004',
+ conname => 'euc_jis_2004_to_shift_jis_2004',
+ conforencoding => 'PG_EUC_JIS_2004', contoencoding => 'PG_SHIFT_JIS_2004',
+ conproc => 'euc_jis_2004_to_shift_jis_2004' },
+{ oid => '4931', descr => 'conversion for SHIFT_JIS_2004 to EUC_JIS_2004',
+ conname => 'shift_jis_2004_to_euc_jis_2004',
+ conforencoding => 'PG_SHIFT_JIS_2004', contoencoding => 'PG_EUC_JIS_2004',
+ conproc => 'shift_jis_2004_to_euc_jis_2004' },
+
+]
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index 6e8f054306..9f31d41272 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -23,30 +23,41 @@
#include "catalog/objectaddress.h"
-/* ----------------------------------------------------------------
- * pg_conversion definition.
- *
- * cpp turns this into typedef struct FormData_pg_namespace
- *
- * conname name of the conversion
- * connamespace name space which the conversion belongs to
- * conowner owner of the conversion
- * conforencoding FOR encoding id
- * contoencoding TO encoding id
- * conproc OID of the conversion proc
- * condefault true if this is a default conversion
- * ----------------------------------------------------------------
+/* ----------------
+ * pg_conversion definition. cpp turns this into
+ * typedef struct FormData_pg_conversion
+ * ----------------
*/
CATALOG(pg_conversion,2607,ConversionRelationId)
{
- Oid oid; /* oid */
+ /* oid */
+ Oid oid;
+
+ /* name of the conversion */
NameData conname;
- Oid connamespace;
- Oid conowner;
- int32 conforencoding;
- int32 contoencoding;
- regproc conproc;
- bool condefault;
+
+ /* name space which the conversion belongs to */
+ Oid connamespace BKI_DEFAULT(PGNSP);
+
+ /* owner of the conversion */
+ Oid conowner BKI_DEFAULT(PGUID);
+
+ /*
+ * Note: The encoding lookups don't refer to other catalogs,
+ * but to values found in mb/pg_wchar.h
+ */
+
+ /* FOR encoding id */
+ int32 conforencoding BKI_LOOKUP(encoding);
+
+ /* TO encoding id */
+ int32 contoencoding BKI_LOOKUP(encoding);
+
+ /* OID of the conversion proc */
+ regproc conproc BKI_LOOKUP(pg_proc);
+
+ /* true if this is a default conversion */
+ bool condefault BKI_DEFAULT(t);
} FormData_pg_conversion;
/* ----------------
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index c8c27948f0..77f124290d 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -21,7 +21,7 @@
# Try to follow the style of existing functions' comments.
# Some recommended conventions:
-
+#
# "I/O" for typinput, typoutput, typreceive, typsend functions
# "I/O typmod" for typmodin, typmodout functions
# "aggregate transition function" for aggtransfn functions, unless
@@ -10048,4 +10048,412 @@
proargnames => '{rootrelid,relid,parentrelid,isleaf,level}',
prosrc => 'pg_partition_tree' },
+# conversion functions
+{ oid => '4600',
+ descr => 'internal conversion function for SQL_ASCII to MULE_INTERNAL',
+ proname => 'ascii_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'ascii_to_mic',
+ probin => '$libdir/ascii_and_mic' },
+{ oid => '4601',
+ descr => 'internal conversion function for MULE_INTERNAL to SQL_ASCII',
+ proname => 'mic_to_ascii', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_ascii',
+ probin => '$libdir/ascii_and_mic' },
+{ oid => '4602',
+ descr => 'internal conversion function for KOI8R to MULE_INTERNAL',
+ proname => 'koi8r_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4603',
+ descr => 'internal conversion function for MULE_INTERNAL to KOI8R',
+ proname => 'mic_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_koi8r',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4604',
+ descr => 'internal conversion function for ISO-8859-5 to MULE_INTERNAL',
+ proname => 'iso_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4605',
+ descr => 'internal conversion function for MULE_INTERNAL to ISO-8859-5',
+ proname => 'mic_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4606',
+ descr => 'internal conversion function for WIN1251 to MULE_INTERNAL',
+ proname => 'win1251_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win1251_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4607',
+ descr => 'internal conversion function for MULE_INTERNAL to WIN1251',
+ proname => 'mic_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_win1251',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4608',
+ descr => 'internal conversion function for WIN866 to MULE_INTERNAL',
+ proname => 'win866_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win866_to_mic',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4609',
+ descr => 'internal conversion function for MULE_INTERNAL to WIN866',
+ proname => 'mic_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_win866',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4610', descr => 'internal conversion function for KOI8R to WIN1251',
+ proname => 'koi8r_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'koi8r_to_win1251', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4611', descr => 'internal conversion function for WIN1251 to KOI8R',
+ proname => 'win1251_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win1251_to_koi8r', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4612', descr => 'internal conversion function for KOI8R to WIN866',
+ proname => 'koi8r_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_win866',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4613', descr => 'internal conversion function for WIN866 to KOI8R',
+ proname => 'win866_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win866_to_koi8r',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4614',
+ descr => 'internal conversion function for WIN866 to WIN1251',
+ proname => 'win866_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win866_to_win1251', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4615',
+ descr => 'internal conversion function for WIN1251 to WIN866',
+ proname => 'win1251_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win1251_to_win866', probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4616',
+ descr => 'internal conversion function for ISO-8859-5 to KOI8R',
+ proname => 'iso_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_koi8r',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4617',
+ descr => 'internal conversion function for KOI8R to ISO-8859-5',
+ proname => 'koi8r_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4618',
+ descr => 'internal conversion function for ISO-8859-5 to WIN1251',
+ proname => 'iso_to_win1251', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_win1251',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4619',
+ descr => 'internal conversion function for WIN1251 to ISO-8859-5',
+ proname => 'win1251_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win1251_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4620',
+ descr => 'internal conversion function for ISO-8859-5 to WIN866',
+ proname => 'iso_to_win866', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso_to_win866',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4621',
+ descr => 'internal conversion function for WIN866 to ISO-8859-5',
+ proname => 'win866_to_iso', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win866_to_iso',
+ probin => '$libdir/cyrillic_and_mic' },
+{ oid => '4622',
+ descr => 'internal conversion function for EUC_CN to MULE_INTERNAL',
+ proname => 'euc_cn_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_cn_to_mic',
+ probin => '$libdir/euc_cn_and_mic' },
+{ oid => '4623',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_CN',
+ proname => 'mic_to_euc_cn', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_cn',
+ probin => '$libdir/euc_cn_and_mic' },
+{ oid => '4624', descr => 'internal conversion function for EUC_JP to SJIS',
+ proname => 'euc_jp_to_sjis', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_jp_to_sjis',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4625', descr => 'internal conversion function for SJIS to EUC_JP',
+ proname => 'sjis_to_euc_jp', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'sjis_to_euc_jp',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4626',
+ descr => 'internal conversion function for EUC_JP to MULE_INTERNAL',
+ proname => 'euc_jp_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_jp_to_mic',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4627',
+ descr => 'internal conversion function for SJIS to MULE_INTERNAL',
+ proname => 'sjis_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'sjis_to_mic',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4628',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_JP',
+ proname => 'mic_to_euc_jp', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_jp',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4629',
+ descr => 'internal conversion function for MULE_INTERNAL to SJIS',
+ proname => 'mic_to_sjis', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_sjis',
+ probin => '$libdir/euc_jp_and_sjis' },
+{ oid => '4630',
+ descr => 'internal conversion function for EUC_KR to MULE_INTERNAL',
+ proname => 'euc_kr_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_kr_to_mic',
+ probin => '$libdir/euc_kr_and_mic' },
+{ oid => '4631',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_KR',
+ proname => 'mic_to_euc_kr', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_kr',
+ probin => '$libdir/euc_kr_and_mic' },
+{ oid => '4632', descr => 'internal conversion function for EUC_TW to BIG5',
+ proname => 'euc_tw_to_big5', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_tw_to_big5',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4633', descr => 'internal conversion function for BIG5 to EUC_TW',
+ proname => 'big5_to_euc_tw', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'big5_to_euc_tw',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4634',
+ descr => 'internal conversion function for EUC_TW to MULE_INTERNAL',
+ proname => 'euc_tw_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_tw_to_mic',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4635',
+ descr => 'internal conversion function for BIG5 to MULE_INTERNAL',
+ proname => 'big5_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'big5_to_mic',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4636',
+ descr => 'internal conversion function for MULE_INTERNAL to EUC_TW',
+ proname => 'mic_to_euc_tw', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_euc_tw',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4637',
+ descr => 'internal conversion function for MULE_INTERNAL to BIG5',
+ proname => 'mic_to_big5', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_big5',
+ probin => '$libdir/euc_tw_and_big5' },
+{ oid => '4638',
+ descr => 'internal conversion function for LATIN2 to MULE_INTERNAL',
+ proname => 'latin2_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin2_to_mic',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4639',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN2',
+ proname => 'mic_to_latin2', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin2',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4640',
+ descr => 'internal conversion function for WIN1250 to MULE_INTERNAL',
+ proname => 'win1250_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win1250_to_mic',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4641',
+ descr => 'internal conversion function for MULE_INTERNAL to WIN1250',
+ proname => 'mic_to_win1250', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_win1250',
+ probin => '$libdir/latin2_and_win1250' },
+{ oid => '4642',
+ descr => 'internal conversion function for LATIN2 to WIN1250',
+ proname => 'latin2_to_win1250', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'latin2_to_win1250', probin => '$libdir/latin2_and_win1250' },
+{ oid => '4643',
+ descr => 'internal conversion function for WIN1250 to LATIN2',
+ proname => 'win1250_to_latin2', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'win1250_to_latin2', probin => '$libdir/latin2_and_win1250' },
+{ oid => '4644',
+ descr => 'internal conversion function for LATIN1 to MULE_INTERNAL',
+ proname => 'latin1_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin1_to_mic',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4645',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN1',
+ proname => 'mic_to_latin1', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin1',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4646',
+ descr => 'internal conversion function for LATIN3 to MULE_INTERNAL',
+ proname => 'latin3_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin3_to_mic',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4647',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN3',
+ proname => 'mic_to_latin3', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin3',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4648',
+ descr => 'internal conversion function for LATIN4 to MULE_INTERNAL',
+ proname => 'latin4_to_mic', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'latin4_to_mic',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4649',
+ descr => 'internal conversion function for MULE_INTERNAL to LATIN4',
+ proname => 'mic_to_latin4', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'mic_to_latin4',
+ probin => '$libdir/latin_and_mic' },
+{ oid => '4650',
+ descr => 'internal conversion function for SQL_ASCII to UTF8',
+ proname => 'ascii_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'ascii_to_utf8',
+ probin => '$libdir/utf8_and_ascii' },
+{ oid => '4651',
+ descr => 'internal conversion function for UTF8 to SQL_ASCII',
+ proname => 'utf8_to_ascii', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_ascii',
+ probin => '$libdir/utf8_and_ascii' },
+{ oid => '4652', descr => 'internal conversion function for BIG5 to UTF8',
+ proname => 'big5_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'big5_to_utf8',
+ probin => '$libdir/utf8_and_big5' },
+{ oid => '4653', descr => 'internal conversion function for UTF8 to BIG5',
+ proname => 'utf8_to_big5', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_big5',
+ probin => '$libdir/utf8_and_big5' },
+{ oid => '4654', descr => 'internal conversion function for UTF8 to KOI8R',
+ proname => 'utf8_to_koi8r', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_koi8r',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4655', descr => 'internal conversion function for KOI8R to UTF8',
+ proname => 'koi8r_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8r_to_utf8',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4656', descr => 'internal conversion function for UTF8 to KOI8U',
+ proname => 'utf8_to_koi8u', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_koi8u',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4657', descr => 'internal conversion function for KOI8U to UTF8',
+ proname => 'koi8u_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'koi8u_to_utf8',
+ probin => '$libdir/utf8_and_cyrillic' },
+{ oid => '4658', descr => 'internal conversion function for UTF8 to WIN',
+ proname => 'utf8_to_win', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_win',
+ probin => '$libdir/utf8_and_win' },
+{ oid => '4659', descr => 'internal conversion function for WIN to UTF8',
+ proname => 'win_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'win_to_utf8',
+ probin => '$libdir/utf8_and_win' },
+{ oid => '4660', descr => 'internal conversion function for EUC_CN to UTF8',
+ proname => 'euc_cn_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_cn_to_utf8',
+ probin => '$libdir/utf8_and_euc_cn' },
+{ oid => '4661', descr => 'internal conversion function for UTF8 to EUC_CN',
+ proname => 'utf8_to_euc_cn', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_cn',
+ probin => '$libdir/utf8_and_euc_cn' },
+{ oid => '4662', descr => 'internal conversion function for EUC_JP to UTF8',
+ proname => 'euc_jp_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_jp_to_utf8',
+ probin => '$libdir/utf8_and_euc_jp' },
+{ oid => '4663', descr => 'internal conversion function for UTF8 to EUC_JP',
+ proname => 'utf8_to_euc_jp', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_jp',
+ probin => '$libdir/utf8_and_euc_jp' },
+{ oid => '4664', descr => 'internal conversion function for EUC_KR to UTF8',
+ proname => 'euc_kr_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_kr_to_utf8',
+ probin => '$libdir/utf8_and_euc_kr' },
+{ oid => '4665', descr => 'internal conversion function for UTF8 to EUC_KR',
+ proname => 'utf8_to_euc_kr', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_kr',
+ probin => '$libdir/utf8_and_euc_kr' },
+{ oid => '4666', descr => 'internal conversion function for EUC_TW to UTF8',
+ proname => 'euc_tw_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'euc_tw_to_utf8',
+ probin => '$libdir/utf8_and_euc_tw' },
+{ oid => '4667', descr => 'internal conversion function for UTF8 to EUC_TW',
+ proname => 'utf8_to_euc_tw', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_euc_tw',
+ probin => '$libdir/utf8_and_euc_tw' },
+{ oid => '4668', descr => 'internal conversion function for GB18030 to UTF8',
+ proname => 'gb18030_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'gb18030_to_utf8',
+ probin => '$libdir/utf8_and_gb18030' },
+{ oid => '4669', descr => 'internal conversion function for UTF8 to GB18030',
+ proname => 'utf8_to_gb18030', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_gb18030',
+ probin => '$libdir/utf8_and_gb18030' },
+{ oid => '4670', descr => 'internal conversion function for GBK to UTF8',
+ proname => 'gbk_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'gbk_to_utf8',
+ probin => '$libdir/utf8_and_gbk' },
+{ oid => '4671', descr => 'internal conversion function for UTF8 to GBK',
+ proname => 'utf8_to_gbk', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_gbk',
+ probin => '$libdir/utf8_and_gbk' },
+{ oid => '4672',
+ descr => 'internal conversion function for UTF8 to ISO-8859 2-16',
+ proname => 'utf8_to_iso8859', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_iso8859',
+ probin => '$libdir/utf8_and_iso8859' },
+{ oid => '4673',
+ descr => 'internal conversion function for ISO-8859 2-16 to UTF8',
+ proname => 'iso8859_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'iso8859_to_utf8',
+ probin => '$libdir/utf8_and_iso8859' },
+{ oid => '4674', descr => 'internal conversion function for LATIN1 to UTF8',
+ proname => 'iso8859_1_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'iso8859_1_to_utf8', probin => '$libdir/utf8_and_iso8859_1' },
+{ oid => '4675', descr => 'internal conversion function for UTF8 to LATIN1',
+ proname => 'utf8_to_iso8859_1', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'utf8_to_iso8859_1', probin => '$libdir/utf8_and_iso8859_1' },
+{ oid => '4676', descr => 'internal conversion function for JOHAB to UTF8',
+ proname => 'johab_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'johab_to_utf8',
+ probin => '$libdir/utf8_and_johab' },
+{ oid => '4677', descr => 'internal conversion function for UTF8 to JOHAB',
+ proname => 'utf8_to_johab', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_johab',
+ probin => '$libdir/utf8_and_johab' },
+{ oid => '4678', descr => 'internal conversion function for SJIS to UTF8',
+ proname => 'sjis_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'sjis_to_utf8',
+ probin => '$libdir/utf8_and_sjis' },
+{ oid => '4679', descr => 'internal conversion function for UTF8 to SJIS',
+ proname => 'utf8_to_sjis', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_sjis',
+ probin => '$libdir/utf8_and_sjis' },
+{ oid => '4680', descr => 'internal conversion function for UHC to UTF8',
+ proname => 'uhc_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'uhc_to_utf8',
+ probin => '$libdir/utf8_and_uhc' },
+{ oid => '4681', descr => 'internal conversion function for UTF8 to UHC',
+ proname => 'utf8_to_uhc', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4', prosrc => 'utf8_to_uhc',
+ probin => '$libdir/utf8_and_uhc' },
+{ oid => '4682',
+ descr => 'internal conversion function for EUC_JIS_2004 to UTF8',
+ proname => 'euc_jis_2004_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'euc_jis_2004_to_utf8', probin => '$libdir/utf8_and_euc2004' },
+{ oid => '4683',
+ descr => 'internal conversion function for UTF8 to EUC_JIS_2004',
+ proname => 'utf8_to_euc_jis_2004', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'utf8_to_euc_jis_2004', probin => '$libdir/utf8_and_euc2004' },
+{ oid => '4684',
+ descr => 'internal conversion function for SHIFT_JIS_2004 to UTF8',
+ proname => 'shift_jis_2004_to_utf8', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'shift_jis_2004_to_utf8', probin => '$libdir/utf8_and_sjis2004' },
+{ oid => '4685',
+ descr => 'internal conversion function for UTF8 to SHIFT_JIS_2004',
+ proname => 'utf8_to_shift_jis_2004', prolang => 'c', prorettype => 'void',
+ proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'utf8_to_shift_jis_2004', probin => '$libdir/utf8_and_sjis2004' },
+{ oid => '4686',
+ descr => 'internal conversion function for EUC_JIS_2004 to SHIFT_JIS_2004',
+ proname => 'euc_jis_2004_to_shift_jis_2004', prolang => 'c',
+ prorettype => 'void', proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'euc_jis_2004_to_shift_jis_2004',
+ probin => '$libdir/euc2004_sjis2004' },
+{ oid => '4687',
+ descr => 'internal conversion function for SHIFT_JIS_2004 to EUC_JIS_2004',
+ proname => 'shift_jis_2004_to_euc_jis_2004', prolang => 'c',
+ prorettype => 'void', proargtypes => 'int4 int4 cstring internal int4',
+ prosrc => 'shift_jis_2004_to_euc_jis_2004',
+ probin => '$libdir/euc2004_sjis2004' },
+
]
diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out
index 1d4b000acf..8538173ff8 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -74,7 +74,6 @@ loop
end loop;
end$$;
NOTICE: pg_constraint contains unpinned initdb-created object(s)
-NOTICE: pg_conversion contains unpinned initdb-created object(s)
NOTICE: pg_database contains unpinned initdb-created object(s)
NOTICE: pg_extension contains unpinned initdb-created object(s)
NOTICE: pg_rewrite contains unpinned initdb-created object(s)
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 7e1c9ac848..7494bfa004 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -139,7 +139,6 @@ sub Install
CopyFiles(
'Error code data', $target . '/share/',
'src/backend/utils/', 'errcodes.txt');
- GenerateConversionScript($target);
GenerateTimezoneFiles($target, $conf);
GenerateTsearchFiles($target);
CopySetOfFiles(
@@ -348,44 +347,6 @@ sub CopySolutionOutput
return;
}
-sub GenerateConversionScript
-{
- my $target = shift;
- my $sql = "";
- my $F;
-
- print "Generating conversion proc script...";
- my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
- $mf =~ s{\\\r?\n}{}g;
- $mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
- || die "Could not find CONVERSIONS line in conversions Makefile\n";
- my @pieces = split /\s+/, $1;
- while ($#pieces > 0)
- {
- my $name = shift @pieces;
- my $se = shift @pieces;
- my $de = shift @pieces;
- my $func = shift @pieces;
- my $obj = shift @pieces;
- $sql .= "-- $se --> $de\n";
- $sql .=
- "CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
- $sql .=
- "COMMENT ON FUNCTION $func(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) IS 'internal conversion function for $se to $de';\n";
- $sql .= "DROP CONVERSION pg_catalog.$name;\n";
- $sql .=
- "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
- $sql .=
- "COMMENT ON CONVERSION pg_catalog.$name IS 'conversion for $se to $de';\n\n";
- }
- open($F, '>', "$target/share/conversion_create.sql")
- || die "Could not write to conversion_create.sql\n";
- print $F $sql;
- close($F);
- print "\n";
- return;
-}
-
sub GenerateTimezoneFiles
{
my $target = shift;
--
2.17.1
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: inconsistency and inefficiency in setup_conversion()
@ 2019-01-04 00:49 Tom Lane <[email protected]>
parent: John Naylor <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Tom Lane @ 2019-01-04 00:49 UTC (permalink / raw)
To: John Naylor <[email protected]>; +Cc: pgsql-hackers
John Naylor <[email protected]> writes:
> Since it's been a few months since last discussion, I'd like to
> summarize the purpose of this patch and advocate for its inclusion in
> v12:
Pushed after some review and correction. Notably, I didn't like
leaving the info about the encoding lookup out of bki.sgml, so
I changed that.
regards, tom lane
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 17:19 Dave Cramer <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Dave Cramer @ 2023-08-07 17:19 UTC (permalink / raw)
To: Alvaro Herrera <[email protected]>; +Cc: Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]
On Mon, 7 Aug 2023 at 03:10, Alvaro Herrera <[email protected]> wrote:
> On 2023-Aug-07, Peter Smith wrote:
>
> > I guess, your patch would not be much different; you can still have
> > all the nice names and assign the appropriate values to the enum
> > values same as now, but using an enum you might also gain
> > type-checking in the code and also get warnings for the "switch"
> > statements if there are any cases accidentally omitted.
>
> Hmm, I think omitting a 'default' clause (which is needed when you want
> warnings for missing clauses) in a switch that handles protocol traffic
> is not great, because the switch would misbehave when the network
> counterpart sends a broken message. I'm not sure we want to do that.
> It could become a serious security problem if confronted with a
> malicious libpq.
>
>
Any other changes required ?
Dave
> --
> Álvaro Herrera PostgreSQL Developer —
> https://www.EnterpriseDB.com/
>
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 17:36 Robert Haas <[email protected]>
parent: Dave Cramer <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Robert Haas @ 2023-08-07 17:36 UTC (permalink / raw)
To: Dave Cramer <[email protected]>; +Cc: Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]
On Mon, Aug 7, 2023 at 1:19 PM Dave Cramer <[email protected]> wrote:
> Any other changes required ?
IMHO, the correspondence between the names in the patch and the
traditional names in the documentation could be stronger. For example,
the documentation mentions EmptyQueryResponse and
NegotiateProtocolVersion, but in this patch those become
PQMSG_RESP_NEGOTIATE_PROTOCOL and PQMSG_RESP_EMPTY_QUERY. I think we
could consider directly using the names from the documentation, right
down to capitalization, perhaps with a prefix, but I'm also totally
fine with this use of uppercase letters and underscores. But why not
do a strict translation, like EmptyQueryResponse ->
PQMSG_EMPTY_QUERY_RESPONSE, NegotiateProtocolVersion ->
PQMSG_NEGOTIATE_PROTOCOL_VERSION? To me at least, the current patch is
inventing new and slightly different names for things that already
have names...
--
Robert Haas
EDB: http://www.enterprisedb.com
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 18:24 Tom Lane <[email protected]>
parent: Robert Haas <[email protected]>
0 siblings, 2 replies; 29+ messages in thread
From: Tom Lane @ 2023-08-07 18:24 UTC (permalink / raw)
To: Robert Haas <[email protected]>; +Cc: Dave Cramer <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]
Robert Haas <[email protected]> writes:
> IMHO, the correspondence between the names in the patch and the
> traditional names in the documentation could be stronger. For example,
> the documentation mentions EmptyQueryResponse and
> NegotiateProtocolVersion, but in this patch those become
> PQMSG_RESP_NEGOTIATE_PROTOCOL and PQMSG_RESP_EMPTY_QUERY. I think we
> could consider directly using the names from the documentation, right
> down to capitalization, perhaps with a prefix, but I'm also totally
> fine with this use of uppercase letters and underscores. But why not
> do a strict translation, like EmptyQueryResponse ->
> PQMSG_EMPTY_QUERY_RESPONSE, NegotiateProtocolVersion ->
> PQMSG_NEGOTIATE_PROTOCOL_VERSION? To me at least, the current patch is
> inventing new and slightly different names for things that already
> have names...
+1. For ease of greppability, maybe even PQMSG_EmptyQueryResponse
and so on? Then one grep would find both uses of the constants and
code/docs references. Not sure if the prefix should be all-caps or
not if we go this way.
regards, tom lane
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 18:38 Nathan Bossart <[email protected]>
parent: Tom Lane <[email protected]>
1 sibling, 0 replies; 29+ messages in thread
From: Nathan Bossart @ 2023-08-07 18:38 UTC (permalink / raw)
To: Tom Lane <[email protected]>; +Cc: Robert Haas <[email protected]>; Dave Cramer <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]
On Mon, Aug 07, 2023 at 02:24:58PM -0400, Tom Lane wrote:
> Robert Haas <[email protected]> writes:
>> IMHO, the correspondence between the names in the patch and the
>> traditional names in the documentation could be stronger. For example,
>> the documentation mentions EmptyQueryResponse and
>> NegotiateProtocolVersion, but in this patch those become
>> PQMSG_RESP_NEGOTIATE_PROTOCOL and PQMSG_RESP_EMPTY_QUERY. I think we
>> could consider directly using the names from the documentation, right
>> down to capitalization, perhaps with a prefix, but I'm also totally
>> fine with this use of uppercase letters and underscores. But why not
>> do a strict translation, like EmptyQueryResponse ->
>> PQMSG_EMPTY_QUERY_RESPONSE, NegotiateProtocolVersion ->
>> PQMSG_NEGOTIATE_PROTOCOL_VERSION? To me at least, the current patch is
>> inventing new and slightly different names for things that already
>> have names...
>
> +1. For ease of greppability, maybe even PQMSG_EmptyQueryResponse
> and so on? Then one grep would find both uses of the constants and
> code/docs references. Not sure if the prefix should be all-caps or
> not if we go this way.
+1 for Tom's suggestion. I have no strong opinion about the prefix, but I
do think easing greppability is worthwhile.
As mentioned earlier [0], I think we should also consider putting the
definitions in pqcomm.h.
[0] https://postgr.es/m/20230803185356.GA1144430%40nathanxps13
--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 18:59 Robert Haas <[email protected]>
parent: Tom Lane <[email protected]>
1 sibling, 1 reply; 29+ messages in thread
From: Robert Haas @ 2023-08-07 18:59 UTC (permalink / raw)
To: Tom Lane <[email protected]>; +Cc: Dave Cramer <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]
On Mon, Aug 7, 2023 at 2:25 PM Tom Lane <[email protected]> wrote:
> +1. For ease of greppability, maybe even PQMSG_EmptyQueryResponse
> and so on? Then one grep would find both uses of the constants and
> code/docs references. Not sure if the prefix should be all-caps or
> not if we go this way.
PqMsgEmptyQueryResponse or something like that seems better, if we
want to keep the current capitalization. I'm not a huge fan of the way
we vary our capitalization conventions so much all over the code base,
but I think we would at least do well to keep it consistent from one
end of a certain identifier to the other.
--
Robert Haas
EDB: http://www.enterprisedb.com
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 20:00 Dave Cramer <[email protected]>
parent: Robert Haas <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Dave Cramer @ 2023-08-07 20:00 UTC (permalink / raw)
To: Robert Haas <[email protected]>; +Cc: Tom Lane <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]
On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
> On Mon, Aug 7, 2023 at 2:25 PM Tom Lane <[email protected]> wrote:
> > +1. For ease of greppability, maybe even PQMSG_EmptyQueryResponse
> > and so on? Then one grep would find both uses of the constants and
> > code/docs references. Not sure if the prefix should be all-caps or
> > not if we go this way.
>
> PqMsgEmptyQueryResponse or something like that seems better, if we
> want to keep the current capitalization. I'm not a huge fan of the way
> we vary our capitalization conventions so much all over the code base,
> but I think we would at least do well to keep it consistent from one
> end of a certain identifier to the other.
>
I don't have a strong preference, but before I make the changes I'd like to
get consensus.
Can we vote or whatever it takes to decide on a naming pattern that is
acceptable ?
Dave
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 20:02 Tom Lane <[email protected]>
parent: Dave Cramer <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Tom Lane @ 2023-08-07 20:02 UTC (permalink / raw)
To: Dave Cramer <[email protected]>; +Cc: Robert Haas <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]
Dave Cramer <[email protected]> writes:
> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
>> PqMsgEmptyQueryResponse or something like that seems better, if we
>> want to keep the current capitalization. I'm not a huge fan of the way
>> we vary our capitalization conventions so much all over the code base,
>> but I think we would at least do well to keep it consistent from one
>> end of a certain identifier to the other.
> I don't have a strong preference, but before I make the changes I'd like to
> get consensus.
> Can we vote or whatever it takes to decide on a naming pattern that is
> acceptable ?
I'm good with Robert's proposal above.
regards, tom lane
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 21:47 Nathan Bossart <[email protected]>
parent: Tom Lane <[email protected]>
0 siblings, 2 replies; 29+ messages in thread
From: Nathan Bossart @ 2023-08-07 21:47 UTC (permalink / raw)
To: Tom Lane <[email protected]>; +Cc: Dave Cramer <[email protected]>; Robert Haas <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]
On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
> Dave Cramer <[email protected]> writes:
>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
>>> PqMsgEmptyQueryResponse or something like that seems better, if we
>>> want to keep the current capitalization. I'm not a huge fan of the way
>>> we vary our capitalization conventions so much all over the code base,
>>> but I think we would at least do well to keep it consistent from one
>>> end of a certain identifier to the other.
>
>> I don't have a strong preference, but before I make the changes I'd like to
>> get consensus.
>> Can we vote or whatever it takes to decide on a naming pattern that is
>> acceptable ?
>
> I'm good with Robert's proposal above.
+1
--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 22:49 Tatsuo Ishii <[email protected]>
parent: Nathan Bossart <[email protected]>
1 sibling, 1 reply; 29+ messages in thread
From: Tatsuo Ishii @ 2023-08-07 22:49 UTC (permalink / raw)
To: [email protected]; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
> On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
>> Dave Cramer <[email protected]> writes:
>>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
>>>> PqMsgEmptyQueryResponse or something like that seems better, if we
>>>> want to keep the current capitalization. I'm not a huge fan of the way
>>>> we vary our capitalization conventions so much all over the code base,
>>>> but I think we would at least do well to keep it consistent from one
>>>> end of a certain identifier to the other.
>>
>>> I don't have a strong preference, but before I make the changes I'd like to
>>> get consensus.
>>> Can we vote or whatever it takes to decide on a naming pattern that is
>>> acceptable ?
>>
>> I'm good with Robert's proposal above.
>
> +1
+1.
Also we need to decide what to do with them:
> #define PQMSG_REQ_PREPARED 'S'
> #define PQMSG_REQ_PORTAL 'P'
If we go "PqMsgEmptyQueryResponse", probably we should go something
like for these?
#define PqMsgReqPrepared 'S'
#define PqMsgReqPortal 'P'
Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-07 23:55 Dave Cramer <[email protected]>
parent: Tatsuo Ishii <[email protected]>
0 siblings, 2 replies; 29+ messages in thread
From: Dave Cramer @ 2023-08-07 23:55 UTC (permalink / raw)
To: Tatsuo Ishii <[email protected]>; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
On Mon, 7 Aug 2023 at 16:50, Tatsuo Ishii <[email protected]> wrote:
> > On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
> >> Dave Cramer <[email protected]> writes:
> >>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]>
> wrote:
> >>>> PqMsgEmptyQueryResponse or something like that seems better, if we
> >>>> want to keep the current capitalization. I'm not a huge fan of the way
> >>>> we vary our capitalization conventions so much all over the code base,
> >>>> but I think we would at least do well to keep it consistent from one
> >>>> end of a certain identifier to the other.
> >>
> >>> I don't have a strong preference, but before I make the changes I'd
> like to
> >>> get consensus.
> >>> Can we vote or whatever it takes to decide on a naming pattern that is
> >>> acceptable ?
> >>
> >> I'm good with Robert's proposal above.
> >
> > +1
>
> +1.
>
> Also we need to decide what to do with them:
>
> > #define PQMSG_REQ_PREPARED 'S'
> > #define PQMSG_REQ_PORTAL 'P'
>
> If we go "PqMsgEmptyQueryResponse", probably we should go something
> like for these?
>
> #define PqMsgReqPrepared 'S'
> #define PqMsgReqPortal 'P'
>
I went with PqMsgPortalSubCommand and PqMsgPreparedSubCommand
See attached patch
Dave
Attachments:
[application/octet-stream] 0001-Created-protocol.h.patch (60.3K, ../../CADK3HHJgZWCh8Kwvc41=B3nAXyP_iX0bFewe7+7q6qp1hXiW5g@mail.gmail.com/3-0001-Created-protocol.h.patch)
download | inline diff:
From 1b613d3c96991a1616786d1ca4b1f5365b68f74a Mon Sep 17 00:00:00 2001
From: Dave Cramer <[email protected]>
Date: Thu, 20 Apr 2023 15:40:03 -0400
Subject: [PATCH] Created protocol.h Protocol.h has defines for every protocol
message both backend and frontend Instead of using hardcoded values for each
protocol message use defines to make code easier to read
Use commands for documenting fe-trace.c
More commands instead of characters
Change name to
PqMsg<name>Request|Response
---
src/backend/access/common/printsimple.c | 5 +-
src/backend/access/transam/parallel.c | 17 +--
src/backend/backup/basebackup_copy.c | 21 ++--
src/backend/commands/async.c | 3 +-
src/backend/commands/copyfromparse.c | 23 ++--
src/backend/commands/copyto.c | 7 +-
src/backend/libpq/auth-sasl.c | 3 +-
src/backend/libpq/auth.c | 9 +-
src/backend/postmaster/postmaster.c | 3 +-
src/backend/replication/walsender.c | 19 ++--
src/backend/tcop/dest.c | 9 +-
src/backend/tcop/fastpath.c | 3 +-
src/backend/tcop/postgres.c | 77 ++++++-------
src/backend/utils/activity/backend_progress.c | 3 +-
src/backend/utils/error/elog.c | 3 +-
src/backend/utils/misc/guc.c | 3 +-
src/include/protocol.h | 60 +++++++++++
src/interfaces/libpq/fe-auth.c | 3 +-
src/interfaces/libpq/fe-connect.c | 15 +--
src/interfaces/libpq/fe-exec.c | 53 ++++-----
src/interfaces/libpq/fe-protocol3.c | 66 ++++++------
src/interfaces/libpq/fe-trace.c | 101 +++++++++---------
22 files changed, 294 insertions(+), 212 deletions(-)
create mode 100644 src/include/protocol.h
diff --git a/src/backend/access/common/printsimple.c b/src/backend/access/common/printsimple.c
index ef818228ac..54052b1bb7 100644
--- a/src/backend/access/common/printsimple.c
+++ b/src/backend/access/common/printsimple.c
@@ -21,6 +21,7 @@
#include "access/printsimple.h"
#include "catalog/pg_type.h"
#include "libpq/pqformat.h"
+#include "protocol.h"
#include "utils/builtins.h"
/*
@@ -32,7 +33,7 @@ printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
StringInfoData buf;
int i;
- pq_beginmessage(&buf, 'T'); /* RowDescription */
+ pq_beginmessage(&buf, PqMsgRowDescriptionResponse);
pq_sendint16(&buf, tupdesc->natts);
for (i = 0; i < tupdesc->natts; ++i)
@@ -65,7 +66,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self)
slot_getallattrs(slot);
/* Prepare and send message */
- pq_beginmessage(&buf, 'D');
+ pq_beginmessage(&buf, PqMsgDataRowResponse);
pq_sendint16(&buf, tupdesc->natts);
for (i = 0; i < tupdesc->natts; ++i)
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 1738aecf1f..dd7c8290f4 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -33,6 +33,7 @@
#include "miscadmin.h"
#include "optimizer/optimizer.h"
#include "pgstat.h"
+#include "protocol.h"
#include "storage/ipc.h"
#include "storage/predicate.h"
#include "storage/sinval.h"
@@ -1127,7 +1128,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
switch (msgtype)
{
- case 'K': /* BackendKeyData */
+ case PqMsgBackendKeyDataRequest:
{
int32 pid = pq_getmsgint(msg, 4);
@@ -1137,8 +1138,8 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
break;
}
- case 'E': /* ErrorResponse */
- case 'N': /* NoticeResponse */
+ case PqMsgErrorResponse:
+ case PqMsgNoticeResponse:
{
ErrorData edata;
ErrorContextCallback *save_error_context_stack;
@@ -1183,7 +1184,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
break;
}
- case 'A': /* NotifyResponse */
+ case PqMsgNotifyResponse:
{
/* Propagate NotifyResponse. */
int32 pid;
@@ -1200,7 +1201,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
break;
}
- case 'P': /* Parallel progress reporting */
+ case PqMsgParallelProgressResponse:
{
/*
* Only incremental progress reporting is currently supported.
@@ -1217,7 +1218,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
break;
}
- case 'X': /* Terminate, indicating clean exit */
+ case PqMsgTerminateRequest: /* Terminate, indicating clean exit */
{
shm_mq_detach(pcxt->worker[i].error_mqh);
pcxt->worker[i].error_mqh = NULL;
@@ -1372,7 +1373,7 @@ ParallelWorkerMain(Datum main_arg)
* protocol message is defined, but it won't actually be used for anything
* in this case.
*/
- pq_beginmessage(&msgbuf, 'K');
+ pq_beginmessage(&msgbuf, PqMsgBackendKeyDataRequest);
pq_sendint32(&msgbuf, (int32) MyProcPid);
pq_sendint32(&msgbuf, (int32) MyCancelKey);
pq_endmessage(&msgbuf);
@@ -1550,7 +1551,7 @@ ParallelWorkerMain(Datum main_arg)
DetachSession();
/* Report success. */
- pq_putmessage('X', NULL, 0);
+ pq_putmessage(PqMsgTerminateRequest, NULL, 0);
}
/*
diff --git a/src/backend/backup/basebackup_copy.c b/src/backend/backup/basebackup_copy.c
index 1db80cde1b..e44189b171 100644
--- a/src/backend/backup/basebackup_copy.c
+++ b/src/backend/backup/basebackup_copy.c
@@ -32,6 +32,7 @@
#include "executor/executor.h"
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
+#include "protocol.h"
#include "tcop/dest.h"
#include "utils/builtins.h"
#include "utils/timestamp.h"
@@ -152,7 +153,7 @@ bbsink_copystream_begin_backup(bbsink *sink)
SendTablespaceList(state->tablespaces);
/* Send a CommandComplete message */
- pq_puttextmessage('C', "SELECT");
+ pq_puttextmessage(PqMsgCommandCompleteResponse, "SELECT");
/* Begin COPY stream. This will be used for all archives + manifest. */
SendCopyOutResponse();
@@ -169,7 +170,7 @@ bbsink_copystream_begin_archive(bbsink *sink, const char *archive_name)
StringInfoData buf;
ti = list_nth(state->tablespaces, state->tablespace_num);
- pq_beginmessage(&buf, 'd'); /* CopyData */
+ pq_beginmessage(&buf, PqMsgCopyDataRequest);
pq_sendbyte(&buf, 'n'); /* New archive */
pq_sendstring(&buf, archive_name);
pq_sendstring(&buf, ti->path == NULL ? "" : ti->path);
@@ -220,8 +221,8 @@ bbsink_copystream_archive_contents(bbsink *sink, size_t len)
{
mysink->last_progress_report_time = now;
- pq_beginmessage(&buf, 'd'); /* CopyData */
- pq_sendbyte(&buf, 'p'); /* Progress report */
+ pq_beginmessage(&buf, PqMsgCopyDataRequest);
+ pq_sendbyte(&buf, PqMsgCopyProgressRequest);
pq_sendint64(&buf, state->bytes_done);
pq_endmessage(&buf);
pq_flush_if_writable();
@@ -246,8 +247,8 @@ bbsink_copystream_end_archive(bbsink *sink)
mysink->bytes_done_at_last_time_check = state->bytes_done;
mysink->last_progress_report_time = GetCurrentTimestamp();
- pq_beginmessage(&buf, 'd'); /* CopyData */
- pq_sendbyte(&buf, 'p'); /* Progress report */
+ pq_beginmessage(&buf, PqMsgCopyDataRequest);
+ pq_sendbyte(&buf, PqMsgCopyProgressRequest);
pq_sendint64(&buf, state->bytes_done);
pq_endmessage(&buf);
pq_flush_if_writable();
@@ -261,7 +262,7 @@ bbsink_copystream_begin_manifest(bbsink *sink)
{
StringInfoData buf;
- pq_beginmessage(&buf, 'd'); /* CopyData */
+ pq_beginmessage(&buf, PqMsgCopyDataRequest);
pq_sendbyte(&buf, 'm'); /* Manifest */
pq_endmessage(&buf);
}
@@ -318,7 +319,7 @@ SendCopyOutResponse(void)
{
StringInfoData buf;
- pq_beginmessage(&buf, 'H');
+ pq_beginmessage(&buf, PqMsgCopyOutResponse);
pq_sendbyte(&buf, 0); /* overall format */
pq_sendint16(&buf, 0); /* natts */
pq_endmessage(&buf);
@@ -330,7 +331,7 @@ SendCopyOutResponse(void)
static void
SendCopyDone(void)
{
- pq_putemptymessage('c');
+ pq_putemptymessage(PqMsgCopyDoneRequest);
}
/*
@@ -368,7 +369,7 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
end_tup_output(tstate);
/* Send a CommandComplete message */
- pq_puttextmessage('C', "SELECT");
+ pq_puttextmessage(PqMsgCommandCompleteResponse, "SELECT");
}
/*
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index ef909cf4e0..27e2401601 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -141,6 +141,7 @@
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
#include "miscadmin.h"
+#include "protocol.h"
#include "storage/ipc.h"
#include "storage/lmgr.h"
#include "storage/proc.h"
@@ -2281,7 +2282,7 @@ NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)
{
StringInfoData buf;
- pq_beginmessage(&buf, 'A');
+ pq_beginmessage(&buf, PqMsgNotifyResponse);
pq_sendint32(&buf, srcPid);
pq_sendstring(&buf, channel);
pq_sendstring(&buf, payload);
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 232768a6e1..7e90e2da5d 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -72,6 +72,7 @@
#include "miscadmin.h"
#include "pgstat.h"
#include "port/pg_bswap.h"
+#include "protocol.h"
#include "utils/builtins.h"
#include "utils/memutils.h"
#include "utils/rel.h"
@@ -174,7 +175,7 @@ ReceiveCopyBegin(CopyFromState cstate)
int16 format = (cstate->opts.binary ? 1 : 0);
int i;
- pq_beginmessage(&buf, 'G');
+ pq_beginmessage(&buf, PqMsgCopyInResponse);
pq_sendbyte(&buf, format); /* overall format */
pq_sendint16(&buf, natts);
for (i = 0; i < natts; i++)
@@ -279,13 +280,13 @@ CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread)
/* Validate message type and set packet size limit */
switch (mtype)
{
- case 'd': /* CopyData */
+ case PqMsgCopyDataRequest:
maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
break;
- case 'c': /* CopyDone */
- case 'f': /* CopyFail */
- case 'H': /* Flush */
- case 'S': /* Sync */
+ case PqMsgCopyDoneRequest:
+ case PqMsgCopyFailRequest:
+ case PqMsgFlushDataRequest:
+ case PqMsgSyncDataRequest:
maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
break;
default:
@@ -305,20 +306,20 @@ CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread)
/* ... and process it */
switch (mtype)
{
- case 'd': /* CopyData */
+ case PqMsgCopyDataRequest:
break;
- case 'c': /* CopyDone */
+ case PqMsgCopyDoneRequest:
/* COPY IN correctly terminated by frontend */
cstate->raw_reached_eof = true;
return bytesread;
- case 'f': /* CopyFail */
+ case PqMsgCopyFailRequest:
ereport(ERROR,
(errcode(ERRCODE_QUERY_CANCELED),
errmsg("COPY from stdin failed: %s",
pq_getmsgstring(cstate->fe_msgbuf))));
break;
- case 'H': /* Flush */
- case 'S': /* Sync */
+ case PqMsgFlushDataRequest:
+ case PqMsgSyncDataRequest:
/*
* Ignore Flush/Sync for the convenience of client
diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c
index 9e4b2437a5..2b832bed1e 100644
--- a/src/backend/commands/copyto.c
+++ b/src/backend/commands/copyto.c
@@ -34,6 +34,7 @@
#include "miscadmin.h"
#include "optimizer/optimizer.h"
#include "pgstat.h"
+#include "protocol.h"
#include "rewrite/rewriteHandler.h"
#include "storage/fd.h"
#include "tcop/tcopprot.h"
@@ -144,7 +145,7 @@ SendCopyBegin(CopyToState cstate)
int16 format = (cstate->opts.binary ? 1 : 0);
int i;
- pq_beginmessage(&buf, 'H');
+ pq_beginmessage(&buf, PqMsgCopyOutResponse);
pq_sendbyte(&buf, format); /* overall format */
pq_sendint16(&buf, natts);
for (i = 0; i < natts; i++)
@@ -159,7 +160,7 @@ SendCopyEnd(CopyToState cstate)
/* Shouldn't have any unsent data */
Assert(cstate->fe_msgbuf->len == 0);
/* Send Copy Done message */
- pq_putemptymessage('c');
+ pq_putemptymessage(PqMsgCopyDoneRequest);
}
/*----------
@@ -247,7 +248,7 @@ CopySendEndOfRow(CopyToState cstate)
CopySendChar(cstate, '\n');
/* Dump the accumulated row as one CopyData message */
- (void) pq_putmessage('d', fe_msgbuf->data, fe_msgbuf->len);
+ (void) pq_putmessage(PqMsgCopyDataRequest, fe_msgbuf->data, fe_msgbuf->len);
break;
case COPY_CALLBACK:
cstate->data_dest_cb(fe_msgbuf->data, fe_msgbuf->len);
diff --git a/src/backend/libpq/auth-sasl.c b/src/backend/libpq/auth-sasl.c
index 684680897b..7327b7316c 100644
--- a/src/backend/libpq/auth-sasl.c
+++ b/src/backend/libpq/auth-sasl.c
@@ -19,6 +19,7 @@
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
#include "libpq/sasl.h"
+#include "protocol.h"
/*
* Maximum accepted size of SASL messages.
@@ -87,7 +88,7 @@ CheckSASLAuth(const pg_be_sasl_mech *mech, Port *port, char *shadow_pass,
{
pq_startmsgread();
mtype = pq_getbyte();
- if (mtype != 'p')
+ if (mtype != PqMsgPasswordResponse)
{
/* Only log error if client didn't disconnect. */
if (mtype != EOF)
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index 315a24bb3f..fb572cfe8c 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -34,6 +34,7 @@
#include "libpq/scram.h"
#include "miscadmin.h"
#include "port/pg_bswap.h"
+#include "protocol.h"
#include "postmaster/postmaster.h"
#include "replication/walsender.h"
#include "storage/ipc.h"
@@ -665,7 +666,7 @@ sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, int extrale
CHECK_FOR_INTERRUPTS();
- pq_beginmessage(&buf, 'R');
+ pq_beginmessage(&buf, PqMsgAuthenticationRequest);
pq_sendint32(&buf, (int32) areq);
if (extralen > 0)
pq_sendbytes(&buf, extradata, extralen);
@@ -698,7 +699,7 @@ recv_password_packet(Port *port)
/* Expect 'p' message type */
mtype = pq_getbyte();
- if (mtype != 'p')
+ if (mtype != PqMsgPasswordResponse)
{
/*
* If the client just disconnects without offering a password, don't
@@ -961,7 +962,7 @@ pg_GSS_recvauth(Port *port)
CHECK_FOR_INTERRUPTS();
mtype = pq_getbyte();
- if (mtype != 'p')
+ if (mtype != PqMsgPasswordResponse)
{
/* Only log error if client didn't disconnect. */
if (mtype != EOF)
@@ -1232,7 +1233,7 @@ pg_SSPI_recvauth(Port *port)
{
pq_startmsgread();
mtype = pq_getbyte();
- if (mtype != 'p')
+ if (mtype != PqMsgPasswordResponse)
{
if (sspictx != NULL)
{
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 9c8ec779f9..d4c8c40596 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -114,6 +114,7 @@
#include "postmaster/pgarch.h"
#include "postmaster/postmaster.h"
#include "postmaster/syslogger.h"
+#include "protocol.h"
#include "replication/logicallauncher.h"
#include "replication/walsender.h"
#include "storage/fd.h"
@@ -2357,7 +2358,7 @@ SendNegotiateProtocolVersion(List *unrecognized_protocol_options)
StringInfoData buf;
ListCell *lc;
- pq_beginmessage(&buf, 'v'); /* NegotiateProtocolVersion */
+ pq_beginmessage(&buf, PqMsgNegotiateProtocolResponse);
pq_sendint32(&buf, PG_PROTOCOL_LATEST);
pq_sendint32(&buf, list_length(unrecognized_protocol_options));
foreach(lc, unrecognized_protocol_options)
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index d27ef2985d..99f357519a 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -69,6 +69,7 @@
#include "nodes/replnodes.h"
#include "pgstat.h"
#include "postmaster/interrupt.h"
+#include "protocol.h"
#include "replication/decode.h"
#include "replication/logical.h"
#include "replication/slot.h"
@@ -603,7 +604,7 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd)
dest->rStartup(dest, CMD_SELECT, tupdesc);
/* Send a DataRow message */
- pq_beginmessage(&buf, 'D');
+ pq_beginmessage(&buf, PqMsgDataRowResponse);
pq_sendint16(&buf, 2); /* # of columns */
len = strlen(histfname);
pq_sendint32(&buf, len); /* col1 len */
@@ -801,7 +802,7 @@ StartReplication(StartReplicationCmd *cmd)
WalSndSetState(WALSNDSTATE_CATCHUP);
/* Send a CopyBothResponse message, and start streaming */
- pq_beginmessage(&buf, 'W');
+ pq_beginmessage(&buf, PqMsgCopyBothResponse);
pq_sendbyte(&buf, 0);
pq_sendint16(&buf, 0);
pq_endmessage(&buf);
@@ -1294,7 +1295,7 @@ StartLogicalReplication(StartReplicationCmd *cmd)
WalSndSetState(WALSNDSTATE_CATCHUP);
/* Send a CopyBothResponse message, and start streaming */
- pq_beginmessage(&buf, 'W');
+ pq_beginmessage(&buf, PqMsgCopyBothResponse);
pq_sendbyte(&buf, 0);
pq_sendint16(&buf, 0);
pq_endmessage(&buf);
@@ -1923,11 +1924,11 @@ ProcessRepliesIfAny(void)
/* Validate message type and set packet size limit */
switch (firstchar)
{
- case 'd':
+ case PqMsgCopyDataRequest:
maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
break;
- case 'c':
- case 'X':
+ case PqMsgCopyDoneRequest:
+ case PqMsgTerminateRequest:
maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
break;
default:
@@ -1955,7 +1956,7 @@ ProcessRepliesIfAny(void)
/*
* 'd' means a standby reply wrapped in a CopyData packet.
*/
- case 'd':
+ case PqMsgCopyDataRequest:
ProcessStandbyMessage();
received = true;
break;
@@ -1964,7 +1965,7 @@ ProcessRepliesIfAny(void)
* CopyDone means the standby requested to finish streaming.
* Reply with CopyDone, if we had not sent that already.
*/
- case 'c':
+ case PqMsgCopyDoneRequest:
if (!streamingDoneSending)
{
pq_putmessage_noblock('c', NULL, 0);
@@ -1978,7 +1979,7 @@ ProcessRepliesIfAny(void)
/*
* 'X' means that the standby is closing down the socket.
*/
- case 'X':
+ case PqMsgTerminateRequest:
proc_exit(0);
default:
diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c
index c0406e2ee5..2f95678b41 100644
--- a/src/backend/tcop/dest.c
+++ b/src/backend/tcop/dest.c
@@ -39,6 +39,7 @@
#include "executor/tstoreReceiver.h"
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
+#include "protocol.h"
#include "utils/portal.h"
@@ -176,7 +177,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o
len = BuildQueryCompletionString(completionTag, qc,
force_undecorated_output);
- pq_putmessage('C', completionTag, len + 1);
+ pq_putmessage(PqMsgCloseRequest, completionTag, len + 1);
case DestNone:
case DestDebug:
@@ -200,7 +201,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o
void
EndReplicationCommand(const char *commandTag)
{
- pq_putmessage('C', commandTag, strlen(commandTag) + 1);
+ pq_putmessage(PqMsgCloseRequest, commandTag, strlen(commandTag) + 1);
}
/* ----------------
@@ -220,7 +221,7 @@ NullCommand(CommandDest dest)
case DestRemoteSimple:
/* Tell the FE that we saw an empty query string */
- pq_putemptymessage('I');
+ pq_putemptymessage(PqMsgEmptyQueryResponse);
break;
case DestNone:
@@ -258,7 +259,7 @@ ReadyForQuery(CommandDest dest)
{
StringInfoData buf;
- pq_beginmessage(&buf, 'Z');
+ pq_beginmessage(&buf, PqMsgReadyForQueryResponse);
pq_sendbyte(&buf, TransactionBlockStatusCode());
pq_endmessage(&buf);
}
diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c
index 2f70ebd5fa..51d5957b7b 100644
--- a/src/backend/tcop/fastpath.c
+++ b/src/backend/tcop/fastpath.c
@@ -27,6 +27,7 @@
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "port/pg_bswap.h"
+#include "protocol.h"
#include "tcop/fastpath.h"
#include "tcop/tcopprot.h"
#include "utils/acl.h"
@@ -69,7 +70,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format)
{
StringInfoData buf;
- pq_beginmessage(&buf, 'V');
+ pq_beginmessage(&buf, PqMsgFunctionCallResponse);
if (isnull)
{
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 36cc99ec9c..849e51f4d1 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -55,6 +55,7 @@
#include "postmaster/autovacuum.h"
#include "postmaster/interrupt.h"
#include "postmaster/postmaster.h"
+#include "protocol.h"
#include "replication/logicallauncher.h"
#include "replication/logicalworker.h"
#include "replication/slot.h"
@@ -402,37 +403,37 @@ SocketBackend(StringInfo inBuf)
*/
switch (qtype)
{
- case 'Q': /* simple query */
+ case PqMsgSimpleQueryRequest:
maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
doing_extended_query_message = false;
break;
- case 'F': /* fastpath function call */
+ case PqMsgFunctionCallRequest:
maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
doing_extended_query_message = false;
break;
- case 'X': /* terminate */
+ case PqMsgTerminateRequest:
maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
doing_extended_query_message = false;
ignore_till_sync = false;
break;
- case 'B': /* bind */
- case 'P': /* parse */
+ case PqMsgBindRequest :
+ case PqMsgParseRequest:
maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
doing_extended_query_message = true;
break;
- case 'C': /* close */
- case 'D': /* describe */
- case 'E': /* execute */
- case 'H': /* flush */
+ case PqMsgCloseRequest:
+ case PqMsgDescribeRequest:
+ case PqMsgExecuteRequest:
+ case PqMsgFlushDataRequest:
maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
doing_extended_query_message = true;
break;
- case 'S': /* sync */
+ case PqMsgSyncDataRequest:
maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
/* stop any active skip-till-Sync */
ignore_till_sync = false;
@@ -440,13 +441,13 @@ SocketBackend(StringInfo inBuf)
doing_extended_query_message = false;
break;
- case 'd': /* copy data */
+ case PqMsgCopyDataRequest:
maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
doing_extended_query_message = false;
break;
- case 'c': /* copy done */
- case 'f': /* copy fail */
+ case PqMsgCopyDoneRequest:
+ case PqMsgCopyFailRequest:
maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
doing_extended_query_message = false;
break;
@@ -1589,7 +1590,7 @@ exec_parse_message(const char *query_string, /* string to execute */
* Send ParseComplete.
*/
if (whereToSendOutput == DestRemote)
- pq_putemptymessage('1');
+ pq_putemptymessage(PqMsgParseCompleteResponse);
/*
* Emit duration logging if appropriate.
@@ -2047,7 +2048,7 @@ exec_bind_message(StringInfo input_message)
* Send BindComplete.
*/
if (whereToSendOutput == DestRemote)
- pq_putemptymessage('2');
+ pq_putemptymessage(PqMsgBindCompleteResponse);
/*
* Emit duration logging if appropriate.
@@ -2290,7 +2291,7 @@ exec_execute_message(const char *portal_name, long max_rows)
{
/* Portal run not complete, so send PortalSuspended */
if (whereToSendOutput == DestRemote)
- pq_putemptymessage('s');
+ pq_putemptymessage(PqMsgPortalSuspendedResponse);
/*
* Set XACT_FLAGS_PIPELINING whenever we suspend an Execute message,
@@ -2683,7 +2684,7 @@ exec_describe_statement_message(const char *stmt_name)
NULL);
}
else
- pq_putemptymessage('n'); /* NoData */
+ pq_putemptymessage(PqMsgNoDataResponse);
}
/*
@@ -2736,7 +2737,7 @@ exec_describe_portal_message(const char *portal_name)
FetchPortalTargetList(portal),
portal->formats);
else
- pq_putemptymessage('n'); /* NoData */
+ pq_putemptymessage(PqMsgNoDataResponse);
}
@@ -4239,7 +4240,7 @@ PostgresMain(const char *dbname, const char *username)
{
StringInfoData buf;
- pq_beginmessage(&buf, 'K');
+ pq_beginmessage(&buf, PqMsgBackendKeyDataRequest);
pq_sendint32(&buf, (int32) MyProcPid);
pq_sendint32(&buf, (int32) MyCancelKey);
pq_endmessage(&buf);
@@ -4618,7 +4619,7 @@ PostgresMain(const char *dbname, const char *username)
switch (firstchar)
{
- case 'Q': /* simple query */
+ case PqMsgSimpleQueryRequest:
{
const char *query_string;
@@ -4642,7 +4643,7 @@ PostgresMain(const char *dbname, const char *username)
}
break;
- case 'P': /* parse */
+ case PqMsgParseRequest:
{
const char *stmt_name;
const char *query_string;
@@ -4672,7 +4673,7 @@ PostgresMain(const char *dbname, const char *username)
}
break;
- case 'B': /* bind */
+ case PqMsgBindRequest:
forbidden_in_wal_sender(firstchar);
/* Set statement_timestamp() */
@@ -4687,7 +4688,7 @@ PostgresMain(const char *dbname, const char *username)
/* exec_bind_message does valgrind_report_error_query */
break;
- case 'E': /* execute */
+ case PqMsgExecuteRequest:
{
const char *portal_name;
int max_rows;
@@ -4707,7 +4708,7 @@ PostgresMain(const char *dbname, const char *username)
}
break;
- case 'F': /* fastpath function call */
+ case PqMsgFunctionCallRequest:
forbidden_in_wal_sender(firstchar);
/* Set statement_timestamp() */
@@ -4742,7 +4743,7 @@ PostgresMain(const char *dbname, const char *username)
send_ready_for_query = true;
break;
- case 'C': /* close */
+ case PqMsgCloseRequest:
{
int close_type;
const char *close_target;
@@ -4755,7 +4756,7 @@ PostgresMain(const char *dbname, const char *username)
switch (close_type)
{
- case 'S':
+ case PqMsgPreparedSubCommand:
if (close_target[0] != '\0')
DropPreparedStatement(close_target, false);
else
@@ -4764,7 +4765,7 @@ PostgresMain(const char *dbname, const char *username)
drop_unnamed_stmt();
}
break;
- case 'P':
+ case PqMsgPortalSubCommand:
{
Portal portal;
@@ -4782,13 +4783,13 @@ PostgresMain(const char *dbname, const char *username)
}
if (whereToSendOutput == DestRemote)
- pq_putemptymessage('3'); /* CloseComplete */
+ pq_putemptymessage(PqMsgCloseCompleteResponse);
valgrind_report_error_query("CLOSE message");
}
break;
- case 'D': /* describe */
+ case PqMsgDescribeRequest:
{
int describe_type;
const char *describe_target;
@@ -4804,10 +4805,10 @@ PostgresMain(const char *dbname, const char *username)
switch (describe_type)
{
- case 'S':
+ case PqMsgPreparedSubCommand:
exec_describe_statement_message(describe_target);
break;
- case 'P':
+ case PqMsgPortalSubCommand:
exec_describe_portal_message(describe_target);
break;
default:
@@ -4822,13 +4823,13 @@ PostgresMain(const char *dbname, const char *username)
}
break;
- case 'H': /* flush */
+ case PqMsgFlushDataRequest:
pq_getmsgend(&input_message);
if (whereToSendOutput == DestRemote)
pq_flush();
break;
- case 'S': /* sync */
+ case PqMsgSyncDataRequest:
pq_getmsgend(&input_message);
finish_xact_command();
valgrind_report_error_query("SYNC message");
@@ -4847,7 +4848,7 @@ PostgresMain(const char *dbname, const char *username)
/* FALLTHROUGH */
- case 'X':
+ case PqMsgTerminateRequest:
/*
* Reset whereToSendOutput to prevent ereport from attempting
@@ -4865,9 +4866,9 @@ PostgresMain(const char *dbname, const char *username)
*/
proc_exit(0);
- case 'd': /* copy data */
- case 'c': /* copy done */
- case 'f': /* copy fail */
+ case PqMsgCopyDataRequest:
+ case PqMsgCopyDoneRequest:
+ case PqMsgCopyFailRequest:
/*
* Accept but ignore these messages, per protocol spec; we
@@ -4897,7 +4898,7 @@ forbidden_in_wal_sender(char firstchar)
{
if (am_walsender)
{
- if (firstchar == 'F')
+ if (firstchar == PqMsgFunctionCallRequest)
ereport(ERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg("fastpath function calls not supported in a replication connection")));
diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c
index 67447ef03a..1059677857 100644
--- a/src/backend/utils/activity/backend_progress.c
+++ b/src/backend/utils/activity/backend_progress.c
@@ -10,6 +10,7 @@
*/
#include "postgres.h"
+#include "protocol.h"
#include "access/parallel.h"
#include "libpq/pqformat.h"
#include "port/atomics.h" /* for memory barriers */
@@ -102,7 +103,7 @@ pgstat_progress_parallel_incr_param(int index, int64 incr)
initStringInfo(&progress_message);
- pq_beginmessage(&progress_message, 'P');
+ pq_beginmessage(&progress_message, PqMsgParallelProgressResponse);
pq_sendint32(&progress_message, index);
pq_sendint64(&progress_message, incr);
pq_endmessage(&progress_message);
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 5898100acb..7c1dc4e69b 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -77,6 +77,7 @@
#include "postmaster/bgworker.h"
#include "postmaster/postmaster.h"
#include "postmaster/syslogger.h"
+#include "protocol.h"
#include "storage/ipc.h"
#include "storage/proc.h"
#include "tcop/tcopprot.h"
@@ -3465,7 +3466,7 @@ send_message_to_frontend(ErrorData *edata)
char tbuf[12];
/* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */
- pq_beginmessage(&msgbuf, (edata->elevel < ERROR) ? 'N' : 'E');
+ pq_beginmessage(&msgbuf, (edata->elevel < ERROR) ? PqMsgNoticeResponse : PqMsgErrorResponse);
sev = error_severity(edata->elevel);
pq_sendbyte(&msgbuf, PG_DIAG_SEVERITY);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 5308896c87..55b9b8bbed 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -37,6 +37,7 @@
#include "libpq/pqformat.h"
#include "parser/scansup.h"
#include "port/pg_bitutils.h"
+#include "protocol.h"
#include "storage/fd.h"
#include "storage/lwlock.h"
#include "storage/shmem.h"
@@ -2593,7 +2594,7 @@ ReportGUCOption(struct config_generic *record)
{
StringInfoData msgbuf;
- pq_beginmessage(&msgbuf, 'S');
+ pq_beginmessage(&msgbuf, PqMsgParameterStatusResponse);
pq_sendstring(&msgbuf, record->name);
pq_sendstring(&msgbuf, val);
pq_endmessage(&msgbuf);
diff --git a/src/include/protocol.h b/src/include/protocol.h
new file mode 100644
index 0000000000..b26f6a04f3
--- /dev/null
+++ b/src/include/protocol.h
@@ -0,0 +1,60 @@
+/*-------------------------------------------------------------------------
+ *
+ * protocol.h
+ * Exports from postmaster/postmaster.c.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * src/include/protocol.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _PROTOCOL_H
+#define _PROTOCOL_H
+
+#define PqMsgBindRequest 'B'
+#define PqMsgCloseRequest 'C'
+#define PqMsgDescribeRequest 'D'
+#define PqMsgExecuteRequest 'E'
+#define PqMsgFunctionCallRequest 'F'
+#define PqMsgFlushDataRequest 'H'
+#define PqMsgBackendKeyDataRequest 'K'
+#define PqMsgParseRequest 'P'
+#define PqMsgAuthenticationRequest 'R'
+#define PqMsgSyncDataRequest 'S'
+#define PqMsgSimpleQueryRequest 'Q'
+#define PqMsgTerminateRequest 'X'
+#define PqMsgCopyFailRequest 'f'
+#define PqMsgCopyDoneRequest 'c'
+#define PqMsgCopyDataRequest 'd'
+#define PqMsgCopyProgressRequest 'p'
+#define PqMsgPreparedSubCommand 'S'
+#define PqMsgPortalSubCommand 'P'
+
+
+/*
+Responses
+*/
+#define PqMsgParseCompleteResponse '1'
+#define PqMsgBindCompleteResponse '2'
+#define PqMsgCloseCompleteResponse '3'
+#define PqMsgNotifyResponse 'A'
+#define PqMsgCommandCompleteResponse 'C'
+#define PqMsgDataRowResponse 'D'
+#define PqMsgErrorResponse 'E'
+#define PqMsgCopyInResponse 'G'
+#define PqMsgCopyOutResponse 'H'
+#define PqMsgEmptyQueryResponse 'I'
+#define PqMsgNoticeResponse 'N'
+#define PqMsgParallelProgressResponse 'P'
+#define PqMsgFunctionCallResponse 'V'
+#define PqMsgParameterStatusResponse 'S'
+#define PqMsgRowDescriptionResponse 'T'
+#define PqMsgCopyBothResponse 'W'
+#define PqMsgReadyForQueryResponse 'Z'
+#define PqMsgNoDataResponse 'n'
+#define PqMsgPasswordResponse 'p'
+#define PqMsgPortalSuspendedResponse 's'
+#define PqMsgParameterDescriptionResponse 't'
+#define PqMsgNegotiateProtocolResponse 'v'
+#endif
\ No newline at end of file
diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c
index 887ca5e9e1..0ee48112cb 100644
--- a/src/interfaces/libpq/fe-auth.c
+++ b/src/interfaces/libpq/fe-auth.c
@@ -43,6 +43,7 @@
#include "fe-auth.h"
#include "fe-auth-sasl.h"
#include "libpq-fe.h"
+#include "protocol.h"
#ifdef ENABLE_GSS
/*
@@ -586,7 +587,7 @@ pg_SASL_init(PGconn *conn, int payloadlen)
/*
* Build a SASLInitialResponse message, and send it.
*/
- if (pqPutMsgStart('p', conn))
+ if (pqPutMsgStart(PqMsgPasswordResponse, conn))
goto error;
if (pqPuts(selected_mechanism, conn))
goto error;
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 837c5321aa..b2a90adea4 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -32,6 +32,7 @@
#include "mb/pg_wchar.h"
#include "pg_config_paths.h"
#include "port/pg_bswap.h"
+#include "protocol.h"
#ifdef WIN32
#include "win32.h"
@@ -3591,7 +3592,7 @@ keep_going: /* We will come back to here until there is
* Anything else probably means it's not Postgres on the other
* end at all.
*/
- if (!(beresp == 'R' || beresp == 'v' || beresp == 'E'))
+ if (!(beresp == PqMsgAuthenticationRequest || beresp == PqMsgNegotiateProtocolResponse || beresp == PqMsgErrorResponse))
{
libpq_append_conn_error(conn, "expected authentication request from server, but received %c",
beresp);
@@ -3618,19 +3619,19 @@ keep_going: /* We will come back to here until there is
* version 14, the server also used the old protocol for
* errors that happened before processing the startup packet.)
*/
- if (beresp == 'R' && (msgLength < 8 || msgLength > 2000))
+ if (beresp == PqMsgAuthenticationRequest && (msgLength < 8 || msgLength > 2000))
{
libpq_append_conn_error(conn, "received invalid authentication request");
goto error_return;
}
- if (beresp == 'v' && (msgLength < 8 || msgLength > 2000))
+ if (beresp == PqMsgNegotiateProtocolResponse && (msgLength < 8 || msgLength > 2000))
{
libpq_append_conn_error(conn, "received invalid protocol negotiation message");
goto error_return;
}
#define MAX_ERRLEN 30000
- if (beresp == 'E' && (msgLength < 8 || msgLength > MAX_ERRLEN))
+ if (beresp == PqMsgErrorResponse && (msgLength < 8 || msgLength > MAX_ERRLEN))
{
/* Handle error from a pre-3.0 server */
conn->inCursor = conn->inStart + 1; /* reread data */
@@ -3693,7 +3694,7 @@ keep_going: /* We will come back to here until there is
}
/* Handle errors. */
- if (beresp == 'E')
+ if (beresp == PqMsgErrorResponse)
{
if (pqGetErrorNotice3(conn, true))
{
@@ -3770,7 +3771,7 @@ keep_going: /* We will come back to here until there is
goto error_return;
}
- else if (beresp == 'v')
+ else if (beresp == PqMsgNegotiateProtocolResponse)
{
if (pqGetNegotiateProtocolVersion3(conn))
{
@@ -4540,7 +4541,7 @@ sendTerminateConn(PGconn *conn)
* Try to send "close connection" message to backend. Ignore any
* error.
*/
- pqPutMsgStart('X', conn);
+ pqPutMsgStart(PqMsgTerminateRequest, conn);
pqPutMsgEnd(conn);
(void) pqFlush(conn);
}
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index a868284ff8..67ed8e3682 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -27,6 +27,7 @@
#include "libpq-fe.h"
#include "libpq-int.h"
#include "mb/pg_wchar.h"
+#include "protocol.h"
/* keep this in same order as ExecStatusType in libpq-fe.h */
char *const pgresStatus[] = {
@@ -1458,7 +1459,7 @@ PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery)
/* Send the query message(s) */
/* construct the outgoing Query message */
- if (pqPutMsgStart('Q', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSimpleQueryRequest, conn) < 0 ||
pqPuts(query, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
{
@@ -1571,7 +1572,7 @@ PQsendPrepare(PGconn *conn,
return 0; /* error msg already set */
/* construct the Parse message */
- if (pqPutMsgStart('P', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgParseRequest, conn) < 0 ||
pqPuts(stmtName, conn) < 0 ||
pqPuts(query, conn) < 0)
goto sendFailed;
@@ -1599,7 +1600,7 @@ PQsendPrepare(PGconn *conn,
/* Add a Sync, unless in pipeline mode. */
if (conn->pipelineStatus == PQ_PIPELINE_OFF)
{
- if (pqPutMsgStart('S', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
goto sendFailed;
}
@@ -1784,7 +1785,7 @@ PQsendQueryGuts(PGconn *conn,
if (command)
{
/* construct the Parse message */
- if (pqPutMsgStart('P', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgParseRequest, conn) < 0 ||
pqPuts(stmtName, conn) < 0 ||
pqPuts(command, conn) < 0)
goto sendFailed;
@@ -1808,7 +1809,7 @@ PQsendQueryGuts(PGconn *conn,
}
/* Construct the Bind message */
- if (pqPutMsgStart('B', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgBindRequest, conn) < 0 ||
pqPuts("", conn) < 0 ||
pqPuts(stmtName, conn) < 0)
goto sendFailed;
@@ -1874,14 +1875,14 @@ PQsendQueryGuts(PGconn *conn,
goto sendFailed;
/* construct the Describe Portal message */
- if (pqPutMsgStart('D', conn) < 0 ||
- pqPutc('P', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgDescribeRequest, conn) < 0 ||
+ pqPutc(PqMsgPortalSubCommand, conn) < 0 ||
pqPuts("", conn) < 0 ||
pqPutMsgEnd(conn) < 0)
goto sendFailed;
/* construct the Execute message */
- if (pqPutMsgStart('E', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgExecuteRequest, conn) < 0 ||
pqPuts("", conn) < 0 ||
pqPutInt(0, 4, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
@@ -1890,7 +1891,7 @@ PQsendQueryGuts(PGconn *conn,
/* construct the Sync message if not in pipeline mode */
if (conn->pipelineStatus == PQ_PIPELINE_OFF)
{
- if (pqPutMsgStart('S', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
goto sendFailed;
}
@@ -2422,7 +2423,7 @@ PQdescribePrepared(PGconn *conn, const char *stmt)
{
if (!PQexecStart(conn))
return NULL;
- if (!PQsendTypedCommand(conn, 'D', 'S', stmt))
+ if (!PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPreparedSubCommand, stmt))
return NULL;
return PQexecFinish(conn);
}
@@ -2441,7 +2442,7 @@ PQdescribePortal(PGconn *conn, const char *portal)
{
if (!PQexecStart(conn))
return NULL;
- if (!PQsendTypedCommand(conn, 'D', 'P', portal))
+ if (!PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPortalSubCommand, portal))
return NULL;
return PQexecFinish(conn);
}
@@ -2456,7 +2457,7 @@ PQdescribePortal(PGconn *conn, const char *portal)
int
PQsendDescribePrepared(PGconn *conn, const char *stmt)
{
- return PQsendTypedCommand(conn, 'D', 'S', stmt);
+ return PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPreparedSubCommand, stmt);
}
/*
@@ -2469,7 +2470,7 @@ PQsendDescribePrepared(PGconn *conn, const char *stmt)
int
PQsendDescribePortal(PGconn *conn, const char *portal)
{
- return PQsendTypedCommand(conn, 'D', 'P', portal);
+ return PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPortalSubCommand, portal);
}
/*
@@ -2488,7 +2489,7 @@ PQclosePrepared(PGconn *conn, const char *stmt)
{
if (!PQexecStart(conn))
return NULL;
- if (!PQsendTypedCommand(conn, 'C', 'S', stmt))
+ if (!PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPreparedSubCommand, stmt))
return NULL;
return PQexecFinish(conn);
}
@@ -2506,7 +2507,7 @@ PQclosePortal(PGconn *conn, const char *portal)
{
if (!PQexecStart(conn))
return NULL;
- if (!PQsendTypedCommand(conn, 'C', 'P', portal))
+ if (!PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPortalSubCommand, portal))
return NULL;
return PQexecFinish(conn);
}
@@ -2521,7 +2522,7 @@ PQclosePortal(PGconn *conn, const char *portal)
int
PQsendClosePrepared(PGconn *conn, const char *stmt)
{
- return PQsendTypedCommand(conn, 'C', 'S', stmt);
+ return PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPreparedSubCommand, stmt);
}
/*
@@ -2534,7 +2535,7 @@ PQsendClosePrepared(PGconn *conn, const char *stmt)
int
PQsendClosePortal(PGconn *conn, const char *portal)
{
- return PQsendTypedCommand(conn, 'C', 'P', portal);
+ return PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPortalSubCommand, portal);
}
/*
@@ -2577,17 +2578,17 @@ PQsendTypedCommand(PGconn *conn, char command, char type, const char *target)
/* construct the Sync message */
if (conn->pipelineStatus == PQ_PIPELINE_OFF)
{
- if (pqPutMsgStart('S', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
goto sendFailed;
}
/* remember if we are doing a Close or a Describe */
- if (command == 'C')
+ if (command == PqMsgCloseRequest)
{
entry->queryclass = PGQUERY_CLOSE;
}
- else if (command == 'D')
+ else if (command == PqMsgDescribeRequest)
{
entry->queryclass = PGQUERY_DESCRIBE;
}
@@ -2696,7 +2697,7 @@ PQputCopyData(PGconn *conn, const char *buffer, int nbytes)
return pqIsnonblocking(conn) ? 0 : -1;
}
/* Send the data (too simple to delegate to fe-protocol files) */
- if (pqPutMsgStart('d', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgCopyDataRequest, conn) < 0 ||
pqPutnchar(buffer, nbytes, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
return -1;
@@ -2731,7 +2732,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg)
if (errormsg)
{
/* Send COPY FAIL */
- if (pqPutMsgStart('f', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgCopyFailRequest, conn) < 0 ||
pqPuts(errormsg, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
return -1;
@@ -2739,7 +2740,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg)
else
{
/* Send COPY DONE */
- if (pqPutMsgStart('c', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgCopyDoneRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
return -1;
}
@@ -2751,7 +2752,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg)
if (conn->cmd_queue_head &&
conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE)
{
- if (pqPutMsgStart('S', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
return -1;
}
@@ -3263,7 +3264,7 @@ PQpipelineSync(PGconn *conn)
entry->query = NULL;
/* construct the Sync message */
- if (pqPutMsgStart('S', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
goto sendFailed;
@@ -3311,7 +3312,7 @@ PQsendFlushRequest(PGconn *conn)
return 0;
}
- if (pqPutMsgStart('H', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgFlushDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
{
return 0;
diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c
index 7bc6355d17..c7c1b079ac 100644
--- a/src/interfaces/libpq/fe-protocol3.c
+++ b/src/interfaces/libpq/fe-protocol3.c
@@ -28,14 +28,16 @@
#include "libpq-int.h"
#include "mb/pg_wchar.h"
#include "port/pg_bswap.h"
+#include "protocol.h"
/*
* This macro lists the backend message types that could be "long" (more
* than a couple of kilobytes).
*/
#define VALID_LONG_MESSAGE_TYPE(id) \
- ((id) == 'T' || (id) == 'D' || (id) == 'd' || (id) == 'V' || \
- (id) == 'E' || (id) == 'N' || (id) == 'A')
+ ((id) == PqMsgRowDescriptionResponse || (id) == PqMsgDataRowResponse || (id) == PqMsgCopyDataRequest || \
+ (id) == PqMsgFunctionCallResponse || (id) == PqMsgErrorResponse || (id) == PqMsgNoticeResponse || \
+ (id) == PqMsgNotifyResponse)
static void handleSyncLoss(PGconn *conn, char id, int msgLength);
@@ -140,12 +142,12 @@ pqParseInput3(PGconn *conn)
* from config file due to SIGHUP), but otherwise we hold off until
* BUSY state.
*/
- if (id == 'A')
+ if (id == PqMsgNotifyResponse)
{
if (getNotify(conn))
return;
}
- else if (id == 'N')
+ else if (id == PqMsgNoticeResponse)
{
if (pqGetErrorNotice3(conn, false))
return;
@@ -165,12 +167,12 @@ pqParseInput3(PGconn *conn)
* it is about to close the connection, so we don't want to just
* discard it...)
*/
- if (id == 'E')
+ if (id == PqMsgErrorResponse)
{
if (pqGetErrorNotice3(conn, false /* treat as notice */ ))
return;
}
- else if (id == 'S')
+ else if (id == PqMsgParameterStatusResponse)
{
if (getParameterStatus(conn))
return;
@@ -192,7 +194,7 @@ pqParseInput3(PGconn *conn)
*/
switch (id)
{
- case 'C': /* command complete */
+ case PqMsgCommandCompleteResponse:
if (pqGets(&conn->workBuffer, conn))
return;
if (!pgHavePendingResult(conn))
@@ -210,12 +212,12 @@ pqParseInput3(PGconn *conn)
CMDSTATUS_LEN);
conn->asyncStatus = PGASYNC_READY;
break;
- case 'E': /* error return */
+ case PqMsgErrorResponse:
if (pqGetErrorNotice3(conn, true))
return;
conn->asyncStatus = PGASYNC_READY;
break;
- case 'Z': /* sync response, backend is ready for new
+ case PqMsgReadyForQueryResponse: /* sync response, backend is ready for new
* query */
if (getReadyForQuery(conn))
return;
@@ -246,7 +248,7 @@ pqParseInput3(PGconn *conn)
conn->asyncStatus = PGASYNC_IDLE;
}
break;
- case 'I': /* empty query */
+ case PqMsgEmptyQueryResponse:
if (!pgHavePendingResult(conn))
{
conn->result = PQmakeEmptyPGresult(conn,
@@ -259,7 +261,7 @@ pqParseInput3(PGconn *conn)
}
conn->asyncStatus = PGASYNC_READY;
break;
- case '1': /* Parse Complete */
+ case PqMsgParseCompleteResponse:
/* If we're doing PQprepare, we're done; else ignore */
if (conn->cmd_queue_head &&
conn->cmd_queue_head->queryclass == PGQUERY_PREPARE)
@@ -277,10 +279,10 @@ pqParseInput3(PGconn *conn)
conn->asyncStatus = PGASYNC_READY;
}
break;
- case '2': /* Bind Complete */
+ case PqMsgBindCompleteResponse:
/* Nothing to do for this message type */
break;
- case '3': /* Close Complete */
+ case PqMsgCloseCompleteResponse:
/* If we're doing PQsendClose, we're done; else ignore */
if (conn->cmd_queue_head &&
conn->cmd_queue_head->queryclass == PGQUERY_CLOSE)
@@ -298,11 +300,11 @@ pqParseInput3(PGconn *conn)
conn->asyncStatus = PGASYNC_READY;
}
break;
- case 'S': /* parameter status */
+ case PqMsgParameterStatusResponse:
if (getParameterStatus(conn))
return;
break;
- case 'K': /* secret key data from the backend */
+ case PqMsgBackendKeyDataRequest: /* secret key data from the backend */
/*
* This is expected only during backend startup, but it's
@@ -314,7 +316,7 @@ pqParseInput3(PGconn *conn)
if (pqGetInt(&(conn->be_key), 4, conn))
return;
break;
- case 'T': /* Row Description */
+ case PqMsgRowDescriptionResponse:
if (conn->error_result ||
(conn->result != NULL &&
conn->result->resultStatus == PGRES_FATAL_ERROR))
@@ -346,7 +348,7 @@ pqParseInput3(PGconn *conn)
return;
}
break;
- case 'n': /* No Data */
+ case PqMsgNoDataResponse:
/*
* NoData indicates that we will not be seeing a
@@ -374,11 +376,11 @@ pqParseInput3(PGconn *conn)
conn->asyncStatus = PGASYNC_READY;
}
break;
- case 't': /* Parameter Description */
+ case PqMsgParameterDescriptionResponse:
if (getParamDescriptions(conn, msgLength))
return;
break;
- case 'D': /* Data Row */
+ case PqMsgDataRowResponse:
if (conn->result != NULL &&
conn->result->resultStatus == PGRES_TUPLES_OK)
{
@@ -405,24 +407,24 @@ pqParseInput3(PGconn *conn)
conn->inCursor += msgLength;
}
break;
- case 'G': /* Start Copy In */
+ case PqMsgCopyInResponse:
if (getCopyStart(conn, PGRES_COPY_IN))
return;
conn->asyncStatus = PGASYNC_COPY_IN;
break;
- case 'H': /* Start Copy Out */
+ case PqMsgCopyOutResponse:
if (getCopyStart(conn, PGRES_COPY_OUT))
return;
conn->asyncStatus = PGASYNC_COPY_OUT;
conn->copy_already_done = 0;
break;
- case 'W': /* Start Copy Both */
+ case PqMsgCopyBothResponse:
if (getCopyStart(conn, PGRES_COPY_BOTH))
return;
conn->asyncStatus = PGASYNC_COPY_BOTH;
conn->copy_already_done = 0;
break;
- case 'd': /* Copy Data */
+ case PqMsgCopyDataRequest:
/*
* If we see Copy Data, just silently drop it. This would
@@ -431,7 +433,7 @@ pqParseInput3(PGconn *conn)
*/
conn->inCursor += msgLength;
break;
- case 'c': /* Copy Done */
+ case PqMsgCopyDoneRequest:
/*
* If we see Copy Done, just silently drop it. This is
@@ -1692,21 +1694,21 @@ getCopyDataMessage(PGconn *conn)
*/
switch (id)
{
- case 'A': /* NOTIFY */
+ case PqMsgNotifyResponse:
if (getNotify(conn))
return 0;
break;
- case 'N': /* NOTICE */
+ case PqMsgNoticeResponse:
if (pqGetErrorNotice3(conn, false))
return 0;
break;
- case 'S': /* ParameterStatus */
+ case PqMsgParameterStatusResponse:
if (getParameterStatus(conn))
return 0;
break;
- case 'd': /* Copy Data, pass it back to caller */
+ case PqMsgCopyDataRequest: /* Copy Data, pass it back to caller */
return msgLength;
- case 'c':
+ case PqMsgCopyDoneRequest:
/*
* If this is a CopyDone message, exit COPY_OUT mode and let
@@ -1929,7 +1931,7 @@ pqEndcopy3(PGconn *conn)
if (conn->asyncStatus == PGASYNC_COPY_IN ||
conn->asyncStatus == PGASYNC_COPY_BOTH)
{
- if (pqPutMsgStart('c', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgCopyDoneRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
return 1;
@@ -1940,7 +1942,7 @@ pqEndcopy3(PGconn *conn)
if (conn->cmd_queue_head &&
conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE)
{
- if (pqPutMsgStart('S', conn) < 0 ||
+ if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
pqPutMsgEnd(conn) < 0)
return 1;
}
@@ -2023,7 +2025,7 @@ pqFunctionCall3(PGconn *conn, Oid fnid,
/* PQfn already validated connection state */
- if (pqPutMsgStart('F', conn) < 0 || /* function call msg */
+ if (pqPutMsgStart(PqMsgFunctionCallRequest, conn) < 0 || /* function call msg */
pqPutInt(fnid, 4, conn) < 0 || /* function id */
pqPutInt(1, 2, conn) < 0 || /* # of format codes */
pqPutInt(1, 2, conn) < 0 || /* format code: BINARY */
diff --git a/src/interfaces/libpq/fe-trace.c b/src/interfaces/libpq/fe-trace.c
index 402784f40e..8414418a5c 100644
--- a/src/interfaces/libpq/fe-trace.c
+++ b/src/interfaces/libpq/fe-trace.c
@@ -28,6 +28,7 @@
#include "libpq-fe.h"
#include "libpq-int.h"
#include "port/pg_bswap.h"
+#include "protocol.h"
/* Enable tracing */
@@ -215,7 +216,7 @@ pqTraceOutputNchar(FILE *pfdebug, int len, const char *data, int *cursor)
* Output functions by protocol message type
*/
-/* NotificationResponse */
+/* PqMsgNotifyResponse */
static void
pqTraceOutputA(FILE *f, const char *message, int *cursor, bool regress)
{
@@ -225,7 +226,7 @@ pqTraceOutputA(FILE *f, const char *message, int *cursor, bool regress)
pqTraceOutputString(f, message, cursor, false);
}
-/* Bind */
+/* PqMsgBindRequest */
static void
pqTraceOutputB(FILE *f, const char *message, int *cursor)
{
@@ -256,7 +257,7 @@ pqTraceOutputB(FILE *f, const char *message, int *cursor)
pqTraceOutputInt16(f, message, cursor);
}
-/* Close(F) or CommandComplete(B) */
+/* PqMsgCloseRequest or PqMsgCommandCompleteResponse */
static void
pqTraceOutputC(FILE *f, bool toServer, const char *message, int *cursor)
{
@@ -273,7 +274,7 @@ pqTraceOutputC(FILE *f, bool toServer, const char *message, int *cursor)
}
}
-/* Describe(F) or DataRow(B) */
+/* PqMsgDescribeRequest or PqMsgDataRowResponse */
static void
pqTraceOutputD(FILE *f, bool toServer, const char *message, int *cursor)
{
@@ -322,7 +323,7 @@ pqTraceOutputNR(FILE *f, const char *type, const char *message, int *cursor,
}
}
-/* Execute(F) or ErrorResponse(B) */
+/* PqMsgExecuteRequest or PqMsgErrorResponse */
static void
pqTraceOutputE(FILE *f, bool toServer, const char *message, int *cursor, bool regress)
{
@@ -336,7 +337,7 @@ pqTraceOutputE(FILE *f, bool toServer, const char *message, int *cursor, bool re
pqTraceOutputNR(f, "ErrorResponse", message, cursor, regress);
}
-/* CopyFail */
+/* PqMsgCopyFailRequest */
static void
pqTraceOutputf(FILE *f, const char *message, int *cursor)
{
@@ -344,7 +345,7 @@ pqTraceOutputf(FILE *f, const char *message, int *cursor)
pqTraceOutputString(f, message, cursor, false);
}
-/* FunctionCall */
+/* PqMsgFunctionCallRequest */
static void
pqTraceOutputF(FILE *f, const char *message, int *cursor, bool regress)
{
@@ -371,7 +372,7 @@ pqTraceOutputF(FILE *f, const char *message, int *cursor, bool regress)
pqTraceOutputInt16(f, message, cursor);
}
-/* CopyInResponse */
+/* PqMsgCopyInResponse */
static void
pqTraceOutputG(FILE *f, const char *message, int *cursor)
{
@@ -385,7 +386,7 @@ pqTraceOutputG(FILE *f, const char *message, int *cursor)
pqTraceOutputInt16(f, message, cursor);
}
-/* CopyOutResponse */
+/* PqMsgCopyOutResponse */
static void
pqTraceOutputH(FILE *f, const char *message, int *cursor)
{
@@ -399,7 +400,7 @@ pqTraceOutputH(FILE *f, const char *message, int *cursor)
pqTraceOutputInt16(f, message, cursor);
}
-/* BackendKeyData */
+/* PqMsgBackendKeyDataRequest */
static void
pqTraceOutputK(FILE *f, const char *message, int *cursor, bool regress)
{
@@ -408,7 +409,7 @@ pqTraceOutputK(FILE *f, const char *message, int *cursor, bool regress)
pqTraceOutputInt32(f, message, cursor, regress);
}
-/* Parse */
+/* PqMsgParseRequest */
static void
pqTraceOutputP(FILE *f, const char *message, int *cursor, bool regress)
{
@@ -423,7 +424,7 @@ pqTraceOutputP(FILE *f, const char *message, int *cursor, bool regress)
pqTraceOutputInt32(f, message, cursor, regress);
}
-/* Query */
+/* PqMsgSimpleQueryRequest */
static void
pqTraceOutputQ(FILE *f, const char *message, int *cursor)
{
@@ -431,7 +432,7 @@ pqTraceOutputQ(FILE *f, const char *message, int *cursor)
pqTraceOutputString(f, message, cursor, false);
}
-/* Authentication */
+/* PqMsgAuthenticationRequest */
static void
pqTraceOutputR(FILE *f, const char *message, int *cursor)
{
@@ -439,7 +440,7 @@ pqTraceOutputR(FILE *f, const char *message, int *cursor)
pqTraceOutputInt32(f, message, cursor, false);
}
-/* ParameterStatus */
+/* PqMsgParameterStatusResponse */
static void
pqTraceOutputS(FILE *f, const char *message, int *cursor)
{
@@ -448,7 +449,7 @@ pqTraceOutputS(FILE *f, const char *message, int *cursor)
pqTraceOutputString(f, message, cursor, false);
}
-/* ParameterDescription */
+/* PqMsgParameterDescriptionResponse */
static void
pqTraceOutputt(FILE *f, const char *message, int *cursor, bool regress)
{
@@ -461,7 +462,7 @@ pqTraceOutputt(FILE *f, const char *message, int *cursor, bool regress)
pqTraceOutputInt32(f, message, cursor, regress);
}
-/* RowDescription */
+/* PqMsgRowDescriptionResponse */
static void
pqTraceOutputT(FILE *f, const char *message, int *cursor, bool regress)
{
@@ -482,7 +483,7 @@ pqTraceOutputT(FILE *f, const char *message, int *cursor, bool regress)
}
}
-/* NegotiateProtocolVersion */
+/* PqMsgNegotiateProtocolResponse */
static void
pqTraceOutputv(FILE *f, const char *message, int *cursor)
{
@@ -491,7 +492,7 @@ pqTraceOutputv(FILE *f, const char *message, int *cursor)
pqTraceOutputInt32(f, message, cursor, false);
}
-/* FunctionCallResponse */
+/* PqMsgFunctionCallResponse */
static void
pqTraceOutputV(FILE *f, const char *message, int *cursor)
{
@@ -503,7 +504,7 @@ pqTraceOutputV(FILE *f, const char *message, int *cursor)
pqTraceOutputNchar(f, len, message, cursor);
}
-/* CopyBothResponse */
+/* PqMsgCopyBothResponse */
static void
pqTraceOutputW(FILE *f, const char *message, int *cursor, int length)
{
@@ -514,7 +515,7 @@ pqTraceOutputW(FILE *f, const char *message, int *cursor, int length)
pqTraceOutputInt16(f, message, cursor);
}
-/* ReadyForQuery */
+/* PqMsgReadyForQueryResponse */
static void
pqTraceOutputZ(FILE *f, const char *message, int *cursor)
{
@@ -562,110 +563,110 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer)
switch (id)
{
- case '1':
+ case PqMsgParseCompleteResponse:
fprintf(conn->Pfdebug, "ParseComplete");
/* No message content */
break;
- case '2':
+ case PqMsgBindCompleteResponse:
fprintf(conn->Pfdebug, "BindComplete");
/* No message content */
break;
- case '3':
+ case PqMsgCloseCompleteResponse:
fprintf(conn->Pfdebug, "CloseComplete");
/* No message content */
break;
- case 'A': /* Notification Response */
+ case PqMsgNotifyResponse:
pqTraceOutputA(conn->Pfdebug, message, &logCursor, regress);
break;
- case 'B': /* Bind */
+ case PqMsgBindRequest:
pqTraceOutputB(conn->Pfdebug, message, &logCursor);
break;
- case 'c':
+ case PqMsgCopyDoneRequest:
fprintf(conn->Pfdebug, "CopyDone");
/* No message content */
break;
- case 'C': /* Close(F) or Command Complete(B) */
+ case PqMsgCommandCompleteResponse: /* Close(F) or Command Complete(B) */
pqTraceOutputC(conn->Pfdebug, toServer, message, &logCursor);
break;
- case 'd': /* Copy Data */
+ case PqMsgCopyDataRequest:
/* Drop COPY data to reduce the overhead of logging. */
break;
- case 'D': /* Describe(F) or Data Row(B) */
+ case PqMsgDescribeRequest: /* Describe(F) or Data Row(B) */
pqTraceOutputD(conn->Pfdebug, toServer, message, &logCursor);
break;
- case 'E': /* Execute(F) or Error Response(B) */
+ case PqMsgExecuteRequest: /* Execute(F) or Error Response(B) */
pqTraceOutputE(conn->Pfdebug, toServer, message, &logCursor,
regress);
break;
- case 'f': /* Copy Fail */
+ case PqMsgCopyFailRequest:
pqTraceOutputf(conn->Pfdebug, message, &logCursor);
break;
- case 'F': /* Function Call */
+ case PqMsgFunctionCallRequest:
pqTraceOutputF(conn->Pfdebug, message, &logCursor, regress);
break;
- case 'G': /* Start Copy In */
+ case PqMsgCopyInResponse:
pqTraceOutputG(conn->Pfdebug, message, &logCursor);
break;
- case 'H': /* Flush(F) or Start Copy Out(B) */
+ case PqMsgFlushDataRequest: /* Flush(F) or Start Copy Out(B) */
if (!toServer)
pqTraceOutputH(conn->Pfdebug, message, &logCursor);
else
fprintf(conn->Pfdebug, "Flush"); /* no message content */
break;
- case 'I':
+ case PqMsgEmptyQueryResponse:
fprintf(conn->Pfdebug, "EmptyQueryResponse");
/* No message content */
break;
- case 'K': /* secret key data from the backend */
+ case PqMsgBackendKeyDataRequest: /* secret key data from the backend */
pqTraceOutputK(conn->Pfdebug, message, &logCursor, regress);
break;
- case 'n':
+ case PqMsgNoDataResponse:
fprintf(conn->Pfdebug, "NoData");
/* No message content */
break;
- case 'N':
+ case PqMsgNoticeResponse:
pqTraceOutputNR(conn->Pfdebug, "NoticeResponse", message,
&logCursor, regress);
break;
- case 'P': /* Parse */
+ case PqMsgParseRequest:
pqTraceOutputP(conn->Pfdebug, message, &logCursor, regress);
break;
- case 'Q': /* Query */
+ case PqMsgSimpleQueryRequest:
pqTraceOutputQ(conn->Pfdebug, message, &logCursor);
break;
- case 'R': /* Authentication */
+ case PqMsgAuthenticationRequest:
pqTraceOutputR(conn->Pfdebug, message, &logCursor);
break;
- case 's':
+ case PqMsgPortalSuspendedResponse:
fprintf(conn->Pfdebug, "PortalSuspended");
/* No message content */
break;
- case 'S': /* Parameter Status(B) or Sync(F) */
+ case PqMsgSyncDataRequest: /* Parameter Status(B) or Sync(F) */
if (!toServer)
pqTraceOutputS(conn->Pfdebug, message, &logCursor);
else
fprintf(conn->Pfdebug, "Sync"); /* no message content */
break;
- case 't': /* Parameter Description */
+ case PqMsgParameterDescriptionResponse:
pqTraceOutputt(conn->Pfdebug, message, &logCursor, regress);
break;
- case 'T': /* Row Description */
+ case PqMsgRowDescriptionResponse:
pqTraceOutputT(conn->Pfdebug, message, &logCursor, regress);
break;
- case 'v': /* Negotiate Protocol Version */
+ case PqMsgNegotiateProtocolResponse:
pqTraceOutputv(conn->Pfdebug, message, &logCursor);
break;
- case 'V': /* Function Call response */
+ case PqMsgFunctionCallResponse:
pqTraceOutputV(conn->Pfdebug, message, &logCursor);
break;
- case 'W': /* Start Copy Both */
+ case PqMsgCopyBothResponse:
pqTraceOutputW(conn->Pfdebug, message, &logCursor, length);
break;
- case 'X':
+ case PqMsgTerminateRequest:
fprintf(conn->Pfdebug, "Terminate");
/* No message content */
break;
- case 'Z': /* Ready For Query */
+ case PqMsgReadyForQueryResponse:
pqTraceOutputZ(conn->Pfdebug, message, &logCursor);
break;
default:
--
2.37.1 (Apple Git-137.1)
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-08 00:37 Tatsuo Ishii <[email protected]>
parent: Dave Cramer <[email protected]>
1 sibling, 0 replies; 29+ messages in thread
From: Tatsuo Ishii @ 2023-08-08 00:37 UTC (permalink / raw)
To: [email protected]; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
> On Mon, 7 Aug 2023 at 16:50, Tatsuo Ishii <[email protected]> wrote:
>
>> > On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
>> >> Dave Cramer <[email protected]> writes:
>> >>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]>
>> wrote:
>> >>>> PqMsgEmptyQueryResponse or something like that seems better, if we
>> >>>> want to keep the current capitalization. I'm not a huge fan of the way
>> >>>> we vary our capitalization conventions so much all over the code base,
>> >>>> but I think we would at least do well to keep it consistent from one
>> >>>> end of a certain identifier to the other.
>> >>
>> >>> I don't have a strong preference, but before I make the changes I'd
>> like to
>> >>> get consensus.
>> >>> Can we vote or whatever it takes to decide on a naming pattern that is
>> >>> acceptable ?
>> >>
>> >> I'm good with Robert's proposal above.
>> >
>> > +1
>>
>> +1.
>>
>> Also we need to decide what to do with them:
>>
>> > #define PQMSG_REQ_PREPARED 'S'
>> > #define PQMSG_REQ_PORTAL 'P'
>>
>> If we go "PqMsgEmptyQueryResponse", probably we should go something
>> like for these?
>>
>> #define PqMsgReqPrepared 'S'
>> #define PqMsgReqPortal 'P'
>>
>
> I went with PqMsgPortalSubCommand and PqMsgPreparedSubCommand
>
> See attached patch
Looks good to me.
Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-08 06:27 Alvaro Herrera <[email protected]>
parent: Nathan Bossart <[email protected]>
1 sibling, 0 replies; 29+ messages in thread
From: Alvaro Herrera @ 2023-08-08 06:27 UTC (permalink / raw)
To: Nathan Bossart <[email protected]>; +Cc: Tom Lane <[email protected]>; Dave Cramer <[email protected]>; Robert Haas <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]
On 2023-Aug-07, Nathan Bossart wrote:
> On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
> > Dave Cramer <[email protected]> writes:
> >> Can we vote or whatever it takes to decide on a naming pattern that is
> >> acceptable ?
> >
> > I'm good with Robert's proposal above.
>
> +1
WFM as well.
--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"Every machine is a smoke machine if you operate it wrong enough."
https://twitter.com/libseybieda/status/1541673325781196801
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-09 15:19 Peter Eisentraut <[email protected]>
parent: Dave Cramer <[email protected]>
1 sibling, 1 reply; 29+ messages in thread
From: Peter Eisentraut @ 2023-08-09 15:19 UTC (permalink / raw)
To: Dave Cramer <[email protected]>; Tatsuo Ishii <[email protected]>; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
1. As was discussed, these definitions should go into
src/include/libpq/pqcomm.h, not a new file.
2. I would prefer an underscore after PgMsg, like PqMsg_DescribeRequest,
so it's easier to visually locate the start of the actual message name.
3. IMO, the names of the protocol messages in protocol.sgml are
canonical. Your patch appends "Request" and "Response" in cases where
that is not part of the actual name. Also, some messages are documented
to go both ways, so this separation doesn't make sense strictly
speaking. Please use the names as in protocol.sgml without augmenting them.
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-09 16:27 Dave Cramer <[email protected]>
parent: Peter Eisentraut <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Dave Cramer @ 2023-08-09 16:27 UTC (permalink / raw)
To: Peter Eisentraut <[email protected]>; +Cc: Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
On Wed, 9 Aug 2023 at 09:19, Peter Eisentraut <[email protected]> wrote:
> 1. As was discussed, these definitions should go into
> src/include/libpq/pqcomm.h, not a new file.
>
I'm ambivalent, this is very easy to do.
>
> 2. I would prefer an underscore after PgMsg, like PqMsg_DescribeRequest,
> so it's easier to visually locate the start of the actual message name.
>
> 3. IMO, the names of the protocol messages in protocol.sgml are
> canonical. Your patch appends "Request" and "Response" in cases where
> that is not part of the actual name. Also, some messages are documented
> to go both ways, so this separation doesn't make sense strictly
> speaking. Please use the names as in protocol.sgml without augmenting
> them.
>
>
I've changed this a number of times. I do not mind changing it again, but
can we reach a consensus ?
Dave
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-09 16:34 Tom Lane <[email protected]>
parent: Dave Cramer <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Tom Lane @ 2023-08-09 16:34 UTC (permalink / raw)
To: Dave Cramer <[email protected]>; +Cc: Peter Eisentraut <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Dave Cramer <[email protected]> writes:
> On Wed, 9 Aug 2023 at 09:19, Peter Eisentraut <[email protected]> wrote:
>> 3. IMO, the names of the protocol messages in protocol.sgml are
>> canonical. Your patch appends "Request" and "Response" in cases where
>> that is not part of the actual name. Also, some messages are documented
>> to go both ways, so this separation doesn't make sense strictly
>> speaking. Please use the names as in protocol.sgml without augmenting
>> them.
> I've changed this a number of times. I do not mind changing it again, but
> can we reach a consensus ?
I agree with Peter: let's use the names in the protocol document
with a single prefix. I've got mixed feelings about whether that prefix
should have an underscore, though.
regards, tom lane
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-09 16:44 Dave Cramer <[email protected]>
parent: Tom Lane <[email protected]>
0 siblings, 1 reply; 29+ messages in thread
From: Dave Cramer @ 2023-08-09 16:44 UTC (permalink / raw)
To: Tom Lane <[email protected]>; +Cc: Peter Eisentraut <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
On Wed, 9 Aug 2023 at 10:34, Tom Lane <[email protected]> wrote:
> Dave Cramer <[email protected]> writes:
> > On Wed, 9 Aug 2023 at 09:19, Peter Eisentraut <[email protected]>
> wrote:
> >> 3. IMO, the names of the protocol messages in protocol.sgml are
> >> canonical. Your patch appends "Request" and "Response" in cases where
> >> that is not part of the actual name. Also, some messages are documented
> >> to go both ways, so this separation doesn't make sense strictly
> >> speaking. Please use the names as in protocol.sgml without augmenting
> >> them.
>
> > I've changed this a number of times. I do not mind changing it again, but
> > can we reach a consensus ?
>
> I agree with Peter: let's use the names in the protocol document
> with a single prefix. I've got mixed feelings about whether that prefix
> should have an underscore, though.
>
Well, we're getting closer :)
Dave
^ permalink raw reply [nested|flat] 29+ messages in thread
* Re: Using defines for protocol characters
@ 2023-08-09 16:51 Nathan Bossart <[email protected]>
parent: Dave Cramer <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Nathan Bossart @ 2023-08-09 16:51 UTC (permalink / raw)
To: Dave Cramer <[email protected]>; +Cc: Tom Lane <[email protected]>; Peter Eisentraut <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]
On Wed, Aug 09, 2023 at 10:44:42AM -0600, Dave Cramer wrote:
> On Wed, 9 Aug 2023 at 10:34, Tom Lane <[email protected]> wrote:
>> I agree with Peter: let's use the names in the protocol document
>> with a single prefix. I've got mixed feelings about whether that prefix
>> should have an underscore, though.
>
> Well, we're getting closer :)
I'm +0.5 for the underscore.
--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v2 02/11] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/RgO6TscyR9fMvkEm1k5N=yu
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v2-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v3 02/11] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/.arW0LC=Yi8JO9BRih4YlyS
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v3-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v4 02/12] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/OOXZvOwbpccKfGOtE9/SwX6
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v4-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v5 02/14] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_//gBZFZYGWm7urqUgDbu6PSe
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v5-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v6 02/15] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/74urtnrsBSymuH7bJczNOGS
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v6-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v7 02/16] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/VSGM3xNEmY7iJyL2wuWRCjV
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v7-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v4 02/12] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/OOXZvOwbpccKfGOtE9/SwX6
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v4-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
* [PATCH v2 02/11] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
0 siblings, 0 replies; 29+ messages in thread
From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)
The section heading of "Copying Types" does not reflect what the
section is about. It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.
"Re-Using the Type of Columns and Variables" seems adequate. Getting
something in there about declartions seems too wordy. I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
doc/src/sgml/plpgsql.sgml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
</sect2>
<sect2 id="plpgsql-declaration-type">
- <title>Copying Types</title>
+ <title>Re-Using the Type of Columns and Variables</title>
<synopsis>
<replaceable>variable</replaceable>%TYPE
--
2.30.2
--MP_/RgO6TscyR9fMvkEm1k5N=yu
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=v2-0003-Better-section-heading-for-plpgsql-exception-trap.patch
^ permalink raw reply [nested|flat] 29+ messages in thread
end of thread, other threads:[~2023-09-24 20:52 UTC | newest]
Thread overview: 29+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2018-11-26 08:31 Re: inconsistency and inefficiency in setup_conversion() John Naylor <[email protected]>
2018-12-01 12:26 ` Dmitry Dolgov <[email protected]>
2018-12-14 21:28 ` John Naylor <[email protected]>
2019-01-04 00:49 ` Tom Lane <[email protected]>
2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
2023-08-07 18:24 ` Re: Using defines for protocol characters Tom Lane <[email protected]>
2023-08-07 18:38 ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
2023-08-07 18:59 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
2023-08-07 20:00 ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
2023-08-07 20:02 ` Re: Using defines for protocol characters Tom Lane <[email protected]>
2023-08-07 21:47 ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
2023-08-07 22:49 ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
2023-08-07 23:55 ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
2023-08-08 00:37 ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
2023-08-09 15:19 ` Re: Using defines for protocol characters Peter Eisentraut <[email protected]>
2023-08-09 16:27 ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
2023-08-09 16:34 ` Re: Using defines for protocol characters Tom Lane <[email protected]>
2023-08-09 16:44 ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
2023-08-09 16:51 ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
2023-08-08 06:27 ` Re: Using defines for protocol characters Alvaro Herrera <[email protected]>
2023-09-24 20:52 [PATCH v2 02/11] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v7 02/16] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v2 02/11] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v4 02/12] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v4 02/12] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v6 02/15] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v3 02/11] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
2023-09-24 20:52 [PATCH v5 02/14] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox