You can use SqlValidator.getFieldOrigins for a SqlNode, or use RelMetadataQuery.getColumnOrigins for a RelNode.
- Jin Julian Hyde <jh...@apache.org> 于2020年4月17日周五 上午7:29写道: > At the RelNode level, you can use RelMetadataQuery.getColumnOrigins. > > But I’m sure that there’s something available at the SqlNode level, after > validation. PreparedExplain.getFieldOrigins() is what the JDBC driver uses > to provide ResultSetMetadata.getColumnName(int) etc. > > Julian > > > > > On Apr 16, 2020, at 4:17 PM, Feng Zhu <wellfeng...@gmail.com> wrote: > > > > You can customize a RelVisitor to visit the RelNode, and collect the > > columns from TableScan's rowtype. > > > > 王驰 <wang...@kuaishou.com> 于2020年4月16日周四 下午11:23写道: > > > >> Hi folks, > >> > >> > >> We're using CalCite in our project for SQL parsing and validating. We > have > >> a question: is there any way to get all used columns from a SQL? > >> > >> > >> Consider the following case: > >> > >> we have two tables `user` and `user_region`. And the SQL is like > >> > >> > >> ``` > >> > >> SELECT > >> > >> id, name, age, country, province, city > >> > >> FROM > >> > >> user > >> > >> INNER JOIN user_region ON user.id = user_region.user_id > >> > >> WHERE age > 18; > >> > >> ``` > >> > >> > >> The result will be a Map with two keys: > >> > >> > >> - 'user' --> List('id', 'name', 'age') > >> - 'user_region' --> List('country', 'province', 'city', 'user_id') > >> > >> > >> ====== > >> > >> I've tried with SqlValidator (along with SqlValidatorScope, > >> SqlValidatorNamespace) but found no easy ways to do this. > >> I also tried to replay the validate process in our code but it seems > >> impossible since most classes used are package private. > >> > >> > >> Could you please give us some suggestions? Thanks! > >> > >> > >