public inbox for [email protected]help / color / mirror / Atom feed
[PATCH 1/3] bootstrap: convert Typ to a List* 3+ messages / 3 participants [nested] [flat]
* [PATCH 1/3] bootstrap: convert Typ to a List* @ 2020-11-20 02:48 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 3+ messages in thread From: Justin Pryzby @ 2020-11-20 02:48 UTC (permalink / raw) --- src/backend/bootstrap/bootstrap.c | 69 ++++++++++++++----------------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 6f615e6622..18eb62ca47 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -159,7 +159,7 @@ struct typmap FormData_pg_type am_typ; }; -static struct typmap **Typ = NULL; +static List *Typ = NIL; /* List of struct typmap* */ static struct typmap *Ap = NULL; static Datum values[MAXATTR]; /* current row's attribute values */ @@ -597,7 +597,7 @@ boot_openrel(char *relname) * pg_type must be filled before any OPEN command is executed, hence we * can now populate the Typ array if we haven't yet. */ - if (Typ == NULL) + if (Typ == NIL) populate_typ_array(); if (boot_reldesc != NULL) @@ -688,7 +688,7 @@ DefineAttr(char *name, char *type, int attnum, int nullness) typeoid = gettype(type); - if (Typ != NULL) + if (Typ != NIL) { attrtypes[attnum]->atttypid = Ap->am_oid; attrtypes[attnum]->attlen = Ap->am_typ.typlen; @@ -877,36 +877,25 @@ populate_typ_array(void) Relation rel; TableScanDesc scan; HeapTuple tup; - int nalloc; - int i; - - Assert(Typ == NULL); - nalloc = 512; - Typ = (struct typmap **) - MemoryContextAlloc(TopMemoryContext, nalloc * sizeof(struct typmap *)); + Assert(Typ == NIL); rel = table_open(TypeRelationId, NoLock); scan = table_beginscan_catalog(rel, 0, NULL); - i = 0; while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL) { Form_pg_type typForm = (Form_pg_type) GETSTRUCT(tup); + struct typmap *newtyp; + MemoryContext old; - /* make sure there will be room for a trailing NULL pointer */ - if (i >= nalloc - 1) - { - nalloc *= 2; - Typ = (struct typmap **) - repalloc(Typ, nalloc * sizeof(struct typmap *)); - } - Typ[i] = (struct typmap *) - MemoryContextAlloc(TopMemoryContext, sizeof(struct typmap)); - Typ[i]->am_oid = typForm->oid; - memcpy(&(Typ[i]->am_typ), typForm, sizeof(Typ[i]->am_typ)); - i++; + old = MemoryContextSwitchTo(TopMemoryContext); + newtyp = (struct typmap *) palloc(sizeof(struct typmap)); + Typ = lappend(Typ, newtyp); + MemoryContextSwitchTo(old); + + newtyp->am_oid = typForm->oid; + memcpy(&newtyp->am_typ, typForm, sizeof(newtyp->am_typ)); } - Typ[i] = NULL; /* Fill trailing NULL pointer */ table_endscan(scan); table_close(rel, NoLock); } @@ -925,16 +914,17 @@ populate_typ_array(void) static Oid gettype(char *type) { - if (Typ != NULL) + if (Typ != NIL) { - struct typmap **app; + ListCell *lc; - for (app = Typ; *app != NULL; app++) + foreach (lc, Typ) { - if (strncmp(NameStr((*app)->am_typ.typname), type, NAMEDATALEN) == 0) + struct typmap *app = lfirst(lc); + if (strncmp(NameStr(app->am_typ.typname), type, NAMEDATALEN) == 0) { - Ap = *app; - return (*app)->am_oid; + Ap = app; + return app->am_oid; } } } @@ -980,14 +970,17 @@ boot_get_type_io_data(Oid typid, if (Typ != NULL) { /* We have the boot-time contents of pg_type, so use it */ - struct typmap **app; - struct typmap *ap; - - app = Typ; - while (*app && (*app)->am_oid != typid) - ++app; - ap = *app; - if (ap == NULL) + struct typmap *ap = NULL; + ListCell *lc; + + foreach (lc, Typ) + { + ap = lfirst(lc); + if (ap->am_oid == typid) + break; + } + + if (!ap || ap->am_oid != typid) elog(ERROR, "type OID %u not found in Typ list", typid); *typlen = ap->am_typ.typlen; -- 2.26.2 --------------8FD28E9B65A94BB176003065 Content-Type: text/x-patch; charset=UTF-8; name="0002-Allow-composite-types-in-bootstrap-20210116.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0002-Allow-composite-types-in-bootstrap-20210116.patch" ^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: Proposal: SELECT * EXCLUDE (...) command @ 2026-01-15 13:15 Christoph Berg <[email protected]> 2026-02-16 14:24 ` Re: Proposal: SELECT * EXCLUDE (...) command Robert Treat <[email protected]> 0 siblings, 1 reply; 3+ messages in thread From: Christoph Berg @ 2026-01-15 13:15 UTC (permalink / raw) To: Peter Eisentraut <[email protected]>; +Cc: Hunaid Sohail <[email protected]>; pgsql-hackers Re: Peter Eisentraut > => select * exclude (foo) from t1, t2; > ERROR: 02000: SELECT list is empty after excluding all columns > > My paper proposes that this should be an error because foo is ambiguous. Consider this example: create table t1(id int, data text, more_data text); create table t2(id int, other_data text, different_data text); Now if you wanted just the data without the surrogate keys, you would want to say: select * exclude (id) from t1 join t2 on t1.id = t2.id; Having to specify (t1.id, t2.id) would make it cumbersome to use, especially considering "exclude" would mostly be useful for interactive use. > You also need to be careful with column privileges. For example: > > create table t5 (a int, b int, c int); > grant select (a) on table t5 to user2; > -- as user2 > select * exclude (b, c) from t5; > > At least under the SQL standard security model, this should be an error, > because you need to check the privileges of b and c. This is because you > shouldn't be able to use this feature to probe for the existence of columns > that you otherwise don't have access to. I would actually argue the exact other way round. If you have access to a table except some column (like everything in a users table except for the password), you would want to be able to write select * exclude (password) from users; This is a very natural way to use the feature. If referencing "password" was forbidden, it would exactly defeat the reason for using EXCLUDE here. Christoph ^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: Proposal: SELECT * EXCLUDE (...) command 2026-01-15 13:15 Re: Proposal: SELECT * EXCLUDE (...) command Christoph Berg <[email protected]> @ 2026-02-16 14:24 ` Robert Treat <[email protected]> 0 siblings, 0 replies; 3+ messages in thread From: Robert Treat @ 2026-02-16 14:24 UTC (permalink / raw) To: Christoph Berg <[email protected]>; Peter Eisentraut <[email protected]>; Hunaid Sohail <[email protected]>; pgsql-hackers On Thu, Jan 15, 2026 at 8:15 AM Christoph Berg <[email protected]> wrote: > > Re: Peter Eisentraut > > => select * exclude (foo) from t1, t2; > > ERROR: 02000: SELECT list is empty after excluding all columns > > > > My paper proposes that this should be an error because foo is ambiguous. > > Consider this example: > > create table t1(id int, data text, more_data text); > create table t2(id int, other_data text, different_data text); > > Now if you wanted just the data without the surrogate keys, you would > want to say: > > select * exclude (id) from t1 join t2 on t1.id = t2.id; > > Having to specify (t1.id, t2.id) would make it cumbersome to use, > especially considering "exclude" would mostly be useful for > interactive use. > A slightly different but perhaps more compelling version of this would be: select * exclude (id) from t1 join t2 using (id); Without the exclude, the returned row would only have a single id column, so it seems pretty natural to similarly add an exclude for that single id column. Robert Treat https://xzilla.net ^ permalink raw reply [nested|flat] 3+ messages in thread
end of thread, other threads:[~2026-02-16 14:24 UTC | newest] Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-11-20 02:48 [PATCH 1/3] bootstrap: convert Typ to a List* Justin Pryzby <[email protected]> 2026-01-15 13:15 Re: Proposal: SELECT * EXCLUDE (...) command Christoph Berg <[email protected]> 2026-02-16 14:24 ` Re: Proposal: SELECT * EXCLUDE (...) command Robert Treat <[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