本发明属于属于数据库管理领域,具体涉及一种基于抽象语法树的sql表字段分析方法、内存、装置。
背景技术:
1、在现有技术中,针对sql语句的表字段分析已经有了一些相关研究和实现,如对查询语句中最外层select子句的表字段进行分析,根据输出字段和源表字段的映射关系进行数据动态脱敏;对插入语句中的目标表结构和查询语句中最外层select子句的表字段进行分析,提取数据血缘等。
2、但是现有的方法有很多局限性,首先并不支持一些生产中常见的sql写法,比如全字段查询的情况,现有方法要么不允许在sql中使用通配符如“*”来代替全字段,要么将通配符当作普通字段处理,导致解析结果的不完整不精确。比如多表关联查询语句,为了识别表字段来源于哪一张表,现有方法需要规范sql语句的写法,在字段前必须显式地添加表别名,否则无法正确分析。其次sql语句的表字段的分析广泛应用于数据脱敏、sql优化、表字段提取、数据血缘、高频表字段识别等场景中,而现有方法仅针对特定类别的sql语句或者sql语句中最外层的查询字段分析,并没有提供一种通用的分析方法对sql语句中各层级、各子句的表字段进行处理并建立关联关系,以满足不同下游任务的需要,普适性较差,应用场景有限。
技术实现思路
1、针对现有技术的不足,本发明提出一种基于抽象语法树的sql表字段分析方法、内存、装置,其能够有效地解决已有方案中处理全字段查询和多表关联的局限性,普适性好。
2、为了实现上述目的,本发明一方面提供一种基于抽象语法树的sql表字段分析方法,包含:
3、步骤s1、将初始sql语句解析成抽象语法树;
4、步骤s2、对所述抽象语法树进行表字段分析,得到初始sql语句以及该初始sql语句的各级查询语句的解析结果作为初始解析结果;
5、步骤s3、对所述初始解析结果进行遍历,对通配符、和/或多表关联中缺少表别名的字段进行处理,并为各级查询语句的各子句的表字段解析结果补充来源字段,得到最终解析结果。
6、在一实施例中,于步骤s2,包含以下子步骤:
7、步骤s21、获取初始sql语句的父级查询语句,该父级查询语句为初始sql语句中的select语句部分;
8、步骤s22、将该父级查询语句转换为简单查询语句,所述简单查询语句包含select、from、where、join、group by、having、order by子句;
9、步骤s23、获取所述简单查询语句中每一子句的表字段解析结果。
10、在一实施例中,于步骤s2,还包含:
11、为各级查询语句创建查询记录表用于存储各级查询语句的解析结果,并生成查询序号。
12、在一实施例中,于步骤s2,如果该父级查询语句由with子句和第一查询语句构成,
13、则将该第一查询语句视为该简单查询语句,
14、提取with子句中的查询部分作为该父级查询语句的第一级的子级查询语句,将该第一级的子级查询语句作为一新的查询语句重新执行步骤s22~s23,得到所述第一级的子级查询语句的解析结果,并将所述第一级的子级查询语句的解析结果作为子节点链接到该父级查询语句的解析结果中。
15、在一实施例中,于步骤s2,如果该父级查询语句是集合查询语句,将该集合查询语句中的两个或多个sql查询语句作为第二查询语句重新执行步骤s22~s23,得到所述第二查询语句的解析结果,并将所述第二查询语句的解析结果作为子节点链接到该父级查询语句的解析结果中。
16、在一实施例中,于步骤s23中,对于select子句、where子句、order by子句、groupby子句、having子句,通过解析各子句中的查询项来获取各子句的表字段解析结果。
17、在一实施例中,如果该查询项是通配符,则将该通配符作为普通字段处理。
18、在一实施例中,如果该查询项是字段,则提取该查询项的字段名称、字段别名、表别名构建为列记录存储到该查询项对应的子句的表字段解析结果中;
19、如果该查询项不存在字段别名,则将字段名称作为字段别名;如果该查询项不存在表别名,且不存在join子句,则将from子句的别名作为表别名。
20、在一实施例中,如果查询项为复杂表达式,则提取该表达式中的字段信息作为该查询项对应的子句的表字段解析结果。
21、在一实施例中,如果查询项为子级查询语句,则将该查询项作为当前简单查询语句的子级查询语句处理。
22、在一实施例中,于步骤s23中,对于from子句、join子句,
23、如果各子句中的来源项是表名,利用该表名更新对应子句的表字段解析结果,包含:
24、若该子句对应的更新前的表字段解析结果的表别名与该子句的别名相同,则利用该来源项中的表名替换该表别名。
25、在一实施例中,对于from子句、join子句,如果各子句中的来源项是子级查询语句,则将该来源项作为当前简单查询语句的子级查询语句处理,并将该子级查询语句的查询语句别名设置为该子句的别名。
26、在一实施例中,于步骤s3,包含以下子步骤:
27、步骤s31、对初始解析结果进行后序遍历,在当前查询记录表中不存在子级查询语句的解析结果的情况下,
28、步骤s32、处理当前查询记录表中各子句的表字段解析结果中的通配符;
29、步骤s33、处理当前查询记录表中各子句的表字段解析结果中的缺失的表别名;
30、步骤s34、为各级查询语句中的各个子句的表字段解析结果补充来源字段。
31、在一实施例中,于步骤s32中,
32、在各子句的表字段解析结果中存在字段名称为通配符的情况,
33、判断当前查询记录表所对应的查询语句中的from子句是否是表名;
34、如果是表名,则通过查询数据库元数据,查询当前查询记录表的表结构信息,获取表中的所有字段,并为每个字段构建构建列记录并添加该子句的表字段解析结果中;将字段名称为通配符的列记录从该子句的表字段解析结果中删除;
35、如果不是表名,则from子句为子级查询语句,使用该查询记录表中select子句的所有表字段解析结果来替换该通配符,并将表字段解析结果中的表别名替换为from子句的别名,将字段名称替换为字段别名。
36、在一实施例中,如果当前查询记录表所对应的查询语句中存在join子句,将join子句的表字段解析结果和from子句的表字段解析结果合并后再替换通配符。
37、在一实施例中,于该步骤s33中,
38、如果表字段解析结果中存在表别名,则当前查询语句为多表关联语句,且该查询语句中的字段前没有显示地指定表别名,则补充缺失的表别名,包含:
39、判断from子句和join子句是否是表名,
40、如果是表名,则通过查询数据库元数据,获取表中的所有字段,作为该子句或者join子句的候选字段;
41、如果不是表名,则该子句为子级查询语句,使用该查询记录表中select子句的所有字段作为该子句的待选字段;
42、如果待选字段的字段别名与缺失表别名的字段名称一致,则说明缺失表别名的字段来源于所述候选字段所属的子句,用该子句的别名补充缺失的表别名。
43、在一实施例中,于步骤s34中,
44、若当前查询记录表中存在子级查询语句的解析结果,将该子级查询语句的解析结果中select子句的表字段解析结果作为待选字段;
45、依次遍历当前查询记录表中各个子句的表字段解析结果,如果表字段解析结果的列记录中的字段名称与待选字段的字段别名相同,表别名与待选字段所属子级查询语句的别名相同,则将所述待选字段添加到列记录的来源字段中。
46、在一实施例中,于步骤s3之后,还包含:
47、步骤s4、根据下游任务的需要,对所述最终解析结果进行处理,得到下游任务的预期输出。
48、在一实施例中,该下游任务包含数据脱敏任务,该步骤s4中,具体包含:
49、获取各级查询语句中的输出字段,包含:
50、遍历父级查询语句对应的查询记录表的select子句的表字段解析结果,将对应列记录中的字段别名确定为输出字段;
51、识别出各输出字段与源表字段的映射关系,包含:
52、如果该表字段解析结果中来源字段为空,则利用该来源字段对应的表别名与字段名直接确定对应输出字段与与源表字段的映射关系;
53、如果该表字段解析结果中来源字段不为空,则继续遍历该来源字段的解析结果,直至该解析结果的来源字段为空,则利用该解析结果中的字段名与表别名确定对应输出字段与与源表字段的映射关系。
54、本发明另一方面还提供了一种基于双向树的表字段分析结果的存储结构,该存储结构包含:
55、查询记录表,用于存储查询序号、查询语句别名、各级查询语句的解析结果、以及各级查询语句中各子句的表字段解析结果;
56、列记录,用于存储各子句的表字段解析结果,包含字段名称、字段别名、表别名、来源字段、是否是最终结果项;
57、各级查询语句的解析结果均以查询记录表的结构存储,组成一棵双向树。
58、本发明再一方面还提供了一种基于基于抽象语法树的sql表字段分析装置,该装置包含:
59、获取模块,用于获取要分析的初始sql语句;
60、解析模块,用于通过解析器将初始sql语句解析成抽象语法树;
61、表字段分析模块,用于对所述抽象语法树进行表字段分析,得到初始sql语句以及该初始sql语句的各级查询语句的解析结果作为初始解析结果,并存储在双向树结构中;
62、元数据模块,用于对所述初始解析结果进行遍历,对通配符、和/或多表关联中缺少表别名的字段进行处理,并为各级查询语句的各子句的表字段解析结果补充来源字段,得到最终解析结果。
63、在一实施例中,该装置还包含:下游任务模块,用于根据下游任务的需要,对最终分析结果进行处理,得到下游任务的预期输出。
64、由以上方案可知,本发明的优点在于:
65、本发明揭示的基于抽象语法树的sql表字段分析方法,通过解析sql生成抽象语法树,对sql语句中各层级、各子句的表字段进行分析和处理,将分析结果存储在双向树结构中,并且引入数据库元数据来处理全字段查询和多表关联中字段名前缺少表别名的情况。该方法能够有效地解决已有方案中处理全字段查询和多表关联的局限性,并且是一种通用的分析方法,建立了sql语句中各层级、各子句的表字段关联关系,能够满足表字段提取、数据脱敏、数据血缘分析、高频表字段识别等不同下游任务的需要。
1.一种基于抽象语法树的sql表字段分析方法,其特征在于,包含:
2.根据权利要求1所述的方法,其特征在于,所述步骤s2,包含以下子步骤:
3.根据权利要求2所述的方法,其特征在于,所述步骤s2还包含:
4.根据权利要求2或3所述的方法,其特征在于,
5.根据权利要求2或3所述的方法,其特征在于,
6.根据权利要求2或3所述的方法,其特征在于,于步骤s23中,
7.根据权利要求6所述的方法,其特征在于,
8.根据权利要求6所述的方法,其特征在于,
9.根据权利要求6所述的方法,其特征在于,
10.根据权利要求2或3所述的方法,其特征在于,于步骤s23中,
11.根据权利要求3所述的方法,其特征在于,所述步骤s3,包含以下子步骤:
12.根据权利要求11所述的方法,其特征在于,于步骤s32中,
13.根据权利要求12所述的方法,其特征在于,
14.根据权利要求11所述的方法,其特征在于,于该步骤s33中,
15.根据权利要求11所述的方法,其特征在于,于步骤s34中,
16.根据权利要求1所述的方法,其特征在于,于步骤s3之后,还包含:
17.根据权利要求16所述的方法,其特征在于,该下游任务包含数据脱敏任务,于该步骤s4中,具体包含:
18.一种内存,其特征在于,该内存中存储结构包含:
19.一种基于基于抽象语法树的sql表字段分析装置,其特征在于,该装置包含: