… table names
CockroachDB introduced non-standard extensions to its SQL dialect very
early in its history, before concerns of compatibility with existing
PostgreSQL clients became a priority. When these features were added,
new keywords were liberally marked as "reserved", so as to "make the
grammar work", and without noticing / care for the fact that this
change would make existing valid SQL queries/clients encounter new
errors.
An example of this:
1. let's make "column families" a thing
2. the syntax `create table(..., constraint xxx family(a,b,c))` is not
good enough (although this would not require reserved keywords), we
really want also `create table (..., family (a,b,c))` to be
possible.
3. oh, the grammar won't let us because "family" is a possible column
name? No matter! let's mark "FAMILY" as a reserved name for
column/function names.
- No concern for the fact that "family" is a perfectly valid
English name for things that people want to make an attribute of
in inventory / classification tables.
- No concern for the fact that reserved column/function names are
also reserved for table names.
4. (much later) Clients complaining about the fact they can't call
their columns or tables `family` without quoting.
Ditto "INDEX", "MINVALUE", "MAXVALUE", and perhaps others.
Moral of the story: DO NOT MAKE NEW RESERVED KEYWORDS UNLESS YOU'RE
VERY VERY VERY SURE THAT THERE IS NO LEGITIMATE USE FOR THEM IN CLIENT
APPS EVER.
(An example perhaps: the word "NOTHING" was also marked as reserved,
but it's much more unlikely this word will ever be used for something
useful.)
This patch restores the use of FAMILY, INDEX, NOTHING, MINVALUE and
MAXVALUE in table and function names, by introducing an awkward dance
in the grammar of keyword non-terminals and database object names.
They remain reserved as colum names because of the non-standard
CockroachDB extensions.
Release note (sql change): It is now again possible to use the
keywords FAMILY, MINVALUE, MAXVALUE, INDEX or NOTHING as table names,
for compatibility with PostgreSQL.