Skip to content

Commit

Permalink
Merge pull request #131 from cassandra-scala/feature/127-cql3.3-specs
Browse files Browse the repository at this point in the history
Adds specs for escaping characters
  • Loading branch information
tabdulradi committed Dec 25, 2016
2 parents 9a565d2 + 0849c91 commit 3a4fbed
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package troy.cql.parser.dml
import troy.cql.ast.CqlParser._
import troy.cql.ast.{ FunctionCall, FunctionName, SelectStatement }
import troy.cql.ast.SelectStatement
import troy.cql.ast.dml.Select

trait SelectStatementParser {
Expand Down
32 changes: 22 additions & 10 deletions cql-parser/src/test/scala/troy/cql/parser/ParserTestUtils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,41 @@ package troy.cql.parser

import org.scalatest.{ FlatSpec, Matchers }
import troy.cql.ast._
import troy.cql.ast.dml.Insert.NamesValues

object ParserTestUtils extends FlatSpec with Matchers {
def parseSchema(statement: String) =
CqlParser.parseSchema(statement) match {
case CqlParser.Success(res, _) => res
case CqlParser.Failure(msg, next) => fail(s"Parse Failure: $msg, line = ${next.pos.line}, column = ${next.pos.column}")
}
handleParseFailure(CqlParser.parseSchema(statement))

def parseSchemaAs[T](statement: String) =
parseSchema(statement)
.head
.asInstanceOf[T]

def parseCreateTable(statement: String) =
parseSchemaAs(statement).asInstanceOf[CreateTable]
parseSchemaAs[CreateTable](statement)

def parseQuery(statement: String) =
CqlParser
.parseDML(statement) match {
case CqlParser.Success(res, _) => res
case CqlParser.Failure(msg, next) => fail(s"Parse Failure: $msg, line = ${next.pos.line}, column = ${next.pos.column}")
}
handleParseFailure(CqlParser.parseDML(statement))

private[this] def handleParseFailure[T](parsed: => CqlParser.ParseResult[T]): T =
parsed match {
case CqlParser.Success(res, _) => res
case CqlParser.Failure(msg, next) => fail(s"Parse Failure: $msg, line = ${next.pos.line}, column = ${next.pos.column}")
case CqlParser.Error(msg, _) => throw new Exception(msg)
}

def parseSelect(statement: String) =
parseQuery(statement).asInstanceOf[SelectStatement]

def parseInsert(statement: String) =
parseQuery(statement).asInstanceOf[InsertStatement]

object InsertUtils {
val parse = parseInsert _

implicit class InsertStatementHelpers(val statement: InsertStatement) extends AnyVal {
def values = statement.insertClause.asInstanceOf[NamesValues].values.values
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package troy.cql.parser.ddl

import org.scalatest.{ FlatSpec, Matchers }
import troy.cql.ast.ddl.Index
import troy.cql.ast.{ StringConstant, Constant, CreateIndex }
import troy.cql.ast.{ StringConstant, CreateIndex }
import troy.cql.parser.ParserTestUtils.parseSchemaAs

class CreateIndexParserTest extends FlatSpec with Matchers {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class CreateTableParserTest extends FlatSpec with Matchers {
}

it should "accepts schemas with timeuuid fields" in {
val statement = parseSchemaAs[CreateTable](
parseSchemaAs[CreateTable](
"""
CREATE TABLE test.posts (
author_id text,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ package troy.cql.parser.dml
import java.util.UUID

import org.scalatest._
import troy.cql.ast
import troy.cql.ast._
import troy.cql.ast.dml.Select.OrderBy
import troy.cql.ast.dml.Select.OrderBy.Ordering
import troy.cql.ast.dml.SimpleSelection.ColumnName
import troy.cql.ast.dml.{ Operator, Select }
import troy.cql.ast.dml.WhereClause.Relation.{ Simple, Token, Tupled }
import troy.cql.ast.dml.WhereClause.Relation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package troy.cql.parser.dml
import java.util.UUID

import org.scalatest.{ FlatSpec, Matchers }
import troy.cql.ast.CqlParser.Constants
import troy.cql.ast._
import troy.cql.ast.dml._
import troy.cql.ast.dml.Update._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ class CaseSensitivityParsingSpec extends FlatSpec with Matchers {
| "baR" UUID,
| "baz" timestamp
| );
""".stripMargin).columns
""".stripMargin
).columns

columns(0).name shouldBe "foo"
columns(1).name shouldBe "Bar"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package troy.cql3_3.lexical

import org.scalatest.{ FlatSpec, Matchers }
import troy.cql.ast.StringConstant
import troy.cql.parser.ParserTestUtils.InsertUtils._

// http://docs.datastax.com/en/cql/3.3/cql/cql_reference/escape_char_r.html
class EscapingCharactersParsingSpec extends FlatSpec with Matchers {
"single quotation in string literal" should "be escaped by duplicate single quotation mark" in {
parse(
"""
| INSERT INTO cycling.calendar (race_id, race_start_date, race_end_date, race_name) VALUES
| (201, '2015-02-18', '2015-02-22', 'Women''s Tour of New Zealand');
""".stripMargin
).values(3) shouldBe StringConstant("Women's Tour of New Zealand")
}

// TODO: https://github.com/cassandra-scala/troy/issues/130
it should "be escaped by duplicate dollar signs" ignore {
parse(
"""
| INSERT INTO cycling.calendar (race_id, race_start_date, race_end_date, race_name) VALUES
| (201, '2015-02-18', '2015-02-22', $$Women's Tour of New Zealand$$);
""".stripMargin
).values(3) shouldBe StringConstant("Women's Tour of New Zealand")
}

}

0 comments on commit 3a4fbed

Please sign in to comment.