[
https://issues.apache.org/jira/browse/CASSANDRA-21747?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Brandon Williams updated CASSANDRA-21747:
-----------------------------------------
Bug Category: Parent values: Availability(12983)Level 1 values:
Unavailable(12994)
Complexity: Normal
Component/s: Feature/UDA
Discovered By: User Report
Fix Version/s: 5.0.x
6.x
7.x
Severity: Normal
Status: Open (was: Triage Needed)
> CREATE AGGREGATE fails when INITCOND is a UDT value with a field name that
> needs quoting
> ----------------------------------------------------------------------------------------
>
> Key: CASSANDRA-21747
> URL: https://issues.apache.org/jira/browse/CASSANDRA-21747
> Project: Apache Cassandra
> Issue Type: Bug
> Components: Feature/UDA
> Reporter: Nadav Har'El
> Priority: Normal
> Fix For: 5.0.x, 6.x, 7.x
>
>
> Tested on Cassandra 5.0.9 and 6.0-alpha2.
> An aggregate whose state type is a user-defined type with a field name that
> needs quoting (e.g., a case-sensitive name) can't be created with an
> INITCOND, even though the INITCOND literal correctly quotes the field name:
> {code:sql}
> CREATE TYPE ks.t ("A" int);
> CREATE FUNCTION ks.sf(s ks.t, x int) RETURNS NULL ON NULL INPUT RETURNS ks.t
> LANGUAGE java AS 'return s;';
> CREATE AGGREGATE ks.agg(int) SFUNC sf STYPE ks.t INITCOND {"A": 10};
> {code}
> fails with:
> {noformat}
> InvalidRequest: Error from server: code=2200 [Invalid query] message="Unknown
> field 'a' in value of user defined type t"
> {noformat}
> With a field name containing a space, the cause is visible in the error
> message:
> {code:sql}
> CREATE TYPE ks.t2 ("my field" int);
> CREATE FUNCTION ks.sf2(s ks.t2, x int) RETURNS NULL ON NULL INPUT RETURNS
> ks.t2 LANGUAGE java AS 'return s;';
> CREATE AGGREGATE ks.agg2(int) SFUNC sf2 STYPE ks.t2 INITCOND {"my field": 10};
> {code}
> fails with:
> {noformat}
> SyntaxException: Error from server: code=2000 [Syntax error in CQL query]
> message="Failed parsing CQL term: [{my field: 10}] reason: SyntaxException
> line 1:4 no viable alternative at input 'field' ...
> {noformat}
> A field name which doesn't need quoting works, with or without quotes in the
> INITCOND (e.g., INITCOND \{"a": 10} for a field a).
> The cause: CreateAggregateStatement doesn't use the already-parsed INITCOND
> term, but converts it back to a string and parses that string again -
> Terms.asBytes(keyspaceName, rawInitialValue.toString(), stateType) in 5.0,
> and Term.asBytes(keyspaceName, rawInitialValue.toString(), stateType) in 6.0.
> For a UDT literal, UserTypes.Literal's string form is built by
> UserTypes.userTypeToString(), which prints each field name with
> FieldIdentifier.toString(), i.e., the bare name without quotes. So
> {"A": 10}
> becomes
> {A: 10}
> , which is parsed as a value for the field a, and
> {"my field": 10}
> becomes
> {my field: 10}
> which isn't valid CQL.
> Note that the form in which INITCOND is saved in the schema and printed by
> DESCRIBE AGGREGATE - CQL3Type.UserDefined.toCQLLiteral() - does quote field
> names when needed (ColumnIdentifier.maybeQuote()), so only the CREATE
> AGGREGATE path is affected. A possible fix is to quote field names in
> UserTypes.userTypeToString() when needed, or to avoid converting the parsed
> INITCOND term back to a string.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]