这部分的规则是这样组成的:
type : ROW '(' rowField (',' rowField)* ')' <- 命中这条 #rowType ... rowField : type | identifier type; <- 命中这条 identifier : IDENTIFIER #unquotedIdentifier | QUOTED_IDENTIFIER #quotedIdentifier | nonReserved #unquotedIdentifier <- END不在这里 | BACKQUOTED_IDENTIFIER #backQuotedIdentifier | DIGIT_IDENTIFIER #digitIdentifier ; nonReserved // IMPORTANT: this rule must only contain tokens. Nested rules are not supported. See SqlParser.exitNonReserved : ADD | ADMIN | ALL | ANALYZE | ANY | ARRAY | ASC | AT | AUTHORIZATION | BERNOULLI | CALL | CASCADE | CATALOGS | COLUMN | COLUMNS | COMMENT | COMMIT | COMMITTED | CURRENT | DATA | DATE | DAY | DEFINER | DESC | DISTRIBUTED | DOUBLE | EXCLUDING | EXPLAIN ... END: 'END';修改很简单,只需要end加上转义即可,变为了array(row(start timestamp,\"end\" timestamp))。
至此可以编译成功(类型挂掉的都是因为和解析不符)。
但运行使用这个UDF的sql会报错,这就是另一个问题了,timestamp的类型增加了。 timestamp(3)和timestamp不匹配,这个比较有意思,文档里说了timestamp是timestamp(3)的别名:
TIMESTAMP is an alias for TIMESTAMP(3) (millisecond precision).
但UDF里就是不能这么写,最后改为array(row(start timestamp(3),\"end\" timestamp(3)))。
至此问题解决。
现在还在测试中,UDF这些的文档有些欠缺了,自己摸索了一下发现还不如看源码来得直接,这部分的文档缺失的也厉害,写/改UDF基本也是靠已有的例子摸索。
其他的部分都还不错,兼容性也很好,可见Trino的社区支持还是很到位的,要感谢各位大佬的努力