I am biased but I do prefer val3 text CHECK NOT NULL AND JSON AND LENGTH() < 1024
Here is a similar accord CQL BEGIN TRANSACTION LET a = (…); IF a IS NOT NULL AND a.b IS NOT NULL AND a.c IS NULL; THEN — profit END IF COMMIT TRANSACTION > On Apr 10, 2025, at 8:46 AM, Yifan Cai <yc25c...@gmail.com> wrote: > > Re: reserved keywords, “check” is currently not, and I don’t think it needs > to be a reserved keyword with the proposal. > > From: C. Scott Andreas <sc...@paradoxica.net> > Sent: Thursday, April 10, 2025 7:59:35 AM > To: dev@cassandra.apache.org <dev@cassandra.apache.org> > Cc: dev@cassandra.apache.org <dev@cassandra.apache.org> > Subject: Re: Constraint's "not null" alignment with transactions and their > simplification > > If the proposal does not introduce “check” as a reserved keyword that would > require quoting in existing DDL/DML, this concern doesn’t apply and the email > below can be ignored. This might be the case if “CHECK NOT NULL” is the full > token introduced rather than “CHECK” separately from constraints that are > checked. > > If “check” is introduced as a standalone reserved keyword: my primary > feedback is on the introduction of reserved words in the CQL grammar that may > affect compatibility of existing schemas. > > In the Cassandra 3.x series, several new CQL reserved words were added (more > than necessary) and subsequently backed out, because it required users to > begin quoting schemas and introduced incompatibility between 3.x and 4.x for > queries and DDL that “just worked” before. > > The word “check” is used in many domains (test/evaluation engineering, > finance, business processes, etc) and is likely to be used in user schemas. > If the proposal introduces this as a reserved word that would require it to > be quoted if used in table or column names, this will create incompatibility > for existing user queries on upgrade. > > Otherwise, ignore me. :) > > Thanks, > > – Scott > > ––– > Mobile > >> On Apr 10, 2025, at 7:47 AM, Jon Haddad <j...@rustyrazorblade.com> wrote: >> >> >> This looks like a really nice improvement to me. >> >> >> On Thu, Apr 10, 2025 at 7:27 AM Štefan Miklošovič <smikloso...@apache.org >> <mailto:smikloso...@apache.org>> wrote: >> Recently, David Capwell was commenting on constraints in one of Slack >> threads (1) in dev channel and he suggested that the current form of "not >> null" constraint we have right now in place, e.g like this >> >> create table ks.tb (id int primary key, val int check not_null(val)); >> >> could be instead of that form used like this: >> >> create table ks.tb (id int primary key, val int check not null); >> >> That is - without the name of a column in the constraint's argument. The >> reasoning behind that was that it is not only easier to read but there is >> also this concept in transactions (cep-15) where there is also "not null" >> used in some fashion and it would be nice if this was aligned so a user does >> not encounter two usages of "not null"-s which are written down differently, >> syntax-wise. >> >> Could the usage of "not null" in transactions be confirmed? >> >> This rather innocent suggestion brought an idea to us that constraints could >> be quite simplified when it comes to their syntax, consider this: >> >> val int check not_null(val) >> val text check json(val) >> val text check lenght(val) < 1000 >> >> to be used like this: >> >> val int check not null >> val text check json >> val text check length() < 1000 >> >> more involved checks like this: >> >> val text check not_null(val) and json(val) and length(val) < 1000 >> >> might be just simplified to: >> >> val text check not null and json and length() < 1000 >> >> It almost reads like plain English. Isn't this just easier for an eye? >> >> The reason we kept the column names in constraint definitions is that, >> frankly speaking, we just did not know any better at the time it was about >> to be implemented. It is a little bit more tricky to be able to use it >> without column names because in Parser.g / Antlr we just bound the grammar >> around constraints to a column name directly there. When column names are >> not going to be there anymore, we need to bind it later in the code behind >> the parser in server code. It is doable, it was just about being a little >> bit more involved there. >> >> Also, one reason to keep the name of a column was that we might specify >> different columns in a constraint from a column that is defined on to have >> cross-column constraints but we abandoned this idea altogether for other >> reasons which rendered the occurrence of a column name in a constraint >> definition redundant. >> >> To have some overview of what would be possible to do with this proposal: >> >> val3 text CHECK SOMECONSTRAINT('a'); >> val3 text CHECK JSON; >> val3 text CHECK SOMECONSTRAINT('a') > 1; >> val3 text CHECK SOMECONSTRAINT('a', 'b', 'c') > 1; >> val3 text CHECK JSON AND LENGTH() < 600; >> afternoon time CHECK afternoon >= '12:00:00' AND afternoon =< '23:59:59'; >> val3 text CHECK NOT NULL AND JSON AND LENGTH() < 1024 >> >> In addition to the specification of constraints without columns, what would >> be possible to do is to also specify arguments to constraints. It is >> currently not possible and there is no constraint which would accept >> arguments to its function but I think that to be as flexible as possible and >> prepare for the future, we might implement it as well. >> >> Constraints in their current form are already usable however I just think >> that if we do not simplify, align and extend the syntax right now, before it >> is baked in in a release, then we will never do it as it will be quite >> tricky to extend this without breaking it and maintaining two grammars at >> the same time would be very complex if not flat out impossible. >> >> Are you open to the simplification of constraint definitions as suggested >> and what is your feedback about that? I already have a working POC which >> just needs to be polished and tests fixed to accommodate the new approach. >> >> Regards >> >> (1) https://the-asf.slack.com/archives/CK23JSY2K/p1742409054164389