Skip to content

Commit fe9042d

Browse files
committed
test: add isAccessible test case
1 parent af51a95 commit fe9042d

File tree

6 files changed

+274
-4
lines changed

6 files changed

+274
-4
lines changed

test/parser/flink/contextCollect/entityCollector.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,4 +655,58 @@ describe('Flink entity collector tests', () => {
655655
expect(tableEntities.length).toBe(1);
656656
expect(tableEntities[0].text).toBe('t1');
657657
});
658+
659+
test('table entities are accessible when caret is in outer query', () => {
660+
const flink = new FlinkSQL();
661+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
662+
663+
// 光标在外层查询的FROM关键字位置
664+
const entities = flink.getAllEntities(sql, {
665+
lineNumber: 1,
666+
column: 13, // 光标在FROM位置
667+
});
668+
669+
// 验证可以访问外层查询中的所有表
670+
const accessibleTables = entities.filter(
671+
(e) => e.entityContextType === EntityContextType.TABLE && e.isAccessible
672+
);
673+
expect(accessibleTables.length).toBe(2); // 应该至少包含t1和t3
674+
675+
// 验证t1和t3是可访问的
676+
const t1 = accessibleTables.find((e) => e.text === 't1');
677+
const t3 = accessibleTables.find((e) => e._alias?.text === 't3');
678+
expect(t1).toBeDefined();
679+
expect(t1?.isAccessible).toBeTruthy();
680+
expect(t3).toBeDefined();
681+
expect(t3?.isAccessible).toBeTruthy();
682+
});
683+
684+
test('table entities are not accessible when caret is in inner query', () => {
685+
const flink = new FlinkSQL();
686+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
687+
688+
// 光标在内层查询的name位置
689+
const entities = flink.getAllEntities(sql, {
690+
lineNumber: 1,
691+
column: 29, // 光标在name位置
692+
});
693+
694+
// 验证实体访问规则
695+
const tables = entities.filter((e) => e.entityContextType === EntityContextType.TABLE);
696+
697+
// 找到t1、t2和t3
698+
const t1 = tables.find((e) => e.text === 't1');
699+
const t2 = tables.find((e) => e.text === 't2');
700+
const t3 = tables.find((e) => e._alias?.text === 't3');
701+
702+
// t1和t3应该不可访问,因为它们在外层查询
703+
expect(t1).toBeDefined();
704+
expect(t1?.isAccessible).toBeFalsy();
705+
expect(t3).toBeDefined();
706+
expect(t3?.isAccessible).toBeFalsy();
707+
708+
// t2应该可以访问,因为它在内层查询中
709+
expect(t2).toBeDefined();
710+
expect(t2?.isAccessible).toBeTruthy();
711+
});
658712
});

test/parser/impala/contextCollect/entityCollector.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,4 +969,58 @@ describe('ImpalaSQL entity collector tests', () => {
969969
expect(queryResults[0].columns?.[0].text).toBe('name');
970970
expect(queryResults[1].text).toBe('id');
971971
});
972+
973+
test('table entities are accessible when caret is in outer query', () => {
974+
const impalaSql = new ImpalaSQL();
975+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
976+
977+
// 光标在外层查询的FROM关键字位置
978+
const entities = impalaSql.getAllEntities(sql, {
979+
lineNumber: 1,
980+
column: 13, // 光标在FROM位置
981+
});
982+
983+
// 验证可以访问外层查询中的所有表
984+
const accessibleTables = entities.filter(
985+
(e) => e.entityContextType === EntityContextType.TABLE && e.isAccessible
986+
);
987+
expect(accessibleTables.length).toBe(2); // 应该至少包含t1和t3
988+
989+
// 验证t1和t3是可访问的
990+
const t1 = accessibleTables.find((e) => e.text === 't1');
991+
const t3 = accessibleTables.find((e) => e._alias?.text === 't3');
992+
expect(t1).toBeDefined();
993+
expect(t1?.isAccessible).toBeTruthy();
994+
expect(t3).toBeDefined();
995+
expect(t3?.isAccessible).toBeTruthy();
996+
});
997+
998+
test('table entities are not accessible when caret is in inner query', () => {
999+
const impalaSql = new ImpalaSQL();
1000+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
1001+
1002+
// 光标在内层查询的name位置
1003+
const entities = impalaSql.getAllEntities(sql, {
1004+
lineNumber: 1,
1005+
column: 29, // 光标在name位置
1006+
});
1007+
1008+
// 验证实体访问规则
1009+
const tables = entities.filter((e) => e.entityContextType === EntityContextType.TABLE);
1010+
1011+
// 找到t1、t2和t3
1012+
const t1 = tables.find((e) => e.text === 't1');
1013+
const t2 = tables.find((e) => e.text === 't2');
1014+
const t3 = tables.find((e) => e._alias?.text === 't3');
1015+
1016+
// t1和t3应该不可访问,因为它们在外层查询
1017+
expect(t1).toBeDefined();
1018+
expect(t1?.isAccessible).toBeFalsy();
1019+
expect(t3).toBeDefined();
1020+
expect(t3?.isAccessible).toBeFalsy();
1021+
1022+
// t2应该可以访问,因为它在内层查询中
1023+
expect(t2).toBeDefined();
1024+
expect(t2?.isAccessible).toBeTruthy();
1025+
});
9721026
});

test/parser/mysql/contextCollect/entityCollector.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,4 +835,58 @@ describe('MySQL entity collector tests', () => {
835835
expect(queryResults[0].columns?.[0].text).toBe('name');
836836
expect(queryResults[1].text).toBe('id');
837837
});
838+
839+
test('table entities are accessible when caret is in outer query', () => {
840+
const mysql = new MySQL();
841+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
842+
843+
// 光标在外层查询的FROM关键字位置
844+
const entities = mysql.getAllEntities(sql, {
845+
lineNumber: 1,
846+
column: 13, // 光标在FROM位置
847+
});
848+
849+
// 验证可以访问外层查询中的所有表
850+
const accessibleTables = entities.filter(
851+
(e) => e.entityContextType === EntityContextType.TABLE && e.isAccessible
852+
);
853+
expect(accessibleTables.length).toBe(2); // 应该至少包含t1和t3
854+
855+
// 验证t1和t3是可访问的
856+
const t1 = accessibleTables.find((e) => e.text === 't1');
857+
const t3 = accessibleTables.find((e) => e._alias?.text === 't3');
858+
expect(t1).toBeDefined();
859+
expect(t1?.isAccessible).toBeTruthy();
860+
expect(t3).toBeDefined();
861+
expect(t3?.isAccessible).toBeTruthy();
862+
});
863+
864+
test('table entities are not accessible when caret is in inner query', () => {
865+
const mysql = new MySQL();
866+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
867+
868+
// 光标在内层查询的name位置
869+
const entities = mysql.getAllEntities(sql, {
870+
lineNumber: 1,
871+
column: 29, // 光标在name位置
872+
});
873+
874+
// 验证实体访问规则
875+
const tables = entities.filter((e) => e.entityContextType === EntityContextType.TABLE);
876+
877+
// 找到t1、t2和t3
878+
const t1 = tables.find((e) => e.text === 't1');
879+
const t2 = tables.find((e) => e.text === 't2');
880+
const t3 = tables.find((e) => e._alias?.text === 't3');
881+
882+
// t1和t3应该不可访问,因为它们在外层查询
883+
expect(t1).toBeDefined();
884+
expect(t1?.isAccessible).toBeFalsy();
885+
expect(t3).toBeDefined();
886+
expect(t3?.isAccessible).toBeFalsy();
887+
888+
// t2应该可以访问,因为它在内层查询中
889+
expect(t2).toBeDefined();
890+
expect(t2?.isAccessible).toBeTruthy();
891+
});
838892
});

test/parser/postgresql/contextCollect/entityCollector.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,4 +776,58 @@ describe('PostgreSql entity collector tests', () => {
776776
expect(queryResults[0].columns?.[0].text).toBe('name');
777777
expect(queryResults[1].text).toBe('id');
778778
});
779+
780+
test('table entities are accessible when caret is in outer query', () => {
781+
const postgreSql = new PostgreSQL();
782+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
783+
784+
// 光标在外层查询的FROM关键字位置
785+
const entities = postgreSql.getAllEntities(sql, {
786+
lineNumber: 1,
787+
column: 13, // 光标在FROM位置
788+
});
789+
790+
// 验证可以访问外层查询中的所有表
791+
const accessibleTables = entities.filter(
792+
(e) => e.entityContextType === EntityContextType.TABLE && e.isAccessible
793+
);
794+
expect(accessibleTables.length).toBe(2); // 应该至少包含t1和t3
795+
796+
// 验证t1和t3是可访问的
797+
const t1 = accessibleTables.find((e) => e.text === 't1');
798+
const t3 = accessibleTables.find((e) => e._alias?.text === 't3');
799+
expect(t1).toBeDefined();
800+
expect(t1?.isAccessible).toBeTruthy();
801+
expect(t3).toBeDefined();
802+
expect(t3?.isAccessible).toBeTruthy();
803+
});
804+
805+
test('table entities are not accessible when caret is in inner query', () => {
806+
const postgreSql = new PostgreSQL();
807+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
808+
809+
// 光标在内层查询的name位置
810+
const entities = postgreSql.getAllEntities(sql, {
811+
lineNumber: 1,
812+
column: 29, // 光标在name位置
813+
});
814+
815+
// 验证实体访问规则
816+
const tables = entities.filter((e) => e.entityContextType === EntityContextType.TABLE);
817+
818+
// 找到t1、t2和t3
819+
const t1 = tables.find((e) => e.text === 't1');
820+
const t2 = tables.find((e) => e.text === 't2');
821+
const t3 = tables.find((e) => e._alias?.text === 't3');
822+
823+
// t1和t3应该不可访问,因为它们在外层查询
824+
expect(t1).toBeDefined();
825+
expect(t1?.isAccessible).toBeFalsy();
826+
expect(t3).toBeDefined();
827+
expect(t3?.isAccessible).toBeFalsy();
828+
829+
// t2应该可以访问,因为它在内层查询中
830+
expect(t2).toBeDefined();
831+
expect(t2?.isAccessible).toBeTruthy();
832+
});
779833
});

test/parser/spark/contextCollect/entityCollector.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,11 +470,11 @@ describe('SparkSQL entity collector tests', () => {
470470
});
471471

472472
test('table entities are accessible when caret is in outer query', () => {
473-
const hiveSql = new SparkSQL();
473+
const spark = new SparkSQL();
474474
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
475475

476476
// 光标在外层查询的FROM关键字位置
477-
const entities = hiveSql.getAllEntities(sql, {
477+
const entities = spark.getAllEntities(sql, {
478478
lineNumber: 1,
479479
column: 13, // 光标在FROM位置
480480
});
@@ -495,11 +495,11 @@ describe('SparkSQL entity collector tests', () => {
495495
});
496496

497497
test('table entities are not accessible when caret is in inner query', () => {
498-
const hiveSql = new SparkSQL();
498+
const spark = new SparkSQL();
499499
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
500500

501501
// 光标在内层查询的name位置
502-
const entities = hiveSql.getAllEntities(sql, {
502+
const entities = spark.getAllEntities(sql, {
503503
lineNumber: 1,
504504
column: 29, // 光标在name位置
505505
});

test/parser/trino/contextCollect/entityCollector.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,4 +513,58 @@ describe('Trino entity collector tests', () => {
513513
expect(queryResults[0].columns?.[0].text).toBe('name');
514514
expect(queryResults[1].text).toBe('id');
515515
});
516+
517+
test('table entities are accessible when caret is in outer query', () => {
518+
const trino = new TrinoSQL();
519+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
520+
521+
// 光标在外层查询的FROM关键字位置
522+
const entities = trino.getAllEntities(sql, {
523+
lineNumber: 1,
524+
column: 13, // 光标在FROM位置
525+
});
526+
527+
// 验证可以访问外层查询中的所有表
528+
const accessibleTables = entities.filter(
529+
(e) => e.entityContextType === EntityContextType.TABLE && e.isAccessible
530+
);
531+
expect(accessibleTables.length).toBe(2); // 应该至少包含t1和t3
532+
533+
// 验证t1和t3是可访问的
534+
const t1 = accessibleTables.find((e) => e.text === 't1');
535+
const t3 = accessibleTables.find((e) => e._alias?.text === 't3');
536+
expect(t1).toBeDefined();
537+
expect(t1?.isAccessible).toBeTruthy();
538+
expect(t3).toBeDefined();
539+
expect(t3?.isAccessible).toBeTruthy();
540+
});
541+
542+
test('table entities are not accessible when caret is in inner query', () => {
543+
const trino = new TrinoSQL();
544+
const sql = `SELECT id FROM t1, (SELECT name from t2) as t3`;
545+
546+
// 光标在内层查询的name位置
547+
const entities = trino.getAllEntities(sql, {
548+
lineNumber: 1,
549+
column: 29, // 光标在name位置
550+
});
551+
552+
// 验证实体访问规则
553+
const tables = entities.filter((e) => e.entityContextType === EntityContextType.TABLE);
554+
555+
// 找到t1、t2和t3
556+
const t1 = tables.find((e) => e.text === 't1');
557+
const t2 = tables.find((e) => e.text === 't2');
558+
const t3 = tables.find((e) => e._alias?.text === 't3');
559+
560+
// t1和t3应该不可访问,因为它们在外层查询
561+
expect(t1).toBeDefined();
562+
expect(t1?.isAccessible).toBeFalsy();
563+
expect(t3).toBeDefined();
564+
expect(t3?.isAccessible).toBeFalsy();
565+
566+
// t2应该可以访问,因为它在内层查询中
567+
expect(t2).toBeDefined();
568+
expect(t2?.isAccessible).toBeTruthy();
569+
});
516570
});

0 commit comments

Comments
 (0)