|
134 | 134 | '''.format(typeinfo=_TYPEINFO) |
135 | 135 |
|
136 | 136 |
|
137 | | -# Prior to 9.2 PostgreSQL did not have range types. |
138 | | -_TYPEINFO_91 = '''\ |
139 | | - ( |
140 | | - SELECT |
141 | | - t.oid AS oid, |
142 | | - ns.nspname AS ns, |
143 | | - t.typname AS name, |
144 | | - t.typtype AS kind, |
145 | | - (CASE WHEN t.typtype = 'd' THEN |
146 | | - (WITH RECURSIVE typebases(oid, depth) AS ( |
147 | | - SELECT |
148 | | - t2.typbasetype AS oid, |
149 | | - 0 AS depth |
150 | | - FROM |
151 | | - pg_type t2 |
152 | | - WHERE |
153 | | - t2.oid = t.oid |
154 | | -
|
155 | | - UNION ALL |
156 | | -
|
157 | | - SELECT |
158 | | - t2.typbasetype AS oid, |
159 | | - tb.depth + 1 AS depth |
160 | | - FROM |
161 | | - pg_type t2, |
162 | | - typebases tb |
163 | | - WHERE |
164 | | - tb.oid = t2.oid |
165 | | - AND t2.typbasetype != 0 |
166 | | - ) SELECT oid FROM typebases ORDER BY depth DESC LIMIT 1) |
167 | | -
|
168 | | - ELSE NULL |
169 | | - END) AS basetype, |
170 | | - t.typreceive::oid != 0 AND t.typsend::oid != 0 |
171 | | - AS has_bin_io, |
172 | | - t.typelem AS elemtype, |
173 | | - elem_t.typdelim AS elemdelim, |
174 | | - NULL::oid AS range_subtype, |
175 | | - elem_t.typreceive::oid != 0 AND |
176 | | - elem_t.typsend::oid != 0 |
177 | | - AS elem_has_bin_io, |
178 | | - (CASE WHEN t.typtype = 'c' THEN |
179 | | - (SELECT |
180 | | - array_agg(ia.atttypid ORDER BY ia.attnum) |
181 | | - FROM |
182 | | - pg_attribute ia |
183 | | - INNER JOIN pg_class c |
184 | | - ON (ia.attrelid = c.oid) |
185 | | - WHERE |
186 | | - ia.attnum > 0 AND NOT ia.attisdropped |
187 | | - AND c.reltype = t.oid) |
188 | | -
|
189 | | - ELSE NULL |
190 | | - END) AS attrtypoids, |
191 | | - (CASE WHEN t.typtype = 'c' THEN |
192 | | - (SELECT |
193 | | - array_agg(ia.attname::text ORDER BY ia.attnum) |
194 | | - FROM |
195 | | - pg_attribute ia |
196 | | - INNER JOIN pg_class c |
197 | | - ON (ia.attrelid = c.oid) |
198 | | - WHERE |
199 | | - ia.attnum > 0 AND NOT ia.attisdropped |
200 | | - AND c.reltype = t.oid) |
201 | | -
|
202 | | - ELSE NULL |
203 | | - END) AS attrnames |
204 | | - FROM |
205 | | - pg_catalog.pg_type AS t |
206 | | - INNER JOIN pg_catalog.pg_namespace ns ON ( |
207 | | - ns.oid = t.typnamespace) |
208 | | - LEFT JOIN pg_type elem_t ON ( |
209 | | - t.typlen = -1 AND |
210 | | - t.typelem != 0 AND |
211 | | - t.typelem = elem_t.oid |
212 | | - ) |
213 | | - ) |
214 | | -''' |
215 | | - |
216 | | -INTRO_LOOKUP_TYPES_91 = '''\ |
217 | | -WITH RECURSIVE typeinfo_tree( |
218 | | - oid, ns, name, kind, basetype, has_bin_io, elemtype, elemdelim, |
219 | | - range_subtype, elem_has_bin_io, attrtypoids, attrnames, depth) |
220 | | -AS ( |
221 | | -
|
222 | | - SELECT |
223 | | - ti.oid, ti.ns, ti.name, ti.kind, ti.basetype, ti.has_bin_io, |
224 | | - ti.elemtype, ti.elemdelim, ti.range_subtype, ti.elem_has_bin_io, |
225 | | - ti.attrtypoids, ti.attrnames, 0 |
226 | | - FROM |
227 | | - {typeinfo} AS ti |
228 | | - WHERE |
229 | | - ti.oid = any($1::oid[]) |
230 | | -
|
231 | | - UNION ALL |
232 | | -
|
233 | | - SELECT |
234 | | - ti.oid, ti.ns, ti.name, ti.kind, ti.basetype, ti.has_bin_io, |
235 | | - ti.elemtype, ti.elemdelim, ti.range_subtype, ti.elem_has_bin_io, |
236 | | - ti.attrtypoids, ti.attrnames, tt.depth + 1 |
237 | | - FROM |
238 | | - {typeinfo} ti, |
239 | | - typeinfo_tree tt |
240 | | - WHERE |
241 | | - (tt.elemtype IS NOT NULL AND ti.oid = tt.elemtype) |
242 | | - OR (tt.attrtypoids IS NOT NULL AND ti.oid = any(tt.attrtypoids)) |
243 | | - OR (tt.range_subtype IS NOT NULL AND ti.oid = tt.range_subtype) |
244 | | -) |
245 | | -
|
246 | | -SELECT DISTINCT |
247 | | - * |
248 | | -FROM |
249 | | - typeinfo_tree |
250 | | -ORDER BY |
251 | | - depth DESC |
252 | | -'''.format(typeinfo=_TYPEINFO_91) |
253 | | - |
254 | | - |
255 | 137 | TYPE_BY_NAME = '''\ |
256 | 138 | SELECT |
257 | 139 | t.oid, |
|
0 commit comments