`SqlAdvisorValidator` 类 扩展了 `SqlValidatorImpl` 类,并重写了其中的一些方法。
下面是每个方法的作用和详细解释:
1. `SqlAdvisorValidator` 构造函数:接受 `SqlOperatorTable`、`SqlValidatorCatalogReader`、`RelDataTypeFactory` 和 `Config` 作为参数,用于初始化 `SqlValidatorImpl` 的实例。
它还创建了一个空的结构类型 `emptyStructType`,用于在某些情况下设置命名空间的类型。
2. `validateIdentifier(SqlIdentifier id, SqlValidatorScope scope)` 方法:重写了父类的方法。
它在注册标识符之后调用父类的 `validateIdentifier` 方法,并捕获可能的 `CalciteException` 异常,然后使用 `Util.swallow` 方法进行忽略。
3. `registerId(SqlIdentifier id, SqlValidatorScope scope)` 方法:在给定的范围中注册标识符。
它遍历标识符的每个组件,并将每个组件的位置和标识符信息存储在 `idPositions` 中。
4. `expand(SqlNode expr, SqlValidatorScope scope)` 方法:扩展给定的表达式并返回。
在这里,它不做任何操作,直接返回输入的表达式。
5. `expandSelectExpr(SqlNode expr, SelectScope scope, SqlSelect select)` 方法:扩展给定的选择表达式并返回。
在这里,它不做任何操作,直接返回输入的表达式。
6. `expandOrderExpr(SqlSelect select, SqlNode orderExpr)` 方法:扩展给定的排序表达式并返回。
在这里,它不做任何操作,直接返回输入的排序表达式。
7. `deriveType(SqlValidatorScope scope, SqlNode operand)` 方法:推导给定操作数的类型。
它调用父类的 `deriveType` 方法,但捕获可能的异常,并返回一个未知类型(`unknownType`),以避免抛出错误。
8. `validateFrom(SqlNode node, RelDataType targetRowType, SqlValidatorScope scope)` 方法:验证给定的 `FROM` 子句。
它调用父类的 `validateFrom` 方法,但捕获可能的异常,并使用 `Util.swallow` 方法进行忽略。
9. `validateWhereClause(SqlSelect select)` 方法:验证给定的 `WHERE` 子句。
它调用父类的 `validateWhereClause` 方法,但捕获可能的异常,并使用 `Util.swallow` 方法进行忽略。
10. `validateHavingClause(SqlSelect select)` 方法:验证给定的 `HAVING` 子句。
它调用父类的 `validateHavingClause` 方法,但捕获可能的异常,并使用 `Util.swallow` 方法进行忽略。
11. `validateOver(SqlCall call, SqlValidatorScope scope)` 方法:验证给定的窗口函数。
它获取窗口函数的作用域和关联的关系,并在必要时验证关系。它还调用父类的方法来验证窗口。
12. `validateNamespace(SqlValidatorNamespace namespace, RelDataType targetRowType)` 方法:验证给定的命名空间并设置其类型。
如果命名空间是首次激活,则调用父类的 `validateNamespace` 方法。否则,将命名空间的类型设置为预定义的空结构类型。
13. `validateModality(SqlSelect select, SqlModality modality, boolean fail)` 方法:验证给定的查询的模态性。在这里,它总是返回 `true`,表示验证通过。
14. `shouldAllowOverRelation()` 方法:确定是否应允许窗口函数的关联关系。在这里,它总是返回 `true`。
这些方法的使用场景是在 SQL 解析、验证和类型推导过程中。
`SqlAdvisorValidator` 类的目的是通过重写这些方法来定制和扩展默认的 SQL 验证器行为,以满足特定的需求,比如忽略某些错误、禁用某些功能或设置特定的类型。