blob: 7fe8a6759a7f04e1930a267bfb1a95ddec637f0f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* Authors:
* Stefane Fermigier, Nuxeo
* Florent Guillaume, Nuxeo
*/
gunit CMISQL;
@header{
package org.apache.chemistry.opencmis.server.support.query;
}
// ----- Lexer tests -----
ID:
"a" OK
"!" FAIL
"toto" OK
"toto123" OK
"toto123_" OK
"_foo" OK
"foo:bar" OK
"123" FAIL
"123abc" FAIL
NUM_LIT:
"123" OK
"0" OK
"-0" OK
"1" OK
"-1" OK
"-123" OK
"0123" OK
"-0123" OK
"123abc" FAIL
"123E" FAIL
"123.456" OK
"+123.456" OK
"-123.456" OK
".456" OK
"+.456" OK
"-.456" OK
"123." OK
"+123." OK
"-123." OK
"+123.456E78" OK
"-123.456E-78" OK
".456E78" OK
"+123.E+78" OK
STRING_LIT:
"'abc'" OK
"'a''bc'" OK
"'abc" FAIL
"abc'" FAIL
"'ab'c'" FAIL
BOOL_LIT:
"TRUE" OK
"true" OK
"FALSE" OK
"false" OK
TIME_LIT:
"TIMESTAMP '2010-01-01Z01:01:01.000Z'" OK
"timestamp '123'" OK
"TIMESTAMP 123" FAIL
// ----- Parser tests -----
literal:
"123" OK
"-123" OK
"0" OK
"0123" OK
"abc123" OK
"123abc" FAIL
"'abc'" OK
"123.345E78" OK
order_by_clause:
"ORDER BY foo" -> (ORDER_BY (COL foo) ASC)
"ORDER BY foo ASC" -> (ORDER_BY (COL foo) ASC)
"ORDER BY foo DESC" -> (ORDER_BY (COL foo) DESC)
"ORDER BY t.foo, bar DESC" -> (ORDER_BY (COL t foo) ASC (COL bar) DESC)
column_reference:
"foo" -> (COL foo)
"bar.foo" -> (COL bar foo)
from_clause:
"FROM foo JOIN bar ON x = y" -> (FROM (TABLE foo) (JOIN INNER (TABLE bar) (ON (COL x) = (COL y))))
table_join:
"LEFT OUTER JOIN foo ON x = y" -> (JOIN LEFT (TABLE foo) (ON (COL x) = (COL y)))
"INNER JOIN foo" -> (JOIN INNER (TABLE foo))
one_table:
"foo" -> (TABLE foo)
"foo bar" -> (TABLE foo bar)
"foo AS bar" -> (TABLE foo bar)
"(foo)" -> (TABLE foo)
in_predicate:
"foo IN ( 'a', 'b', 'c')" -> (BIN_OP IN (COL foo) (LIST 'a' 'b' 'c'))
"foo NOT IN ( 1, 2, 3)" -> (BIN_OP NOT_IN (COL foo) (LIST 1 2 3))
quantified_in_predicate:
"ANY foo IN ('a', 1)" -> (BIN_OP_ANY IN (LIST 'a' 1) (COL foo))
comparison_predicate:
"foo = 1" -> (BIN_OP = (COL foo) 1)
"foo <> 1" -> (BIN_OP <> (COL foo) 1)
predicate:
"foo = 1" -> (BIN_OP = (COL foo) 1)
"foo IN ('bar')" -> (BIN_OP IN (COL foo) (LIST 'bar'))
"foo IS NULL" -> (UN_OP IS_NULL (COL foo))
"foo IS NOT NULL" -> (UN_OP IS_NOT_NULL (COL foo))
"1 = ANY foo" -> (BIN_OP_ANY = 1 (COL foo))
"LOWER(foo) = 'bar'" -> (BIN_OP = (FUNC LOWER (COL foo)) 'bar')
"quux(foo) = 'bar'" -> (BIN_OP = (FUNC quux (COL foo)) 'bar')
folder_predicate:
"IN_FOLDER(foo,'ID123')" -> (FUNC IN_FOLDER foo 'ID123')
"IN_FOLDER('ID123')" -> (FUNC IN_FOLDER 'ID123')
"IN_TREE(foo,'ID123')" -> (FUNC IN_TREE foo 'ID123')
"IN_TREE('ID123')" -> (FUNC IN_TREE 'ID123')
text_search_predicate:
"CONTAINS('foo')" -> (FUNC CONTAINS 'foo')
"CONTAINS(bar, 'foo')" -> (FUNC CONTAINS bar 'foo')
where_clause:
"WHERE foo = 1" -> (WHERE (BIN_OP = (COL foo) 1))
"WHERE a = 1 AND b <> 2 OR c >= 3 AND NOT d <= 4" -> (WHERE (BIN_OP = (COL a) 1) AND (BIN_OP <> (COL b) 2) OR (BIN_OP >= (COL c) 3) AND NOT (BIN_OP <= (COL d) 4))
query:
"SELECT * FROM Document" -> (SELECT * (FROM (TABLE Document)))
"SELECT a, b, c FROM Document" -> (SELECT (LIST (COL a) (COL b) (COL c)) (FROM (TABLE Document)))
"SELECT a, b FROM Document ORDER BY a, b" -> (SELECT (LIST (COL a) (COL b)) (FROM (TABLE Document)) (ORDER_BY (COL a) ASC (COL b) ASC))
"SELECT DISTINCT a, b, c FROM Document" -> (SELECT DISTINCT (LIST (COL a) (COL b) (COL c)) (FROM (TABLE Document)))
// Examples from the specs.
<<
SELECT TITLE, AUTHORS, DATE
FROM WHITE_PAPER
WHERE ( IN_TREE('ID00093854763') ) AND ( 'SMITH' = ANY AUTHORS )
>> -> (SELECT (LIST (COL TITLE) (COL AUTHORS) (COL DATE)) (FROM (TABLE WHITE_PAPER)) (WHERE ( (FUNC IN_TREE 'ID00093854763') ) AND ( (BIN_OP_ANY = 'SMITH' (COL AUTHORS)) )))
<<
SELECT OBJECT_ID, SCORE() AS X, DESTINATION, DEPARTURE_DATES
FROM TRAVEL_BROCHURE
WHERE ( CONTAINS('CARIBBEAN CENTRAL AMERICA CRUISE TOUR') ) AND
( '2010-1-1' < ANY DEPARTURE_DATES )
ORDER BY X DESC
>> OK
<<
SELECT *
FROM CAR_REVIEW
WHERE ( LOWER(MAKE) = 'buick' ) OR
( ANY FEATURES IN ('NAVIGATION SYSTEM', 'SATELLITE RADIO', 'MP3' ) )
>> OK
<<
SELECT Y.CLAIM_NUM, X.PROPERTY_ADDRESS, Y.DAMAGE_ESTIMATES
FROM POLICY AS X JOIN CLAIMS AS Y ON X.POLICY_NUM = Y.POLICY_NUM
WHERE ( 100000 <= ANY Y.DAMAGE_ESTIMATES ) AND ( Y.CAUSE NOT LIKE '%Katrina%' )
>> OK