refactor: migrate antlr4 v4.12.0 to antlr4ts(4.9.0) (#106)

* build: ignore gen folder

* refactor: remove useless code

* fix: correct the Javascript usage in grammar

* refactor: move to antlr4ts

* fix: remove useless

* fix: update grammars for javascript target

* refactor: migrate to antlr4ts

* refactor: migrate to antlr4ts

* refactor: implements ParserErrorListener

* fix: rename the  start reserved word

* refactor: remove unused import

* refactor: migrate to antlr4ts

* test: update the expects of test cases

* refactor: migrate hive to antlr4ts

* refactor: update the incompatible syntax for antlr4ts

* refactor: migrate pgsql grammar to antlr4ts, increasing tests

* refactor: migrate the plsql to antlr4ts

* build: remove unused config

* build: migrate to antlr4ts

* build: migrate ts-jest to @swc/jest

* refactor: migrate to anltr4ts

* build: migrate ts-jest to @swc/jest
This commit is contained in:
Ziv
2023-05-30 14:44:03 +08:00
committed by GitHub
parent 793ff6ef0e
commit 34f64e6bea
104 changed files with 436945 additions and 419757 deletions

View File

@ -6,6 +6,6 @@ describe('FlinkSQL Lexer tests', () => {
const sql = 'SELECT * FROM table1';
const tokens = parser.getAllTokens(sql);
test('token counts', () => {
expect(tokens.length - 1).toBe(7);
expect(tokens.length).toBe(7);
});
});

View File

@ -1,5 +1,5 @@
import FlinkSQL from '../../../src/parser/flinksql';
import FlinkSqlParserListener from '../../../src/lib/flinksql/FlinkSqlParserListener';
import { FlinkSqlParserListener } from '../../../src/lib/flinksql/FlinkSqlParserListener';
import { TableExpressionContext } from '../../../src/lib/flinksql/FlinkSqlParser';
describe('Flink SQL Listener Tests', () => {
@ -11,14 +11,10 @@ describe('Flink SQL Listener Tests', () => {
test('Listener enterTableName', async () => {
let result = '';
class MyListener extends FlinkSqlParserListener {
constructor() {
super()
}
class MyListener implements FlinkSqlParserListener {
enterTableExpression = (ctx: TableExpressionContext): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
}
}
const listenTableName = new MyListener();

View File

@ -23,7 +23,7 @@ describe('FlinkSQL Syntax Tests', () => {
expect(result.length).toBe(0);
});
test('Test simple Error Select Statement', () => {
const sql = `SELECTproduct, amount FROM;`;
const sql = `SELECT product, amount FROM;`;
const result = parser.validate(sql);
expect(result.length).toBe(1);
});

View File

@ -1,5 +1,6 @@
import FlinkSQL from '../../../src/parser/flinksql';
import FlinkSqlParserVisitor from '../../../src/lib/flinksql/FlinkSqlParserVisitor';
import { FlinkSqlParserVisitor } from '../../../src/lib/flinksql/FlinkSqlParserVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree';
describe('Flink SQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -12,9 +13,12 @@ describe('Flink SQL Visitor Tests', () => {
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends FlinkSqlParserVisitor<any>{
class MyVisitor extends AbstractParseTreeVisitor<any> implements FlinkSqlParserVisitor<any>{
protected defaultResult() {
return result;
}
visitTableExpression = (ctx): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
}
}
const visitor: any = new MyVisitor();

View File

@ -7,6 +7,6 @@ describe('GenericSQL Lexer tests', () => {
const tokens = mysqlParser.getAllTokens(sql);
test('token counts', () => {
expect(tokens.length - 1).toBe(12);
expect(tokens.length).toBe(12);
});
});

View File

@ -1,5 +1,5 @@
import GenericSQL from '../../../src/parser/generic';
import SqlParserListener from '../../../src/lib/generic/SqlParserListener';
import { SqlParserListener } from '../../../src/lib/generic/SqlParserListener';
describe('Generic SQL Listener Tests', () => {
const expectTableName = 'user1';
@ -10,9 +10,9 @@ describe('Generic SQL Listener Tests', () => {
test('Listener enterTableName', async () => {
let result = '';
class MyListener extends SqlParserListener {
class MyListener implements SqlParserListener {
enterTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
}
}
const listenTableName: any = new MyListener();

View File

@ -1,5 +1,6 @@
import GenericSQL from '../../../src/parser/generic';
import SqlParserVisitor from '../../../src/lib/generic/SqlParserVisitor';
import { SqlParserVisitor } from '../../../src/lib/generic/SqlParserVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree';
describe('Generic SQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -12,14 +13,13 @@ describe('Generic SQL Visitor Tests', () => {
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends SqlParserVisitor<any> {
constructor() {
super();
class MyVisitor extends AbstractParseTreeVisitor<any> implements SqlParserVisitor<any> {
protected defaultResult() {
return result;
}
visitTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
super.visitTableName?.(ctx);
result = ctx.text.toLowerCase();
}
}
const visitor = new MyVisitor();

View File

@ -5,12 +5,12 @@ describe('HiveSQL Lexer tests', () => {
test('select token counts', () => {
const sql = 'SELECT * FROM t1';
const tokens = parser.getAllTokens(sql);
expect(tokens.length - 1).toBe(4);
expect(tokens.length).toBe(7);
});
test('select token counts', () => {
const sql = 'show create table_name;';
const tokens = parser.getAllTokens(sql);
expect(tokens.length - 1).toBe(4);
expect(tokens.length).toBe(6);
});
});

View File

@ -1,4 +1,4 @@
import HiveSqlListener from '../../../src/lib/hive/HiveSqlListener';
import { HiveSqlListener } from '../../../src/lib/hive/HiveSqlListener';
import HiveSQL from '../../../src/parser/hive';
@ -10,28 +10,28 @@ describe('Hive SQL Listener Tests', () => {
const parserTree = parser.parse(sql);
let result = '';
class MyListener extends HiveSqlListener {
enterSelect_list = (ctx): void => {
result = ctx.getText();
class MyListener implements HiveSqlListener {
enterSelectItem(ctx) {
result = ctx.text;
}
}
const listenTableName: any = new MyListener();
await parser.listen(listenTableName, parserTree);
expect(result).toBe(expectTableName);
expect(result).toBe(expectTableName.toUpperCase());
});
test('Listener enterCreateTable', async () => {
const sql = `drop table table_name;`;
const parserTree = parser.parse(sql);
let result = '';
class MyListener extends HiveSqlListener {
enterDrop_stmt = (ctx): void => {
result = ctx.getText();
class MyListener implements HiveSqlListener {
enterDropTableStatement(ctx) {
result = ctx.text;
}
}
const listenTableName: any = new MyListener();
await parser.listen(listenTableName, parserTree);
expect(result).toBe('droptabletable_name');
expect(result).toBe('DROPTABLETABLE_NAME');
});
});

View File

@ -13,10 +13,8 @@ describe('Hive SQL Syntax Tests', () => {
expect(result.length).toBe(0);
});
test('Wrong Select Statement', () => {
const sql = 'SELECT add ABC from Where ;';
const sql = 'SELECT add ABC FROM WHERE;';
const result = parser.validate(sql);
expect(result.length).toBe(2);
expect(result[0].message).toBe(`no viable alternative at input 'SELECTaddABCfromWhere'`);
expect(result[1].message).toBe(`mismatched input 'Where' expecting <EOF>`);
});
});

View File

@ -1,7 +1,8 @@
import HiveSqlVisitor from '../../../src/lib/hive/HiveSqlVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor';
import { HiveSqlVisitor } from '../../../src/lib/hive/HiveSqlVisitor';
import HiveSQL from '../../../src/parser/hive';
describe('Generic SQL Visitor Tests', () => {
describe('Hive SQL Visitor Tests', () => {
const expectTableName = 'dm_gis.dlv_addr_tc_count';
const sql = `select citycode,tc,inc_day from ${expectTableName} where inc_day='20190501' limit 100;`;
const parser = new HiveSQL();
@ -12,10 +13,14 @@ describe('Generic SQL Visitor Tests', () => {
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends HiveSqlVisitor<any> {
visitTable_name = (ctx): void => {
result = ctx.getText().toLowerCase();
super.visitTable_name?.(ctx);
class MyVisitor extends AbstractParseTreeVisitor<any> implements HiveSqlVisitor<any> {
defaultResult() {
return result;
}
visitTableName(ctx) {
result = ctx.text.toLowerCase();
}
}

View File

@ -0,0 +1,244 @@
SELECT * FROM onek
WHERE onek.unique1 < 10
ORDER BY onek.unique1;
SELECT onek.unique1, onek.stringu1 FROM onek
WHERE onek.unique1 < 20
ORDER BY unique1 using >;
SELECT onek.unique1, onek.stringu1 FROM onek
WHERE onek.unique1 > 980
ORDER BY stringu1 using <;
SELECT onek.unique1, onek.string4 FROM onek
WHERE onek.unique1 > 980
ORDER BY string4 using <, unique1 using >;
SELECT onek.unique1, onek.string4 FROM onek
WHERE onek.unique1 > 980
ORDER BY string4 using >, unique1 using <;
--
-- awk '{if($1<20){print $1,$16;}else{next;}}' onek.data |
-- sort +0nr -1 +1d -2
--
SELECT onek.unique1, onek.string4 FROM onek
WHERE onek.unique1 < 20
ORDER BY unique1 using >, string4 using <;
--
-- awk '{if($1<20){print $1,$16;}else{next;}}' onek.data |
-- sort +0n -1 +1dr -2
--
SELECT onek.unique1, onek.string4 FROM onek
WHERE onek.unique1 < 20
ORDER BY unique1 using <, string4 using >;
--
-- test partial btree indexes
--
-- As of 7.2, planner probably won't pick an indexscan without stats,
-- so ANALYZE first. Also, we want to prevent it from picking a bitmapscan
-- followed by sort, because that could hide index ordering problems.
--
ANALYZE onek2;
SET enable_seqscan TO off;
SET enable_bitmapscan TO off;
SET enable_sort TO off;
--
-- awk '{if($1<10){print $0;}else{next;}}' onek.data | sort +0n -1
--
SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10;
--
-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1
--
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 < 20
ORDER BY unique1 using >;
--
-- awk '{if($1>980){print $1,$14;}else{next;}}' onek.data | sort +1d -2
--
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 > 980;
RESET enable_seqscan;
RESET enable_bitmapscan;
RESET enable_sort;
SELECT two, stringu1, ten, string4
INTO TABLE tmp
FROM onek;
--
-- awk '{print $1,$2;}' person.data |
-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data |
-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - student.data |
-- awk 'BEGIN{FS=" ";}{if(NF!=2){print $4,$5;}else{print;}}' - stud_emp.data
--
-- SELECT name, age FROM person*; ??? check if different
SELECT p.name, p.age FROM person* p;
--
-- awk '{print $1,$2;}' person.data |
-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data |
-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - student.data |
-- awk 'BEGIN{FS=" ";}{if(NF!=1){print $4,$5;}else{print;}}' - stud_emp.data |
-- sort +1nr -2
--
SELECT p.name, p.age FROM person* p ORDER BY age using >, name;
--
-- Test some cases involving whole-row Var referencing a subquery
--
select foo from (select 1 offset 0) as foo;
select foo from (select null offset 0) as foo;
select foo from (select 'xyzzy',1,null offset 0) as foo;
--
-- Test VALUES lists
--
select * from onek, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j)
WHERE onek.unique1 = v.i and onek.stringu1 = v.j;
-- a more complex case
-- looks like we're coding lisp :-)
select * from onek,
(values ((select i from
(values(10000), (2), (389), (1000), (2000), ((select 10029))) as foo(i)
order by i asc limit 1))) bar (i)
where onek.unique1 = bar.i;
-- try VALUES in a subquery
select * from onek
where (unique1,ten) in (values (1,1), (20,0), (99,9), (17,99))
order by unique1;
-- VALUES is also legal as a standalone query or a set-operation member
VALUES (1,2), (3,4+4), (7,77.7);
VALUES (1,2), (3,4+4), (7,77.7)
UNION ALL
SELECT 2+2, 57
UNION ALL
TABLE int8_tbl;
--
-- Test ORDER BY options
--
CREATE TEMP TABLE foo (f1 int);
INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1);
SELECT * FROM foo ORDER BY f1;
SELECT * FROM foo ORDER BY f1 ASC; -- same thing
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
SELECT * FROM foo ORDER BY f1 DESC;
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
-- check if indexscans do the right things
CREATE INDEX fooi ON foo (f1);
SET enable_sort = false;
SELECT * FROM foo ORDER BY f1;
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
SELECT * FROM foo ORDER BY f1 DESC;
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
DROP INDEX fooi;
CREATE INDEX fooi ON foo (f1 DESC);
SELECT * FROM foo ORDER BY f1;
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
SELECT * FROM foo ORDER BY f1 DESC;
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
DROP INDEX fooi;
CREATE INDEX fooi ON foo (f1 DESC NULLS LAST);
SELECT * FROM foo ORDER BY f1;
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
SELECT * FROM foo ORDER BY f1 DESC;
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
--
-- Test planning of some cases with partial indexes
--
-- partial index is usable
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- actually run the query with an analyze to use the partial index
explain (costs off, analyze on, timing off, summary off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- partial index predicate implies clause, so no need for retest
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 < 'B';
select * from onek2 where unique2 = 11 and stringu1 < 'B';
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
-- but if it's an update target, must retest anyway
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
-- partial index is not applicable
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
-- partial index implies clause, but bitmap scan must recheck predicate anyway
SET enable_indexscan TO off;
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
RESET enable_indexscan;
-- check multi-index cases too
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
--
-- Test some corner cases that have been known to confuse the planner
--
-- ORDER BY on a constant doesn't really need any sorting
SELECT 1 AS x ORDER BY x;
-- But ORDER BY on a set-valued expression does
create function sillysrf(int) returns setof int as
'values (1),(10),(2),($1)' language sql immutable;
select sillysrf(42);
select sillysrf(-1) order by 1;
drop function sillysrf(int);
-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
-- (see bug #5084)
select * from (values (2),(null),(1)) v(k) where k = k order by k;
select * from (values (2),(null),(1)) v(k) where k = k;
-- Test partitioned tables with no partitions, which should be handled the
-- same as the non-inheritance case when expanding its RTE.
create table list_parted_tbl (a int,b int) partition by list (a);
create table list_parted_tbl1 partition of list_parted_tbl
for values in (1) partition by list(b);
explain (costs off) select * from list_parted_tbl;
drop table list_parted_tbl;

View File

@ -7,6 +7,6 @@ describe('PostgresSQL Lexer tests', () => {
const tokens = mysqlParser.getAllTokens(sql);
test('token counts', () => {
expect(tokens.length - 1).toBe(12);
expect(tokens.length).toBe(12);
});
});

View File

@ -1,4 +1,5 @@
import PostgreSQLParserListener from '../../../src/lib/pgsql/PostgreSQLParserListener';
import { Target_listContext } from '../../../src/lib/pgsql/PostgreSQLParser';
import { PostgreSQLParserListener } from '../../../src/lib/pgsql/PostgreSQLParserListener';
import PostgresSQL from '../../../src/parser/pgsql';
describe('PostgresSQL Listener Tests', () => {
@ -10,10 +11,9 @@ describe('PostgresSQL Listener Tests', () => {
test('Listener enterTableName', async () => {
let result = '';
class MyListener extends PostgreSQLParserListener {
// eslint-disable-next-line camelcase
enterTable_ref = (ctx): void => {
result = ctx.getText().toLowerCase();
class MyListener implements PostgreSQLParserListener {
enterTable_ref(ctx) {
result = ctx.text.toLowerCase();
}
}
const listenTableName: any = new MyListener();

View File

@ -0,0 +1,18 @@
import PostgresSQL from "../../../src/parser/pgsql";
import { readSQL } from "../../helper";
const parser = new PostgresSQL();
const features = {
base: readSQL(__dirname, "select.sql"),
};
describe("Postgre SQL Query Statement Tests", () => {
describe("Base Select", () => {
features.base.forEach((sql) => {
it(sql, () => {
expect(parser.validate(sql).length).toBe(0);
});
});
});
});

View File

@ -1,10 +1,10 @@
import PostgresSQL from "../../../src/parser/pgsql";
describe('Generic SQL Syntax Tests', () => {
describe('PostgresSQL SQL Syntax Tests', () => {
const parser = new PostgresSQL();
test('Select Statement', () => {
const sql = 'select id,name from user1;';
const sql = 'select id, t_name from user1;';
const result = parser.validate(sql);
expect(result.length).toBe(0);
@ -15,4 +15,11 @@ describe('Generic SQL Syntax Tests', () => {
const result = parser.validate(sql);
expect(result.length).toBe(0);
});
test('Select 1+1', () => {
const sql = 'SELECT 1+1;';
const result = parser.validate(sql);
expect(result.length).toBe(0);
});
});

View File

@ -1,4 +1,5 @@
import PostgreSQLParserVisitor from "../../../src/lib/pgsql/PostgreSQLParserVisitor";
import { AbstractParseTreeVisitor } from "antlr4ts/tree/AbstractParseTreeVisitor";
import { PostgreSQLParserVisitor } from "../../../src/lib/pgsql/PostgreSQLParserVisitor";
import PostgresSQL from "../../../src/parser/pgsql";
describe('Generic SQL Visitor Tests', () => {
@ -12,11 +13,13 @@ describe('Generic SQL Visitor Tests', () => {
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends PostgreSQLParserVisitor<any> {
// eslint-disable-next-line camelcase
visitTable_ref = (ctx): void => {
result = ctx.getText().toLowerCase();
super.visitTable_ref?.(ctx);
class MyVisitor extends AbstractParseTreeVisitor<any> implements PostgreSQLParserVisitor<any> {
protected defaultResult() {
return result;
}
visitTable_ref(ctx) {
result = ctx.text.toLowerCase();
}
}
const visitor: any = new MyVisitor();

View File

@ -7,6 +7,6 @@ describe('PLSQL Lexer tests', () => {
const tokens = parser.getAllTokens(sql);
test('token counts', () => {
expect(tokens.length - 1).toBe(12);
expect(tokens.length).toBe(12);
});
});

View File

@ -1,4 +1,4 @@
import PlSqlParserListener from '../../../src/lib/plsql/PlSqlParserListener';
import { PlSqlParserListener } from '../../../src/lib/plsql/PlSqlParserListener';
import PLSQL from '../../../src/parser/plsql';
describe('PLSQL Listener Tests', () => {
@ -10,10 +10,10 @@ describe('PLSQL Listener Tests', () => {
test('Listener enterTableName', async () => {
let result = '';
class MyListener extends PlSqlParserListener {
class MyListener implements PlSqlParserListener {
// eslint-disable-next-line camelcase
enterTable_ref_list = (ctx): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
}
}
const listenTableName: any = new MyListener();

View File

@ -1,4 +1,5 @@
import PlSqlParserVisitor from '../../../src/lib/plsql/PlSqlParserVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor';
import { PlSqlParserVisitor } from '../../../src/lib/plsql/PlSqlParserVisitor';
import PLSQL from '../../../src/parser/plsql';
describe('PLSQL Visitor Tests', () => {
@ -10,11 +11,13 @@ describe('PLSQL Visitor Tests', () => {
test('Visitor visitTable_ref_list', () => {
let result = '';
class MyVisitor extends PlSqlParserVisitor<any> {
class MyVisitor extends AbstractParseTreeVisitor<any> implements PlSqlParserVisitor<any> {
protected defaultResult() {
return result;
}
// eslint-disable-next-line camelcase
visitTable_ref_list = (ctx): void => {
result = ctx.getText().toLowerCase();
super.visitTable_ref_list?.(ctx);
result = ctx.text.toLowerCase();
}
}
const visitor: any = new MyVisitor();

View File

@ -6,12 +6,12 @@ describe('SparkSQL Lexer tests', () => {
test('select id,name from user1;', () => {
const sql = `select id,name from user1;`;
const tokens = parser.getAllTokens(sql);
expect(tokens.length - 1).toBe(10);
expect(tokens.length).toBe(10);
});
test('SELECT * FROM t WHERE x = 1 AND y = 2;', () => {
const sql = `SELECT * FROM t WHERE x = 1 AND y = 2;`;
const tokens = parser.getAllTokens(sql);
expect(tokens.length - 1).toBe(24);
expect(tokens.length).toBe(24);
});
});

View File

@ -1,4 +1,4 @@
import SparkSqlListener from '../../../src/lib/spark/SparkSqlListener';
import { SparkSqlListener } from '../../../src/lib/spark/SparkSqlListener';
import SparkSQL from '../../../src/parser/spark';
describe('Spark SQL Listener Tests', () => {
@ -10,9 +10,9 @@ describe('Spark SQL Listener Tests', () => {
test('Listener enterTableName', () => {
let result = '';
class MyListener extends SparkSqlListener {
class MyListener implements SparkSqlListener {
enterTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
}
}
const listenTableName: any = new MyListener();

View File

@ -10,7 +10,7 @@ const validateTest = (sqls) => {
error(i, sql);
error(result);
}
expect(result.length).toBe(0);
expect(result.find(i => i.message)).toBeUndefined();
});
};

View File

@ -1,4 +1,5 @@
import SparkSqlVisitor from '../../../src/lib/spark/SparkSqlVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor';
import { SparkSqlVisitor } from '../../../src/lib/spark/SparkSqlVisitor';
import SparkSQL from '../../../src/parser/spark';
describe('Spark SQL Visitor Tests', () => {
@ -12,10 +13,12 @@ describe('Spark SQL Visitor Tests', () => {
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends SparkSqlVisitor<any> {
class MyVisitor extends AbstractParseTreeVisitor<any> implements SparkSqlVisitor<any> {
protected defaultResult() {
return result;
}
visitTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
super.visitTableName?.(ctx);
result = ctx.text.toLowerCase();
}
}
const visitor: any = new MyVisitor();

View File

@ -7,6 +7,6 @@ describe('trinoSQL Lexer tests', () => {
const tokens = parser.getAllTokens(sql);
test('token counts', () => {
expect(tokens.length - 1).toBe(7);
expect(tokens.length).toBe(7);
});
});

View File

@ -1,5 +1,5 @@
import trinoSQL from '../../../src/parser/trinosql';
import TrinoSqlParserListener from '../../../src/lib/trinosql/TrinoSqlListener';
import { TrinoSqlListener } from '../../../src/lib/trinosql/TrinoSqlListener';
describe('trino SQL Listener Tests', () => {
const expectTableName = 'user1';
@ -10,14 +10,10 @@ describe('trino SQL Listener Tests', () => {
test('Listener enterTableName', async () => {
let result = '';
class MyListener extends TrinoSqlParserListener {
constructor() {
super()
}
class MyListener implements TrinoSqlListener {
enterTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
};
}
const listenTableName = new MyListener();

View File

@ -1,5 +1,6 @@
import trinoSQL from '../../../src/parser/trinosql';
import TrinoSqlParserVisitor from '../../../src/lib/trinosql/TrinoSqlVisitor';
import { TrinoSqlVisitor } from '../../../src/lib/trinosql/TrinoSqlVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree';
describe('trino SQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -12,9 +13,12 @@ describe('trino SQL Visitor Tests', () => {
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends TrinoSqlParserVisitor<any>{
class MyVisitor extends AbstractParseTreeVisitor<any> implements TrinoSqlVisitor<any>{
protected defaultResult() {
return result;
}
visitTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
result = ctx.text.toLowerCase();
}
}
const visitor: any = new MyVisitor();