diff --git a/CHANGES.txt b/CHANGES.txt index e067d9ce45..8325a9320e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -36,6 +36,7 @@ * Fix Subcolumn slice ends not respected (CASSANDRA-4826) * Fix Assertion error in cql3 select (CASSANDRA-4783) * Fix list prepend logic (CQL3) (CASSANDRA-4835) + * Add booleans as literals in CQL3 (CASSANDRA-4776) Merged from 1.1: * fix get_paged_slice to wrap to next row correctly (CASSANDRA-4816) * fix indexing empty column values (CASSANDRA-4832) diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 8e0d987488..089b2b9887 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -208,6 +208,9 @@ JUNK ::= /([ \t\r\f\v]+|(--|[/][/])[^\n\r]*([\n\r]|$)|[/][*].*?[*][/])/ ; ::= /[][{}]/ ; ::= "-"? ; + ::= "true" + | "false" + ; ::= /'([^']|'')*/ ; ::= /"([^"]|"")*/ ; @@ -217,6 +220,7 @@ JUNK ::= /([ \t\r\f\v]+|(--|[/][/])[^\n\r]*([\n\r]|$)|[/][*].*?[*][/])/ ; | | | + | ; ::= token="TOKEN" "(" ( "," )* ")" @@ -841,6 +845,8 @@ def insert_newval_completer(ctxt, cass): return ['{'] if coltype == 'list': return ['['] + if coltype == 'boolean': + return ['true', 'false'] return [Hint('' % (maybe_escape_name(curcol), cqltype.cql_parameterized_type()))] diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 76f2509e45..0f7668e0c4 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -578,7 +578,7 @@ map_literal returns [Map value] ; term returns [Term term] - : t=(STRING_LITERAL | UUID | INTEGER | FLOAT ) { $term = new Term($t.text, $t.type); } + : t=(STRING_LITERAL | UUID | INTEGER | FLOAT | K_TRUE | K_FALSE ) { $term = new Term($t.text, $t.type); } | t=QMARK { $term = new Term($t.text, $t.type, ++currentBindMarkerIdx); } ; @@ -641,7 +641,7 @@ property[PropertyDefinitions props] ; propertyValue returns [String str] - : v=(STRING_LITERAL | IDENT | INTEGER | FLOAT) { $str = $v.text; } + : v=(STRING_LITERAL | IDENT | INTEGER | FLOAT | K_TRUE | K_FALSE) { $str = $v.text; } | u=unreserved_keyword { $str = u; } ; @@ -823,6 +823,9 @@ K_WRITETIME: W R I T E T I M E; K_MAP: M A P; K_LIST: L I S T; +K_TRUE: T R U E; +K_FALSE: F A L S E; + // Case-insensitive alpha characters fragment A: ('a'|'A'); fragment B: ('b'|'B'); diff --git a/src/java/org/apache/cassandra/cql3/Term.java b/src/java/org/apache/cassandra/cql3/Term.java index 6eaba14be8..cfea259ce6 100644 --- a/src/java/org/apache/cassandra/cql3/Term.java +++ b/src/java/org/apache/cassandra/cql3/Term.java @@ -30,7 +30,7 @@ public class Term { public enum Type { - STRING, INTEGER, UUID, FLOAT, QMARK; + STRING, INTEGER, UUID, FLOAT, BOOLEAN, QMARK; static Type forInt(int type) { @@ -42,6 +42,8 @@ public class Term return UUID; else if (type == CqlParser.FLOAT) return FLOAT; + else if (type == CqlParser.K_TRUE || type == CqlParser.K_FALSE) + return BOOLEAN; else if (type == CqlParser.QMARK) return QMARK;