Feat/flink grammar (#73)
* feat: complete flink sql insert statement * feat: complete flink sql drop statement * feat: complete flink sql alert statement * feat: complete flink sql create statement, remove console log * feat: complete flink sql describe, show, explain, use statement * feat(flinksql): add statement, such as set, load * fix(flinksql): fix insert, add temporary table
This commit is contained in:
@ -3,104 +3,6 @@ import { FlinkSQL } from '../../../src';
|
||||
describe('FlinkSQL Syntax Tests', () => {
|
||||
const parser = new FlinkSQL();
|
||||
|
||||
// Create statements
|
||||
test('Test simple CreateTable Statement', () => {
|
||||
const sql = `
|
||||
CREATE TABLE Orders (
|
||||
user BIGINT
|
||||
) WITH (
|
||||
"connector" = "kafka",
|
||||
"scan.startup.mode" = "earliest-offset"
|
||||
);
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple CreateDatabase Statement', () => {
|
||||
const sql = `
|
||||
CREATE DATABASE IF NOT EXISTS dataApi
|
||||
WITH (
|
||||
"owner" = "admin"
|
||||
);
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple CreateView Statement', () => {
|
||||
const sql = `
|
||||
CREATE TEMPORARY VIEW IF NOT EXISTS tempView
|
||||
AS SELECT product, amount FROM Orders;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple CreateFunction Statement', () => {
|
||||
const sql = `
|
||||
CREATE TEMPORARY FUNCTION IF NOT EXISTS tempFunction AS 'SimpleUdf';
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// Alter statements
|
||||
test('Test simple AlterTable Statement', () => {
|
||||
const sql = `ALTER TABLE Orders RENAME TO NewOrders;`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple AlterDatabase Statement', () => {
|
||||
const sql = `ALTER DATABASE tempDB SET ("key1"="value1");`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple AlterFunction Statement', () => {
|
||||
const sql = `
|
||||
ALTER TEMPORARY FUNCTION IF EXISTS tempFunction AS 'SimpleUdf';
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// Drop statements
|
||||
test('Test simple DropTable Statement', () => {
|
||||
const sql = `DROP TABLE IF EXISTS Orders;`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple DropDatabase Statement', () => {
|
||||
const sql = `DROP DATABASE IF EXISTS Orders RESTRICT;`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple DropView Statement', () => {
|
||||
const sql = `DROP TEMPORARY VIEW IF EXISTS Orders;`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple DropFunction Statement', () => {
|
||||
const sql = `DROP TEMPORARY FUNCTION IF EXISTS Orders;`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// insert statements
|
||||
test('Test one simple Insert Statement', () => {
|
||||
const sql = `
|
||||
INSERT INTO students VALUES
|
||||
('Amy Smith', '123 Park Ave, San Jose', 111111);
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test two simple Insert Statement', () => {
|
||||
const sql = `
|
||||
INSERT INTO students PARTITION (student_id = 444444)
|
||||
SELECT name, address FROM persons WHERE name = "Dora Williams";
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// query statements
|
||||
test('Test With clause', () => {
|
||||
const sql = `
|
||||
@ -195,32 +97,102 @@ describe('FlinkSQL Syntax Tests', () => {
|
||||
|
||||
// describe statements
|
||||
test('Test simple Describe Statement', () => {
|
||||
const sql = `DESCRIBE Orders;`;
|
||||
const sql = `
|
||||
DESCRIBE Orders;
|
||||
DESC Orders;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// describe statements
|
||||
// explain statements
|
||||
test('Test simple Explain Statement', () => {
|
||||
const sql = `EXPLAIN tempTable FOR SELECT k, SUM(v) FROM oneTable;`;
|
||||
const sql = `
|
||||
EXPLAIN SELECT * FROM emps;
|
||||
EXPLAIN PLAN FOR SELECT * FROM emps;
|
||||
EXPLAIN PLAN FOR insert into emps1 SELECT * FROM emps2;
|
||||
EXPLAIN CHANGELOG_MODE SELECT * FROM emps;
|
||||
EXPLAIN ESTIMATED_COST SELECT * FROM emps;
|
||||
EXPLAIN JSON_EXECUTION_PLAN SELECT * FROM emps;
|
||||
EXPLAIN CHANGELOG_MODE, JSON_EXECUTION_PLAN, ESTIMATED_COST SELECT * FROM emps;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// explain insert_statement
|
||||
test('Test Explain Insert Statement', () => {
|
||||
const sql = `EXPLAIN INSERT INTO EMPS1 SELECT * FROM EMPS2;`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
test('Test simple Explain statement_set', () => {
|
||||
// 按官网上写的,那应该是 explain execute statement set - begin,但实际执行时,携带 execute 会报错
|
||||
// 个人理解,explain 是解析该语法如何执行,而不能在解析的过程中,去执行语句
|
||||
const sql = `
|
||||
EXPLAIN STATEMENT SET
|
||||
BEGIN
|
||||
INSERT INTO t1 SELECT * FROM t2;
|
||||
INSERT INTO t2 SELECT * FROM t3;
|
||||
END;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// use statements
|
||||
test('Test simple Use Statement', () => {
|
||||
const sql = `USE CATALOG orders;`;
|
||||
const sql = `
|
||||
USE CATALOG cat1;
|
||||
USE db1;
|
||||
USE MODULES hive;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// show statements
|
||||
test('Test simple Show Statement', () => {
|
||||
const sql = `SHOW CATALOGS;`;
|
||||
const sql = `
|
||||
SHOW CATALOGS;
|
||||
SHOW CURRENT CATALOG;
|
||||
SHOW DATABASES;
|
||||
SHOW CURRENT DATABASE;
|
||||
SHOW TABLES;
|
||||
SHOW TABLES FROM catalog1.db1 NOT LIKE '%';
|
||||
SHOW CREATE TABLE my_table;
|
||||
SHOW COLUMNS FROM my_table LIKE '%f%';
|
||||
SHOW VIEWS;
|
||||
SHOW CREATE VIEW my_view;
|
||||
SHOW FUNCTIONS;
|
||||
SHOW USER FUNCTIONS;
|
||||
SHOW MODULES;
|
||||
SHOW FULL MODULES;
|
||||
SHOW JARS;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// other statement
|
||||
test('Test other Statement', () => {
|
||||
const sql = `
|
||||
LOAD MODULE CORE;
|
||||
LOAD MODULE dummy WITH ('k1' = 'v1', 'k2' = 'v2');
|
||||
UNLOAD MODULE CORE;
|
||||
SET;
|
||||
SET 'test-key' = 'test-value';
|
||||
RESET;
|
||||
RESET 'test-key';
|
||||
ADD JAR '<path_to_filename>.jar'
|
||||
REMOVE JAR '<path_to_filename>.jar'
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
console.log(result);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
test('Test invalid Double Line Comment statement', () => {
|
||||
let sql = `-test comment\n`;
|
||||
let result = parser.validate(sql);
|
||||
|
38
test/parser/flinksql/syntax/alterStatement.test.ts
Normal file
38
test/parser/flinksql/syntax/alterStatement.test.ts
Normal file
@ -0,0 +1,38 @@
|
||||
import { FlinkSQL } from '../../../../src';
|
||||
|
||||
describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const parser = new FlinkSQL();
|
||||
// Alter statements
|
||||
test('Test simple alter table Statement', () => {
|
||||
const sql = `
|
||||
ALTER TABLE Orders RENAME TO NewOrders;
|
||||
ALTER TABLE sample_table SET ('key1'='value2');
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple alter view Statement', () => {
|
||||
const sql = `
|
||||
ALTER VIEW v1 RENAME TO v2;
|
||||
ALTER VIEW v1 AS SELECT c1, c2 FROM tbl;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple alter database Statement', () => {
|
||||
const sql = `ALTER DATABASE tempDB SET ("key1"="value1");`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple alter function Statement', () => {
|
||||
const sql = `
|
||||
ALTER FUNCTION tempFunction AS 'SimpleUdf';
|
||||
ALTER TEMPORARY FUNCTION IF EXISTS tempFunction AS 'SimpleUdf';
|
||||
ALTER TEMPORARY SYSTEM FUNCTION IF EXISTS tempFunction AS 'SimpleUdf';
|
||||
ALTER FUNCTION myudf AS 'com.example.MyUdf' LANGUAGE PYTHON;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
});
|
||||
|
43
test/parser/flinksql/syntax/createStatement.test.ts
Normal file
43
test/parser/flinksql/syntax/createStatement.test.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import { FlinkSQL } from '../../../../src';
|
||||
|
||||
describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const parser = new FlinkSQL();
|
||||
// Create statements
|
||||
test('Test Create Catalog Statement', () => {
|
||||
const sql = `
|
||||
CREATE CATALOG c1
|
||||
WITH (
|
||||
'key1'='value1',
|
||||
'key2'='value2'
|
||||
)
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple Create Database Statement', () => {
|
||||
const sql = `
|
||||
CREATE DATABASE IF NOT EXISTS dataApi
|
||||
WITH (
|
||||
"owner" = "admin"
|
||||
);
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple Create View Statement', () => {
|
||||
const sql = `
|
||||
CREATE TEMPORARY VIEW IF NOT EXISTS tempView
|
||||
AS SELECT product, amount FROM Orders;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test simple Create Function Statement', () => {
|
||||
const sql = `
|
||||
CREATE FUNCTION IF NOT EXISTS tempFunction AS 'SimpleUdf';
|
||||
CREATE TEMPORARY FUNCTION function1 AS 'org.apache.fink.function.function1' LANGUAGE JAVA USING JAR 'file:///path/to/test.jar', JAR 'hdfs:///path/to/test2.jar';
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
});
|
@ -4,7 +4,7 @@ describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const parser = new FlinkSQL();
|
||||
|
||||
// simple create table statement
|
||||
test('Test simple CreateTable Statement', () => {
|
||||
test('Test simple Create Table Statement', () => {
|
||||
const sql = `
|
||||
CREATE TABLE MyTable (
|
||||
'user_id' BIGINT,
|
||||
@ -16,6 +16,19 @@ describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
// create temporary table statement
|
||||
test('Test Temporary Create Table Statement', () => {
|
||||
const sql = `
|
||||
CREATE TEMPORARY TABLE MyTable (
|
||||
'user_id' BIGINT,
|
||||
'name' STRING
|
||||
) WITH (
|
||||
'connector'='oracle-x'
|
||||
);
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
// Metadata Columns statement
|
||||
test('Test Metadata Columns Statement', () => {
|
||||
const sql = `
|
||||
@ -114,6 +127,19 @@ describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
// AS select_statement
|
||||
test('Test As Select Statement', () => {
|
||||
const sql = `
|
||||
CREATE TABLE my_ctas_table
|
||||
WITH (
|
||||
'connector' = 'kafka'
|
||||
)
|
||||
AS SELECT id, name, age FROM source_table WHERE mod(id, 10) = 0;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
|
||||
// create catalog table
|
||||
test('Test Create Catalog Table Statement', () => {
|
||||
const sql = `
|
||||
|
49
test/parser/flinksql/syntax/dropStatement.test.ts
Normal file
49
test/parser/flinksql/syntax/dropStatement.test.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import { FlinkSQL } from '../../../../src';
|
||||
|
||||
describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const parser = new FlinkSQL();
|
||||
// Drop statements
|
||||
test('Test Simple Drop Catalog Statement', () => {
|
||||
const sql = `
|
||||
DROP CATALOG catalog1;
|
||||
DROP CATALOG IF EXISTS catalog2;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Simple Drop Table Statement', () => {
|
||||
const sql = `
|
||||
DROP TABLE Orders;
|
||||
DROP TABLE IF EXISTS Orders;
|
||||
DROP TEMPORARY TABLE IF EXISTS Orders;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Simple Drop Database Statement', () => {
|
||||
const sql = `
|
||||
DROP DATABASE Orders;
|
||||
DROP DATABASE IF EXISTS Orders RESTRICT;
|
||||
DROP DATABASE IF EXISTS Orders CASCADE;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Simple Drop View Statement', () => {
|
||||
const sql = `
|
||||
DROP VIEW Orders;
|
||||
DROP TEMPORARY VIEW IF EXISTS Orders;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Simple Drop Function Statement', () => {
|
||||
const sql = `
|
||||
DROP FUNCTION Orders;
|
||||
DROP TEMPORARY FUNCTION IF EXISTS Orders;
|
||||
DROP TEMPORARY SYSTEM FUNCTION IF EXISTS Orders;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
});
|
83
test/parser/flinksql/syntax/insertStatement.test.ts
Normal file
83
test/parser/flinksql/syntax/insertStatement.test.ts
Normal file
@ -0,0 +1,83 @@
|
||||
import { FlinkSQL } from '../../../../src';
|
||||
|
||||
describe('FlinkSQL Create Table Syntax Tests', () => {
|
||||
const parser = new FlinkSQL();
|
||||
// insert statements
|
||||
test('Test one simple Insert Statement', () => {
|
||||
const sql = `
|
||||
INSERT INTO country_page_view
|
||||
SELECT user, cnt FROM page_view_source;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Insert Overwrite Statement', () => {
|
||||
const sql = `
|
||||
INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30', country='China')
|
||||
SELECT user, cnt FROM page_view_source;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test execute Statement', () => {
|
||||
const sql = `
|
||||
EXECUTE INSERT INTO country_page_view PARTITION (date='2019-8-30', country='China')
|
||||
SELECT user, cnt FROM page_view_source;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Partition Clause Statement', () => {
|
||||
const sql = `
|
||||
INSERT INTO country_page_view PARTITION (date='2019-8-30', country='China')
|
||||
SELECT user, cnt FROM page_view_source;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Column List Statement', () => {
|
||||
const sql = `
|
||||
INSERT INTO emps PARTITION (x='ab', y='bc') (x, y) SELECT * FROM emps;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test Insert Values Statement', () => {
|
||||
const sql = `
|
||||
INSERT INTO students
|
||||
VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test insert into multiple tables Statement for 1.14', () => {
|
||||
const sql = `
|
||||
BEGIN STATEMENT SET;
|
||||
|
||||
INSERT INTO pageviews
|
||||
SELECT page_id, count(1)
|
||||
FROM pageviews
|
||||
GROUP BY page_id;
|
||||
|
||||
INSERT INTO uniqueview
|
||||
SELECT page_id, count(distinct user_id)
|
||||
FROM pageviews
|
||||
GROUP BY page_id;
|
||||
|
||||
END;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
test('Test insert into multiple tables Statement for 1.15', () => {
|
||||
const sql = `
|
||||
EXECUTE STATEMENT SET
|
||||
BEGIN
|
||||
INSERT INTO students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
|
||||
INSERT INTO students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
|
||||
END;
|
||||
`;
|
||||
const result = parser.validate(sql);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user