Hi Ayush, This is a solid patch but here are my observations:
1. The BY NAME + VALUES/DEFAULT VALUES rejection check runs before the target table/column are validated, which masks the real error: postgres=# INSERT INTO no_such_table BY NAME VALUES (1,2); ERROR: cannot use BY NAME with VALUES HINT: BY NAME requires a query, such as a SELECT, as the data source. It reports "cannot use BY NAME with VALUES" instead of "relation does not exist". This is an ordering bug, easy to fix by moving the check after setTargetTable()/checkInsertTargets(). 2. *srccolnames list is not needed: *It's a separate list built only to carry tle->resname values, but the same names are already available on selectQuery->targetList. transformInsertColsByName could just read them from there directly, one less list to carry around. 3. *Grammar has too many hand-written alternatives:* insert_rest grows from 5 to 13 almost-identical rules to cover every order of BY NAME/POSITION with OVERRIDING and the column list. Each one repeats the same 3 assignments by hand. The codebase already has a pattern for this kind of thing (opt_unique_null_treatment), worth factoring this the same way so a future change does not need to touch 8 places at once. 4. *matched Bitmapset duplicates new_attrnos:* Both matched and new_attrnos are built in the same loop and hold the same information. bms_is_member(x, matched) could just be list_member_int(new_attrnos, x), one less variable to keep in sync. Regards, Vaibhav On Wed, Jul 22, 2026 at 5:42 PM Marcos Pegoraro <[email protected]> wrote: > Em qua., 22 de jul. de 2026 às 08:39, Ayush Tiwari < > [email protected]> escreveu: > >> Only the *bare* VALUES form is rejected, since a VALUES row has no column >> names of its own. Maybe I'll reword the docs to make that distinction >> clear. >> > > yeap, I tested and it works, but it would be good to mention that only > unnamed values don't work. > > regards > Marcos >
