Benedict:

An alternative for that, keeping the CHECK word, would be to change the 
constraint name to IS_JSON. CHECK IS_JSON would read as you intend without the 
need to jump to REQUIRE. I think that’s true for the rest of provided 
constraints as well.

Bernardo


> On Apr 11, 2025, at 6:02 AM, Benedict <bened...@apache.org> wrote:
> 
> We have taken a different approach though, as we do not actually take a 
> predicate on the RHS and do not supply the column name. In our examples we 
> had eg CHECK JSON, which doesn’t parse unambiguously to a human. The 
> equivalent to Postgres would seem to be CHECK is_json(field).
> 
> I’m all for following an existing example, but once we decide to diverge the 
> justification is gone and we should decide holistically what we think is 
> best. So if we want to elide the column entirely and have a list of built in 
> restrictions, I’d prefer eg REQUIRE JSON since this parses unambiguously to a 
> human, whereas if we want to follow Postgres let’s do that but do it but that 
> means eg CHECK is_json(field).
> 
>> On 11 Apr 2025, at 10:57, Štefan Miklošovič <smikloso...@apache.org> wrote:
>> 
>> 
>> While modelling that, we followed how it is done in SQL world, PostgreSQL as 
>> well as MySQL both use CHECK.
>> 
>> https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-CHECK-CONSTRAINTS
>> https://dev.mysql.com/doc/refman/8.4/en/create-table-check-constraints.html
>> 
>> On Fri, Apr 11, 2025 at 10:43 AM Benedict <bened...@apache.org 
>> <mailto:bened...@apache.org>> wrote:
>>> I would prefer require/expect/is over check
>>> 
>>>> On 11 Apr 2025, at 08:05, Štefan Miklošovič <smikloso...@apache.org 
>>>> <mailto:smikloso...@apache.org>> wrote:
>>>> 
>>>> 
>>>> Yes, you will have it like that :) Thank you for this idea. Great example 
>>>> of cooperation over diverse domains.
>>>> 
>>>> On Fri, Apr 11, 2025 at 12:29 AM David Capwell <dcapw...@apple.com 
>>>> <mailto:dcapw...@apple.com>> wrote:
>>>>> 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 
>>>>>> <mailto: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 
>>>>>> <mailto:sc...@paradoxica.net>>
>>>>>> Sent: Thursday, April 10, 2025 7:59:35 AM
>>>>>> To: dev@cassandra.apache.org <mailto:dev@cassandra.apache.org> 
>>>>>> <dev@cassandra.apache.org <mailto:dev@cassandra.apache.org>>
>>>>>> Cc: dev@cassandra.apache.org <mailto:dev@cassandra.apache.org> 
>>>>>> <dev@cassandra.apache.org <mailto: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 
>>>>>>> <mailto: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
>>>>> 

Reply via email to