Nadav Har'El created CASSANDRA-21746:
----------------------------------------
Summary: SELECT JSON output can't be read back by INSERT JSON for
a column or UDT field whose name begins and ends with a double quote
Key: CASSANDRA-21746
URL: https://issues.apache.org/jira/browse/CASSANDRA-21746
Project: Apache Cassandra
Issue Type: Bug
Reporter: Nadav Har'El
SELECT JSON prints a case-sensitive column name (one with uppercase letters) in
an extra pair of quotes, e.g. "\"Foo\"", and INSERT JSON (and fromJson() for
UDT fields) treats a name in quotes as case-sensitive, stripping one pair of
quotes. The same convention applies to the field names of a user-defined type.
But a name which itself begins and ends with a double-quote character - allowed
in CQL, e.g. the quoted identifier """foo""", whose name is "foo" including the
quotes - is printed by SELECT JSON without the extra quotes, because it has no
uppercase letters. INSERT JSON then strips the name's own quotes, and writes
the value to a different column or field. Tested on Cassandra 5.0.9 and
6.0-alpha2:
{code}
CREATE TABLE t (p int PRIMARY KEY, """foo""" int, foo int);
INSERT INTO t (p, """foo""", foo) VALUES (1, 1, 2);
SELECT JSON * FROM t WHERE p = 1;
-- {"p": 1, "\"foo\"": 1, "foo": 2}
INSERT INTO t JSON '{"p": 2, "\"foo\"": 1, "foo": 2}';
SELECT JSON * FROM t WHERE p = 2;
-- {"p": 2, "\"foo\"": null, "foo": 1} <- the value 1 went into foo, and
foo's value 2 was lost
{code}
The same happens with a UDT field named """foo""" (in UserType.toJSONString()
and fromJSONObject()).
The fix is to also print a name which begins and ends with a double quote in an
extra pair of quotes, e.g. "\"\\\"foo\\\"\"", so that stripping one pair of
quotes restores the original name.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]