[
https://issues.apache.org/jira/browse/CASSANDRA-2027?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13002396#comment-13002396
]
Eric Evans commented on CASSANDRA-2027:
---------------------------------------
The following reboot is the result of a discussion between Gary Dusbabek,
Jonathan Ellis, and myself (any errors or misunderstandings are my fault).
h2. Revised definitions (+ semantics)
h3. String
Anything between quotes, _or_ any unquoted alnum values that begins with a
letter.
Examples:
{code:style=SQL}
SELECT "0day" FROM cf;
SELECT B_day FROM cf;
UPDATE cf SET "value-low" = "14%" WHERE KEY = "@skinny";
UPDATE cf SET foo = bar WHERE KEY = baz;
{code}
h3. Integer
An undecorated numeric literal. How the term is converted node-side is
determined by the comparator/validator in use. For example, {{100}} could be
converted to a 4-byte integer or an 8-byte long depending on whether the
comparator/validator was an {{IntegerType}} or {{LongType}} respectively.
Examples:
{code:style=SQL}
SELECT 10..100 FROM cf WHERE KEY = "key";
UPDATE cf SET 1000 = "thousand", 100 = "hundred" WHERE KEY = "key";
{code}
h3. UUID
A UUID formated as a hexidecimal-hyphenated string (i.e.
{{b137dd10-45b6-11e0-8955-00247ee1f924}}).
Examples:
{code:style=SQL}
SELECT f1fa6c22-45b7-11e0-8955-00247ee1f924 FROM cf WHERE KEY = key;
UPDATE cf SET 0ceb632e-45b8-11e0-8955-00247ee1f924 = 9 WHERE KEY = key;
{code}
As a special-case, when the comparator/validator is TimeUUIDType, a quoted
string literal can be used to supply a parse-able timestamp (currently most
ISO8601 variants).
{code:style=SQL}
SELECT "2011-01-01".."2011-02-01" FROM cf WHERE KEY = key;
{code}
_Note: it doesn't make sense to try to query by-column using a timestamp like
this, because date-time is only one component of a type 1 UUID. The docs will
need to be clear about this._
h3. UTF-8
A double-quoted string literal that is prefixed with a "u" to indicate that it
should be encoded to bytes using the utf-8 charset node-side.
Examples:
{code:style=SQL}
SELECT u"name" FROM cf;
UPDATE cf SET u"name" = u"value" WHERE KEY = "key";
{code}
_This one is iffy. Consensus seems to be that the UTF8 charset should
implicitly be used in the conversion to bytes when comparator/validator is
UTF8Type. If that's the case, then the only time where this term would do
anything useful would be for storing UTF8 where comparator/validator is
BytesType. That seems corner-case enough for me to warrant leaving it out
entirely._
----
One point of contention during the discussion that spawned this reboot was type
inference. What's proposed above adds some inference, (namely for unicode,
decimal values, and some UUID cases), but I'm going to make one more attempt at
stopping it there. I'm nothing if not persistent, right? :)
For example, Least Surprise says that {{"10"}} and {{10}} differ in that one is
explicitly a string, so converting it to a numeric type with a decimal value of
10 (still) seems wrong to me. I'd prefer to raise an exception for such
mismatches, which also seems like a good way of protecting users from a whole
class of bugs.
I'm also continuing to have a hard time accepting that different rules should
exist (syntax and semantics) for column names and values. The general argument
for SQL parity is a strong one, and I'm trying to be convinced on this issue,
(honest), but I keep coming back to the notion that SQL column names are not
typed, and that forcing that distinction on Cassandra seems contrived.
> term definitions
> ----------------
>
> Key: CASSANDRA-2027
> URL: https://issues.apache.org/jira/browse/CASSANDRA-2027
> Project: Cassandra
> Issue Type: Sub-task
> Components: API
> Affects Versions: 0.8
> Reporter: Eric Evans
> Assignee: Eric Evans
> Priority: Minor
> Labels: cql
> Fix For: 0.8
>
> Attachments: v1-0001-CASSANDRA-2027-utf8-and-integer-term-types.txt,
> v1-0002-column-name-validation.txt,
> v1-0003-system-tests-for-integer-and-utf8-term-types.txt,
> v1-0004-uuid-term-definitions.txt,
> v1-0005-missed-doc-update-for-utf8-term-type.txt
>
> Original Estimate: 0h
> Remaining Estimate: 0h
>
> h3. String
> Anything between double-quotes. Node-side this is just converted to bytes,
> so it could really be used to represent *any* type so long as it is
> appropriately encoded.
> Examples:
> {code:style=SQL}
> SELECT "name" FROM cf;
> UPDATE cf SET "name" = "value" WHERE KEY = "key";
> {code}
> h3. UTF-8
> A double-quoted string literal that is prefixed with a "u" to indicated that
> it should be encoded to bytes using the utf-8 charset node-side.
> Examples:
> {code:style=SQL}
> SELECT u"name" FROM cf;
> UPDATE cf SET u"name" = u"value" WHERE KEY = "key";
> {code}
> h3. Integer
> An undecorated numeric literal, converted to a 4-byte int node-side.
> Examples:
> {code:style=SQL}
> SELECT 10..100 FROM cf WHERE KEY = "key";
> UPDATE cf SET 1000 = "thousand", 100 = "hundred" WHERE KEY = "key";
> {code}
> h3. Long
> A numeric literal suffixed with an "L", converted to an 8-byte long node-side.
> Examples:
> {code:style=SQL}
> SELECT 10L..100L FROM cf WHERE KEY = "key";
> UPDATE cf SET 1000L = "thousand", 100L = "hundred" WHERE KEY = "key";
> {code}
> h3. UUID
> A string-formatted UUID supplied as an "argument" to a ctor/function formated
> string ({{uuid(<uuid string>)}}). Node-side this is converted back to the
> corresponding UUID.
> Examples:
> {code:style=SQL}
> SELECT uuid(5f989e95-ae07-4425-b84a-6876ba106c66) FROM cf WHERE KEY = "key";
> UPDATE cf SET uuid(5621b93d-d3a2-4d22-8a59-bdb93202b6cb) = "username" WHERE
> KEY = "key";
> {code}
> h3. TimeUUID (UUID Type 1)
> A string-formatted time-based UUID (type 1) supplied as an "argument" to a
> ctor/function formated string ({{timeuuid(<uuid string>)}}). Node-side this
> is converted back to the corresponding UUID. In addition to a
> string-formatted UUID, it should also be possible to supply dates in a
> variety of formats which will result in a new UUID being created node-side.
> Examples:
> {code:style=SQL}
> SELECT timeuuid(2011-01-01)..timeuuid(2010-01-21) FROM cf WHERE KEY = "key";
> UPDATE cf SET timeuuid(now) = 1000L WHERE KEY = "key";
> {code}
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira