The “coupling” is not for performance. Each AST node (SqlNode) contains a 
position so that we can give a good error message, including the exact position 
of the error, when there is a validation error. This important if you are 
running a SQL statement that is more than a few lines long.

SqlParserPos contains only 4 fields:

   int lineNumber;
   int columnNumber;
   int endLineNumber;
   int endColumnNumber;

We deliberately do not keep references to the parser, or to the tokens emitted 
by the parser, or even to the source SQL text. (We used to, by accident, and it 
caused memory leaks.) So, you can easily create a SqlParserPos for each node if 
you have used a different parser. Or you can just use SqlParserPos.ZERO for 
every node (if you don’t want meaningful positions in your error messages).

Julian



> On Dec 10, 2015, at 10:58 PM, xuxuwangzi888 <[email protected]> wrote:
> 
> dear,
>      I have a question,why the parser and operator Tree are coupled,like this:
> 
> SqlNode(SqlParserPos pos) {
> 
>  Util.pre(pos != null, "pos != null");
>  this.pos = pos;
> }
> 
> 
>  Because we pass the variable pos,it lead to the couple。
> 
> I develped a parser use antlr,and hope the parse and symantec tree is loose 
> coupled。
> 
>   I guess calcite coupled design is for performance, is it ?   
> 
>   Many thanks!
> 
> gongbo.yxh
> 
> 
> 

Reply via email to