diff --git a/eva/parser/eva.lark b/eva/parser/eva.lark index edc4da309..e04b84e55 100644 --- a/eva/parser/eva.lark +++ b/eva/parser/eva.lark @@ -298,151 +298,151 @@ math_operator: STAR | DIVIDE | MODULUS | DIV | MOD | PLUS | MINUS | MINUSMINUS // KEYWORDS -ALL: "ALL" -ALTER: "ALTER" -AND: "AND" -ANY: "ANY" -ANYDIM: "ANYDIM" -AS: "AS" -ASC: "ASC" -BLOB: "BLOB" -BY: "BY" -COLUMN: "COLUMN" -CREATE: "CREATE" -DATABASE: "DATABASE" -DEFAULT: "DEFAULT" -DELETE: "DELETE" -DESC: "DESC" -DESCRIBE: "DESCRIBE" -DISTINCT: "DISTINCT" -DROP: "DROP" -EXIT: "EXIT" -EXISTS: "EXISTS" -EXPLAIN: "EXPLAIN" -FALSE: "FALSE" -FROM: "FROM" -GROUP: "GROUP" -HAVING: "HAVING" -IF: "IF" -IN: "IN" -FILE: "FILE" -INDIR: "INDIR" -INTO: "INTO" -INDEX: "INDEX" -INSERT: "INSERT" -IS: "IS" -JOIN: "JOIN" -KEY: "KEY" -LATERAL: "LATERAL" -LIKE: "LIKE" -LIMIT: "LIMIT" -LOAD: "LOAD" -NO: "NO" -NOT: "NOT" -NULL_LITERAL: "NULL" -OFFSET: "OFFSET" -ON: "ON" -OR: "OR" -ORDER: "ORDER" -PATH: "PATH" -PRIMARY: "PRIMARY" -REFERENCES: "REFERENCES" -RENAME: "RENAME" -SAMPLE: "SAMPLE" -IFRAMES: "IFRAMES" -AUDIORATE: "AUDIORATE" -SELECT: "SELECT" -SET: "SET" -SHUTDOWN: "SHUTDOWN" -SHOW: "SHOW" -SOME: "SOME" -TABLE: "TABLE" -TABLES: "TABLES" -TO: "TO" -TRUE: "TRUE" -UDFS: "UDFS" -UNION: "UNION" -UNIQUE: "UNIQUE" -UNKNOWN: "UNKNOWN" -UNLOCK: "UNLOCK" -UNNEST: "UNNEST" -UNSIGNED: "UNSIGNED" -UPDATE: "UPDATE" -USING: "USING" -VALUES: "VALUES" -WHERE: "WHERE" -XOR: "XOR" +ALL: "ALL"i +ALTER: "ALTER"i +AND: "AND"i +ANY: "ANY"i +ANYDIM: "ANYDIM"i +AS: "AS"i +ASC: "ASC"i +BLOB: "BLOB"i +BY: "BY"i +COLUMN: "COLUMN"i +CREATE: "CREATE"i +DATABASE: "DATABASE"i +DEFAULT: "DEFAULT"i +DELETE: "DELETE"i +DESC: "DESC"i +DESCRIBE: "DESCRIBE"i +DISTINCT: "DISTINCT"i +DROP: "DROP"i +EXIT: "EXIT"i +EXISTS: "EXISTS"i +EXPLAIN: "EXPLAIN"i +FALSE: "FALSE"i +FROM: "FROM"i +GROUP: "GROUP"i +HAVING: "HAVING"i +IF: "IF"i +IN: "IN"i +FILE: "FILE"i +INDIR: "INDIR"i +INTO: "INTO"i +INDEX: "INDEX"i +INSERT: "INSERT"i +IS: "IS"i +JOIN: "JOIN"i +KEY: "KEY"i +LATERAL: "LATERAL"i +LIKE: "LIKE"i +LIMIT: "LIMIT"i +LOAD: "LOAD"i +NO: "NO"i +NOT: "NOT"i +NULL_LITERAL: "NULL"i +OFFSET: "OFFSET"i +ON: "ON"i +OR: "OR"i +ORDER: "ORDER"i +PATH: "PATH"i +PRIMARY: "PRIMARY"i +REFERENCES: "REFERENCES"i +RENAME: "RENAME"i +SAMPLE: "SAMPLE"i +IFRAMES: "IFRAMES"i +AUDIORATE: "AUDIORATE"i +SELECT: "SELECT"i +SET: "SET"i +SHUTDOWN: "SHUTDOWN"i +SHOW: "SHOW"i +SOME: "SOME"i +TABLE: "TABLE"i +TABLES: "TABLES"i +TO: "TO"i +TRUE: "TRUE"i +UDFS: "UDFS"i +UNION: "UNION"i +UNIQUE: "UNIQUE"i +UNKNOWN: "UNKNOWN"i +UNLOCK: "UNLOCK"i +UNNEST: "UNNEST"i +UNSIGNED: "UNSIGNED"i +UPDATE: "UPDATE"i +USING: "USING"i +VALUES: "VALUES"i +WHERE: "WHERE"i +XOR: "XOR"i // File Formats -WITH: "WITH" -FORMAT: "FORMAT" -CSV: "CSV" -VIDEO: "VIDEO" -IMAGE: "IMAGE" +WITH: "WITH"i +FORMAT: "FORMAT"i +CSV: "CSV"i +VIDEO: "VIDEO"i +IMAGE: "IMAGE"i // Index types -HNSW: "HNSW" +HNSW: "HNSW"i // Computer vision tasks -OBJECT_DETECTION: "OBJECT_DETECTION" -ACTION_CLASSICATION: "ACTION_CLASSICATION" +OBJECT_DETECTION: "OBJECT_DETECTION"i +ACTION_CLASSICATION: "ACTION_CLASSICATION"i // DATA TYPE Keywords -BOOLEAN: "BOOLEAN" -INTEGER: "INTEGER" -FLOAT: "FLOAT" -TEXT: "TEXT" -NDARRAY: "NDARRAY" -INT8: "INT8" -UINT8: "UINT8" -INT16: "INT16" -INT32: "INT32" -INT64: "INT64" -UNICODE: "UNICODE" -FLOAT32: "FLOAT32" -FLOAT64: "FLOAT64" -DECIMAL: "DECIMAL" -STR: "STR" -DATETIME: "DATETIME" -ANYTYPE: "ANYTYPE" +BOOLEAN: "BOOLEAN"i +INTEGER: "INTEGER"i +FLOAT: "FLOAT"i +TEXT: "TEXT"i +NDARRAY: "NDARRAY"i +INT8: "INT8"i +UINT8: "UINT8"i +INT16: "INT16"i +INT32: "INT32"i +INT64: "INT64"i +UNICODE: "UNICODE"i +FLOAT32: "FLOAT32"i +FLOAT64: "FLOAT64"i +DECIMAL: "DECIMAL"i +STR: "STR"i +DATETIME: "DATETIME"i +ANYTYPE: "ANYTYPE"i // Group function Keywords -AVG: "AVG" -COUNT: "COUNT" -MAX: "MAX" -MIN: "MIN" -STD: "STD" -SUM: "SUM" -FCOUNT: "FCOUNT" -FIRST: "FIRST" -LAST: "LAST" -SEGMENT: "SEGMENT" +AVG: "AVG"i +COUNT: "COUNT"i +MAX: "MAX"i +MIN: "MIN"i +STD: "STD"i +SUM: "SUM"i +FCOUNT: "FCOUNT"i +FIRST: "FIRST"i +LAST: "LAST"i +SEGMENT: "SEGMENT"i // Keywords, but can be ID // Common Keywords, but can be ID -AUTO_INCREMENT: "AUTO_INCREMENT" -HELP: "HELP" -TEMPTABLE: "TEMPTABLE" -VALUE: "VALUE" +AUTO_INCREMENT: "AUTO_INCREMENT"i +HELP: "HELP"i +TEMPTABLE: "TEMPTABLE"i +VALUE: "VALUE"i // UDF -UDF: "UDF" -INPUT: "INPUT" -OUTPUT: "OUTPUT" -TYPE: "TYPE" -IMPL: "IMPL" +UDF: "UDF"i +INPUT: "INPUT"i +OUTPUT: "OUTPUT"i +TYPE: "TYPE"i +IMPL: "IMPL"i // MATERIALIZED -MATERIALIZED: "MATERIALIZED" -VIEW: "VIEW" +MATERIALIZED: "MATERIALIZED"i +VIEW: "VIEW"i // Common function names -ABS: "ABS" +ABS: "ABS"i // Operators // Operators. Assigns diff --git a/eva/parser/lark_visitor/_common_clauses_ids.py b/eva/parser/lark_visitor/_common_clauses_ids.py index 6df63c833..d90396aa2 100644 --- a/eva/parser/lark_visitor/_common_clauses_ids.py +++ b/eva/parser/lark_visitor/_common_clauses_ids.py @@ -56,7 +56,7 @@ def simple_id(self, tree): def decimal_literal(self, tree): decimal = None token = tree.children[0] - if token == "ANYDIM": + if str.upper(token) == "ANYDIM": decimal = Dimension.ANYDIM else: decimal = int(str(token)) diff --git a/eva/parser/lark_visitor/_create_statements.py b/eva/parser/lark_visitor/_create_statements.py index 3c60afa16..2f7f735e3 100644 --- a/eva/parser/lark_visitor/_create_statements.py +++ b/eva/parser/lark_visitor/_create_statements.py @@ -128,7 +128,7 @@ def simple_data_type(self, tree): dimensions = [] token = tree.children[0] - if token == "BOOLEAN": + if str.upper(token) == "BOOLEAN": data_type = ColumnType.BOOLEAN return data_type, array_type, dimensions @@ -139,7 +139,7 @@ def integer_data_type(self, tree): dimensions = [] token = tree.children[0] - if token == "INTEGER": + if str.upper(token) == "INTEGER": data_type = ColumnType.INTEGER return data_type, array_type, dimensions @@ -150,10 +150,10 @@ def dimension_data_type(self, tree): dimensions = [] token = tree.children[0] - if token == "FLOAT": + if str.upper(token) == "FLOAT": data_type = ColumnType.FLOAT dimensions = self.visit(tree.children[1]) - elif token == "TEXT": + elif str.upper(token) == "TEXT": data_type = ColumnType.TEXT dimensions = self.visit(tree.children[1]) @@ -180,31 +180,31 @@ def array_type(self, tree): array_type = None token = tree.children[0] - if token == "INT8": + if str.upper(token) == "INT8": array_type = NdArrayType.INT8 - elif token == "UINT8": + elif str.upper(token) == "UINT8": array_type = NdArrayType.UINT8 - elif token == "INT16": + elif str.upper(token) == "INT16": array_type = NdArrayType.INT16 - elif token == "INT32": + elif str.upper(token) == "INT32": array_type = NdArrayType.INT32 - elif token == "INT64": + elif str.upper(token) == "INT64": array_type = NdArrayType.INT64 - elif token == "UNICODE": + elif str.upper(token) == "UNICODE": array_type = NdArrayType.UNICODE - elif token == "BOOLEAN": + elif str.upper(token) == "BOOLEAN": array_type = NdArrayType.BOOL - elif token == "FLOAT32": + elif str.upper(token) == "FLOAT32": array_type = NdArrayType.FLOAT32 - elif token == "FLOAT64": + elif str.upper(token) == "FLOAT64": array_type = NdArrayType.FLOAT64 - elif token == "DECIMAL": + elif str.upper(token) == "DECIMAL": array_type = NdArrayType.DECIMAL - elif token == "STR": + elif str.upper(token) == "STR": array_type = NdArrayType.STR - elif token == "DATETIME": + elif str.upper(token) == "DATETIME": array_type = NdArrayType.DATETIME - elif token == "ANYTYPE": + elif str.upper(token) == "ANYTYPE": array_type = NdArrayType.ANYTYPE return array_type @@ -259,7 +259,7 @@ def index_type(self, tree): index_type = None token = tree.children[1] - if token == "HNSW": + if str.upper(token) == "HNSW": index_type = IndexType.HNSW return index_type diff --git a/eva/parser/lark_visitor/_select_statement.py b/eva/parser/lark_visitor/_select_statement.py index d92c16e4a..fc5bb808f 100644 --- a/eva/parser/lark_visitor/_select_statement.py +++ b/eva/parser/lark_visitor/_select_statement.py @@ -52,9 +52,9 @@ def sort_order(self, tree): token = tree.children[0] sort_order = None - if token == "ASC": + if str.upper(token) == "ASC": sort_order = ParserOrderBySortType.ASC - elif token == "DESC": + elif str.upper(token) == "DESC": sort_order = ParserOrderBySortType.DESC return sort_order diff --git a/eva/parser/lark_visitor/_show_statements.py b/eva/parser/lark_visitor/_show_statements.py index 433f39eff..e2cb95194 100644 --- a/eva/parser/lark_visitor/_show_statements.py +++ b/eva/parser/lark_visitor/_show_statements.py @@ -21,10 +21,9 @@ ################################################################## class Show: def show_statement(self, tree): - token = tree.children[1] - if token == "UDFS": + if str.upper(token) == "UDFS": return ShowStatement(show_type=ShowType.UDFS) - elif token == "TABLES": + elif str.upper(token) == "TABLES": return ShowStatement(show_type=ShowType.TABLES) diff --git a/test/parser/test_parser_statements.py b/test/parser/test_parser_statements.py index e9b811617..5553acb99 100644 --- a/test/parser/test_parser_statements.py +++ b/test/parser/test_parser_statements.py @@ -87,7 +87,60 @@ def test_parser_statement_types(self): FeatureExtractor(data)) LIMIT 1;""", ] - + # The queries below are the result of randomly changing the case of the + # characters in the above queries. + randomized_cases = [ + "Create index TestIndex on MyVideo (featCol) using HNSW;", + """create table if not exists Persons ( + Frame_ID integer unique, + Frame_Data text(10), + Frame_Value float(1000, 201), + Frame_Array ndArray uint8(5, 100, 2432, 4324, 100) + )""", + "Rename Table STUDENT to student_info", + "drop table if exists Student_info", + "drop table Student_Info", + "Drop udf FASTRCNN;", + "Select min(id), max(Id), Sum(Id) from ABC", + "select CLASS from Taipai where (Class = 'VAN' and REDNESS < 300) or Redness > 500;", + "select class, REDNESS from TAIPAI Union all select Class, redness from Shanghai;", + "Select class, redness from Taipai Union Select CLASS, redness from Shanghai;", + "Select first(Id) from Taipai group by '8F';", + """Select Class, redness from TAIPAI + where (CLASS = 'VAN' and redness < 400 ) or REDNESS > 700 + order by Class, redness DESC;""", + "Insert into MyVideo (Frame_ID, Frame_Path) values (1, '/mnt/frames/1.png');", + """insert into testDeleteOne (Id, feat, salary, input) + values (15, 2.5, [[100, 100, 100]], [[100, 100, 100]]);""", + "delete from Foo where ID < 6", + "Load video 'data/video.mp4' into MyVideo", + "Load image 'data/pic.jpg' into MyImage", + """Load csv 'data/meta.csv' into + MyMeta (id, Frame_ID, video_ID, label);""", + """select Licence_plate(bbox) from + (select Yolo(Frame).bbox from autonomous_vehicle_1 + where Yolo(frame).label = 'vehicle') as T + where is_suspicious(bbox) = 1 and + Licence_plate(bbox) = '12345';""", + """Create materialized view UADTrac_FastRCNN (id, labels) as + Select id, YoloV5(Frame).labels from MyVideo + where id<5; """, + """Select Table1.A from Table1 join Table2 + on Table1.A = Table2.a where Table1.A <= 5""", + """Select Table1.A from Table1 Join Table2 + On Table1.a = Table2.A Join Table3 + On Table3.A = Table1.A where Table1.a <= 5""", + """Select Frame from MyVideo Join Lateral + ObjectDet(Frame) as OD;""", + """Create UDF FaceDetector + Input (Frame ndArray uint8(3, anydim, anydim)) + Output (bboxes ndArray float32(anydim, 4), + scores ndArray float32(ANYdim)) + Type FaceDetection + Impl 'eva/udfs/face_detector.py'; + """, + ] + queries = queries + randomized_cases ref_stmt = parser.parse(queries[0])[0] self.assertNotEqual(ref_stmt, None) self.assertNotEqual(ref_stmt.__str__(), None)