Re: range_agg - Mailing list pgsql-hackers
From | Paul A Jungwirth |
---|---|
Subject | Re: range_agg |
Date | |
Msg-id | CA+renyXY4tY5vpw0Ha3xqPgL4PFz_uAWVMUCHWU4AQ4mTPp30A@mail.gmail.com Whole thread Raw |
In response to | Re: range_agg (Pavel Stehule <pavel.stehule@gmail.com>) |
Responses |
Re: range_agg
|
List | pgsql-hackers |
On Tue, Nov 19, 2019 at 1:17 AM Pavel Stehule <pavel.stehule@gmail.com> wrote: > Hi > I tested last patches. I found some issues Thank you for the review! > 1. you should not to try patch catversion. I've seen discussion on pgsql-hackers going both ways, but I'll leave it out of future patches. :-) > 2. there is warning > > parse_coerce.c: In function ‘enforce_generic_type_consistency’: > parse_coerce.c:1975:11: warning: ‘range_typelem’ may be used uninitialized in this function [-Wmaybe-uninitialized] > 1975 | else if (range_typelem != elem_typeid) Fixed locally, will include in my next patch. > 3. there are problems with pg_upgrade. Regress tests fails > . . . > pg_restore: while PROCESSING TOC: > pg_restore: from TOC entry 1653; 1247 17044 TYPE arrayrange pavel > pg_restore: error: could not execute query: ERROR: pg_type array OID value not set when in binary upgrade mode I see what's going on here. (Sorry if this verbose explanation is obvious; it's as much for me as for anyone.) With pg_upgrade the values of pg_type.oid and pg_type.typarray must be the same before & after. For built-in types there's no problem, because those are fixed by pg_type.dat. But for user-defined types we have to take extra steps to make sure they don't change. CREATE TYPE always uses two oids: one for the type and one for the type's array type. But now when you create a range type we use *four*: the range type, the array of that range, the multirange type, and the array of that multirange. Currently when you run pg_dump in "binary mode" (i.e. as part of pg_upgrade) it includes calls to special functions to set the next oid to use for pg_type.oid and pg_type.typarray. Then CREATE TYPE also has special "binary mode" code to check those variables and use those oids (e.g. AssignTypeArrayOid). After using them once it sets them back to InvalidOid so it doesn't keep using them. So I guess I need to add code to pg_dump so that it also outputs calls to two new special functions that similarly set the oid to use for the next multirange and multirange[]. For v12->v13 it will chose high-enough oids like we do already for arrays of domains. (For other upgrades it will use the existing value.) And then I can change the CREATE TYPE code to check those pre-set values when obtaining the next oid. Does that sound like the right approach here? > 4. there is a problem with doc > > extend.sgml:281: parser error : Opening and ending tag mismatch: para line 270 and type > type of the ranges in an </type>anymultirange</type>. Hmm, yikes, I'll fix that! > I am not sure how much is correct to use <literallayout class="monospaced"> in doc. It is used for ranges, and multiranges,but no in other places I could use some advice here. Many operators seem best presented in groups of four, where only their parameter types change, for example: int8range < int8range int8range < int8multirange int8multirange < int8range int8multirange < int8multirange All I really want is to show those separated by line breaks. I couldn't find any other examples of that happening inside a table cell though (i.e. inside <row><entry></entry></row>). What is the best way to do that? Thanks, Paul
pgsql-hackers by date: