用于分布式系统的执行过程化SQL语句的方法和设备与流程

文档序号:12177024阅读:248来源:国知局
本申请涉及计算机领域,尤其涉及一种用于分布式系统的执行过程化SQL语句的技术。
背景技术
::传统关系型数据库为数据库使用者提供了SQL(StructuredQueryLanguage,结构化查询语言)语言作为数据库操作的接口,几乎所有的数据库应用都是建立在SQL语言接口之上,而SQL语言的支持程度则是一个数据库系统是否健壮的最重要指标。随着企业业务的快速发展,大数据的处理需求成为了所有行业不可避免的问题。而现有的大数据平台对SQL语言的支持十分有限,同时也缺少很多对SQL语言的优化,更没有对过程化SQL语言的支持。这一局限极大的增加了传统应用向大数据平台的迁移成本,成为了传统应用迁移至大数据平台的最大难题。因此,增强在大数据平台上的SQL语言完整度,降低企业的迁移成本,是一个很有意义和挑战的课题。技术实现要素:本申请的目的是提供一种用于分布式系统的执行过程化SQL语句的方法和设备,以解决现有大数据平台对SQL语言支持完整度的问题。根据本申请的一个方面提供的一种用于分布式系统的执行过程化SQL语句的方法,其中,A对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示;B对所述中间表示进行语义分析,以转化为若干执行块,并逐块执行所述执行块。进一步地,所述步骤B还包括:记录若干所述执行块之间的依赖关系;基于所述依赖关系,从起始的执行块起,依次执行所述执行块。进一步地,所述过程化SQL语句包括若干非标准SQL语句。进一步地,所述过程化SQL语句包括若干非标准SQL语句和若干标准SQL语句。进一步地,所述步骤B包括:B1对所述过程化SQL语句进行语义分析,将所述非标准SQL语句的中间表示转化为待解释执行的执行块,将所述标准SQL语句的中间表示转化为标准SQL语句执行块;B2解释执行所述待解释执行的执行块;B3将所述标准SQL语句执行块发送给分布式系统的计算引擎进行执行。进一步地,所述步骤B1包括:根据所述过程化SQL语句的中间表示,分析并记录所述中间表示的属性,所述属性包括参量、变量和类型;所述步骤B2包括:创建基于栈式的函数执行框架;在所述函数执行框架的栈中分配所述中间表示的属性;利用所述函数执行框架,逐块执行所述执行块。进一步地,所述步骤B3还包括:分析所述标准SQL语句的中间表示是否用到其他中间表示的变量,若用到,则记录所述变量的名称和在标准SQL语句中的位置,并在执行到所述标准SQL语句执行块时,先获取所述变量的值,将所述变量的值替换为常量后存入标准SQL语句执行块。进一步地,所述B还包括:将所述分布式系统的计算引擎所执行的结果存储于所述分布式系统的存储装置,以供后续执行块读取使用。进一步地,所述待解释执行的执行块包括以下至少任一项:起止执行块、赋值语句执行块、控制语句执行块、读取执行块、调用执行块。根据本申请另一方面提供的一种用于分布式系统的执行过程化SQL 语句的设备,其中,所述设备包括:第一装置,用于对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示;第二装置,用于对所述中间表示进行语义分析,以转化为若干执行块,并逐块执行所述执行块。进一步地,所述第二装置还用于:记录若干所述执行块之间的依赖关系;基于所述依赖关系,从起始的执行块起,依次执行所述执行块。进一步地,所述过程化SQL语句包括若干非标准SQL语句。进一步地,所述过程化SQL语句包括若干非标准SQL语句和若干标准SQL语句。进一步地,所述第二装置包括:第二一单元,用于对所述过程化SQL语句进行语义分析,将所述非标准SQL语句转化为待解释执行的执行块,将所述标准SQL语句转化为标准SQL语句执行块;第二二单元,用于解释执行所述待解释执行的执行块;第二三单元,用于将所述标准SQL语句执行块发送给分布式系统的计算引擎进行执行。进一步地,所述第二一单元用于:根据所述过程化SQL语句的中间表示,分析并记录所述中间表示的属性,所述属性包括参量、变量和类型;所述第二二单元用于:创建基于栈式的函数执行框架;在所述函数执行框架的栈中分配所述中间表示的属性;利用所述函数执行框架,逐块执行所述执行块。进一步地,所述第二三单元还用于:分析所述标准SQL语句的中间表示是否用到其他中间表示的变量,若用到,则记录所述变量的名称和在标准SQL语句中的位置,并在执行到所述标准SQL语句执行块时,先获取所述变量的值,将所述变量的值 替换为常量后存入标准SQL语句执行块。进一步地,所述第二装置还包括:第二五单元,用于将所述分布式系统的计算引擎所执行的结果存储于所述分布式系统的存储装置,以供后续执行块读取使用。进一步地,所述待解释执行的执行块包括以下至少任一项:起止执行块、赋值语句执行块、控制语句执行块、读取执行块、调用执行块。与现有技术相比,本申请通过提供了用于分布式系统的执行过程化SQL语句的方法和设备,对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示;对所述中间表示进行语义分析,以转化为若干执行块;逐块执行所述执行块。本申请所述方法和设备增强了大数据平台上的SQL语言表达能力,使得用户可以在数据库层完成复杂的业务逻辑。通过与现有过程化SQL语言的语法兼容,使得现有应用迁移到大数据平台的成本大幅降低。附图说明通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:图1示出根据本申请一个方面的一种用于分布式系统的执行过程化SQL语句的方法流程图;图2示出根据本申请一具体实施例中的一种用于分布式系统的执行过程化SQL语句的中间表示的语法树示意图;图3示出根据本申请一具体实施例中的一种用于分布式系统的执行过程化SQL语句的执行块示意图;图4示出根据本申请一个方面的用于分布式系统的执行过程化SQL语句的设备示意图;附图中相同或相似的附图标记代表相同或相似的部件。具体实施方式下面结合附图对本申请作进一步详细描述。图1示出根据本申请一个方面的一种用于分布式系统的执行过程化SQL语句的方法流程图,结合图1,所述方法包括:步骤S11和步骤S12。其中,在所述步骤S11中,对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示;在所述步骤S12中,对所述中间表示进行语义分析,以转化为若干执行块,并逐块执行所述执行块。在此,所述过程化SQL语句来源可以包括用户设备的输入或通过JDBC(JavaDataBaseConnectivity,JAVA数据库连接)/ODBC(OpenDatabaseConnectivity,ODBC)标准接口来中间设备发送的请求等。所述过程化SQL语句可以包括若干非标准SQL语句,此外,所述过程化SQL语句还可以包括若干非标准SQL语句和若干标准SQL语句。其中,非标准SQL语句可以例如但不限于:起止语句(BEGIN/END)、控制语句(IF/ELSE)、赋值语句、循环语句、游标(CURSOR)、异常捕获等;所述标准SQL语句可以是DML(DataManipulationLanguage,数据操纵语言命令)。首先,在所述步骤S11中,对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示。在所述步骤S11中,通过在标准SQL的词法分析器和语法分析器的基础上进行了扩展,在词法分析器和语法分析器中增加对过程化SQL语句的词法和语法的定义,使其能够在对过程化SQL语句进行词法分析和语法分析时,识别过程化SQL语句的特有关键词和语法结构,包括:函数和过程的定义;函数参数的定义;函数变量的定义,标量、集合和记录数据类型,赋值语句,条件分支语句,LOOP循环语句,FOR循环语句,FORALL循环语句,WHILE循环语句,CONTINUE语句,EXIT语句,返回语句,DML语句。例如,遇到关键词(Keyword)为select,非标准SQL语句,遇到关键词包括:Beginprocedurestatement……End,则识别为一个起止执行的中间语句(blockstatement)。在具体的实施例中,以下代码示例一中描述的过程化SQL语句包括:上述过程化SQL语句包括,开始:“BEGIN”、结束:“END”、如果:“IF”和否则:“ELS”的非标准SQL语句,以及从表格1中选择:“select*fromtable1”,从表格2中选择:“select*fromtable2”这两个标准SQL语句,代码示例一的过程化SQL语句表示:用于根据变量var值是否大于0来决定是从table1还是table2来做查询。接上例,词法分析器需要扩展为能够识别关键字BEGIN、END、IF、THEN、ELSE。语法分析器需要扩展为能够识别BEGIN、END、IF、THEN、ELSE等语句的语法结构。扩展之后的词法分析器和语法分析器能够将上例中的过程化SQL语句识别,形成图2所示的中间表示的语法树。接着,在所述步骤S12中,对所述中间表示进行语义分析,以转化为若干执行块,并逐块执行所述执行块。进一步地,在所述步骤S12中,还包括:记录若干所述执行块之间的依赖关系;基于所述依赖关系,从起始的执行块起,依次执行所述执行块。当所述过程化SQL只包括非标准SQL语句时,将过程化SQL语句全部转化为待解释执行的执行块,所述待解释执行的执行块可以包括以下至少任一项:赋值语句执行块、控制语句执行块(例如IF/ELSE、GOTO、LOOP、FOR、FORALL、WHILE/CONTINUE/EXIT)、读取执行块及调用执行块。当所述过程化SQL语句包括非标准SQL语句和标准SQL语句时,对所述过程化SQL语句进行语义分析,将所述非标准SQL语句转化为待解释执行的执行块,将所述标准SQL语句转化为标准SQL语句执行块。图3示出根据本申请一具体实施例中的一种用于分布式系统的执行过 程化SQL语句的执行块示意图;接上例,将图2所示的中间表示转化为图3所示的执行块,其中,包括根执行块、条件判断执行块、表达式执行块、标准SQL语句执行块、变量访问执行块和常量访问执行块,并且所述执行块之间的连线关系即为其依赖关系,在执行时,从起始执行块(Begin)起,依此执行所述执行块。在执行过程中,所述步骤S12包括:步骤S121、步骤S122和步骤S123。所述步骤S121:对所述过程化SQL语句进行语义分析,将所述非标准SQL语句的中间表示转化为待解释执行的执行块,将所述标准SQL语句的中间表示转化为标准SQL语句执行块;所述步骤S122:解释执行所述待解释执行的执行块;所述步骤S123:将所述标准SQL语句执行块发送给分布式系统的计算引擎进行执行。进一步地,在所述步骤S121还包括:根据所述过程化SQL语句的中间表示,分析并记录所述中间表示的属性,所述属性包括参量、变量和类型;则在所述步骤S122根据所述中间表示的属性,利用基于栈式的函数执行框架执行所述执行块,包括:创建基于栈式的函数执行框架;在所述函数执行框架的栈中分配所述中间表示的属性;利用所述函数执行框架,逐块执行所述执行块。进一步地,所述步骤S123还包括:分析所述标准SQL语句的中间表示是否用到其他中间表示的变量,若用到,则记录所述变量的名称和在标准SQL语句中的位置,并在执行到所述标准SQL语句执行块时,先获取所述变量的值,将所述变量的值替换为常量后存入标准SQL语句执行块。随后将变量的值替换为常量的标准SQL语句执行块发送分布式系统的计算引擎进行执行。具体地,代码示例二如下:DeclareVarint:=100BeginSelect*fromTwherecol<varEnd所述代码示例二描述了一个整型(int)的变量var,首先定义变量Var为100,开始执行从表格T中选择小于var的数据。在步骤S123中,首先通过语义分析,分析到标准SQL语句“Select*fromTwherecol<var”用到其他中间表示的变量var,记录变量的名称为var和在标准SQL语句中的位置为小于号后;在执行到所述标准SQL语句执行块时,先获取所述变量var的值为100(执行至此的变量通常都已通过之前执行过程获得值的结果),将所述变量的值替换为常量100后存入标准SQL语句执行块(Select*fromTwherecol<var的执行块),随后将变量的值替换为常量的标准SQL语句执行块发送分布式系统的计算引擎进行执行。通过交由分布式系统的计算引擎进行执行,能够提高数据处理效率,进而实现数据的实时处理,使得用户可以在数据库层完成复杂的业务逻辑,并且通过与现有过程化SQL语言的语法兼容,使得现有应用迁移到大数据平台的成本大幅降低。进一步地,所述步骤S12还包括:步骤S124,在所述步骤S124中,将所述分布式系统的计算引擎所执行的结果存储于所述分布式系统的存储装置,以供后续执行块读取使用。例如,游标(CURSOR)语句可以用于过程化SQL语句和标准SQL语句之间的数据调用,可以读取存储于所述分布式系统的存储装置的数据。具体地,如以下示例代码三所示:DeclarecursorCisSelectnamefromT//从T表中选name字段的一列数据Var_namestring//定义本地变量BeginOpenC//打开游标语句FetchCintovar_name//第一种情况,从游标C中获取一条数据到本地的变量Var_name……Putline(var_name)//打印本地的Var_name示例代码三表示,定义游标C表示从T表中选name字段的一列数据,定义本地变量var_name,开始执行打开游标C,从游标C中获取一条数据到本地变量var_name中,此后本地变量var_name的数据。最后可以通过游标内部的状态确定是否已取完。此外,如以下示例代码四所示:DeclarecursorCisSelectnamefromT//从T表中选name字段的一列数据Var_namestring//定义本地变量BeginOpenC//打开游标语句FetchCbuckcollectinto本地数组//从游标C中获取所有数据到本地数组Limit100//最大取100条示例代码四表示,定义游标C表示从T表中选name字段的一列数据,定义本地变量var_name,开始执行打开游标C,从游标C中获取所有数据到本地数组,可以限制最大取100条。最后可以通过游标内部的状态确定是否已取完。在步骤S124中,通过游标(CURSOR)语句可以将存储于分布式系统的存储装置中的数据读取,并未后续执行块在执行中使用。当然,本领域技术人员应当能够理解,所述步骤S124通过游标读取分布式系统的存储装置中的数据的方式仅为举例,其他能够读取方式适用于本申请的,也包含在本申请的思想范围之内。图4示出根据本申请一个方面的用于分布式系统的执行过程化SQL语句的设备示意图,结合图4,所述设备1包括:第一装置11和第二装置S12。其中,在所述第一装置11中,对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示;在所述第二装置12中,对所述中间表示进行语义分析,以转化为若干执行块并逐块执行所述执行块。在此,所述过程化SQL语句来源可以包括用户设备的输入或通过JDBC(JavaDataBaseConnectivity,JAVA数据库连接)/ODBC(OpenDatabaseConnectivity,ODBC)标准接口来中间设备发送的请求等。所述过程化SQL语句可以包括若干非标准SQL语句,此外,所述过程化SQL语句还可以包括若干非标准SQL语句和若干标准SQL语句。其中,非标准SQL语句可以例如但不限于:起止语句(BEGIN/END)、控制语句(IF/ELSE)、赋值语句、循环语句、游标、异常捕获等;所述标准SQL语句可以是DML(DataManipulationLanguage,数据操纵语言命令)。首先,在所述第一装置11中,对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示。在所述第一装置11中,通过在标准SQL的词法分析器和语法分析器的基础上进行了扩展,在词法分析器和语法分析器中增加对过程化SQL语句的词法和语法的定义,使其能够在对过程化SQL语句进行词法分析和语法分析时,识别过程化SQL语句的特有关键词和语法结构,包括:函数和过程的定义;函数参数的定义;函数变量的定义,标量、集合和记录数据类型,赋值语句,条件分支语句,LOOP循环语句,FOR循环语句,FORALL循环语句,WHILE循环语句,CONTINUE语句,EXIT语句,返回语句,DML语句。例如,遇到关键词(Keyword)为select,非标准SQL语句,遇到关键词包括:Beginprocedurestatement……End,则识别为一个起止执行的中间语句(blockstatement)。在具体的实施例中,例如一段过程化SQL语句如下:上述过程化SQL语句包括,开始:“BEGIN”、结束:“END”、如果:“IF”和否则:“ELS”的非标准SQL语句,以及从表格1中选择:“select*fromtable1”,从表格2中选择:“select*fromtable2”这两个标准SQL语句,代码示例一的过程化SQL语句表示:用于根据变量var值是否大于0来决定是从table1还是table2来做查询。接上例,词法分析器需要扩展为能够识别关键字BEGIN、END、IF、THEN、ELSE。语法分析器需要扩展为能够识别BEGIN、END、IF、THEN、ELSE等语句的语法结构。扩展之后的词法分析器和语法分析器能够将上例中的过程化SQL语句识别,形成图2所示的中间表示的语法树。接着,在所述第二装置12中,对所述中间表示进行语义分析,以转化为若干执行块,并逐块执行所述执行块。进一步地,在第二装置12中,还包括:记录若干所述执行块之间的依赖关系;基于所述依赖关系,从起始的执行块起,依次执行所述执行块。当所述过程化SQL只包括非标准SQL语句时,将过程化SQL语句全部转化为待解释执行的执行块,所述待解释执行的执行块可以包括以下至少任一项:赋值语句执行块、控制语句执行块(例如IF/ELSE、GOTO、LOOP、FOR、FORALL、WHILE/CONTINUE/EXIT)、读取执行块及调用执行块。当所述过程化SQL语句包括非标准SQL语句和标准SQL语句时,对所述过程化SQL语句进行语义分析,将所述非标准SQL语句转化为待解释执行的执行块,将所述标准SQL语句转化为标准SQL语句执行块。图3示出根据本申请一具体实施例中的一种用于分布式系统的执行过程化SQL语句的执行块示意图;接上例,将图2所示的中间表示转化为图3所示的执行块,其中,包括根执行块、条件判断执行块、表达式执行块、标准SQL语句执行块、变量访问执行块和常量访问执行块。所述第二装置12包括:第二一单元121、第二二单元122和第二三单元123。所述第二一单元121用于:对所述过程化SQL语句进行语义分析,将所述非标准SQL语句的中间表示转化为待解释执行的执行块,将所述 标准SQL语句的中间表示转化为标准SQL语句执行块;所述第二二单元122用于:解释执行所述待解释执行的执行块;所述第二三单元123用于:将所述标准SQL语句执行块发送给分布式系统的计算引擎进行执行。进一步地,在所述第二一单元121还包括:根据所述过程化SQL语句的中间表示,分析并记录所述中间表示的属性,所述属性包括参量、变量和类型;则在所述第二二单元122根据所述中间表示的属性,利用基于栈式的函数执行框架执行所述执行块,包括:创建基于栈式的函数执行框架;在所述函数执行框架的栈中分配所述中间表示的属性;利用所述函数执行框架,逐块执行所述执行块。进一步地,所述第二三单元123还包括:分析所述标准SQL语句的中间表示是否用到其他中间表示的变量,若用到,则记录所述变量的名称和在标准SQL语句中的位置,并在执行到所述标准SQL语句执行块时,先获取所述变量的值,将所述变量的值替换为常量后存入标准SQL语句执行块。随后将变量的值替换为常量的标准SQL语句执行块发送分布式系统的计算引擎进行执行。具体地,代码示例二如下:DeclareVarint:=100BeginSelect*fromTwherecol<varEnd所述代码示例二描述了一个整型(int)的变量var,首先定义变量Var为100,开始执行从表格T中选择小于var的数据。在第二三单元123中,首先通过语义分析,分析到标准SQL语句“Select*fromTwherecol<var”用到其他中间表示的变量var,记录变量的名称为var和在标准SQL语句中的位置为小于号后;在执行到所述标准SQL语句执行块时,先获取所述变量var的值为100(执行至此的变量通常都已通过之前执行过程获得值的结果),将所述变量的值替换为常量100后存入标准SQL语句执行 块(Select*fromTwherecol<var的执行块),随后将变量的值替换为常量的标准SQL语句执行块发送分布式系统的计算引擎进行执行。通过交由分布式系统的计算引擎进行执行,能够提高数据处理效率,进而实现数据的实时处理,使得用户可以在数据库层完成复杂的业务逻辑,并且通过与现有过程化SQL语言的语法兼容,使得现有应用迁移到大数据平台的成本大幅降低。进一步地,所述第二装置12还包括:第二四单元124,所述第二四单元124用于,将所述分布式系统的计算引擎所执行的结果存储于所述分布式系统的存储装置,以供后续执行块读取使用。例如,游标(CURSOR)语句可以用于过程化SQL语句和标准SQL语句之间的数据调用,可以读取存储于所述分布式系统的存储装置的数据。具体地,如以下示例代码三所示:DeclarecursorCisSelectnamefromT//从T表中选name字段的一列数据Var_namestring//定义本地变量BeginOpenC//打开游标语句FetchCintovar_name//第一种情况,从游标C中获取一条数据到本地的变量Var_name……Putline(var_name)//打印本地的Var_name示例代码三表示,定义游标C表示从T表中选name字段的一列数据,定义本地变量var_name,开始执行打开游标C,从游标C中获取一条数据到本地变量var_name中,此后本地变量var_name的数据。最后可以通过游标内部的状态确定是否已取完。此外,如以下示例代码四所示:DeclarecursorCisSelectnamefromT//从T表中选name字段的一列数据Var_namestring//定义本地变量BeginOpenC//打开游标语句FetchCbuckcollectinto本地数组//从游标C中获取所有数据到本地数组Limit100//最大取100条示例代码四表示,定义游标C表示从T表中选name字段的一列数据,定义本地变量var_name,开始执行打开游标C,从游标C中获取所有数据到本地数组,可以限制最大取100条。最后可以通过游标内部的状态确定是否已取完。第二四单元124通过游标(CURSOR)语句可以将存储于分布式系统的存储装置中的数据读取,并为后续执行块在执行中使用。当然,本领域技术人员应当能够理解,所述第二四单元124通过游标读取分布式系统的存储装置中的数据的方式仅为举例,其他能够读取方式适用于本申请的,也包含在本申请的思想范围之内。与现有技术相比,本申请通过提供了用于分布式系统的执行过程化SQL语句的方法和设备,对过程化SQL语句进行词法分析和语法分析,以建立所述过程化SQL语句的中间表示;对所述中间表示进行语义分析,以转化为若干执行块;逐块执行所述执行块。本申请所述方法和设备增强了大数据平台上的SQL语言表达能力,使得用户可以在数据库层完成复杂的业务逻辑。通过与现有过程化SQL语言的语法兼容,使得现有应用迁移到大数据平台的成本大幅降低。需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序 指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1